天天看點

第三部分 linux busybox最小檔案系統的移植

原文位址:http://blog.csdn.net/woshidahuaidan2011/article/details/51693525

1、源碼包下載下傳

首先要說明移植檔案系統無非就是添加一些檔案夾(有的需要加入一些配置檔案)而已,這裡是利用Busybox( http://www.busybox.net/downloads/ )建立/bin 和/sbin等目錄的檔案。

至于以上兩種名字的含義,google很詳細了。

言歸正傳,正式開始。

首先下載下傳完成後将這兩個壓縮包可以用cuteftprro工具拷貝到linux檔案夾下,

然後解壓,tar –xvf busybox-1.23.2.tar.bz2

本版本的busybox是1.23.2本版本的所支援的核心、gcc、使用方法等的版本資訊在加壓後的busybox-1.23.2的檔案夾下readme有詳細的介紹,建議在進行下面配置前能浏覽一下。

1、busybox菜單配置及其編譯

進入busybox-1.23.1檔案後執行make menuconfig進入菜單配置選項。如圖。

第三部分 linux busybox最小檔案系統的移植

最上面寫的操作使用說明。

在這裡我在linux sysytem utilities -à 選擇了(根據自身要求設定,選擇後會出現錯誤,至于是否編譯出錯,跟具體的gcc版本有關系)

第三部分 linux busybox最小檔案系統的移植

第三部分 linux busybox最小檔案系統的移植

這兩個預設未選擇的選項。

這就算配置完成。打開後,假如核心預設選擇,請去掉選擇(去掉前面的“*“)否則可能出現錯誤資訊。

接下來就要稍微修改一下makefile檔案了,在 busybox-1.22.1下用vi Makefile 設定結構和交叉編譯。

内容是如下:

ARCH?=arm       //大概  191行

CROSS_COMPILE ?=arm-linux-2440-          //156行 名字因人而異,根據實際修改字首

完成後儲存退出,執行make。然後就是稍微漫長的等待。

說明,由于使用的交叉編譯工具鍊的版本不同,有些版本可能會出現編譯錯誤

假如使用的是gcc的版本是4.9.1可能會出現如下的錯誤(假如沒有出錯,直接跳過洗面的錯誤提示與改正):

然後可能提示錯誤:

networking/inetd.c:178:22: fatal error:rpc/rpc.h: No such file or directory

 # include<rpc/rpc.h>

compilation terminated.

make[1]: *** [networking/inetd.o] 錯誤 1

make: *** [networking] 錯誤 2

由于使用交叉編譯器編寫的,其收索路徑是在交叉編譯器的安裝目錄内。我的交叉編譯器是用crosstool-ng制作的,是以其搜尋的路徑為在交叉編譯器的安裝的目錄下:

參考 :http://blog.csdn.net/caspiansea/article/details/21581043

/work/tools/crosstool/arm-jason-linux-gnueabi/sysroot/usr/include/在這裡确實沒有 rpc/rpc.h但是在系統的/usr/include/的目錄下存在,于是将該檔案夾拷貝到arm-jason-linux-gnueabi/sysroot/usr/include/,然後執行:

sudo cp -r /usr/linclude/rpc /work/tools/crosstool/arm-jason-linux-gnueabi/sysroot/usr/include/

這裡最好修改一下使用者組參考:http://www.cnblogs.com/jdonson/archive/2011/04/28/2031878.html

sudo chown +r  jasonwork/tools/crosstool/arm-jason-linux-gnueabi/sysroot/usr/include/rpc/*

拷貝完繼續make

networking/lib.a(inetd.o): In function`unregister_rpc':

inetd.c:(.text.unregister_rpc+0x20):undefined reference to `pmap_unset'

networking/lib.a(inetd.o): In function`register_rpc':

inetd.c:(.text.register_rpc+0x50):undefined reference to `pmap_unset'

inetd.c:(.text.register_rpc+0x74):undefined reference to `pmap_set'

collect2: error: ld returned 1 exit status

這裡好像由于glibc版本過高有關,找不到相關函數,make menuconfig 去掉如下選項。感興趣的可以換下glibc版本然後再次嘗試。

Networking Utilities  —>[ ] inetd (Internet 超級伺服器 )

去掉以後有什麼影響等後面遇到在解決。

繼續make就編譯成功了,何為編譯成功,linux因為此處無聲勝有聲,不提示錯誤就是正确的。成功後就開始安裝了。

總結:所有的這些錯誤都是因為include沒有打開的原因,遇見其他類似的錯誤,解決方案也是不盡雷同,解決方法總結起來兩種:

1将對應的檔案或者定義放到裡面:

2,将對應檔案複制到編譯出錯的檔案的同一個檔案夾下,修改include路徑

3、Busybox的安裝及其網絡檔案系統挂載

在readme裡有使用說明如下所示:

The build automatically generates a file "busybox.links",which is used by 'make install' to create symlinks to the BusyBox binary forall compiled in commands.  This uses theCONFIG_PREFIX environment variable to specify where to install, and installshardlinks or symlinks depending on the configuration preferences.  (You can also manually run the install scriptat "applets/install.sh").

在這裡使用make installCONFIG_PREFIX=/work/root

這裡需注意,在執行此指令的時候需要在busybox-1.22.1目錄下執行不然可能會提示:

make: *** No rule to make target `install'.  Stop.

最後會有如下目錄和檔案生成:

第三部分 linux busybox最小檔案系統的移植

目前位置,busybox安裝完畢,可以利用busybox制作檔案系統了,但是在制作之前,還需要了解兩個概念------動态庫和加載器。

加載器英語:Loader(本版本的加載器為ld-x.x.x.so和ld-linux.so.2),又譯為加載器、加載程式,是作業系統的一部份,負責程式的加載。:加載器(它是程式運作中不可或缺的一個步驟,加載器會将程式置放在存儲器中,讓它開始運作。加載程式的步驟包括,讀取可執行檔案,将可執行檔案的内容寫入存儲器中,之後開展其他所需的準備工作,準備讓可執行檔案運作。當加載完成之後,作業系統會将控制權交給加載的代碼,讓它開始運作;何為動态庫:這類庫的名字一般是libxxx.so;相對于靜态函數庫,動态函數庫在編譯的時候 并沒有被編譯進目标代碼中,你的程式執行到相關函數時才調用該函數庫裡的相應函數,是以動态函數庫所産生的可執行檔案比較小。由于函數庫沒有被整合進你的程式,而是程式運作時動态的申請并調用,是以程式的運作環境中必須提供相應的庫。動态函數庫的改變并不影響你的程式,是以動态函數庫的更新比較友善。 linux系統有幾個重要的目錄存放相應的函數庫,如/lib /usr/lib;那麼與之對應的有個靜态庫:這類庫的名字一般是libxxx.a;利用靜态函數庫編譯成的檔案比較大,因為整個 函數庫的所有資料都會被整合進目标代碼中,他的優點就顯而易見了,即編譯後的執行程式不需要外部的函數庫支援,因為所有使用的函數都已經被編譯進去了。當然這也會成為他的缺點,因為如果靜态函數庫改變了,那麼你的程式必須重新編譯。

我們的busybosx安裝的知識一盒shell解析指令,是以我們需要将一些動态庫和加載器(在我們的交叉編譯工具鍊中)拷貝到即将要制作的檔案系統之中:

首先我們要做的實在Busybox的安裝的目錄下/home/book/mywork/files/first_fsroot建立一個lib檔案夾

mkdir -p /work/root/lib然後将交叉編譯工具鍊安裝目錄下的/arm-class-linux-gnueabi/lib的*so.*的檔案複制到/home/book/mywork/files/first_fsroot/lib這個裡面

cp -p   安裝目錄/arm-class-linux-gnueabi/lib/*so.*  work/root/lib

(-p保持元件原有屬性)

4、建立檔案體統相關檔案

進入ubuntu的根目錄,可以看到ubuntu的檔案系統,執行ls可以看到:

第三部分 linux busybox最小檔案系統的移植

實際上他們每個檔案都有一些特殊性的用途,那麼我們要制作一個檔案系統也需要他們之中的必要檔案夾或者檔案,接下來我們将手動的去建立這些檔案夾或者檔案。

這裡進入busybox的安裝後的目錄,也就是上面剛才make install CONFIG_PREFIX= /work/root指定的目錄,進入/work/root

⑴建立etc目錄

/etc放置的是一些配置檔案,其不同的子檔案夾下是對于不同功能的配置功能。至于每個子檔案的建立,書本上網上也有相應的介紹。例如http://www.jb51.net/article/15800.htm  。

①建立etc/inittab檔案(檔案系統初始的配置檔案,每次進入檔案系統時讀取該檔案,執行該檔案所規定的指令)

這裡隻需要在win系統下打開busybox的源碼包裡的example/inittab的檔案複制出來修改一下就可以

在busybox的安裝目錄下建立etc目錄

mkdir etc

cd etc/

vi inittab

修改内容為可為:

# /etc/inittab  

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

::askfirst:-/bin/sh

# Stuff to do before rebooting

::ctrlaltdel:/sbin/reboot

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

其中,第一句的意思是: 啟動系統初始化檔案/etc/init.d/rcS。字段sysinit表明檔案/etc/init.d/rcS在系統啟動後最先執行,并且隻執行一次,init程序等待它結束才繼續執行其它動作。(腳本檔案名一般為rc,字尾S代表單使用者運作級别腳本具體級别下文做出說明);第二句:在序列槽上啟動askfirst動作的shell。需要注意的是。askfirst表明init程序先輸出“Please press Enter to actvie this console”,等使用者輸入Enter鍵之後才啟動-/bin/sh;第三句:  當按下Ctrl+Alt+Delete組合鍵時,init重新開機執行程式。字段ctrlaltdel表明當按下Ctrl+Alt+Delete組合鍵時,執行相應的程序;第四句:告訴init在關機時運作umount指令解除安裝所有的檔案系統,如果解除安裝失敗,試圖以隻讀方式重新挂載。字段shutdown表明在重新開機關閉系統指令時執行相應程序。

/etc/inittab 檔案中每個條目用來定義一個子程序,并确定它的啟動方法,具體說明在busybox-1.22.1/examples/inittab中有介紹。格式如下 

  <id>:<runlevels>:<action>:<process>

<id>:前面會自動加上/etc/即為/etc/id表示這個程序要使用的控制台(即标準輸入、标準輸出、标準錯誤裝置)。如果省略,則使用與程序一樣的控制台。

<runlevels>:對于Busybox init程式,可以省略。

<action>:表示init程式如何控制這個子程序,

<process>: 要執行的程式,它可以是可執行程式,也可以是腳本

剛才提到的運作級别這裡說明一下:

在Debian Linux中,下列路徑對應不同的運作級别。當系統啟動時,通過其中的腳本檔案來啟動相應的服務。

/etc/rc0.d Run level 0運作級别0:系統停機狀态,系統預設運作級别不能設為0,否則不能正常啟動

/etc/rc1.d Run level 1運作級别1:單使用者工作狀态,root權限,用于系統維護,禁止遠端登陸

/etc/rc2.d Run level 2運作級别2:多使用者狀态(沒有NFS)

/etc/rc3.d Run level 3運作級别3:完全的多使用者狀态(有NFS),登陸後進入控制台指令行模式

/etc/rc4.d Run level 4運作級别4:系統未使用,保留

/etc/rc5.d Run level 5運作級别5:X11控制台,登陸後進入圖形GUI模式

/etc/rc6.d Run level 6運作級别6:系統正常關閉并重新開機,預設運作級别不能設為6,否則不能正常啟動

比如上面說的rcS,其中的“S“代表擁有所有級别權限。

可以參考:http://blog.chinaunix.net/uid-22746363-id-383989.html

②建立etc/init.d/rcS檔案

同樣的參考busybox的源碼包裡的examples/bootfloppy/etc/init.d/rcS檔案

在etc/目錄下執行

mkdir init.d

cd init.d

vi rcS

内容定義為:

#!/bin/sh

mount –a

mkdir /dev/pts

mount -t devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

#! /bin/sh   #用busybox的shell

mount -a           #将檔案 /etc/fstab 中指明的檔案挂載到對應的挂載點上

mkdir /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug    #當有熱插拔事件産生時, 核心就會調用位于/sbin目錄的 mdev。 這時 mdev通過環境變量中的 ACTION 和 DEVPATH,(這兩個變量是系統自帶的)來确定此次熱插拔事件的動作以及影響了/sys 中的那個目錄。接着會看看這個目錄中是否有“dev”的屬性檔案,如果有就利用這些資訊為 這個裝置在/dev 下建立裝置節點檔案。

mdev -s    #建立dev目錄。以‘-s’為參數調用位于/sbin 目錄寫的 mdev(其實是個連結,作用是傳遞參數給/bin目錄下的busybox 程式并調用它) ,mdev掃描 /sys/class和/sys/block中所有的類裝置目錄,如果在目錄中含有名為“dev”的檔案,且檔案中包含的是裝置号,則 mdev 就利用這些資訊為這個裝置在/dev下建立裝置節點檔案。一般隻在啟動時才執行一次  “mdev -s” 。

然後修改rcS的屬性:

chmod +x etc/init.d/rcS (加上可執行屬性)

第一行指明該檔案為腳本檔案;第二行用于挂接/etc/fastab的檔案系統;

⑵建立dev裝置檔案

建立dev裝置檔案有兩種方案,其一是使用較為原始的靜态建立裝置檔案,其二使用mdev建立裝置檔案,這裡使用的是第二種方案。

mdev是busybox自帶的一個簡化版的udev,适合于嵌入式的應用埸合。其具有使用簡單的特點。它的作用,就是在系統啟動和熱插拔或動态加載驅動程式時,自動産生驅動程式所需的節點檔案。在以busybox為基礎建構嵌入式linux的根檔案系統時,使用它是較優的選擇。

medv的使用方法在doc/medv.txt上有說明。

此時,可以建立etc/fstab

在etc/目錄下執行

vi fstab

内容如下

# device      mount-point      type     options    dump   fsck order

proc                  /proc             proc          defaults     0        0

tmpfs        /tmp              tmpfs   defaults    0      0

sysfs              /sys             sysfs     defaults     0        0

tmpfs        /dev              tmpfs   defaults    0      0

這個檔案是用來自動挂載檔案系統的,至于它的含義可以參考

檔案fstab包含了你的電腦上的儲存設備及其檔案系統的資訊。它是決定一個硬碟(分區)被怎樣使用或者說整合到整個系統中的唯一檔案。

具體來說:用fstab可以自動挂載各種檔案系統格式的硬碟、分區、可移動裝置和遠端裝置等。對于Windows與arch雙作業系統使用者,用fstab挂載FAT格式和NTFS格式的分區,可以在Linux中共享windows系統下的資源。具體參考:http://ckc620.blog.51cto.com/631254/394238

其格式如下:

device:這裡用來指定你要挂載的檔案系統的裝置名稱或塊資訊,也可以是遠端的檔案系統。

mount-point:挂載點,也就是自己找一個或建立一個dir(目錄),然後把檔案系統device挂到這個目錄上,然後就可以從這個目錄中通路要挂載檔案系統。對于swap分區,這個域應該填寫:none,表示沒有挂載點。

type:這裡用來指定檔案系統的類型。下面的檔案系統都是目前Linux所能支援的:adfs、befs、cifs、ext3、 ext2、ext、iso9660、kafs、minix、msdos、vfat、umsdos、proc、reiserfs、swap、 squashfs、nfs、hpfs、ncpfs、ntfs、affs、ufs。

options :這裡用來填寫設定選項,各個選項用逗号隔開。

auto: 系統自動挂載,fstab預設就是這個選項

        defaults: rw, suid, dev, exec, auto,nouser, and async.

        noauto 開機不自動挂載

        nouser 隻有超級使用者可以挂載

        ro 按隻讀權限挂載

        rw 按可讀可寫權限挂載

        user 任何使用者都可以挂載

        (請注意光驅和軟驅隻有在裝有媒體時才可以進行挂載,是以它是noauto)

其他不在一一列出,可以用指令 man mount 來檢視具體的選項資訊。

dump :先說明這個dump名詞含義,Dump檔案是程序的記憶體鏡像。可以把程式的執行狀态通過調試器儲存到dump檔案中。Dump檔案是用來給驅動程式編寫人員調試驅動程式用的,這種檔案必須用專用工具軟體打開,比如使用WinDbg打開。此處為1的話,表示要将整個device裡的内容備份;為0的話,表示不備份。現在很少用到dump這個工具,在這裡一般選0。

  fsck order:告訴fsck程式以什麼順序檢查檔案系統,為0就表示不檢查,(/)分區永遠都是1,其它的分區隻能從2開始,當數字相同就同時檢查(但不能有兩1),比如第一和第二個分區填寫2,第三和第四個分區填寫3,則系統在檢查完根分區後,接着同時檢查第一和第二個分區,然後再同時檢查第三和第四個分區。

其中:proc檔案系統是一個僞檔案系統,它隻存在記憶體當中,而不占用外存空間。它以檔案系統的方式為通路系統核心資料的操作提供接口。使用者和應用程式可以通過proc得到系統的資訊,并可以改變核心的某些參數。由于系統的資訊,如程序,是動态改變的,是以使用者或應用程式讀取proc檔案時,proc檔案系統是動态從系統核心讀出所需資訊并送出的。

tmpfs是一種基于記憶體的檔案系統,讀取速度非常快,它和虛拟磁盤ramdisk比較類似像,但不完全相同,和ramdisk一樣,tmpfs可以使用RAM,但它也可以使用swap分區來存儲。而且傳統的ramdisk是個塊裝置,要用mkfs指令來格式化它,才能真正地使用它;而tmpfs是一個檔案系統,并不是塊裝置,隻是安裝它,就可以使用了。tmpfs是最好的基于RAM的檔案系統。詳情參考:

http://baike.baidu.com/link?url=377ZSRpUtRGUf95aioIRF_Y5XVAJdhVmEpnf3irpkJfZoBVoO5pVF9XaQ4AQW7REKiUAeWkAqphhclrwfu71OK

Sysfs 是 Linux 2.6 所提供的一種虛拟檔案系統。這個檔案系統不僅可以把裝置(devices)和驅動程式(drivers) 的資訊從核心輸出到 使用者空間,也可以用來對裝置和驅動程式做設定。

到這裡就基本設定完畢了,啊但是由于mdev是通過init程序來啟動的,是以在使用mdev構造/dev目錄前,init需要用到裝置檔案/dev/

Console 和/dev/null,是以要建立這兩個空檔案:

是以進入檔案系統建立dev目錄并手動設定這兩個檔案的主次裝置号:

mkdir  dev/

cd dev/

執行

sudo mknod console c  5     1

sudo mknod null  c  1      3

 ⑶建立其它目錄

進入/home/book/mywork/files/first_fsroot/:

mkdir proc/  mnt/  tmp/ sys/  root/

5、檔案系統的挂載

⑴為了確定檔案系統可以正确的被挂載,必須設定允許伺服器去挂載檔案系統,為此,首先需要設定伺服器的/etc/exports的内容

設定如下 sudo vi  /etc/exports

然後在後面加上: /work/root  *(rw,sync,no_root_squash)

其中前面的目錄就是代表nfs的共享目錄,也就是nfs的挂載目錄,*代表所有的客戶機都可以挂載此目錄,其中對于括号中參數:rw代表,挂載此目錄的客戶機有對該目錄檔案有讀寫權利;sync 表示檔案同步寫入記憶體和硬碟當中,與之對應的是async表示檔案先暫時放入記憶體而不是直接寫入記憶體中;no_root_squash代表挂載客戶機擁有該主機的root權限,與之對應的參數是root_squash代表如何登陸共享目錄是root使用者,那麼他的權限将被限制為匿名使用者,一般情況下,他的uid和gid會變成nobody,同時還有與之對應的參數,all_squash,通過名字就就可以看得出來(所有的被鎮壓),也就是說無論登陸共享目錄的是什麼身份都會被限制為匿名使用者。

然後可以重新開機下nfs伺服器:

sudo /etc/init.d/nfs-kernel-server restart 或者

sudo service nfs-kernel-server restart

大功告成,然後在伺服器上自己挂載自己進行測設:

sudo mount -t nfs 192.168.1.110:/home/book/mywork/files/first_fsroot/mnt (ip為ubuntu IP)

假如沒出現錯誤的話,最小檔案系統就基本完成了

⑵接下來在闆子上挂載一下。

①假設nand已經燒寫有檔案系統平且已經進入檔案系統主要在用mount指令挂載nfs就可以,

在闆子的檔案系統下建立一個mnt的檔案夾 mkdir  /mnt 然後

mount  –t nfs –o nolock  192.168.1.110:/work/root  /mnt

②假設nand裡面沒有檔案系統存在,隻需要在uboot引導設定檔案系統類型就可以:

set bootargs noinitrd root=/dev/nfsnfsroot=192.168.1.132work/root

ip=192.168.1.17192.168.1.132:192.168.1.1:255.255.255.0::eth0:offinit=/linuxrc console=ttySAC0,115200

具體的使用方法可以參考:linux源碼包下的Documentation/filesystems/nfs/nfsroot.txt

本人的客戶ip(開發闆ip)為192.168.1.11,主機ip(linux的ip)是192.168.1.110,網關為192.168.1.1,預設掩碼為255.255.255.0

(使用route指令中會顯示一條default的裡邊标有GATEWAY的那個就是你的網關!當然,也可以使用ip route 來顯示網關,随便說一下:dns可以檢視cat /etc/resolv.conf檢視nameserver)。

然後save,設定完成的print後會輸如下圖。重新開機開發闆就可以:

第三部分 linux busybox最小檔案系統的移植

繼續閱讀