ARM-Linux移植之(四)——根檔案系統構建

來源:互聯網
上載者:User

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

我就被這個問題搞了好久!後來我是從一個好的根檔案系統把這些檔案和目錄拷貝過來才行。切記切記!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

Tags Index: