FreeBSD 中文期刊
FreeBSD 中文社区
  • FreeBSD 中文期刊
  • 编辑日志
  • 2025-123 下游项目
    • FreeBSD 发布工程:新主管上任
    • GhostBSD:从易用到挣扎与重生
    • BSD Now 与将来
    • 字符设备驱动教程(第三部分)
    • 学会走路——连接 GPIO 系统
    • FreeBSD 中对 SYN 段的处理
    • FreeBSD 2024 年秋季峰会
  • 2024-1112 虚拟化
    • 字符设备驱动程序教程(第二部分)
    • 面向 Linux 和 Windows 用户的 bhyve
    • Xen 与 FreeBSD
    • Wifibox:一种嵌入式虚拟化无线路由器
    • 嵌入式 FreeBSD:Fabric——起步阶段
    • DGP:一种新的数据包控制方法
    • 会议报告:我在都柏林的 EuroBSDCon 体验
  • 2024-0910 内核开发
    • 字符设备驱动程序教程
    • VPP 移植到了 FreeBSD:基础用法
    • 利用 Kyua 的 Jail 功能提升 FreeBSD 测试套件的并行效率
    • FreeBSD 上的 Valgrind
    • 嵌入式 FreeBSD:探索 bhyve
    • TCP/IP 历险记:FreeBSD TCP 协议栈中的 Pacing
    • 实用软件:实现无纸化(Paperless)
  • 2024-0708 存储与文件系统
    • FreeBSD 中的 NVMe-oF
    • FreeBSD iSCSI 入门
    • 使用 ZFS 原生加密保护数据
    • 嵌入式 FreeBSD:打造自己的镜像
    • TCP LRO 简介
    • 基于 Samba 的时间机器备份
  • 2024-0506 配置管理对决
    • 基本系统中的 mfsBSD
    • rdist
    • Hashicorp Vault
    • 在 GitHub 上向 FreeBSD 提交 PR
    • 悼念 Mike Karels
    • 2024 年 5-6 月来信
    • 嵌入式 FreeBSD 面包板
    • TCP/IP 历险记:TCP BBLog
    • 实用软件:开发定制 Ansible 模块
  • 2024-0304 开发工作流与集成
    • FreeBSD 内核开发工作流程
    • FreeBSD 与 KDE 持续集成(CI)
    • 更现代的内核调试工具
    • 从零开始的 ZFS 镜像及 makefs -t zfs
    • 提升 Git 使用体验
  • 2024-0102 网络(十周年)
    • FreeBSD 中的 RACK 栈和替代 TCP 栈
    • FreeBSD 14 中有关 TCP 的更新
    • if_ovpn 还是 OpenVPN
    • SR-IOV 已成为 FreeBSD 的重要功能
    • FreeBSD 接口 API(IfAPI)
    • BATMAN:更优的可移动热点网络方式
    • 配置自己的 VPN——基于 FreeBSD、Wireguard、IPv6 和广告拦截
    • 实用软件:使用 Zabbix 监控主机
  • 2023-1112 FreeBSD 14.0
    • LinuxBoot:从 Linux 启动 FreeBSD
    • FreeBSD 容器镜像
    • 现在用 Webhook 触发我
    • 新的 Ports 提交者:oel Bodenmann (jbo@freebsd.org)
  • 2023-0910 Port 与软件包
    • 回忆录:与 Warner Losh(@imp)的访谈
    • 在你自己的仓库中定制 Poudriere 源
    • Wazuh 和 MITRE Caldera 在 FreeBSD Jail 中的使用
    • PEP 517
    • CCCamp 2023 旅行报告
  • 2023-0708 容器与云
    • 在 Firecracker 上的 FreeBSD
    • 使用 pot 和 nomad 管理 Jail
    • 会议报告:C 与 BSD 正如拉丁语与我们——一位神学家的旅程
    • 抒怀之旅:与 Doug Rabson 的访谈
    • 基于 Jail 的广告拦截教程
    • 我们收到的来信
  • 2023-0506 FreeBSD 三十周年纪念特刊
    • CheriBSD 近十多年的历程
    • AArch64:成为 FreeBSD 新的一级架构
    • 岁月如梭:我个人的时间线
    • 安装 FreeBSD 1.0:回顾 30 年前
    • ZFS 是如何进入 FreeBSD 的呢?
    • 我不是来自约克郡的,我保证!
    • 回忆录:采访 David Greenman Lawrence
    • FreeBSD 和早期的 Unix 社区
    • 早期的 FreeBSD 移植
    • FreeBSD 30 周年:成功的秘诀
    • FreeBSD 在日本:回忆之旅与今日之实
  • 2023-0304 嵌入式
    • CheriBSD port 和软件包
    • 让我们来试试 ChatGPT
    • GPU 直通
  • 2023-0102 构建 FreEBSD Web 服务器
    • ZFS 的原子 I/O 与 PostgreSQL
    • 虚拟实验室——BSD 编程研讨会
    • ZFS 简介
    • 会议报告:落基山庆祝女性计算机科学家
    • 进行中的工作/征求反馈:数据包批处理
    • 基金会与 FreeBSD 桌面
  • 2022-1112 可观测性和衡量标准
    • 在 FreeBSD 的 DDB 内核调试器中编写自定义命令
    • DTrace:老式跟踪系统的新扩展
    • 基于证书的 Icinga 监控
    • 活动监控脚本(activitymonitor.sh)
    • 实用 IPv6(第四部分)
    • EuroBSDCon 会议报道
    • 实用 Port:Prometheus 的安装与配置
    • 书评:《用火解决问题:管理老化的计算机系统(并为现代系统保驾护航)》Kill It with Fire: Manage Aging Computer Systems (and Future Proof Modern Ones)
  • 2022-0910 安全性
    • CARP 简介
    • 重构内核加密服务框架
    • PAM 小窍门
    • SSH 小窍门
    • 实用 IPv6(第三部分)
    • 书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著
    • 访谈:保障 FreeBSD 安全性
    • MCH 2022 会议报告
  • 2022-0708 科研、系统与 FreeBSD
    • 在 FreeBSD 上构建 Loom 框架
    • 教授本科生 Unix 课程
    • FreeBSD 入门研讨会
    • 实用 IPv6(第二部分)
    • 在 2022 年及以后推广 FreeBSD
    • 进行中的工作/征求反馈:Socket 缓冲区
    • FreeBSD 开发者峰会报告
    • 支持 Electromagnetic Field 2022
  • 2022-0506 灾难恢复
    • 使用 FreeBSD 构建高弹性的私有云
    • LLDB 14 —— FreeBSD 新调试器
    • 实用 IPv6(第一部分)
    • 利用 netdump(4) 进行事后内核调试
    • 进行中的工作/征求反馈:FreeBSD 启动性能
    • 实用 Port:在 OpenZFS 上设置 NFSv4 文件服务器
  • 2022-0304 ARM64 是一级架构
    • FreeBSD/ARM64 上的数据科学
    • Pinebook Pro 上的 FreeBSD
    • 嵌入式控制器的 ACPI 支持
    • 进行中的工作/征求反馈:Lumina 桌面征集开发人员
    • 实用 Port:如何设置 Apple 时间机器
  • 2022-0102 软件与系统管理
    • 为 FreeBSD Ports 做贡献
    • 使用 Git 贡献到 FreeBSD Ports
    • CBSD:第一部分——生产环境
    • 将 OpenBSD 的 pf syncookie 代码移植到 FreeBSD 的 pf
    • 进行中的工作/征求反馈:mkjail
    • 《编程智慧:编程鬼才的经验和思考》(The Kollected Kode Vicious)书评
    • 会议报告:EuroBSDCon 2021 我的第一次 EuroBSDCon:一位新组织者的视角
  • 2021-1112 存储
    • 开放通道 SSD
    • 构建 FreeBSD 社区
    • 与完美操作系统同行 27 年
    • 进行中的工作/征求反馈:OccamBSD
    • 通过 iSCSI 导入 ZFS ZIL——不要在工作中这样做——就像我做的那样
  • 2021-0910 FreeBSD 开发
    • FreeBSD 代码审查与 git-arc
    • 如何为 FreeBSD 实现简单的 USB 驱动程序
    • 内核开发技巧
    • 程序员编程杂谈
  • 2021-0708 桌面/无线网
    • 通往 FreeBSD 桌面的直线路径
    • FreeBSD 13 中的人机接口设备 (HID) 支持
    • Panfrost 驱动程序
    • 用 Git 更新 FreeBSD
    • FreeBSD 的新面孔
    • 想给你的桌面加点佐料?
  • 2021-0506 安全
    • 七种提升新安装 FreeBSD 安全性的方法
    • copyinout 框架
    • 使用 TLS 改善 NFS 安全性
    • Capsicum 案例研究:Got
    • 对 Jail 进行安全扫描
  • 2021-0304 FreeBSD 13.0
    • 展望未来
    • FreeBSD 13.0 工具链
    • FreeBSD 13.0 中有新加载器吗?
    • TCP Cubic 准备起飞
    • OpenZFS 中的 Zstandard 压缩
    • 会议报告:FreeBSD 供应商峰会
    • Git 不够吗?
  • 2021-0102 案例研究
    • Tarsnap 的 FreeBSD 集群
    • BALLY WULFF
    • Netflix Open Connect
    • FreeBSD 的新面孔
    • 写作学者的 FreeBSD
    • 在世界之巅
  • 2020-1112 工作流/持续集成(CI)
    • FreeBSD Git 快速入门
    • 使用 syzkaller 进行内核 Fuzzing
    • Mastering Vim Quickly 书评
    • 线上会议实用技巧
    • 在控制台上进行网络监控
  • 2020-0910 贡献与入门
    • 采访:Warner Losh,第 2 部分
    • 代码审查
    • 撰写良好的提交消息
    • 如何在不是程序员的情况下做出贡献——成为 FreeBSD 译者
    • 如何成为文档提交者
    • 谷歌编程之夏
    • 为 FreeBSD 期刊撰写文章
    • 你为什么使用 FreeBSD
    • FreeBSD 的新面孔
  • 2020-0708 基准测试/调优
    • FreeBSD Friday
    • 采访:Warner Losh,第 1 部分
    • 构建和运行开源社区
    • 在 FreeBSD 上轻松搭建我的世界(Minecraft)服务器
    • FreeBSD 的新面孔
  • 2020-0506 网络性能
    • 内核中的 TLS 卸载
    • 访谈:Michael W Lucas
    • FreeBSD 桌面发行版
    • 使用 Poudriere 进行 Port 批量管理
    • FreeBSD 的新面孔
由 GitBook 提供支持

FreeBSD 中文社区

在本页
  • 准备工作
  • 网络配置
  • 模板
  • 创建虚拟机
  • 安装和使用虚拟机
  • 总结

这有帮助吗?

在GitHub上编辑
导出为 PDF
  1. 2024-1112 虚拟化

面向 Linux 和 Windows 用户的 bhyve

  • 原文链接:bhyve for the Linux and Windows Users

  • 作者:Jason Tubnor

FreeBSD bhyve 虚拟化程序在 2011 年 5 月由 Neel Natu 和 Peter Grehan 向全世界宣布,随后由 NetApp 赠送给 FreeBSD。这为 FreeBSD 提供了与 Linux KVM 虚拟化程序竞争的机会。然而,bhvy 还有其他好处,它不仅小巧且稳健,性能优异,并且高度依赖 CPU 指令集,而不是通过解释执行。

最初的实现仅适用于 FreeBSD 客户机,直到过了一段时间,我们才看到 bhyve 能够运行其他操作系统。

首先是 Linux,然后有了一种方法来重新打包 Windows 8 或 Windows Server 2012 以使其安装。这对于普通用户来说管理起来过于复杂,直到 bhyve 引入 UEFI 启动特性,事情才真正起飞。

UEFI 启动是 bhyve 所等待的杀手级特性。它使得可以在 FreeBSD bhyve 上安装并运行各种操作系统。当 FreeBSD 11 发布时,我们终于拥有了与其他操作系统相媲美的虚拟化组件。

虽然 UEFI 启动是 bhyve 的杀手级特性,但 bhyve 的杀手级应用是 Windows Server 2016。这是一个转折点,企业能够在没有修改的情况下运行 bhyve 和 Windows,获得一个可靠的企业级虚拟化程序,以稳定的方式运行商业工作负载。

突然间,企业能够广泛部署设备,使用一个具有 2-Clause BSD 许可证的解决方案,并能够通过硬件或软件调整虚拟化程序,以解决其问题。

然而,问题仍然存在,因为 Windows 需要安装多个驱动程序,无论是在镜像中还是在安装后,以避免性能问题。在 2018 年 7 月,通过实现 PCI-NVMe 存储仿真,这个问题得到了部分解决,最终让 bhyve 在一般工作负载的存储性能上超越了 KVM。

如今,Windows 在 bhyve 上运行仍然至少需要 RedHat 提供的 VirtIO-net 驱动程序,以确保网络传输可靠且超过 1Gb/s。RedHat 提供的 Windows MSI 包中还有其他驱动程序,建议在生产环境实现前加载这些驱动程序。对于 Linux,大多数发行版都包括所有相关驱动程序,包括本文中使用的 AlmaLinux。对于 Linux 安装,推荐使用 NVMe 仿真存储作为后端,然而,如果你计划将 Linux 工作负载在 bhyve 和 KVM 之间迁移,建议将客户机设置为使用 VirtIO-blk 存储。

以下配置适用于典型的类型 2 虚拟化程序配置中的标准 FreeBSD 工作站,或用于仅托管客户机工作负载并与客户机相关联的存储和网络的专用 FreeBSD 服务器,适用于类型 1 虚拟化程序。

准备工作

通常,过去十年的所有现代处理器都适合用于 bhyve 虚拟化。

确保你的硬件配置启用了虚拟化技术,并且启用了 VT-d 支持。PCI 直通的使用超出了本文的范围,但建议启用 VT-d,以便在需要时可以使用。在你的计算机 BIOS/固件中配置好之后,你可以通过查看 CPU 的 Features2 中是否包含 POPCNT 来检查 FreeBSD 是否能够识别到。

# dmesg | grep Features2
  Features2=0x7ffafbff<SSE3,PCLMULQDQ,DTES64,MON,DS_CPL,VMX,SMX,EST,TM2,SSSE3,SDBG,FMA,
  CX16,xTPR,PDCM,PCID,SSE4.1,SSE4.2,x2APIC,MOVBE,POPCNT,TSCDLT,AESNI,XSAVE,OSXSAVE,AVX,
  F16C,RDRAND>

现在我们已经确认 CPU 准备就绪,我们需要安装一些软件包,以便轻松创建和管理客户操作系统:

pkg install openntpd vm-bhyve bhyve-firmware

简而言之,OpenNTPD 是来自 OpenBSD 项目的一个简单时间守护进程。它可以防止主机时间偏移。当虚拟化程序由于客户工作负载而面临极大压力时,这可能导致系统时间迅速失去同步。OpenNTPD 通过确保你的上游时间源通过 HTTPS 协议报告正确的时间,来保持时间的准确性。bhyve-firmware 是个元包,用于从软件包中加载 bhyve 支持的最新 EDK2 固件。最后,vm-bhyve 是用于 bhyve 的管理系统,使用 shell 编写,避免了复杂的依赖关系。

使用 vm-bhyve 为机器引导并做好准备非常简单,但需要注意一些 ZFS 选项,以确保客户在底层存储上能够保持良好的性能,特别是对于一般工作负载:

# zfs create -o mountpoint=/vm -o recordsize=64k zroot/vm
# cat <<EOF >> /etc/rc.conf
vm_enable=”YES”
vm_dir=”zfs:zroot/vm”
vm_list=””
vm_delay=”30”
EOF
# vm init

在我们深入讨论之前,我们应该先下载稍后将使用的 ISO 文件,以便 vm-bhyve 安装程序可以使用它们。要将 ISO 下载到 vm-bhyve ISO 存储中,可以使用 vm iso 命令:

# vm iso https://files.bsd.engineer/Windows11-bhyve.iso

(sha256 – 46c6e0128d1123d5c682dfc698670e43081f6b48fcb230681512edda216d3325)

# vm iso https://repo.almalinux.org/almalinux/9.5/isos/x86_64/AlmaLinux-9.5-x86_64-dvd.iso

(sha256 – 3947accd140a2a1833b1ef2c811f8c0d48cd27624cad343992f86cfabd2474c9)

这些文件将被下载到目录 /vm/.iso 中。注意:AlmaLinux ISO 文件直接从项目官网下载,校验和可以上游验证。而 Windows11-bhyve ISO 文件是从 Microsoft 下载的,并经过修改,确保它能够安装在 Microsoft 认为是“未支持”硬件的设备上,并已提供用于协助本文。因此,该 ISO 文件仅应在实验室环境中使用。它已移除 CPU 和 TPM 要求,并且不再需要创建 Microsoft 帐户。

网络配置

默认情况下,vm-bhyve 使用桥接将系统的物理接口与分配给每个虚拟机的 tap 接口连接。在将物理接口添加到桥接时,某些功能,如 TCP 分段卸载(TSO)和大接收卸载(LRO),不会被禁用,但需要禁用这些功能,以确保虚拟机的网络功能正常工作。如果主机有 em(4) 接口,可以通过以下命令禁用它:

# ifconfig em0 -tso -lro

为了避免每次重启后都需要禁用这些功能,可以将其添加到系统的 /etc/rc.conf 文件中:

# ifconfig_em0_ipv6="inet6 2403:5812:73e6:3::9:0 prefixlen 64 -tso -lro"

根据使用的网卡不同,以上步骤可能不是每种情况都需要,但如果你遇到虚拟机网络性能问题,这就是可能的原因。

要配置虚拟交换机(桥接),可以使用 switch vm 子命令:

# vm switch create public
# vm switch add public em0

这将创建一个名为 public 的虚拟交换机,并将 em0 物理接口添加到该虚拟交换机中。

模板

模板用于帮助设置虚拟机配置,确保虚拟机使用正确的虚拟硬件和其他必要的设置。使用 root 用户,添加以下内容到模板仓库:

# cat <<EOF > /vm/.templates/linux-uefi.conf
loader=”uefi”
graphics=”yes”
cpu=2
memory=1G
disk0_type=”virtio-blk”
disk0_name=”disk0.img”
disk0_dev=”file”
graphics_listen=”[::]”
graphics_res=”1024x768”
xhci_mouse=”yes”
utctime=”yes”
virt_random=”yes”
EOF

# cat <<EOF > /vm/.templates/windows-uefi.conf
loader=”uefi”
graphics=”yes”
cpu=2
memory=4G
disk0_type=”nvme”
disk0_name=”disk0.img”
disk0_dev=”file”
graphics_listen=”[::]”
graphics_res=”1024x768”
xhci_mouse=”yes”
utctime=”no”
virt_random=”yes”
EOF

创建虚拟机

在准备好存储、网络、安装程序和模板后,现在可以创建虚拟机了。

# vm create -t windows-uefi -s 100G windows-guest
# vm add -d network -s public windows-guest

# vm create -t linux-uefi -s 100G linux-guest
# vm add -d network -s public linux-guest

上述操作使用相应的模板创建了 Windows 和 Linux 虚拟机,并为每个虚拟机分配了 100GB 的存储(使用文件存储)。同时,为每个虚拟机添加了一个连接到 public vSwitch 的网络接口。

Windows 虚拟机在安装过程中需要稍作调整,以便在安装 VirtIO 驱动程序之前能够进行网络访问。编辑虚拟机配置,将网络接口从 virtio-net 更改为 e1000:

# vm configure windows-guest

将 network0_type="e1000" 修改为 e1000。

待安装了 RedHat VirtIO 驱动程序,可以恢复为 virtio-net。

安装和使用虚拟机

要安装每个虚拟机:

# vm install windows-guest Windows11-bhyve.iso
# vm install linux-guest AlmaLinux-9.5-x86_64-dvd.iso

待安装启动,bhyve 将进入等待状态。它将在与 VNC 控制台端口建立连接之前不会开始 ISO 启动过程。要确定哪个虚拟机控制台正在相应的 VNC 端口上运行,可以使用子命令 list :

# vm list
NAME DATASTORE LOADER CPU MEMORY VNC AUTO STATE
linux-guest default uefi 2 1G [::]:5901 No Locked (host)
windows-guest default uefi 2 8G [::]:5900 No Locked (host)

使用像 TigerVNC 和 TightVNC 这样的 VNC 查看器,连接每个虚拟机的 IPv6 地址和端口以开始安装:

[2001:db8:1::a]:5900 # if the host is remote
[::1]:5900 # if it is on your local machine using localhost

安装完 Windows 客户端后,可以加载 VirtIO 驱动程序。可以在以下位置找到驱动程序:

https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/archive-virtio/virtio-win-0.1.266-1/virtio-win-gt-x64.msi

(sha256 – 37b9ee622cff30ad6e58dea42fd15b3acfc05fbb4158cf58d3c792b98dd61272)

安装完 Windows 后,使用 Edge 浏览器访问上述链接下载并安装这些驱动程序。安装完成后,关闭主机,将虚拟机配置文件中的网络接口切换回 virtio-net,系统即可正常启动。

现在,我们已经安装了可用的客户端,但需要对其进行控制,以便根据需要启动和停止。以下命令将对你的客户端执行基本操作,如启动、停止或立即关闭:

# vm start linux-guest
# vm stop windows-guest
# vm poweroff windows-guest

stop 和 poweroff 之间的区别在于,stop 向客户端发出 ACPI 关机请求,而 poweroff 立即终止 bhyve 进程,并不会干净地关闭客户端。

总结

本文简要介绍了如何控制 bhyve 并使用 FreeBSD 包管理库中直接提供的工具安装常见操作系统。vm-bhyve 能做的远不止本文所述的内容,详细信息可以参考 vm(8) 手册页。


Jason Tubnor 拥有超过 28 年的 IT 行业经验,涉及多个领域,目前是 Latrobe Community Health Service(澳大利亚维多利亚州)的 ICT 高级安全负责人。自 1990 年代中期接触 Linux 和开源软件,并于 2000 年开始使用 OpenBSD,Jason 利用这些工具在不同行业的组织中解决了各种问题。Jason 还是 BSDNow 播客的共同主持人。

最后更新于4个月前

这有帮助吗?