尝试在qemu上启动Arch Linux RISC-V
目录
警告
本文最后更新于 2025-06-27,文中内容可能已过时。
Note: 本文为作者个人实验记录,可能存在错误或不完整之处,不代表最佳方法,请谨慎参考。
准备工作
创建一个工作目录并进入:
mkdir -p archriscv && cd archriscv
安装qemu的RISC-V模拟器和交叉编译工具链:
sudo pacman -S qemu-system-riscv riscv64-linux-gnu-gcc
获取Arch Linux RISC-V的镜像文件和linux源码:
wget https://mirrors.pku.edu.cn/archriscv/images/archriscv-latest.tar.zst
git clone https://github.com/torvalds/linux.git --depth=1
开始安装
创建空磁盘镜像
qemu-img create -f raw archriscv.img -o nocow=on 10G
对于btrfs文件系统,打开
nocow选项
编译内核
Arch Linux RISC-V的rootfs中不包含内核,因此我们先使用riscv通用配置编译linux内核并加载,然后通过pacman安装内核
cd linux
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- defconfig
make -j$(nproc) ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- \
Image
编译后得到arch/riscv/boot/Image文件
创建GPT分区表和root分区
cd ..
parted --script archriscv.img mklabel gpt \
mkpart primary ext4 1MiB 100% \
set 1 boot on
创建 loop 设备并格式化挂载
LOOP=$(sudo losetup -fP --show archriscv.img)
sudo mkfs.ext4 ${LOOP}p1 -L rootfs
sudo mkdir -p /mnt/riscv-root
sudo mount ${LOOP}p1 /mnt/riscv-root
解压rootfs到挂载目录
sudo bsdtar -xpf archriscv-latest.tar.zst -C /mnt/riscv-root
umount -R /mnt/riscv-root
配置Arch Linux
启动Qemu
编写start.sh,通过之前编译的内核加载rootfs,并通过NAT模式进行网络连接
#!/bin/bash
KERNEL_IMAGE="linux/arch/riscv/boot/Image"
ROOTFS_IMAGE="archriscv.img"
sudo ip tuntap add dev tap0 mode tap
sudo ip link set tap0 up
sudo ip link set tap0 master virbr0
sudo qemu-system-riscv64 \
-nographic \
-machine virt \
-m 12g \
-smp 8 \
-kernel "$KERNEL_IMAGE" \
-append "root=/dev/vda1 rw console=ttyS0 init=/lib/systemd/systemd" \
-drive file="$ROOTFS_IMAGE",format=raw,if=none,id=hd0 \
-device virtio-blk-device,drive=hd0 \
-netdev tap,id=net0,ifname=tap0,script=no,downscript=no \
-device virtio-net-device,netdev=net0
随后:
chmod +x start.sh
./start.sh
配置网络
进入系统后,通过以下方式配置网络:
mkdir -p /etc/systemd/network
cat > /etc/systemd/network/20-eth0.network <<EOF
[Match]
Name=eth0
[Network]
DHCP=yes
EOF
systemctl enable systemd-networkd --now
systemctl enable systemd-resolved --now
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-networkd
安装linux包
pacman -Syu linux mkinitcpio
mkinitcpio -P
退出qemu,再次挂载loop设备并复制/mnt/riscv-root/boot下的文件:
sudo mount ${LOOP}p1 /mnt/riscv-root
cp /mnt/riscv-root/boot/* ./
解压vmlinuz-linux:
zcat vmlinuz-linux > vmlinuz-linux.uncompressed
mv vmlinuz-linux.uncompressed vmlinuz-linux
按如下方式修改启动脚本:
diff start.sh.old start.sh
3c3
< KERNEL_IMAGE="linux/arch/riscv/boot/Image"
---
> KERNEL_IMAGE="vmlinuz-linux"
15a16
> -initrd ./initramfs-linux.img \
即可使用发行版内核加载