# QEMU 在 RISC-V 上跑 Ubuntu 本筆記整合完整步驟與實驗心得,全部放在同一份,方便直接複製執行。涵蓋 QEMU + Ubuntu 啟動、QEMU / OpenSBI / U-Boot 最後正確編譯版本、網路/SSH、共享、NFS/CIFS/SSHFS、CoreMark 編譯、常見錯誤對應。  --- 安裝必要套件: ```bash 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 網路) ```bash 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(正確版本) ```bash 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.elf` * `build/platform/generic/firmware/fw_dynamic.bin` --- ### U-Boot(正確版本) ```bash 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 映像 ```bash 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 平台 ```bash ~/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" ``` 登入方式: ```bash ssh -p 2222 ubuntu@127.0.0.1 # 預設帳密 ubuntu/ubuntu ``` --- ### WSL 轉發(如需從 Windows 連進去) ```powershell 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 時加: ```bash -virtfs local,path=/home/you/share,mount_tag=hostshare,security_model=passthrough,id=hostshare ``` Guest 掛載: ```bash sudo mkdir -p /mnt/share sudo mount -t 9p -o trans=virtio hostshare /mnt/share ``` --- ### 區域網共享 NFS: ```bash sudo mount -t nfs 192.168.1.100:/srv/nfs/share /mnt ``` CIFS: ```bash sudo mount -t cifs //192.168.1.101/share /mnt/smb -o username=USER,password=PASS ``` SSHFS: ```bash sshfs user@192.168.1.102:/remote/path /mnt/ssh ``` --- ### 傳檔:scp / sftp / rsync ```bash 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 編譯 ```bash 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
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.