文件系統的製作步驟
from:http://blog.sina.com.cn/s/blog_87766e4a0100z6lo.html
1、 建立工作目錄(這邊設定工作目錄爲/root/build_rootfs),下載busybox到該目錄
[root@localhost /]#mkdir /root/build_rootfs |
2、 建立根目錄, 該目錄就是我們要移植到目標板上的目錄,對於嵌入式的文件系統,根目錄下必要的目錄包括bin,dev,etc,usr,lib,sbin,proc sys tmp
[root@localhost /]# cd /root/build_rootfs/ [root@localhost build_rootfs]#mkdir rootfs [root@localhost build_rootfs]#cd rootfs [root@localhost rootfs]# mkdir bin dev etc usr lib sbin proc sys tmp [root@localhost rootfs]# mkdir usr/bin usr/sbin usr/lib |
/bin bin是Binary的縮寫。這個目錄存放着最經常使用的命令。
/sbin s就是Super User的意思,這裏存放的是系統管理員使用的系統管理程序。
/dev dev是Device(設備)的縮寫。該目錄下存放的是Linux的外部設備,在Linux中訪問設備的方式和訪問文件的方式是相同的。
/etc這個目錄用來存放所有的系統管理所需要的配置文件和子目錄。
/usr 我們要用到的很多應用程序和文件幾乎都存放在usr目錄下
/usr/bin存放着許多應用程序;
/usr/sbin存放root超級用戶使用的管理程序;
/usr/lib存放一些常用的動態鏈接共享庫和靜態檔案庫;
/lib這個目錄裏存放着系統最基本的動態鏈接共享庫,其作用類似於Windows裏的DLL文件。幾乎所有的應用程序都需要用到這些共享庫。
/proc這個目錄是一個虛擬的目錄,它是系統內存的映射,我們可以通過直接訪問這個目錄來獲取系統信息。
/proc 是系統運行時進程和內核的信息存在這裏,它屬於僞文件系統,存在於內存中。
/tmp 用於用戶程序運行時產生的臨時文件。
/sys 內核所支持的sysfs文件系統。Sysfs把系統上的設備和總線組織成一個分級的文件,以被用戶空間存取。
3、 交叉編譯busybox
busybox的源碼可以從http://www.busybox.net/downloads/下載,這裏我們下載一個1.5.0版本的源碼。
我們在配置busybox的時候是基於默認配置之上來配置的;先make defconfig就是把busybox配置成默認,然後再make menuconfig來配置busybox。
說明:我們在配置一個源代碼包之前,可以先閱讀源碼包目錄下的README和INSTALL文件以及Makefile的註釋部分,也可以到http://www.busybox.net網站以獲取幫助。
http://www.busybox.net/FAQ.html#configure的第二個問題2 How do I configure busybox?有介紹怎麼去配置。
(1) 解壓busybox-1.15.3.tar.gz和mkyaffs2image
[root@localhost build_rootfs]# tar -zxvf busybox-1.15.3.tar.gz [root@localhost build_rootfs]# tar -zxvf mkyaffs2image.tgz [root@localhost build_rootfs]# tar -zxvf mkyaffs2image.tgz usr/sbin/mkyaffs2image usr/sbin/mkyaffs2image-128M [root@localhost build_rootfs]# mv usr/sbin/mkyaffs2image mkyaffs2image [root@localhost build_rootfs]# rm -rf usr [root@localhost build_rootfs]# cd busybox-1.13.3 |
(2) 添加交叉工具鏈(如果這個編譯器已經寫入到配置文件中,這步可以省略)
[root@localhost build_rootfs]# export PATH=/usr/local/arm/arm-linux-gcc/bin:$PATH |
(3) 配置編譯
[root@localhost busybox-1.15.3]# make defconfig [root@localhost busybox-1.15.3]# make menuconfig |
手工配置如下:
如果您正在構建一個具有特殊需求的嵌入式設備,那就可以手工使用 make menuconfig目標來配置BusyBox 的內容。如果您熟悉 Linux 內核的編譯過程,就會注意到 menuconfig 與配置 Linux 內核的內容所使用的目標相同。實際上,它們都採用了相同的基於 ncurses 的應用程序。
使用手工配置,我們可以指定在最終的 BusyBox 映像中包含的命令。我們也可以對 BusyBox 環境進行配置,例如包括對 NSA(美國國家安全代理)的安全增強 Linux(SELinux),指定要使用的編譯器(用來在嵌入式環境中進行交叉編譯)以及 BusyBox 應該靜態編譯還是動態編譯。圖 1 給出了 menuconfig的主界面。在這裏我們應該可以看到可以爲 BusyBox 配置的不同類型的應用程序(applet)。
Busybox setting
->builds options
[*] build busybox as a static binary(a)//選擇將busybox進行靜態編譯
->installitation options
[*] don’t use /usr (b) //選擇上 Don’t use /usr
->Busybox Library Tuning->
[ *]Username completion
[ *]Fancy shell prompts
//編譯出的busybox的shell命令解釋器支持顯示當前路徑及主機信息
Miscellaneous Utilities ―> (c)
[ ] taskset
其他選項都是一些linux基本命令選項,自己需要哪些命令就編譯進去,一般用默認的就可以了。保存退出。
(a)這個選項是一定要選擇的,這樣才能把busybox編譯成靜態鏈接的可執行文件,運行時才獨立於其他函數庫.否則必需要其他庫文件才能運行,在單一個linux內核不能使他正常工作。
(b)這個選項也一定要選,否則make install後,busybox將安裝在原系統的/usr下,這將覆蓋掉系統原有的命令.選擇這個選項後,make install後會在busybox目錄下生成一個叫_install的目錄,裏面有busybox和指向他的鏈接.
( c)
Taskset命令能夠爲即將執行的程式或已有進程指定affinity屬性,讓該程式或進程運行在指定的CPU上。下面是幾個例子:
taskset ?c 1 nohup perl pi.pl & ---指定在1號CPU上執行指定的perl程式
taskset ?c 1 ?P 10284 ---將10284號進程限定在1號CPU上執行
4、 編譯安裝
[root@localhost busybox-1.15.3]# make ARCH=arm CROSS_COMPILE=arm-linux- CONFIG_PREFIX=/root/build_rootfs/rootfs all install |
(此時bin(195個 290M) sbin(58個 86.4M ---windows下看的結果) 已安裝了文件,其實是busybox的可執行文件和指向它的鏈接。不同的鏈接名完成不同的功能,命令行調用作爲一個參數傳給busybox,即可完成相應的功能,即於 BusyBox 中包含的每個工具來說,都會創建一個符號鏈接,這樣就可以使用這些符號鏈接來調用 BusyBox 了。BusyBox 然後可以通過 argv[0] 來調用內部工具)
ARCH指定平臺
CROSS_COMPILE指定交叉編譯
CONFIG_PRRFIX指定安裝的路徑
5、 複製c庫
[root@localhost build_rootfs]# cp /usr/local/arm/arm-linux-gcc/arm-none-linux-gnueabi/libc/armv4t/lib/* -a /root/build_rootfs/rootfs/lib/ |
交叉應用程序的開發需要用到交叉編譯的鏈接庫,交叉編譯的鏈接庫是在交叉工具鏈的lib目錄下;我們在移植應用程序到我們的目標板的時候,需要把交叉編譯的鏈接庫也一起移植到目標板上,這裏我們用到的交叉工具鏈的路徑是/usr/local/arm/3.3.2/,所以鏈接庫的目錄是/usr/local/arm/3.3.2/lib(本來跟目標板相關的目錄是/usr/local/arm/3.3.2/arm-linux, 因此要拷貝的鏈接庫應該在/usr/local/arm/3.3.2/arm-linux/lib下,但是此目錄的很多鏈接都是鏈接到/usr/local/arm/3.3.2/lib目錄下的庫文件,所以我們從/usr/local/arm/3.3.2/lib目錄拷貝庫),此目錄下有四種類型的文件(其實就2種:.so動態庫 .a靜態庫):
(1) .so動態庫
A、實際的共享鏈接庫(libname-version.so)
如:libc-2.3.2.so
B、主修訂版本的符號鏈接. (lib.so.version)
程序一旦鏈接了特定的鏈接庫,它將會使用其符號鏈接,程序啓動時,加載器在加載程序之前,會加載該文件。
如:libc.so.6
C、與版本無關的符號鏈接(libname.so)
這些符號鏈接的只要功能是爲需要鏈接特定的鏈接庫的所有程序提供一個通用的條目,與版本號無關。
如:libc.so
(2) .a靜態庫
靜態鏈接庫包文件,如libc.a
6、 建立配置文件
內核啓動的最後,會執行sbin/init程序,init程序在啓動的最後會執行/bin/sh,sh在啓動的時候會讀取文件。
(1) 在/etc/profile文件裏設定PATH,LD_RARYLIB_PATH環境變量,目的是配置用戶程序運行的環境。
[root@localhost build_rootfs]# cd rootfs/etc/ [root@localhost etc]# vi profile |
#!/bin/sh
echo "Set seaech library in /etc/profile"
export LD_LIBRARY_PATH=/lib #定義查找可用共享對象的位置 //usr/lib
echo "Set user path in /etc/profile"
export PATH=/bin:/sbin:/usr/bin #命令的路徑
export PS1=[root@mini2440\ \\W]\\$ #當有自動補齊功能時使用這個
#export PS1=[root@mini2440]\# #//命令行提示符
(2) 創建inittab文件,內容如下每一條目用來定義一個子進程,並確定它的啓動方法(該文件的)
[root@localhost etc]# vim inittab |
::sysinit:/etc/init.d/rcS
::respawn:-/bin/sh #注意:“-”要加上
::ctrlaltdel:/bin/umount -a -r
(3) 創建/etc/init.d/rcS 文件,內容如下(rcS是個可執行的腳步文件,是系統啓動之後先執行的命令)
[root@localhost etc]# mkdir init.d [root@localhost etc]#vi init.d/rcS [root@localhost etc]#chmod +x rcS |
#! /bin/sh
//“mount -a”命令後將掛載proc,tmpfs 等包含在該文件中的所有的文件系統。
/bin/mount -a
//下面三行是配置增加熱插拔支持
/bin/mount -t tmpfs mdev /dev //(1)
/bin/echo /sbin/mdev > /proc/sys/kernel/hotplug //(2)
mdev –s //(3)
l (1)設置dev 目錄被用作一個 tmpfs 文件系統的掛載點,該文件系統是由 mdev 填充的。 這樣在/dev目錄下就可以看到內核已經掛載的驅動的節點。
l (2)設置內核的hotplug handler 爲 mdev, 即當設備熱插拔時,由 mdev 接收來自內核的消息並作出相應的迴應, 比如掛載U盤。當有熱插拔事件產生時, 內核就會調用位於/sbin目錄的 mdev。 這時 mdev通過環境變量中的 ACTION 和 DEVPATH, (這兩個變量是系統自帶的)來確定此次熱插拔事件的動作以及影響了/sys 中的那個目錄。接着會看看這個目錄中是否有“dev”的屬性文件,如果有就利用這些信息爲 這個設備在/dev 下創建設備節點文件。
l (3) mdev 主要是實現對移動設備的動態掛載,在/dev 目錄下建立必要的設備節點。mdev掃描 /sys/class和/sys/block中所有的類設備目錄,如果在目錄中含有名爲“dev”的文件,且文件中包含的是設備號,則mdev 就利用這些信息爲這個設備在/dev下創建設備節點文件。
(4) 在/etc/目錄下添加文件fstab,內容如下(該文件定義了文件系統的靜態信息)
[root@localhost etc]# vim fstab |
proc /proc proc defaults 0 0
none /tmp ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
則已經掛載的設備可以通過命令查詢#lsmod
所掛載的設備的設備號可查詢#cat /proc/devices
其中/proc 是系統運行時進程和內核的信息存在這裏,它屬於僞文件系統,存在於內存中。
/tmp 用於用戶程序運行時產生的臨時文件。
/sys 內核所支持的sysfs文件系統。Sysfs把系統上的設備和總線組織成一個分級的文件,以被用戶空間存取。
7、 構建/dev目錄
[root@localhost rootfs]# mknod dev/console c 5 1 //建立控制檯和終點的節點 [root@localhost rootfs]# mknod dev/null c 1 3 [root@localhost rootfs]# mknod dev/tty1 c 4 1 [root@localhost rootfs]# mknod dev/tty2 c 4 2 [root@localhost rootfs]# mknod dev/tty3 c 4 3 [root@localhost rootfs]# mknod dev/tty4 c 4 4 |
8、 添加一個用戶程序
[root@localhost build_rootfs]# vim hehho.c [root@localhost build_rootfs]# arm-linux-gcc hello.c -o hello [root@localhost build_rootfs]# cp hello /rootfs/usr/bin |
隨便寫一個hello.c的用戶程序,編譯完之後放在usr/bin目錄下,用於文件系統燒寫後的測試
9、 製作yaffs2映像文件
[root@localhost build_rootfs]# ./mkyaffs2image-128M rootfs rootfs.yaffs2 |
10、 燒寫rootfs.yaffs2的第3分區
[u-boot@mini2440]#tftp 30008000 rootfs.yaffs2 [u-boot@mini2440]#nand erase 560000 40000000 //下載完提示下載了多大就多大,是16進制 [u-boot@mini2440]#nand write.yaffs 30008000 560000 615300 [u-boot@mini2440]#set bootargs 'noinitrd root=/dev/mtdblock3 rootfstype=yaffs2 rw console=ttySAC0,115200 init=/linuxrc mem=64M' [u-boot@mini2440]#saveenv [u-boot@mini2440]#reset |