Heng30的博客
搜索 分类 关于 订阅

如何使用qemu启动Linux(2)?

2025-02-11

之前写了一篇文章介绍如何使用qemu启动Linux?。主要是使用bzImagebusybox创建的文件系统来启动Linux内核。制作文件系统的过程还是比较麻烦的。下面介绍两个简单点的方法。

编译内核

  • 下载最新的内核源码

  • 解压源码并进入到源码目录,执行make menuconfigmake -j 4对内核进行编译

  • 内核源码编译成功后会在项目根目录下有一个vmlinux的可执行文件

方法1:使用宿主机的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

方法2: 自制rootf.ext4文件系统

  • 创建文件系统镜像:dd if=/dev/zero of=rootfs.ext4 bs=4M count=128

  • 格式化镜像:mkfs.ext4 rootfs.ext4

  • 挂载镜像:sudo mount rootfs.ext4 /mnt

  • 解压initrd.imgunmkinitramfs /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

希望上面的内容对你有所帮助。