linux最小系統的製作(嵌入式第一節課)
準備工作
硬體工具:
電腦(安裝了linux虛擬機器(UBuntu或者CentOS),需要提供一個平臺環境)
一塊板子(我這裡是使用訊為提供的Cortex-A9 4412精英板)
軟體工具:
1.busybox
2.linux_tools.tgz
3.arm-linux-gcc編譯器
busybox介紹
Busybox工具(https://busybox.NET/):目前的最新版本是:busybox-1.27.2.tar.bz2(2017年8月17日)
Busybox工具就是一個集成了100多個Linxu常用命令和工具的軟體,可以稱為Linux裡面的瑞士軍刀吧,它是開源的,同時在不斷更新,我們接下來就是用它來搭建我們的最小Linux系統。
網址:
BusyBox combines tiny versions of many common UNIX utilities into a single small executable. It provides replacements for most of the utilities you usually find in GNU fileutils, shellutils, etc. The utilities in BusyBox generally have fewer options than their full-featured GNU cousins; however, the options that are included provide the expected functionality and behave very much like their GNU counterparts. BusyBox provides a fairly complete environment for any small or embedded system.
百度機器翻譯:BusyBox結合許多常見的UNIX工具小版本到一個單一的小的可執行檔案。它提供了你最經常發現在GNU FileUtils,shellutils公用事業等替代,BusyBox的事業通常比功能齊全的GNU的表兄弟更少的選擇;然而,選項,包括提供預期的功能和行為很像他們的GNU同行。BusyBox為小或嵌入式系統提供了比較完善的環境。
板子板執行一個完整的作業系統需要四個檔案“u-boot-iTOP-4412.bin”,“zImage”,“ramdisk-uboot.img”,“system.img”,檔案“u-boot-iTOP-4412.bin”不用燒寫,出廠前就有的,是通用的。如果你是不同板子估計也有類似東西。
下載解壓busybox
進入網址網址:https://busybox.net/ 官網下載busybox
下載好的busybox-1.27.2.tar.bz2拷貝到ubuntu系統的/home/minilinux下:我用的是virtualbox 裝的ubantu16.04,拷貝檔案用的共享資料夾。接下來解壓它,
sudo tar -xvf busybox-1.27.2.tar.bz2
解壓成功,cd到該資料夾裡
cd busybox-1.27.2/
配置busybox
下面開始配置Busybox:
make menuconfig
進入失敗可能是沒有sudo,沒有安裝gcc編譯器,沒有安裝ncurses-devel.在ubuntu中ncurses-devel的名字叫libncurses5-dev
解決方法
sudo apt-get install gcc
sudo apt-get install gcc-c++
sudo apt-get install libncurses5-dev
sudo make menuconfig
配置之前 su root進入root省去不少麻煩。
選中Busybox Settings,然後按回車進入到Busybox Settings 介面,如下圖:
在Busybox Settings 配置選項裡面需要修改兩個地方,第一個是Build Optiions-> CrossCompiler prefix,它是指定用什麼編譯器來編譯Busybox,選中Build Options 如下圖:
按回車,進入到Build Options 配置介面,選中Build Options 配置介面的Cross Compiler prefix然後回車;如下圖:
輸入使用的交叉編譯工具arm-none-linux-gnueabi-,如下圖:
按回車返回到Build Options 配置介面,這時可以看到剛才設定的交叉編譯工具,如下圖:
使用鍵盤的左右按鍵選中Exit,並且回車,如下圖:
回到Busybox Settings 設定介面,如下圖:
選中Installation Options ,然後按回車,進入Installation Options 配置介面,如下圖:
選中BusyBox installation prefix 如上圖所示,然後按回車進入BusyBox installationprefix 配置介面(這個介面是設定編譯完Busybox,把最終生成的二進位制檔案安裝到哪個目錄下面),修改為../system
(最終生成的二進位制檔案會安裝到當前目錄的上一級目錄下的system 目錄裡面),如下圖:
回車,回到上一介面Busybox Settings:
接下來繼續Tab鍵選擇Exit,然後按回車,返回到Busybox Configuration:
繼續使用鍵盤向右的方向鍵移動游標到“Exit”,然後回車選擇yes儲存:
沒有報錯的情況下,結果是這個
報錯的原因一般是沒有安裝arm-linux-gcc編譯器。
安裝安裝arm-linux-gcc編譯器教程我下期再說,因為單單安裝arm-linux-gcc編譯器需要很長篇幅。
編譯busybox
下面我們繼續吧,接下來是編譯和安裝Busybox了,因為前面我們花了那麼久終於配置好了:
busybox-1.27.2目錄下執行: make
編譯報錯:
解決方法
MTD_FILE_MODE_RAW在/usr/include/mtd/mtd-abi.h中定義,於是將/usr/include/mtd/mtd-abi.h拷貝到busybox的include檔案中,然後在nandwrite.c檔案中包含該標頭檔案
cd /usr/include/mtd/
sudo cp mtd-abi.h /home/minilinux/busybox-1.27.2/include
(配圖沒有給許可權sudo,普通使用者需要許可權執行cp,root使用者不用)
到/busybox-1.27.1/miscutils下找到nandwrite.c
編輯nandwrite.c的程式碼
cd /home/minilinux/busybox-1.27.2/miscutils
vim nandwrite.c或者是 gedit nandwrite.c
新增標頭檔案#include “mtd-abi.h” 儲存並關閉
注意 #include “mtd-abi.h” 的位置順序,in出路標頭檔案順序不能錯,#include “mtd-abi.h” 在中間
三個#include順序必須與上圖一樣,順序不一樣還是錯誤。比如三行include讓#include “mtd-abi.h”加到最後還是出錯,需要加到中間。
cd .. 然後繼續make 編譯
繼續報錯:util-linux/blkdiscard.c: In function ‘blkdiscard_main’:
解決辦法:
BLKSECDISCARD在/usr/include/linux/fs.h中定義,方法如上所述,將/usr/include/linux/fs.h拷貝到busybox的include資料夾中,然後修改util-linux/blkdiscard.c中標頭檔案包含:
cd /usr/include/linux/
sudo cp fs.h /home/minilinux/busybox-1.27.2/include
退回目錄cd .. 執行make ,重新編譯
接著繼續出錯
解決辦法:
make menuconfig
Linux System Utilities—>nsenter,去掉該選項,重新編譯make。
重新編譯,媽的智障,又雙叒叕出錯了。
解決辦法:和前面很類似了,其實這些錯誤我們應該會很熟悉的,都是這些亂七八糟的錯誤,慢慢解決就好:
make menuconfig
Coreutils—>sync選項去掉,儲存退出,
make重新編譯
編譯成功,鬆一口氣。別高興太早,還沒結束呢,後面還有好多步驟呢。
安裝生成system
接下來我們需要把編譯生成的二進位制檔案安裝到剛才我們指定的../system 目錄裡面,
使用命令“make install”命令安裝二進位制檔案到“../system”目錄。
root@zzz:/home/minilinux/busybox-1.27.2# cd ..
root@zzz:/home/minilinux# ls
busybox-1.27.2 busybox-1.27.2.tar.bz2 system
root@zzz:/home/minilinux# cd system/
root@zzz:/home/minilinux/system# ls
bin linuxrc sbin usr
root@zzz:/home/minilinux/system#
完善最小系統
接下來開始很關鍵的完善最小Linux系統:
首先製作的檔案系統還需要dev,etc,lib,mnt,proc,sys,tmp,var 資料夾,使用命令“mkdir dev etc lib mnt proc sys tmp var”
建立上述所有目錄,然後ls檢視:
root@zzz:/home/minilinux/system# mkdir dev etc lib mnt proc sys tmp var
root@zzz:/home/minilinux/system# ls
bin dev etc lib linuxrc mnt proc sbin sys tmp usr var
root@zzz:/home/minilinux/system#
cd到剛剛建立的etc下,在etc 目錄下使用命令vim建立eth0-setting 檔案,並在eth0-setting 檔案裡輸入下面的內容:
IP=192.168.1.230
Mask=255.255.255.0
Gateway=192.168.1.1
DNS=192.168.1.1
MAC=08:90:90:90:90:90
修改許可權755
chmod 755 eth0-setting
同理,在etc目錄下建立init.d目錄,並且cd到init.d下面去,在init.d 目錄下面建立ifconfig-eth0 檔案:
[[email protected] etc]# mkdir init.d
[[email protected] etc]# cd init.d/
[[email protected] init.d]# vim ifconfig-eth0
#!/bin/bash
echo -n Try to bring eth0 interface up......>/dev/ttySAC2
if [ -f /etc/eth0-setting ]
then
source /etc/eth0-setting
if grep -q "^/dev/root / nfs " /etc/mtab
then
echo -n NFS root ... > /dev/ttySAC2
else
ifconfig eth0 down
ifconfig eth0 hw ether $MAC
ifconfig eth0 $IP netmask $Mask up
route add default gw $Gateway
fi
echo nameserver $DNS > /etc/resolv.conf
else
if grep -q "^/dev/root / nfs " /etc/mtab
then
echo -n NFS root ... > /dev/ttySAC2
else
/sbin/ifconfig eth0 192.168.1.106 netmask 255.255.255.0 up
fi
fi
echo Done > /dev/ttySAC2
把它們的許可權修改為755。
chmod 755 ifconfig-eth0
同理,再次在init.d目錄下面建立rcs檔案:
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
"rcS" 70L, 1898C 1,1 頂端
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
#! /bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/bin:
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel
#
# Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
#
trap ":" INT QUIT TSTP
/bin/hostname iTOP-4412
#/bin/mount -n -t proc none /proc
#/bin/mount -n -t sysfs none /sys
#/bin/mount -n -t usbfs none /proc/bus/usb
#/bin/mount -t ramfs none /dev
[ -e /proc/1 ] || /bin/mount -n -t proc none /proc
[ -e /sys/class ] || /bin/mount -n -t sysfs none /sys
[ -e /dev/tty ] || /bin/mount -t ramfs none /dev
echo /sbin/mdev > /proc/sys/kernel/hotplug
/sbin/mdev -s
#/bin/hotplug
# mounting file system specified in /etc/fstab
mkdir -p /dev/pts
mkdir -p /dev/shm
/bin/mount -n -t devpts none /dev/pts -o mode=0622
/bin/mount -n -t tmpfs tmpfs /dev/shm
#/bin/mount -n -t ramfs none /tmp
#/bin/mount -n -t ramfs none /var
mkdir -p /var/empty
mkdir -p /var/log
mkdir -p /var/log/boa
mkdir -p /var/lock
mkdir -p /var/run
mkdir -p /var/tmp
ln -sf /dev/ttyS2 /dev/tty2
ln -sf /dev/ttyS2 /dev/tty3
ln -sf /dev/ttyS2 /dev/tty4
syslogd
/etc/rc.d/init.d/netd start
echo " " > /dev/tty1
echo "Starting networking..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/httpd start
#echo " " > /dev/tty1
#echo "Starting web server..." > /dev/tty1
#sleep 1
#/etc/rc.d/init.d/leds start
#echo " " > /dev/tty1
#echo "Starting leds service..." > /dev/tty1
#echo " "
#sleep 1
#echo "*************************************" > /dev/ttySAC2
#echo " http://www.topeet.com.cn " > /dev/ttySAC2
#echo "*************************************" > /dev/ttySAC2
#echo "*************************************"
#echo " http://www.topeet.com.cn "
#echo "*************************************"
mkdir /mnt/disk
sleep 1
/sbin/ifconfig lo 127.0.0.1
/etc/init.d/ifconfig-eth0
修改許可權755
在etc 目錄下建立rc.d目錄:
cd進入rc.d目錄下,建立init.d目錄,cd到init.d目錄下:
在此時init.d目錄下建立netd檔案
[[email protected] init.d]# vim netd
#!/bin/sh
base=inetd
# See how we were called.
case "$1" in
start)
/usr/sbin/$base
;;
stop)
pid=`/bin/pidof $base`
if [ -n "$pid" ]; then
kill -9 $pid
fi
;;
esac
exit 0
和前面一樣修改許可權為755
接下來cd ../../../返回到system目錄下面:
cd到lib目錄下面:
因為使用的交叉編譯環境和編譯核心的相同,所以編譯器是/home/minilinux/arm-2009q3,(編譯器arm-2009q3是拷貝過去的)
Busybox 編譯生成的二進位制檔案十一動態連結庫的形式執行,所以我們需要拷貝編譯器裡面的
庫檔案到lib 目錄,使用下面的命令:
“cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ./”
cp /usr/local/arm/arm-2009q3/arm-none-linux-gnueabi/libc/lib/* ./
即從arm-linux-gcc編譯器庫裡把所有庫檔案/*拷貝庫到最小系統lib庫(system/lib)裡面。
拷貝完成後返回到system目錄,cd到var目錄:
使用“mkdir lib lock log run tmp”命令在var 目錄下建立lib,lock,log,run,
tmp 五個目錄:
mkdir lib lock log run tmp
到此,檔案系統所需檔案都建立好了,cd回到system目錄的上一級目錄:
到了這一步,製作好的資料夾“system”,可以在視訊教程對應的目錄下找到。如果發現
後面的操作命令出現了問題,可以對照著修改檔案,看看問題出在什麼地方。
打包和編譯
打包工具 make_ext4fs 可以檔案系統製作成二進位制檔案,先來安裝一下 make_ext4fs 工
具。這個工具是在第一步準備工作的網盤裡“linux_tools.tgz”壓縮檔案。
拷貝壓縮包“linux_tools.tgz”到 Ubuntu 系統的“/”目錄下,注意目錄是“/” 。
使用解壓命令“tar -vxf linux_tools.tgz”解壓 。
tar -vxf linux_tools.tgz
安裝好打包編譯工具“make_ext4fs”之後。
使用命令“cd /home/minilinux/”進入目錄“/home/minilinux/”,
使用命令“make_ext4fs -s -l 314572800 -a root -L linux system.img system”生成 system.img檔案系統映象 。
cd /home/minilinux/
make_ext4fs -s -l 314572800 -a root -L linux system.img system
報錯:
解決方法:安裝lib32stdc++6
apt-get install lib32stdc++6
然後在/home/minilinux下重新輸入
make_ext4fs -s -l 314572800 -a root -L linux system.img system
接著可以使用 ls 命令檢視一下生成的 system.img 。
到此為止,已經完成了 linux 最小檔案系統的製作 。
撒花!
相關推薦
linux最小系統的製作(嵌入式第一節課)
準備工作 硬體工具: 電腦(安裝了linux虛擬機器(UBuntu或者CentOS),需要提供一個平臺環境) 一塊板子(我這裡是使用訊為提供的Cortex-A9 4412精英板) 軟體工具:
#嵌入式Linux最小系統移植# yaffs2根檔案系統移植出錯記錄
busybox官網地址: 本次移植採用的busybox版本: busybox-1.26.0.tar.bz2 交叉編譯工具鏈版本: $ arm-linux-gcc -v gcc version 4.4.3 (ctng-1.6.1) 1
#嵌入式Linux最小系統移植# 對uboot移植和裁剪的一點點個人思考和總結
思路: 1.分析啟動流程 2.移植config檔案(smdk440_config) 3.移植包含控制條件編譯巨集的.h檔案(configs/s3c2440.h) 4.移植板級初始化.c檔案(s3c2440.c) 5.移植RAM初始化?DDR? 6.移植NorF
[嵌入式開發入門]4412開發板從零建立Linux最小系統
iTOP-4412開發板不僅可以執行Android,還可以執行簡單的Linux最小檔案系統。 最小Linux 系統“麻雀雖小,五臟俱全”,它不帶圖形介面的Linux 系統,剔除干擾因素便於理解,用來學習Linux系統程式設計非常合適。 另外,Linux最小系統佔用的
ZYNQ學習之路1. Linux最小系統構建
開發環境:window10, vivado 2017.1, ubuntu 16.04, Eclipse+cdt硬體環境:米爾科技zturn board,zynq7z010 本筆記詳細介紹了開發ZYNQ
Linux核心移植和根檔案系統製作(詳細步驟精講)
start_kernel是所有 Linux 平臺進入系統核心初始化後的入口函式,它主要完成剩餘的與硬體平臺相關的初始化工作,在進行一系列與核心相關的初始化後,呼叫第一個使用者程序-init 程序並等待使用者程序的執行,這樣整個 Linux 核心便啟動完畢。該函式所做的具體工作有:呼叫 setup_arch
基於itop4412在Linux最小系統下的 ffmpeg 的移植和測試
近期在做一個視訊監控的專案,在網上了解到如下的方案: 用的V4L2的視訊驅動,然後配合ffmpeg、x264的軟體編解碼,通過udp上傳至pc顯示,配合開源的編解碼庫,實現h.264的流編碼與傳輸。 前面我們已經實現了x264編碼庫的移植,並且做了測
Linux最小系統移植之早期打印CONFIG_DEBUG_LL
ace makefile add ssa ptr 終端 同時 虛擬 固件 一、幾個關鍵宏定義 CONFIG_DEBUG_LL、 CONFIG_DEBUG_LL_INCLUDE 容我慢慢道來, 首先要使能早期打印, menuconfig必須選中CONFIG_
java從《《遞迴函式》》到《《歸併排序》》再到《《最小和問題(歸併排序的應用)》》:
一:我們首先來研究一下遞迴函式(使用遞迴函式求陣列最大值): 我們開始把陣列分為兩半,分別找出最大值,那麼這個最大值就是最後的最大值:同時我們左右兩邊繼續細分,停止條件就是細分到單個數值為止。 package chapter1; //使用遞迴求出一個數組中的最小值 public class
【機器學習筆記02】最小二乘法(多元線性迴歸模型)
數學基礎 1.轉置矩陣 定義: 將矩陣A同序數的行換成列成為轉置矩陣ATA^TAT,舉例: A=(1203−11)A=\begin{pmatrix} 1 & 2 & 0 \\ 3 & -1 &
【機器學習筆記01】最小二乘法(一元線性迴歸模型)
【參考資料】 【1】《概率論與數理統計》 【2】 http://scikit-learn.org /stable/auto_examples/ linear_model/ plot_ols.html # sphx-glr-auto-examples-
Unity實戰篇:MOBA遊戲小地圖製作(二:細節完善)
1.場景新建一個Cube,命名為Ground,scale設定為200,0.01,200。 2.建立材質球,把準備好的地圖圖片(開一把MOBA遊戲~)拖進去,然後把材質球給Ground。 我們的地
009、最小的映象(2018-12-26 週三)
參考 https://www.cnblogs.com/CloudMan6/p/6788841.html 映象的內部結構 為後面製作映象做準備,先來分析一個簡單的映象 hello-world。
最小二乘法(自我理解+自我熟悉)(1)
最近一直在看機器學習的東西,看了好些論文,但奈何基礎實在太差,有很多東西都不懂。所以就看各種演算法。雖然當然看完覺得理解了,但一段時間過去又忘的差不多,無奈之舉,希望通過部落格來加深自己對基礎知識的理解和掌握。這次總結也是通過各種部落格和材料收集得到的,所以只能說是
字串最小表示法(LeetCode 899. Orderly Queue )
A string S of lowercase letters is given. Then, we may make any number of moves. In each move, we choose one of the first K letters (sta
把陣列中全部數拼接組合成一個最小的數(劍指offer筆記)
題目:輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。先附上程式碼,後面具體講解一下為何這樣寫以及程式碼中涉及到的python方法# -*- cod
我的瑜伽課表:第一階段課程(共8節課)
我們在流瑜伽和ashtanga瑜伽練習中經常會使用ujjayi呼吸,主要是需要運用很強的呼吸控制幫助我們來完成體式,一般都採用胸腔呼吸,吸氣的時候胸腔向外擴張,呼氣的時候胸腔向內收縮,充分運用我們的雙肺,同時配合我們喉嚨處的控制,達到對呼吸和對身體的控制。 初學者在一開始練習ujjayi呼吸時不容
《Linux就該這麽學》第一節課筆記
kickstart linux命令 info 服務管理 ima rhca 最有 學習網址 存儲結構 本書是由全國多名紅帽架構師(RHCA)基於最新Linux系統共同編寫的高質量Linux技術自學教程,極其適合用於Linux技術入門教程或講課輔助教材,目前是國內最值得去讀的L
PCB製作(微控制器最小系統為例)
參考連結: 第一步:安裝Altium Designer Summer 09並破解(詳情見軟體安裝) 第二步:建立工程,建立PCB工程,建立原理圖並儲存在同一目錄下 右擊工程名,儲存所有檔案在同一目錄下 第三步:放置元器件,繪製原理圖 開啟右下角system-&g
三分鐘學會用SpringMVC搭建最小系統(超詳細)
springmvc+mybatis dubbo+zookeeper restful redis分布式緩存 kafka 前言做 Java Web 開發的你,一定聽說過SpringMVC的大名,作為現在運用最廣泛的Java框架,它到目前為止依然保持著強大的活力和廣泛的用戶群。本文介紹如何用ecli