天天看點

Linux rootfs:使用busybox建構根檔案系統

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根據自己需求添加對應的功能。)

繼續閱讀