Skip to content

26.6 QEMU 安装 RISC-V FreeBSD(基于 x86 Windows 主机)

QEMU(Quick Emulator)是一款基于纯软件模拟的开源虚拟机监视器(VMM,Virtual Machine Monitor)。

本节实验环境基于 Windows 11 24H2(宿主机,x86-64 架构)、FreeBSD 14.2-RELEASE(虚拟机,RISC-V 架构)以及 QEMU 20241220,所有操作步骤均在此环境下验证。

26.6.1 QEMU

首先需要下载并安装 QEMU 虚拟机软件。

QEMU 下载地址:

QEMU Binaries for Windows (64 bit),请下载列表中最新的安装程序。本节撰写时,最新版本为 qemu-w64-setup-20241220.exe,大小为 174 MB。

下载后在 Windows 上安装 QEMU。

26.6.2 RISC-V FreeBSD 磁盘镜像

QEMU 安装完成后,需要下载 RISC-V 架构的 FreeBSD 磁盘镜像。

RISC-V FreeBSD 磁盘镜像(以 FreeBSD 14.2-RELEASE 为例):

https://download.freebsd.org/releases/VM-IMAGES/14.2-RELEASE/riscv64/Latest/FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw.xz

下载后解压缩备用。

26.6.3 相关文件结构

安装完成后,相关文件分布在以下目录结构中。

sh
/usr/
└── local/
    └── share/
        ├── opensbi/
   └── lp64/
       └── generic/
           └── firmware/
               └── fw_jump.elf # OpenSBI 固件
        └── u-boot/
            └── u-boot-qemu-riscv64/
                └── u-boot.bin # U-Boot 引导加载程序

26.6.4 OpenSBI

获取 OpenSBI(RISC-V Open Source Supervisor Binary Interface),其功能类似于启动固件。

26.6.4.1 安装 OpenSBI

使用 pkg 安装:

sh
# pkg install opensbi

或者使用 Ports 安装:

sh
# cd /usr/ports/sysutils/opensbi/
# make install clean

26.6.4.2 提取 fw_jump.elf

sh
# /etc/periodic/weekly/310.locate # 刷新 locate 数据库
# locate fw_jump.elf
/usr/local/share/opensbi/lp64/generic/firmware/fw_jump.elf

提取 fw_jump.elf 到 Windows 下备用。

26.6.5 U-Boot

在 FreeBSD 系统中获取 U-Boot(Universal Boot Loader),其功能类似于 GRUB 2。

26.6.5.1 安装 U-Boot

使用 pkg 安装:

sh
# pkg install u-boot-qemu-riscv64

或者使用 Ports 安装:

sh
# cd /usr/ports/sysutils/u-boot-qemu-riscv64/
# make install clean

26.6.5.2 提取 u-boot.bin 文件

sh
# /etc/periodic/weekly/310.locate # 刷新数据库
# locate u-boot.bin
/usr/local/share/u-boot/u-boot-qemu-riscv64/u-boot.bin

提取 u-boot.bin 到 Windows 下备用。

26.6.6 配置 QEMU

在桌面新建一个文本文件 qemu.bat,写入以下内容:

batch
cd /d "C:\Program Files\qemu"
.\qemu-system-riscv64.exe ^
    -machine virt ^
    -smp 4 ^
    -cpu rv64 ^
    -m 4G ^
    -device virtio-blk-device,drive=hd ^
    -drive file="C:\Users\ykla\Desktop\FreeBSD-14.2-RELEASE-riscv-riscv64-zfs.raw",if=none,id=hd ^
    -device virtio-net-device,netdev=net ^
    -netdev user,id=net,hostfwd=tcp::8022-:22 ^
    -bios "C:\Users\ykla\Desktop\fw_jump.elf" ^
    -kernel "C:\Users\ykla\Desktop\u-boot.bin" ^
    -append "root=LABEL=rootfs" ^
    -nographic

参数说明:

  • ^ 在 Windows 批处理脚本中用作续行符,可将一条长命令拆成多行书写。
  • smp 为 CPU 数量
  • cpu 指定 CPU 架构
  • m 指定内存大小
  • hostfwd=tcp::8022-:22 将宿主机的 8022 端口转发至虚拟机的 22 端口(SSH)

以上示例中,请将 C:\Users\ykla\Desktop\ 替换为实际路径。

运行脚本。

Qemu 安装 FreeBSD

输入用户名 root 后直接登录,默认无密码。

无论使用 PowerShell 还是 CMD,输出均会出现乱码(例如 ee 命令或按 Tab 键)。

此外,该镜像默认未为普通用户配置 SSH 服务,因此无法直接通过 SSH 连接 FreeBSD 设备。

26.6.7 创建普通用户(如没有)

先创建一个普通用户(注意加入 wheel 组):

技巧

本节示例中出现的用户名 ykla 及路径 /home/ykla 均为示例,请根据自身需求替换为实际用户名和主目录。

sh
# adduser
Username: ykla
Full name:
Uid (Leave empty for default):
Login group [ykla]:
Login group is ykla. Invite ykla into other groups? []: wheel  # 注意:请在此处输入 wheel,否则该用户将无法使用 su 命令提升权限
Login class [default]:
Shell (sh csh tcsh nologin) [sh]:
Home directory [/home/ykla]:
Home directory permissions (Leave empty for default):

Enable ZFS encryption? (yes/no) [no]: Use password-based authentication? [yes]:
Use an empty password? (yes/no) [no]:
Use a random password? (yes/no) [no]:
Enter password:
Enter password again:
Lock out the account after creation? [no]:
Username    : ykla
Password    : *****
Full Name   :
Uid         : 1001
ZFS dataset : zroot/home/ykla
Class       :
Groups      : ykla wheel
Home        : /home/ykla
Home Mode   :
Shell       : /bin/sh
Locked      : no
OK? (yes/no) [yes]:
adduser: INFO: Successfully created ZFS dataset (zroot/home/ykla).
adduser: INFO: Successfully added (ykla) to the user database.
Add another user? (yes/no) [no]:
Goodbye!

26.6.8 配置 sshd 服务

配置 sshd 服务如下:

sh
# service sshd enable # 添加启动项
# service sshd start # 启动 sshd 服务

此后即可在 Windows 上通过 SSH 连接(IP 为 localhost):

powershell
ssh -p 8022 ykla@localhost

即可使用端口 8022(由文件 qemu.bat 指定)通过 SSH 连接到本地主机的 ykla 用户。

26.6.9 故障排除与未竟事宜

26.6.9.1 无法显示图形界面

待解决。

26.6.10 参考文献