2025-02-11
之前写了一篇文章介绍如何使用qemu启动Linux?。主要是使用bzImage
和busybox
创建的文件系统来启动Linux
内核。制作文件系统的过程还是比较麻烦的。下面介绍两个简单点的方法。
下载最新的内核源码
解压源码并进入到源码目录,执行make menuconfig
和make -j 4
对内核进行编译
内核源码编译成功后会在项目根目录下有一个vmlinux
的可执行文件
initrd.img
作为文件系统qemu-system-x86_64 \
-m 2048M \
-kernel vmlinux \
-append "console=ttyS0" \
-initrd /boot/initrd.img \
--nographic
通过上面的命令就能很方便的调试Linux
内核。/boot/initrd.img
是一个在内存中的文件系统,主要包含下面的内容:
(initramfs) ls
tmp sbin lib usr
proc run init kernel
sys lib64 etc root
var lib32 conf dev
scripts lib.usr-is-merged bin
rootf.ext4
文件系统创建文件系统镜像:dd if=/dev/zero of=rootfs.ext4 bs=4M count=128
格式化镜像:mkfs.ext4 rootfs.ext4
挂载镜像:sudo mount rootfs.ext4 /mnt
解压initrd.img
:unmkinitramfs /boot/initrd.img initrd
复制文件系统文件:sudo cp -rf initrd/main/* /mnt
运行sudo mkdir /mnt/{dev,proc,sys}
按照自己的需要在mnt
目录下添加任意文件
卸载镜像:sudo umount /mnt
启动内核:
qemu-system-x86_64 \
-m 2048M \
-kernel vmlinux \
-append "console=ttyS0 root=/dev/sda init=/bin/sh" \
-hda rootfs.ext4 --nographic
如果文件系统挂载出错,需要查看ext4
内核模块是否编译为内置模块。
make menuconfig
File systems
->The Extended 4 (ext4) filesystem
启用如果ext4
模块被编译成外部模块,而且该模块在initrd.img
只读文件系统中。
# 可以通过`/boot/config-xxx-generic`文件查看模块编译信息
# 下面的命令会先使用`initrd.img`文件系统加载`ext4`驱动。最后加载`rootfs.ext4`文件系统。
qemu-system-x86_64 \
-m 2048M \
-kernel vmlinux \
-initrd /boot/initrd.img \
-append "console=ttyS0 root=/dev/sda init=/bin/sh" \
-hda rootfs.ext4 --nographic
希望上面的内容对你有所帮助。