busybox是一個複合了大量簡易版linux工具的程序,嵌入式系統中使用它能夠快速創建一個相對簡易的根文件系統。
【1】下載busybox
官網 www.busybox.net
目前(2015.8.4)的最新穩定版爲1.23.2
【2】編譯busybox
編譯busybox前,請安裝好交叉工具鏈,好比我這裏是omapl138的工具鏈,安裝位置/opt/arm-linux-gcc/omapl138/bin/,由於編譯器前綴和另一個編譯器的相同,每次使用前設置環境變量linux
PATH=$PATH:/opt/arm-linux-gcc/omapl138/bin/ cd ~/buildspace tar xf ~/Downloads/busybox-1.23.2.tar.bz2 cd busybox-1.23.2 make menuconfig make make install
menuconfig時,
Busybox Settings --->
Build Options --->
() Cross Compiler prefix 填入交叉工具鏈的前綴,這裏是arm-none-linux-gnueab-
Installation Options("make install" behavior) ->
What kind of applet links to install (as soft-links)
(./_install) BusyBox installation prefix 安裝路徑,我喜歡用這個默認值
其餘選項通常默認就夠用。
【3】構建根文件系統目錄
以root用戶建立根目錄,拷貝busybox文件,建立幾個目錄c++
sudo -s mkdir /home/rootfs cd /home/rootfs cp -r ~/biuldspace/busybox-1.23.2/_install/* . mkdir dev etc lib mnt opt var tmp proc sys root
建立兩個基本設備文件shell
mknod dev/console c 5 1 mknod dev/null c 1 3
建立/linuxrc的初始化配置文件/etc/inittab
該文件中指定linuxrc初始化完成後運行/etc/init.d.rcS腳本。而後在ttyS2運行一個shell,該shell不須要登錄。app
::sysinit:/etc/init.d/rcS ::ctrlaltdel:/sbin/reboot ::shutdown:/sbin/swapoff -a ::shutdown:/bin/umount -a -r ::restart:/sbin/init ttyS2::respawn:-/bin/sh
/etc/init.d/rcS的內容。在rcS文件中,必須使用絕對路徑,由於環境變量尚未初始化......工具
mount -a # 掛載在/etc/fstab中定義的全部掛載點 echo /sbin/mdev > /proc/sys/kernel/hotplug # 設置熱插拔事件處理程序爲mdev mdev -s #設備節點維護程序mdev初始化 mkdir /dev/pts #爲telnetd建立pts目錄 mount -t devpts devpts /dev/pts #掛載pts目錄 /bin/hostname -F /etc/hostname # 設置主機名。/etc/hostname 的內容爲主機名字符串 mkdir /var/run #ifup須要該目錄 /sbin/ifup -a #根據/etc/network/interface設置網卡 /usr/sbin/telnetd & #運行telnetd
#後臺運行你的程序
/etc/fstab的內容oop
tmpfs /dev tmpfs defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /var tmpfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0
建立ifup須要的文件夾post
cd /home/rootfs/etc/ mkdir network cd network mkdir if-down.d if-post-down.d if-pre-up.d if-up.d
/etc/network/interfaces 的內容ui
auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 192.168.0.5 netmask 255.255.255.0 gateway 192.168.0.1
/etc/passwd 的內容spa
root::0:0:root:/root:/bin/sh
/etc/profile 的內容.net
PS1='\u@\h:\w \$ ' #設置終端提示符 PATH=$PATH:/usr/local/bin #設置搜索路徑 export TERM=vt102 #termcap的環境變量,gdb -tui須要 export TERMINFO=/usr/share/terminfo
拷貝動態庫
cd /opt/arm-linux-gcc/omap_4.3.3/arm-none-linux-gnueabi/libc cp lib/* /home/rootfs/lib/ cp usr/lib/libstdc++.* /home/rootfs/lib/
【4】製做ubi鏡像文件
if [ -e ubifs.img ]; then rm ubifs.img; fi if [ -e ubi.img ]; then rm ubi.img; fi rootfs=/home/rootfs mkfs.ubifs -v -r ${rootfs} -m 2048 -e 126976 -c 3717 -o ubifs.img -F ubinize -v -o ubi.img -O 2048 -m 2048 -p 128KiB -s 512 ubinize.cfg rm ubifs.img
其中,mkfs.ubifs須要加-F參數,不然ubi文件系統極可能在啓動一次後就壞掉。-F參數的意思是在第一次啓動時清空空閒區域。
ubinize.cfg的內容
[rootfs] mode=ubi image=ubifs.img vol_id=0 vol_type=dynamic vol_name=rootfs vol_flags=autoresize
mkfs.ubifs是建立單個卷(相似邏輯分區)的鏡像,ubinize是建立一個能夠包含多個卷的鏡像(相似擴展分區)。ubinize.cfg中,[]內爲卷的名字。