測試平台
宿主機平台:Ubuntu 12.04.4 LTS
目標機:Easy-ARM IMX283
目標機內核:Linux 2.6.35.3
交叉編譯器:arm-linux-gcc 4.4.4
Busybox簡介
關於busybox的原理及代碼分析推薦 busybox詳解
Busybox是一個開源項目,遵循GPL v2協議。Busybox將眾多的UNIX命令集合進一個很小的可執行程序中,可以用來替代GNU fileutils、shellutils等工具集。Busybox中各種命令與相應的GNU工具相比,所能提供的選項比較少,但是也足夠一般的應用了。Busybox主要用於嵌入式系統。
Busybox構建基礎文件系統
下載 busybox
備注:2.6的內核不要使用太高版本busybox,會出現不兼容情況
wget https://busybox.net/downloads/busybox-1.22.1.tar.bz2
解壓
tar xjvf busybox-1.22.1.tar.bz2 cd busybox-1.22.1
編譯配置
make menuconfig
下面記錄一下我主要配置的地方
1.Build Options
1)設置為靜態編譯,反正也不太大,共享庫的話還得拷貝動態庫文件
2)交叉編譯工具,也可在make時使用 make ARCH=arm CROSS_COMPILE=arm-none-linux-gnueabi-
2.Installation Options
安裝路徑設置,最好放在支持nfs掛載的目錄里面,因為后面文件系統需要通NFS掛載來測試
剩下的都是一些工具集的配置,剛開始使用默認配置即可;
編譯與安裝
make
make install
開始構建文件系統
1.完善文件系統
查看安裝文件夾,發現之后 bin sbin usr 這三個文件夾,我們在此基礎上添加其他文件夾
mkdir dev etc lib proc sys tmp var
2.添加C運行庫
C運行庫可以直接從使用的交叉編譯工具中獲取,一般在 /arm-none-linux-gnueabi/libc/lib/
cp -av /home/ctools/arm-2011.03/arm-none-linux-gnueabi/libc/lib/* lib/
3.添加初始化腳本
初始化腳本放置在 etc 目錄下, 先從busybox中拷貝初始化腳本模板
cp -av /home/vmuser/wtools/busybox-1.22.1/examples/bootfloppy/etc/* etc/
初始化腳本文件修改
1)打開 myrootfs/etc/inittab, 注釋第三行,因為我們不是使用tty2
最小文件系統掛載測試
NFS根文件系統設置
1)開機按空格,進入Uboot
2)修改內核啟動參數變量 bootargs ,設置為內核 nfs 啟動
setenv bootargs 'root=/dev/nfs rw console=ttyAM0,115200n8 nfsroot=192.168.1.123:/home/vmuser/workspace/myrootfs ip=192.168.1.124:192.168.1.123:192.168.1.254:255.255.255.0:epc.zlgmcu.com:eth0:off mem=64M'
saveenv
reset
3)復位,內核啟動正常
文件系統增加功能
上面的系統啟動后,發現僅掛載了 proc文件系統
/etc/fstab是用來存放文件系統的靜態信息的文件,當系統啟動的時候,系統會自動地從這個文件讀取信息,並且會自動將此文件中指定的文件系統掛載到指定的目錄。
/etc/fstab文件主要包括6段,依次是:
<file system> <dir> <type> <options> <dump> <pass>
<file system> 要掛載的分區或存儲設備 <dir> 掛載的目錄位置 <type> 掛載分區的文件系統類型,比如:ext3、ext4、xfs、swap <options> 掛載使用的參數有哪些。舉例如下: auto - 在啟動時或鍵入了 mount -a 命令時自動掛載。 noauto - 只在你的命令下被掛載。 exec - 允許執行此分區的二進制文件。 noexec - 不允許執行此文件系統上的二進制文件。 ro - 以只讀模式掛載文件系統。 rw - 以讀寫模式掛載文件系統。 user - 允許任意用戶掛載此文件系統,若無顯示定義,隱含啟用 noexec, nosuid, nodev 參數。 users - 允許所有 users 組中的用戶掛載文件系統. nouser - 只能被 root 掛載。 owner - 允許設備所有者掛載. sync - I/O 同步進行。 async - I/O 異步進行。 dev - 解析文件系統上的塊特殊設備。 nodev - 不解析文件系統上的塊特殊設備。 suid - 允許 suid 操作和設定 sgid 位。這一參數通常用於一些特殊任務,使一般用戶運行程序時臨時提升權限。 nosuid - 禁止 suid 操作和設定 sgid 位。 noatime - 不更新文件系統上 inode 訪問記錄,可以提升性能。 nodiratime - 不更新文件系統上的目錄 inode 訪問記錄,可以提升性能(參見 atime 參數)。 relatime - 實時更新 inode access 記錄。只有在記錄中的訪問時間早於當前訪問才會被更新。(與 noatime 相似,但不會打斷如 mutt 或其它程序探測文件在上次訪問后是否被修改的進程。),可以提升性能。 flush - vfat 的選項,更頻繁的刷新數據,復制對話框或進度條在全部數據都寫入后才消失。 defaults - 使用文件系統的默認掛載參數,例如 ext4 的默認參數為:rw, suid, dev, exec, auto, nouser, async. <dump> dump 工具通過它決定何時作備份. dump 會檢查其內容,並用數字來決定是否對這個文件系統進行備份。 允許的數字是 0 和 1 。0 表示忽略, 1 則進行備份。大部分的用戶是沒有安裝 dump 的 ,對他們而言 <dump> 應設為 0。 <pass> fsck 讀取 <pass> 的數值來決定需要檢查的文件系統的檢查順序。允許的數字是0, 1, 和2。 根目錄應當獲得最高的優先權 1, 其它所有需要被檢查的設備設置為 2. 0 表示設備不會被 fsck 所檢查。
我們參照模板添加 sysfs tmpfs devfs的支持
動態創建設備節點
修改 /etc/init.d/rcS
#! /bin/sh /bin/mount -a mkdir -p /dev/pts mount -t devpts devpts /dev/pts echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
然后重新啟動,增加的文件系統均已支持