三、根檔案系統

上節講解了Linux核心移植,這節講如何構造根檔案系統。

工具和原始碼在路徑:F:\韋東山\CD1_主光碟\system。

jffs2製作工具路徑:F:\韋東山\CD1_主光碟\GUI\xwindow\X\deps

tar xjf  busybox-1.7.0.tar.bz2 //解壓

cd busybox-1.7.0 //進入目錄

make  menuconfig //進入配置選單

一是在編譯選項選擇動態庫編譯,當然你也可以選擇靜態,不過那樣構建的根檔案系統會比動態編譯的的大。

->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

這裡我們先新建一個first_fs來構建根檔案系統,/share/first_fs是安裝busybox的目錄。

然後使用命令[email protected]:/share/busybox-1.7.0# make CONFIG_PREFIX=/share/first_fs install對busybox進行安裝。於是在/share/first_fs下面就出現瞭如下目錄和檔案,可以看出linuxrc是指向busybox的連結。

[[email protected] first_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本身)。

[[email protected]_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庫。

在first_fs下新建lib目錄mkdir  lib,再把arm-linux-交叉編譯鏈下的lib檔案拷貝到我們first_fs下的lib目錄下。我使用

cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*   first_fs/lib/* -df 使用-d選項表示連結檔案按照原來的連結方式拷貝,否則連結檔案拷貝過來是一個副本。

3.構建/etc,/dev,proc目錄

/etc和/dev是一個根檔案系統必須的。/etc檔案需包含init程序啟動所需的配置檔案inittab。dev目錄下需包含init程序啟動需要的兩個裝置檔案console和null。proc目錄要進來掛載核心的虛擬proc檔案系統。這樣對程序的一些命令如ps才會有效。

1) 在first_fs目錄下執行mkdir   etc dev proc

2) 在etc下新建檔案inittab

inittab內配置資訊的格式我已經在我的上一篇文章《linux移植(三)》裡解釋了。我們在裡面寫入兩行配置資訊。

::sysinit:/etc/init.d/rcS

::askfirst:-/bin/sh

第一行是用來啟動指令碼檔案rcS,之所以這樣做,是因為我們可以利用這個檔案來引導系統啟動時為我們做一個工作比如說掛載檔案系統或者啟動一些其他的應用程式的。

第二個是啟動shell直譯器sh

3)配置指令碼檔案rcS(當載入完檔案系統後,首先執行該指令碼)

在etc下新建init.d目錄mkdir  init.d,然後在init.d目錄下新建rcS檔案,

再給rcS檔案加上可執行許可權chmod +x rcS。

在rcS目錄下寫入

#!bin/sh

#mount –a

mount -t proc none /proc

在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目錄下建立了這兩個檔案,調了大半天才找到原因。還有在cd  etc或者cd  dev 時千萬不要在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

再在first_fs下新建一個sys目錄mkdir  sys。

於是我們再做成一個yaffs2映象就可以支援自動建立裝置檔案了,注意上面說到的建立的console和null裝置檔案不能刪除,因為它們在mdev工作之前就已經被使用了。

6.完善根檔案系統。

1)將etc目錄下的inittab加上

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

::restart:/sbin/init

來指定系統執行特殊操作命令(shultdown、restart、ctrlaltdel)時做的附加工作。

2)在first_fs下新建mnt、tmp、root目錄

7.製作yaffs2映象

拷貝目錄:F:\韋東山\CD1_主光碟\system下的工具

yaffs_source_util_larger_small_page_nand.tar.bz2到/share目錄,並解壓

進入\Development_util_ok\yaffs2目錄,執行make命令生成mkyaffs2image工具,將它複製到/usr/local/bin目錄。

 Cp mkyaffs2image  /usr/local/bin

Chmod  +x  /usr/local/bin/mkyaffs2image

返回/share目錄,把share目錄下的first_fs製作成yaffs2檔案系統。

執行命令 mkyaffs2image  first_fs  first_fs.yaffs2

通過u-boot下載first_fs.yaffs2。

在移植根檔案系統的過程中可能會遇到如下問題:

linux核心引導根檔案系統的時候,卡死在這裡,解決辦法看核心移植中有說明。

block 535 is bad

block 809 is bad

block 937 is bad

block 1898 is bad

VFS: Mounted root (yaffs filesystem).

Freeing init memory: 136K