尝试在qemu上启动Arch Linux RISC-V

警告
本文最后更新于 2025-06-27,文中内容可能已过时。

Arch Linux RISC-V port地址

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文件

cd ..
parted --script archriscv.img mklabel gpt \
    mkpart primary ext4 1MiB 100% \
    set 1 boot on
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
sudo bsdtar -xpf archriscv-latest.tar.zst -C /mnt/riscv-root
umount -R /mnt/riscv-root

编写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
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 \

即可使用发行版内核加载

相关内容