busybox製作最小根檔案系統
接上篇,qemu啟動linux核心 ,啟動核心失敗後,開始製作一個最小的ramdisk根檔案系統。
根檔案系統製作工具busybox,還是走大眾路線吧。原始碼包下載地址:https://busybox.net/
直接進入busybox的根目錄,準備編譯,使用預設配置檔案defconfig,
生成配置檔案make ARCH=arm defconfig
再修改下配置項make ARCH=arm menuconfig
選擇靜態編譯
其他可以預設選項,然後開始編譯,使用我們之前製作的交叉編譯工具鏈。
make ARCH=arm CROSS_COMPILE=arm-unknown-linux-gnueabi- -j4
編譯成功後,再進行安裝步驟,因為整個過程使用的是預設配置,所以安裝目錄在根目錄下_install。
製作一個4M大小的ramdisk映象檔案,
dd if=/dev/zero of=test.rd bs=1024 count=4096
格式化為ext2的檔案系統,
mkfs.ext2 test.rd
掛載test.rd到指定目錄test
mkdir test;sudo mount test.rd test;
拷貝busybox安裝好的檔案到掛載目錄test,
sudo cp busybox-1.29.3/_install/* test/ -arf;sudo umount test;
拷貝配置檔案
sudo cp busybox-1.29.3/examples/bootfloppy/etc test/ -arf
進入掛載目錄建立必備的裝置節點(這是針對我編譯出來的核心4.16.18要求,其他的核心可能不需要)
sudo mknod -m 600 dev/tty2 c 4 2
建立必備目錄proc、sys(核心啟動後會生成一些內容在此)
(這一步可以不做,直接掛載也是可以起來的)最後還需要拷貝一些必備的庫,如果不知道需要拷貝什麼庫,可以將交叉編譯工具鏈的動態庫全部拷貝到跟檔案系統的lib目錄,但是很多檔案,都是不需要的。而且會讓ramdisk變大,如果超過核心配置的大小(通常預設4M),系統會無法正常啟動。我們可以使用交叉編譯工具編譯一個動態的Hello程式,使用arm-xxx-ldd檢視hello的動態依賴庫,然後將這些庫拷貝過去,比如,
[email protected]:~/work/linux-4.16.18$ arm-unknown-linux-gnueabi-ldd --root /home/jqh/x-tools/arm-unknown-linux-gnueabi/arm-unknown-linux-gnueabi/sysroot ../rootfs_test/hello
libc.so.6 => /lib/libc.so.6 (0xdeadbeef)
ld-linux.so.3 => /lib/ld-linux.so.3 (0xdeadbeef)
退出掛載目錄,umount test。
再來試一下,啟動帶檔案系統的Linux核心,
qemu-system-arm -M virt -cpu cortex-a15 -m 256 -kernel arch/arm/boot/zImage -nographic -append "root=/dev/ram0 console=ttyAMA0" -initrd ramdisk-arm.rd
列印資訊如下:
RAMDISK: ext2 filesystem found at block 0
RAMDISK: Loading 3584KiB [1 disk] into ram disk... \
done.
EXT4-fs (ram0): mounted filesystem without journal. Opts: (null)
VFS: Mounted root (ext4 filesystem) readonly on device 1:0.
Freeing unused kernel memory: 1024K
mount: /etc/mtab: Read-only file system
mount: /etc/mtab: Read-only file system
mount: /etc/mtab: Read-only file system
Please press Enter to activate this console.
/ #
說明已經正常進入根檔案系統shell環境。