在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 1500
options=80028<VLAN_MTU,JUMBO_MTU,LINKSTATE>
ether 52:54:00:12:34:56
inet 10.0.2.15 netmask 0xffffff00 broadcast 10.0.2.255
inet6 fe80::5054:ff:fe12:3456%vtnet0 prefixlen 64 scopeid 0x1
media: Ethernet autoselect (10Gbase-T <full-duplex>)
status: active
nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
groups: lo
nd6 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 这个参数,问题解决。