ARM-Linux移植之(四)——根檔案系統構建
K-Style
轉載請註明來自于衡陽師範學院08電2 K-Style http://blog.csdn.net/ayangke,QQ:843308498 郵箱:yangkeemail@qq.com
相關工具版本:
busybox-1.7.0 arm-linux-4.3.2 linux-2.6.22
1.配置busybox並安裝。
在我們的根檔案系統中的/bin和/sbin目錄下有各種命令的應用程式,而這些程式在嵌入式系統中都是通過busybox來構建的,每一個命令實際上都是一個指向busybox的連結,busybox通過傳入的參數來決定進行何種命令操作。
1)配置busybox
解壓busybox-1.7.0,然後進入該目錄,使用makemenuconfig進行配置。這裡我們這配置兩項
一是在編譯選項選擇動態庫編譯,當然你也可以選擇靜態,不過那樣構建的根檔案系統會比動態編譯的的大。
->Busybox Settings
->BuildOptions
->Buildshared libbusybox
二是在效能微調選項選擇tab鍵補全功能。
->Busybox Settings
->Busyboxlibrary Tuning
->Commandline editing
->Tabcompletion
其他的都是一些命令配置,如果你想使你的根檔案系統具備哪些命令就選擇那個命令。我選擇的是預設的配置,一般基本的命令都幫你選上了。
2)編譯busybox
修改Makefile,修改”ARCH?= arm” 和”CROSS_COMPILE?= arm-linux-“,然後使用make命令進行編譯。我在編譯的過程出現如下錯誤:
../arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h:44:
error: field ‘in’ has incomplete type
解決辦法:
修改arm-linux交叉編譯工具鏈
在usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/usr/include/linux/netfilter.h 標頭檔的開頭添加缺少的標頭檔:#include<netinet/in.h>
3)安裝busybox
這裡我們先建立一個root_fs來構建根檔案系統,
然後使用命令makeCONFIG_PREFIX=/home/y-kee/work/root_make/root_fs對busybox進行安裝。於是在root_fs下面就出現了如下目錄和檔案,可以看出linuxrc是指向busybox的連結。
[root@localhost root_fs]# ls -l
total 12
drwxr-xr-x 2 root root 4096 Oct 19 05:41bin
lrwxrwxrwx 1 root root 11 Oct 22 11:17 linuxrc -> bin/busybox
drwxr-xr-x 2 root root 4096 Oct 22 18:43sbin
drwxr-xr-x 4 root root 4096 Oct 22 16:52usr
進入bin目錄,可以看出這些檔案全部是指向busybox的連結(除了busybox本身)。
[root@localhostroot_fs]# ls bin -l
total 0
lrwxrwxrwx 1 root root 7 Oct 22 11:17addgroup -> busybox
lrwxrwxrwx 1 root root 7 Oct 22 11:17adduser -> busybox
lrwxrwxrwx 1 root root 7 Oct 22 11:17ash -> busybox
-rwxr-xr-x 1 root root 0 Oct 23 13:20busybox
lrwxrwxrwx 1 root root 7 Oct 22 11:17cat -> busybox
lrwxrwxrwx 1 root root 7 Oct 22 11:17catv -> busybox
2.安裝glibc庫。
在root_fs下建立lib目錄,再把arm-linux-交叉編譯鏈下的lib檔案拷貝到我們root_fs下的lib目錄下。我使用
cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*root_fs/lib/* -df
使用-d選項表示連結檔案按照原來的連結方式拷貝,否則連結檔案拷貝過來是一個副本。
3.構建/etc,/dev,proc目錄
/etc和/dev是一個根檔案系統必須的。/etc檔案需包含init進程啟動所需的設定檔inittab.dev目錄下需包含init進程啟動需要的兩個裝置檔案console和null。proc目錄要進來掛載核心的虛擬proc檔案系統。這樣對進程的一些命令如ps才會有效。
1) 在dev目錄下執行mkdiretc dev proc
2) 在etc下建立檔案inittab
inittab內配置資訊的格式我已經在我的上一篇文章《linux移植(三)》裡解釋了。我們在裡面寫入兩行配置資訊。
::sysinit:/etc/init.d/rcS
::askfirst:/bin/sh
第一行是用來啟動指令檔rcS,之所以這樣做,是因為我們可以利用這個檔案來引導系統啟動時為我們做一個工作比如說掛載檔案系統或者啟動一些其他的應用程式的。
第二個是啟動shell解譯器sh
3)配置指令檔rcS
在etc下建立init.d目錄,然後在init.d目錄下建立rcS檔案,再給rcS檔案加上可執行許可權。
在rcS目錄下寫入
#!bin/sh
mount –a
在rcS裡面執行mount –a命令,於是該命令就會根據etc下fstab檔案來掛載相應的目錄。
4)配置fstab檔案
在etc目錄下建立fstab檔案,然後在該檔案內寫入
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
第一個參數是裝置,第二個是掛載點,第三個是設定。其餘的寫兩個0。
5)構建dev目錄下的裝置檔案。
由於console和null裝置是init進程啟動所必須的,所以要建立這兩個裝置檔案,進入dev目錄,然後執行
mknod console c 5 1
mknod null c 1 3
如果這兩個裝置檔案沒有手工mknod建立就在核心啟動時會出現錯誤:
Warning: unable to open an initialconsole.
注意一定是在dev下建立這兩個裝置檔案。我因為一時糊塗在etc目錄下建立了這兩個檔案,調了大半天才找到原因。還有在cdetc或者cddev時千萬不要在etc和dev前面順手打上了斜杠了,我就是手賤,順手打了斜杠,結果進入的PC上的LINUX系統的etc目錄刪了一些檔案,導致系統崩潰。
完成了上述步驟,將根檔案系統製作成yaffs2鏡像燒到flash就能正常啟動了。
5.配置mdev來支援熱插拔
busybox使用sbin目錄下的一個mdev來支援熱插拔,什麼叫做支援熱插拔?就是你linux系統啟動時插入一個裝置,則mdev會在dev目錄下自動給你建立裝置檔案。
在/busybox源碼中的mdev.txt有介紹。我截取部分如下
Mdev has two primary uses: initialpopulation and dynamic updates. Both
require sysfs support in the kernel andhave it mounted at /sys. For dynamic
updates, you also need to havehotplugging enabled in your kernel.
Here's a typical code snippet from theinit script:
[1] mount -t sysfs sysfs /sys
[2] echo /bin/mdev >/proc/sys/kernel/hotplug
[3] mdev -s
Of course, a more "full" setupwould entail executing this before the previous
code snippet:
[4] mount -t tmpfs mdev /dev
[5] mkdir /dev/pts
[6] mount -t devpts devpts /dev/pts
The simple explanation here is that [1]you need to have /sys mounted before
executing mdev. Then you [2] instruct the kernel to execute/bin/mdev whenever
a device is added or removed so that thedevice node can be created or
destroyed. Then you [3] seed /dev with all the devicenodes that were created
while the system was booting.
For the "full" setup, you wantto [4] make sure /dev is a tmpfs filesystem
(assumingyou're running out of flash). Then you want to [5] create the
/dev/pts mount point and finally [6]mount the devpts filesystem on it.
當我們在flash中使用使,則只需要前面[1][2][3]步就行了。即
[1] mount -t sysfs sysfs /sys
[2] echo /bin/mdev >/proc/sys/kernel/hotplug
[3] mdev -s
於是我們在etc/init.d/rcS檔案改為
mount –a
echo /bin/mdev >/proc/sys/kernel/hotplug
mdev -s
將ect/fstab檔案改為
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
再在root_fs下建立一個sys目錄。
於是我們再做成一個yaffs2鏡像就可以支援自動建立裝置檔案了,注意上面說到的建立的console和null裝置檔案不能刪除,因為它們在mdev工作之前就已經被使用了。
6.完善根檔案系統。
1)將etc目錄下的inittab加上
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::restart:/sbin/init
來指定系統執行特殊操作命令(shultdown、restart、ctrlaltdel)時做的附加工作。
2)在root_fs下建立mnt、tmp、root目錄
注意:
在製作根檔案系統的過程中不要去移動root_fs目錄下的由busybox建立的binsbin usr和linuxrc,因為這些目錄和檔案很多都是連結檔案。移動可能會導致核心啟動時出現如下錯誤:
request_module:runaway loop modprobe binfmt-0000
我就被這個問題搞了好久!後來我是從一個好的根檔案系統把這些檔案和目錄拷貝過來才行。切記切記!