在Ubuntu下運行QEMU仿真FreeBSD riscv64系統
突發奇想,嘗試在Ubuntu下運行QEMU仿真FreeBSD riscv64系統,
參考這篇文檔:手把手教你在QEMU上運行RISC-V Linux_qemu 運行 .bin-CSDN博客
并參考FreeBSD的Wiki:riscv - FreeBSD Wiki?
以前做過嘗試,是在FreeBSD里仿真FreeBSD riscv64系統 以及Ubuntu里QEMU仿真Riscv64 linux系統,這回是在Ubuntu下運行QEMU仿真FreeBSD riscv64系統。本次實踐是在Ubuntu24.04下進行QEMU仿真FreeBSD riscv64系統,發現當前新的QEMU使用起來更加簡單方便,基本只需要包安裝,不需要編譯安裝(這樣實踐耗時大大減少)
以前的實踐:QEMU安裝和使用@Ubuntu(待續)_qumu安裝與使用-CSDN博客
FreeBSD下qemu啟動FreeBSD riscv64 zfs 映像
使用buildboot創建文件系統(非必須)
看參考文檔里,講的使用buildboot,比較復雜,主要是make menuconfig 耗時非常長,沒有等待編譯成功。所以后期放棄這個方法了。
使用buildboot
下載:https://buildroot.org/downloads/buildroot-2024.11.tar.xz
wget https://buildroot.org/downloads/buildroot-2024.11.tar.xz
?解壓
unxz buildroot-2024.11.tar.xz
解包
tar -xvf buildroot-2024.11.tar.xz
進入目錄,執行make menuconfig:
cd buildroot-2022.02.6
make menuconfig
進入菜單,設置為riscv ,選64位,選ext3
然后編譯
make -j 8?
Saving to: ‘/home/skywalk/download/buildroot-2024.11/output/build/.util-linux-2.40.2.tar.xz.s98aRn/output’
編譯事件較長,沒有等到編譯完成,所以最終放棄了該方法。
實踐,在Windows10 Ubuntu24.04下QEMU仿真FreeBSD riscv64系統
準備好FreeBSD riscv64系統虛擬鏡像
從中科大下載FreeBSD riscv64系統虛擬鏡像
wget https://mirrors.ustc.edu.cn/freebsd/releases/VM-IMAGES/14.2-RELEASE/riscv64/Latest/FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw.xz
但是中科大的站可能不允許直接wget,所以要通過lynx從網頁端過去,先安裝lynx
sudo apt install lynx
用lynx打開中科大鏡像站:
lynx https://mirrors.ustc.edu.cn
點擊里面的FreeBSD鏡像,也就是進入這個頁面:
lynx https://mirrors.ustc.edu.cn/freebsd/releases/VM-IMAGES/14.2-RELEASE/riscv64/Latest/
下載這個文件:FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw.xz
解壓:
unxz FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw.xz
擴充文件到40G
truncate -s 20G FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw
拿到FreeBSD的boot kernel?
發現在Ubuntu下拿這個文件比較難,建議直接找一臺機器到FreeBSD下去拿。
準備一臺FreeBSD系統
可以用實體機安裝FreeBSD
也可以用Vmware或者VirtualBox等創建FreeBSD的虛擬機,然后安裝FreeBSD系統。
也可以用QEMU創建FreeBSD的仿真,然后用啟動光盤安裝或運行FreeBSD系統。
安裝u-boot-qemu-riscv64?
在FreeBSD系統下,使用pkg install來安裝u-boot-qemu-riscv64:
sudo pkg install opensbi u-boot-qemu-riscv64 qemu
?從FreeBSD系統拿到u-boot文件
我們需要u-boot.bin這個文件,位置FreeBSD系統的/usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin
可以使用scp從FreeBSD系統scp到Ubuntu,比如FreeBSD系統的ip是192.168.1.5,scp到當前目錄:
scp 192.168.1.5://usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin .
啟動QEMU仿真
將u-boot.bin 和?FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw 文件都放在當前目錄,然后啟動QEMU仿真:
qemu-system-riscv64 -machine virt -m 2048M -smp 2 -nographic \-kernel u-boot.bin \-drive file=FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw,format=raw,id=hd0 -device virtio-blk-device,drive=hd0 \-netdev user,id=net0,ipv6=off,hostfwd=tcp::8022-:22 -device virtio-net-device,netdev=net0
?啟動成功,用uname看看:
root@freebsd:~ # uname -a
FreeBSD freebsd 14.2-RELEASE FreeBSD 14.2-RELEASE releng/14.2-n269506-c8918d6c7412 GENERIC riscv
好了,現在實踐完成。
網絡好像還沒有通,大約是需要打開nat轉發,這個以后再調試:
ifconfig
vtnet0: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500options=80028<VLAN_MTU,JUMBO_MTU,LINKSTATE>ether 52:54:00:12:34:56inet 10.0.2.15 netmask 0xffffff00 broadcast 10.0.2.255inet6 fe80::5054:ff:fe12:3456%vtnet0 prefixlen 64 scopeid 0x1media: Ethernet autoselect (10Gbase-T <full-duplex>)status: activend6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>inet 127.0.0.1 netmask 0xff000000inet6 ::1 prefixlen 128inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2groups: lond6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
后來才知道,當時網絡已經通了,只是ping不通罷了。
但是沒有pkg,所以需要手工下載ports.txz ,然后到/usr/ports/ports-mgmt/pkg 目錄下編譯make install安裝才行。參考:如果一臺Riscv FreeBSD系統沒有pkg怎么辦?_freebsd 沒有pkg-CSDN博客?
調試
qemu-system-riscv64啟動后卡住
Domain0 Name ? ? ? ? ? ? ?: root
Domain0 Boot HART ? ? ? ? : 3
Domain0 HARTs ? ? ? ? ? ? : 0*,1*,2*,3*
Domain0 Region00 ? ? ? ? ?: 0x0000000002000000-0x000000000200ffff M: (I,R,W) S/U: ()
Domain0 Region01 ? ? ? ? ?: 0x0000000080040000-0x000000008005ffff M: (R,W) S/U: ()
Domain0 Region02 ? ? ? ? ?: 0x0000000080000000-0x000000008003ffff M: (R,X) S/U: ()
Domain0 Region03 ? ? ? ? ?: 0x0000000000000000-0xffffffffffffffff M: (R,W,X) S/U: (R,W,X)
Domain0 Next Address ? ? ?: 0x0000000000000000
Domain0 Next Arg1 ? ? ? ? : 0x00000000bfe00000
Domain0 Next Mode ? ? ? ? : S-mode
Domain0 SysReset ? ? ? ? ?: yes
Domain0 SysSuspend ? ? ? ?: yes
Boot HART ID ? ? ? ? ? ? ?: 3
Boot HART Domain ? ? ? ? ?: root
Boot HART Priv Version ? ?: v1.12
Boot HART Base ISA ? ? ? ?: rv64imafdch
Boot HART ISA Extensions ?: time,sstc
Boot HART PMP Count ? ? ? : 16
Boot HART PMP Granularity : 4
Boot HART PMP Address Bits: 54
Boot HART MHPM Count ? ? ?: 16
Boot HART MIDELEG ? ? ? ? : 0x0000000000001666
Boot HART MEDELEG ? ? ? ? : 0x0000000000f0b509
看了下感覺是沒有寫kernel的緣故,最終是到FreeBSD下安裝了uboot,拿到了這個文件:usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin
并在命令里加入:? ? -kernel u-boot.bin 這個參數,問題解決。