1. 程式人生 > >busybox製作最小根檔案系統

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環境。