1、準備工作
busybox源碼下載下傳:https://busybox.net/downloads/
主機環境:Ubuntu 16.04
目标主機:Freescale imx6ull
工具鍊:arm-linux-gnueabihf (4.9.4)
2、制作檔案系統
2.1 解壓壓縮包
tar xjvf busybox-1.32.0.tar.bz2
2.2 配置交叉編譯工具鍊
cd busybox-1.32.0/
make menuconfig
# 配置路徑
Settings --->
--- Build Options
(arm-linux-gnueabihf-) Cross compiler prefix
若舊版busybox不支援menuconfig配置交叉編譯工具鍊也可以直接修改Makefile:
CROSS_COMPILE ?= arm-linux-gnueabihf-
ARCH ?= arm
2.3 編譯
2.4 安裝
# 建立需要安裝的目錄
mkdir myrootfs
# 安裝到建立的目錄中,如果不指定路徑會預設安裝在主機的目錄,可能會造成嚴重後果
make install CONFIG_PREFIX=./myrootfs/
# 安裝完成會生成一下目錄
ls myrootfs/
bin linuxrc sbin usr
2.5 完善其他目錄
dev目錄:(裝置相關)
mkdir dev
cd dev/
sudo mknod console c 5 1
sudo mknod null c 1 3
etc目錄:(系統配置)
mkdir etc
cd etc/
vi inittab # 檔案内容在後面
vi fstab # 檔案内容在後面
mkdir init.d
cd init.d/
vi rcS # 檔案内容在後面
chmod +x rcS
# 1、inittab内容如下:
console::askfirst:-/bin/sh # '-'代表互動
#tty1::askfirst:-/bin/sh
::sysinit:/etc/init.d/rcS # 執行rcS檔案初始化系統
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
# 2、fstab内容如下:
#device mount-point type options dump fask order
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
# 3、rcS内容如下:
mount -a # 會調用/etc/fstab檔案去挂載
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug # 開啟熱拔插機制
mdev -s
解析:
inittab說明可以參考busybox中examples/inittab檔案,内容格式為
<id>:<runlevels>:<action>:<process>
;id是唯一的,runlevels完全可以忽略,主要看action動作選項,它是指定process可能會用到的動作;
rcS和fstab所涉及的檔案系統主要用途如下:tmpfs用于記憶體檔案系統,用于減少對flash的讀寫操作;pts用于支援外部網絡連接配接(telnet)的虛拟終端;sysfs用于mdev通過它獲得裝置資訊;proc用于檢視裝置運作情況;
其他目錄:
mkdir lib proc mnt tmp sys root usr/lib -p
2.6 拷貝C庫(c程式運作會依賴動态庫)
cp -d /arm-linux-gnueabihf-linaro-4.9.4-2017.01-x86_64/arm-linux-gnueabihf/libc/usr/lib/*so* ./usr/lib/
cp -d /arm-linux-gnueabihf-linaro-4.9.4-2017.01-x86_64/arm-linux-gnueabihf/libc/lib/*so* ./lib/
2.7 完成!
完成後的檔案架構如下:
[email protected]:~/busybox-1.32.0/myrootfs$ tree
.
├── bin
│ ├── arch -> busybox
│ ├── # 省略...
│ └── zcat -> busybox
├── dev
│ ├── console
│ └── null
├── etc
│ ├── fstab
│ ├── init.d
│ │ └── rcS
│ └── inittab
├── lib
│ ├── ld-2.19-2014.08-1-git.so
│ ├── # 省略...
│ └── libutil.so.1 -> libutil-2.19-2014.08-1-git.so
├── linuxrc -> bin/busybox
├── mnt
├── proc
├── root
├── sbin
│ ├── acpid -> ../bin/busybox
│ ├── # 省略...
│ └── zcip -> ../bin/busybox
├── sys
├── tmp
└── usr
├── bin
│ ├── [ -> ../../bin/busybox
│ ├── # 省略...
│ └── yes -> ../../bin/busybox
├── lib
│ ├── libanl.so -> ../../lib/libanl.so.1
│ ├── # 省略...
│ └── libutil.so -> ../../lib/libutil.so.1
└── sbin
├── addgroup -> ../../bin/busybox
├── # 省略...
└── udhcpd -> ../../bin/busybox
(注:這裡隻是示範建構最簡單的檔案系統,需要添加新的功能可以通過make menuconfig根據自己需求添加對應的功能。)