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

如何使用qemu启动Linux?

2025-02-08

最近在学习内核相关的知识,所以有一个Linux内核调试环境是非常有必要的。我选择在ubuntu 24.04上使用qemu启动内核,主要是qemu启动速度快。qemu启动内核需要有下面的文件: 内核镜像, busybox, 文件系统。

编译内核

  • 内核版本6.12.8

  • 安装编译内核的工具:sudo apt install build-essential flex bison bc

  • 运行make menuconfig,修改下面的内核选项:

    • General setting -> Initial RAM filesystem and RAM disk (initramfs/initrd) support 启用
    • Device Drivers -> Block devices -> RAM block device support 启用
    • Device Drivers -> Block devices -> Default RAM disk size (kbytes) 设置为65535
  • 运行make -j 4 编译内核

编译busybox

  • 下载busybox 1.37.0

  • 运行make menuconfig

    • Settings -> Build static binary (no shared libs) 启用
  • 运行make -j 4 编译busybox

启动内核

  • 安装qemusudo apt install qemu-system

  • 创建目录:mkdir os

  • 复制内核:cp linux-6.12.8/arch/x86/boot/bzImage os/

  • 复制busyboxcp -rf busybox-1.37.0/_install os/fs

  • 进入到fs目录,执行下面的命令:

    • mkdir -p etc dev mnt proc sys tmp mnt etc/init.d
    • vi etc/fstab, 并添加下面内容:
      proc        /proc       proc    defaults 0 0
      tmpfs       /tmp        tmpfs   defaults 0 0
      sysfs       /sys        sysfs   defaults 0 0
      
    • vi etc/init.d/rcS,并添加下面内容:
      echo -e "Welcome to tiny Linux"
      mount -a
      echo -e "Remount the root filesystem"
      mount -o remount,rw /
      mkdir /dev/pts
      mount -t devpts devpts /dev/pts
      echo /sbin/mdev > /proc/sys/kernel/hotplug
      mdev -s
      
    • chmod 755 etc/init.d/rcS
    • vi etc/inittab ,并添加下面内容:
      ::sysinit:/etc/init.d/rcS
      ::respawn:~/bin/sh
      ::askfirst:~/bin/sh
      
    • chmod 755 etc/inittab
    • 进入到dev目录,执行下面的命令:
      • sudo mknod console c 5 1
      • sudo mknod null c 1 3
      • sudo mknod tty1 c 4 1
  • 进入到os目录, 创建打包文件系统脚本:

    • vi rootfs.sh

      #!/bin/sh
      rm -rf rootfs.ext3
      rm -rf tmpfs
      dd if=/dev/zero of=./rootfs.ext3 bs=1M count=32
      mkfs.ext3 rootfs.ext3
      mkdir tmpfs
      mount -o loop rootfs.ext3 tmpfs
      cp -rf fs/* tmpfs
      umount tmpfs
      gzip --best -c rootfs.ext3 > rootfs.img.gz
      
    • chmod 755 rootfs.sh

    • sudo ./rootfs.sh

  • 进入到os目录,运行qemu-system-x86_64 -kernel bzImage -initrd rootfs.img.gz -append "root=/dev/ram init=/linuxrc console=ttyS0" -serial mon:stdio -nographic启动qemu

排错

  • 内核编译出错

    make[1]: *** No rule to make target 'debian/canonical-certs.pem', needed by 'certs/x509_certificate_list'.  Stop.
    make: *** [Makefile:1809: certs] Error 2
    
    • scripts/config --disable SYSTEM_TRUSTED_KEYS
    • scripts/config --disable SYSTEM_REVOCATION_KEYS
  • busybox编译tc出错

    • make menuconfig
    • Networking Utilities -> tc (8.3 kb) 禁用

参考