在QEMU上启动riscv-linux
前提条件:
- 已安装完成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路径为正确路径)- 启动界面:
- 在终端中操作:
- 退出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镜像的地方省略了一大段,总体是正确的)