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的动态依赖库,然后将这些库拷贝过去,比如,

jqh@ubuntu:~/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环境。

猜你喜欢

转载自blog.csdn.net/jqh_111/article/details/84261070