在QEMU上启动riscv-linux

55

前提条件:

  • 已安装完成qemu
  • 已安装完成riscv64的工具链(riscv64-unknown-gnu-linux-**)

需要的资源:

  • linux kernel: 选择一个合适的版本即可(本次实验选用较新的6.10.5)
    • 使用命令:wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.10.5.tar.xz
    • 注意不要直接克隆 linux 的仓库,应为仓库中包含了各个版本的信息,会比较大,下载时间长。
  • busybox:选择一个合适的版本即可(本次实验选用较新的1.36.1)
    • 使用命令:wget https://www.busybox.net/downloads/busybox-1.36.1.tar.bz2

编译过程:

  • linux kernel:

    • make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- defconfig
    • make ARCH=riscv CROSS_COMPILE=riscv64-unknown-linux-gnu- -j $(nproc)
  • busybox:

    • CROSS_COMPILE=riscv64-unknown-linux-gnu- make defconfig
    • CROSS_COMPILE=riscv64-unknown-linux-gnu- make -j $(nproc)
    • CROSS_COMPILE=riscv64-unknown-linux-gnu- make install (从这一步开始官网教程已没有介绍了)
      • 这一步会生成一个 _install文件夹,里面放有编译好的根目录文件。
  • 利用busybox生成的 _install制作镜像(以下操作在busybox目录中完成):

    • qemu-img create rootfs.img 1g

    • mkfs.ext4 rootfs.img

    • chmod 777 rootfs.img(如果没有这一步操作,在我服务器环境中,会导致后续 sudo cp -r ../busyboxsource/_install/* .出现权限问题而失败)

    • sudo mount -o loop rootfs.img rootfs

    • cd rootfs

    • sudo cp -r ../busyboxsource/_install/* .

    • sudo mkdir proc sys dev etc etc/init.d

    • cd etc/init.d/

    • sudo touch rcS

    • sudo vi rcS

    • 然后在rcS中加入如下内容:

      • #!/bin/sh
        mount -t proc none /proc
        mount -t sysfs none /sys
        /sbin/mdev -s
        
    • sudo chmod +x rcS

    • sudo umount rootfs

使用qemu启动riscv-linux过程:

  • qemu-system-riscv64 -M virt -m 256M -nographic -kernel linux-6.10.5/arch/riscv/boot/Image -drive file=busybox-1_36_1/rootfs.img,format=raw,id=hd0,file.locking=off -device virtio-blk-device,drive=hd0 -append "root=/dev/vda rw console=ttyS0"(注意修改linux image和busybox img路径为正确路径)
  • 启动界面:

image-iepq.png

  • 在终端中操作:

image-eixa.png

  • 退出qemu命令:Ctrl + a 然后再按 x

开始在运行qemu的时候,遇到了缺少动态库(libssh和libcapstone)的问题。可以通过 ldd qemu-system-riscv64 观察到缺啥,将对应动态库安装后即可正常运行。

参考资料:

[1] 在QEMU上執行64 bit RISC-V Linux. 本篇文章主要是用來記錄我的學習紀錄,嘗試在Virtual… | by Swark | Swark | Medium

[2] Running 64- and 32-bit RISC-V Linux on QEMU — RISC-V - Getting Started Guide(官方文档除了在制作rootfs镜像的地方省略了一大段,总体是正确的)