busybox是構造文件系統最常用的軟件工具包,它被非常形象地稱爲嵌入式Linux系統中的“瑞士軍刀”,因爲它將許多常用的Linux命令和工具結合到了一個單獨的可執行程序(busybox)中。
雖然與相應的GNU工具比較起來,busybox所提供的功能和參數略少,但在比較小的系統(例如啓動盤)或者嵌入式系統中已經足夠了。
busybox在設計上就充分考慮了硬件資源受限的特殊工作環境。它採用一種很巧妙的辦法減少自己的體積:所有的命令都通過“插件”的方式集中到一個可執行文件中,在實際應用過程中通過不同的符號鏈接來確定到底要執行哪個操作。採用單一執行文件的方式最大限度地共享了程序代碼,甚至連文件頭、內存中的程序控制塊等其他系統資源都共享了,對於資源比較緊張的系統來說,真是最合適不過了。在busybox的編譯過程中,可以非常方便地加減它的“插件”,最後的符號鏈接也可以由編譯系統自動生成。
【實驗目的】
熟悉Linux文件系統目錄結構,創建自己的文件系統,通過NFS方式測試;用文件系統工具生成ramdisk文件系統映象文件。
【實驗環境】
主機:ubuntu 12.04發行版
目標機:FS210平臺
交叉編譯工具:arm-none-linux-gnueabi-gcc
【實驗步驟】
一、根文件系統製作
1、 源碼下載
我們選擇的版本是busybox-1.17.3.tar.bz2
下載路徑爲:http://busybox.net/downloads/
2、 解壓源碼
$ tar xvf busybox-1.17.3.tar.bz2
3、 進入源碼目錄,修改Makefile
$ cd busybox-1.17.3
vim Makefile
ARCH = arm
CROSS_COMPILE = arm-none-linux-gnueabi-
4、 配置源碼
$ make menuconfig
Busybox Settings --->
Build Options --->
[*] Build BusyBox as a static binary(no shared libs)
[ ] Force NOMMU build
[ ] Build with Large File Support(for accessing files > 2 GB)
()Cross Compiler prefix
() Additional CFLAGS
Installation Options --->
[*] Don't use /usr
Appletslinks (as soft-links) --->
(./_install) BusyBoxinstallation prefix (NEW)
5、 編譯
$ make
6、 安裝
$ make install
busybox默認安裝路徑爲源碼目錄下的_install
7、 進入安裝目錄下
$ cd _install
$ ls
bin linuxrc sbin
8、 創建其他需要的目錄
$ mkdir dev etc mnt proc var tmp sys root lib home usr
9、 添加動態庫
? 將工具鏈中的庫拷貝到_install目錄下的lib目錄
$cp -raf/usr/local/toolchain-4.5.1-farsight/arm-none-linux-gnueabi/lib/* lib/
? 刪除庫文件中的符號表,也叫瘦身
$ rm -rf lib/*.a
$ arm-none-linux-gnueabi-strip lib/*
10、 添加系統啓動文件
在_install/etc下添加文件inittab,文件內容如下:
::sysinit:/etc/init.d/rcS
::askfirst:-/bin/ash
::ctrlaltdel:/sbin/reboot
::shutdown:/sbin/swapoff -a
::shutdown:/bin/umount -a -r
::restart:/sbin/init
格式說明:
<id>:<runlevels>:<action>:<process>: 在什麼時間啓動什麼進程
id: 進程所使用的終端名
runlevels:不用填寫
<action>: Valid actions include:sysinit, respawn, askfirst, wait, once, restart, ctrlaltdel, and shutdown.\
sysinit: 系統初始化的時候,放在最前面
respawn,askfirst是一樣的,如果process意外終止啦,系統會講其重啓
askfirst 會有提示Please press Enter to activate this console
wait: 該進程一定要執行完,才能執行下一個
once, 進程如果意外終止,那麼不會重啓
11,在_install/etc下添加文件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
這裏我們掛載的文件系統有三個proc、sysfs和tmpfs。在內核中proc和sysfs默認都支持,而tmpfs是沒有支持的,我們需要添加tmpfs的支持
修改內核配置:
File systems --->
Pseudo filesystems --->
[*] /proc file system support (NEW)
[*] sysfs file system support(NEW)
[*] Virtual memory file systemsupport (former shm fs)
[*] Tmpfs POSIX Access Control Lists
重新編譯內核
12,在_install/etc下創建init.d目錄,並在init.d下創建rcS文件,rcS文件內容爲:
cd _install/etc
mkdir init.d
vim init.d/rcS
===============================================
#!/bin/sh
echo ">>>>>>>>in/etc/init.d/rcS<<<<<<<<<<<<<<<<<"
/bin/mount -a
echo /sbin/mdev >/proc/sys/kernel/hotplug
/sbin/mdev -s
===============================================
mdev是用於自動創建設備節點
爲rcS添加可執行權限:
$ chmod +x init.d/rcS
13,在_install/etc下添加profile文件,文件內容爲:
#!/bin/sh
export HOSTNAME=farsight
export USER=root
export HOME=root
export PS1="[$USER@$HOSTNAME \W]\#"
PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH
14、 設備文件創建
根文件系統中有一個設備節點是必須的,在dev下創建console節點
$ mknod dev/console c 5 1
以上的步驟就完成了linux根目錄所需要的所有文件,可以直接使用
NFS測試
1、將做好的根目錄複製成/opt/rootfs(如果你已經有這個目錄,就要注意啦)
$sudo cp -raf _install /opt/rootfs
2, 在ubuntu中將/opt/rootfs設置成nfs文件系統
修改ubuntu的/etc/exports: 將/opt/rootfs設置成nfs文件系統格式
/opt/rootfs *(subtree_check,rw,no_root_squash,async)
sudo service nfs-kernel-server restart
測試:
sudo mount -t nfs 192.168.7.22:/opt/filesystem/ /mnt/nfs/
設置uboot環境變量
===========================================================================
# setenv bootcmd tftp 20800000 zImage \; go 20800000
# setenv bootargs root=nfs nfsroot=192.168.7.100:/opt/rootfs init=/linuxrc console=ttySAC0,115200 ip=192.168.7.200
# saveenv
===========================================================================
如果開機就運行一個自己可執行程序,可以做如下處理
1、編譯出一個可執行程序:/bin/hello_arm/
2、/etc/init.d/rcS中啓動可執行程序
方法一:直接在/etc/init.d/rcS添加一條:
/bin/hello_arm
方法二:另外再寫一個腳本,然後在/etc/init.d/rcS中啓動這個腳本
寫一個腳本:/etc/local/mysrv.sh
#!/bin/ash
echo "my first app"
/bin/hello_arm
然後在/etc/init.d/rcS添加一條
/etc/local/mysrv.sh
重新啓動開發板,查看是否能夠正常掛載,功能是否正常