
QEMU 在 RISC-V 上跑 Ubuntu
本筆記整合完整步驟與實驗心得,全部放在同一份,方便直接複製執行。涵蓋 QEMU + Ubuntu 啟動、QEMU / OpenSBI / U-Boot 最後正確編譯版本、網路/SSH、共享、NFS/CIFS/SSHFS、CoreMark 編譯、常見錯誤對應。

安裝必要套件:
sudo apt update
sudo apt install -y build-essential git wget xz-utils qemu-utils gcc-riscv64-linux-gnu \
libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev ninja-build meson \
nfs-common cifs-utils sshfs flex bison pkg-config
QEMU(正確編譯版本,支援 slirp 網路)
git clone https://gitlab.com/qemu-project/qemu.git ~/qemu-src
cd ~/qemu-src
git checkout v8.2.0 # 最後實測可用版本
./configure --target-list=riscv64-softmmu --enable-slirp --disable-werror
make -j$(nproc)
輸出檔案: ~/qemu-src/build/qemu-system-riscv64
OpenSBI(正確版本)
git clone https://github.com/riscv/opensbi.git ~/opensbi-src
cd ~/opensbi-src
git checkout v1.5
make CROSS_COMPILE=riscv64-linux-gnu- PLATFORM=generic -j$(nproc)
輸出檔案:
build/platform/generic/firmware/fw_jump.elfbuild/platform/generic/firmware/fw_dynamic.bin
U-Boot(正確版本)
git clone https://source.denx.de/u-boot/u-boot.git ~/u-boot
cd ~/u-boot
git checkout v2023.07
make distclean
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- qemu-riscv64_smode_defconfig
make ARCH=riscv CROSS_COMPILE=riscv64-linux-gnu- -j$(nproc)
輸出檔案:
~/u-boot/u-boot~/u-boot/u-boot.elf
下載 Ubuntu riscv64 映像
wget https://cdimage.ubuntu.com/releases/24.04.3/release/ubuntu-24.04.3-preinstalled-server-riscv64.img.xz
xz -dk ubuntu-24.04.3-preinstalled-server-riscv64.img.xz
啟動 QEMU virt 平台
~/qemu-src/build/qemu-system-riscv64 \
-machine virt -m 2G -smp 4 -nographic \
-bios ~/opensbi-src/build/platform/generic/firmware/fw_jump.elf \
-kernel ~/u-boot/u-boot \
-nic user,hostfwd=tcp::2222-:22 \
-device virtio-rng-pci \
-drive file=ubuntu-24.04.3-preinstalled-server-riscv64.img,format=raw,if=virtio \
-append "console=ttyS0"
登入方式:
ssh -p 2222 ubuntu@127.0.0.1 # 預設帳密 ubuntu/ubuntu
WSL 轉發(如需從 Windows 連進去)
wsl hostname -I # 取得 WSL IP
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=2222 connectaddress=<WSL_IP> connectport=2222
New-NetFirewallRule -DisplayName "QEMU-WSL-SSH-2222" -Direction Inbound -LocalPort 2222 -Protocol TCP -Action Allow
Host ↔ Guest 共享目錄 (9p virtfs)
啟動 QEMU 時加:
-virtfs local,path=/home/you/share,mount_tag=hostshare,security_model=passthrough,id=hostshare
Guest 掛載:
sudo mkdir -p /mnt/share
sudo mount -t 9p -o trans=virtio hostshare /mnt/share
區域網共享
NFS:
sudo mount -t nfs 192.168.1.100:/srv/nfs/share /mnt
CIFS:
sudo mount -t cifs //192.168.1.101/share /mnt/smb -o username=USER,password=PASS
SSHFS:
sshfs user@192.168.1.102:/remote/path /mnt/ssh
傳檔:scp / sftp / rsync
scp -P 2222 file ubuntu@127.0.0.1:/home/ubuntu/
sftp -P 2222 ubuntu@127.0.0.1
rsync -avz -e "ssh -p 2222" ubuntu@127.0.0.1:/remote ./local
CoreMark 編譯
export CROSS_COMPILE=/path/to/toolchain/riscv64-linux-
make compile CC="${CROSS_COMPILE}gcc" \
XCFLAGS="-march=rv64gc -mabi=lp64d -mcmodel=medany"
常見錯誤
Invalid read/write @0x0:映像與 machine 不符,請確認用virt搭配通用 img。SD card size has to be power of 2:用qemu-img resize img 4G。network backend 'user' is not compiled:需重編 QEMU 加--enable-slirp。Image 'itb' missing external blobs (fw_dynamic.bin):請先編譯 OpenSBI 並設OPENSBI=/path/to/fw_dynamic.bin。
✅ 最後正確組合版本:
- QEMU v8.2.0 +
--enable-slirp - OpenSBI v1.5 (generic, fw_jump.elf)
- U-Boot v2023.07 (qemu-riscv64_smode_defconfig)
- Ubuntu 24.04.3 preinstalled server riscv64 image
Comments