FreeBSD 中文社区 2025 第二季度问卷调查
FreeBSD 中文社区(CFC)
VitePress 镜像站QQ 群 787969044视频教程Ⅰ视频教程Ⅱ
  • FreeBSD 从入门到追忆
  • 中文期刊
  • 状态报告
  • 发行说明
  • 手册
  • 网络文章集锦
  • 笔记本支持报告
  • Port 开发者手册
  • 架构手册
  • 开发者手册
  • 中文 man 手册
  • 文章
  • 书籍
  • FreeBSD 中文手册
  • 编辑日志
  • 译者说明
  • FreeBSD 中文手册
  • 概述
  • 前言
    • 致读者
    • 第四版
    • 第三版
    • 第二版(2004)
    • 第一版(2001)
    • 本书的组织结构
    • 本书中使用的一些约定
    • 致谢
  • 第一部分:快速开始
  • 第1章 简介
    • 1.1.概述
    • 1.2.欢迎来到 FreeBSD!
    • 1.3.关于 FreeBSD 项目
  • 第2章 安装 FreeBSD
    • 2.1.概述
    • 2.2.最低硬件要求
    • 2.3.安装前的准备工作
    • 2.4.开始安装
    • 2.5.使用 bsdinstall
    • 2.6.分配磁盘空间
    • 2.7.获取安装文件
    • 2.8.账户、时区、服务和安全
    • 2.9.故障排除
    • 2.10.使用 Live CD
  • 第3章 FreeBSD 基础
    • 3.1.概述
    • 3.2.虚拟控制台和终端
    • 3.3.用户和基本账户管理
    • 3.4.权限
    • 3.5.目录结构
    • 3.6.磁盘结构
    • 3.7.文件系统的挂载与卸载
    • 3.8.进程和守护进程
    • 3.9.Shell
    • 3.10.文本编辑器
    • 3.11.设备和设备节点
    • 3.12.手册页
  • 第4章 安装应用程序:软件包和 Ports
    • 4.1.概述
    • 4.2.软件安装的概述
    • 4.3.寻找所需的应用程序
    • 4.4.使用 pkg 管理二进制包
    • 4.5.使用 Ports
    • 4.6.使用 Poudriere 构建软件包
    • 4.7.安装后的注意事项
    • 4.8.如何处理损坏的 port
  • 第5章 X Window 系统
    • 5.1.概述
    • 5.2.安装 Xorg
    • 5.3.显卡驱动
    • 5.4.Xorg 配置
    • 5.5.在 X11 中使用字体
  • 第6章 FreeBSD 中的 Wayland
    • 6.1.简介
    • 6.2.Wayland 概述
    • 6.3.Wayfire 混成器
    • 6.4.Hikari 混成器
    • 6.5.Sway 混成器
    • 6.6.使用 Xwayland
    • 6.7.使用 VNC 进行远程连接
    • 6.8.Wayland 登录管理器
    • 6.9.实用工具
  • 第7章 网络
    • 7.1.概述
    • 7.2.设置网络
    • 7.3.有线网络
    • 7.4.无线网络
    • 7.5.主机名
    • 7.6.DNS
    • 7.7.故障排除
  • 第二部分:常见任务
  • 第8章 桌面环境
    • 8.1.概述
    • 8.2.桌面环境
    • 8.3.浏览器
    • 8.4.开发工具
    • 8.5.桌面办公应用
    • 8.6.文档阅读器
    • 8.7.财务
  • 第9章 多媒体
    • 9.1.概述
    • 9.2.设置声卡
    • 9.3.音频播放器
    • 9.4.视频播放器
    • 9.5.视频会议
    • 9.6.图像扫描仪
  • 第10章 配置 FreeBSD 内核
    • 10.1.概述
    • 10.2.为什么要构建定制内核
    • 10.3.浏览系统硬件
    • 10.4.配置文件
    • 10.5.构建并安装定制内核
    • 10.6.如果发生了错误
  • 第11章 打印
    • 11.1.快速入门
    • 11.2.连接打印机
    • 11.3.常见的页面描述语言(PDL)
    • 11.4.直接打印
    • 11.5.LPD(行式打印机程序)
    • 11.6.其他打印系统
  • 第12章 Linux 二进制兼容层
    • 12.1.概述
    • 12.2.配置 Linux 二进制兼容层
    • 12.3.Linux 用户空间
    • 12.4.高级主题
  • 第13章 WINE
    • 13.1.概述
    • 13.2.WINE 概述和概念
    • 13.3.在 FreeBSD 上安装 WINE
    • 13.4.在 FreeBSD 上运行第一个 WINE 程序
    • 13.5.配置 WINE 安装程序
    • 13.6.WINE 图形化用户管理界面
    • 13.7.多用户 FreeBSD 与 WINE
    • 13.8.FreeBSD 上的 WINE 常见问题
  • 第三部分:系统管理
  • 第14章 配置与优化
    • 14.1.概述
    • 14.2.配置文件
    • 14.3.管理 FreeBSD 中的服务
    • 14.4.Cron 和 Periodic
    • 14.5.配置系统日志
    • 14.6.电源和资源管理
    • 14.7.添加交换空间
  • 第15章 FreeBSD 的引导过程
    • 15.1.概述
    • 15.2.FreeBSD 的引导过程
    • 15.3.Device Hints
    • 15.4.关机流程
  • 第16章 安全
    • 16.1.概述
    • 16.2.简介
    • 16.3.账户安全
    • 16.4.入侵检测系统(IDS)
    • 16.5.安全等级
    • 16.6.文件标志位
    • 16.7.OpenSSH
    • 16.8.OpenSSL
    • 16.9.Kerberos
    • 16.10.TCP 封装器(TCP Wrapper)
    • 16.11.访问控制列表(ACL)
    • 16.12.Capsicum
    • 16.13.进程记账
    • 16.14.资源限制
    • 16.15.监控第三方安全问题
    • 16.16.FreeBSD 安全公告
  • 第17章 jail 与容器
    • 17.1.概述
    • 17.2.jail 的类型
    • 17.3.主机配置
    • 17.4.传统 jail(厚 jail)
    • 17.5.瘦 jail
    • 17.6.管理 jail
    • 17.7.更新 jail
    • 17.8.jail 资源限制
    • 17.9.jail 管理器与容器
  • 第18章 强制访问控制
    • 18.1.概述
    • 18.2.关键术语
    • 18.3.了解 MAC 标签
    • 18.4.规划安全配置
    • 18.5.可用的 MAC 策略
    • 18.6.用户锁定
    • 18.7.MAC Jail 中的 Nagios
    • 18.8.MAC 框架的故障排除
  • 第19章 安全事件审计
    • 19.1.概述
    • 19.2.关键术语
    • 19.3.审计配置
    • 19.4.使用审计跟踪
  • 第20章 存储
    • 20.1.概述
    • 20.2.添加磁盘
    • 20.3.调整和增加磁盘大小
    • 20.4.USB 存储设备
    • 20.5.创建和使用 CD
    • 20.6.创建和使用 DVD
    • 20.7.创建和使用软盘
    • 20.8.备份的基础知识
    • 20.9.内存盘
    • 20.10.文件系统快照
    • 20.11.磁盘配额
    • 20.12.加密磁盘分区
    • 20.13.加密交换分区
    • 20.14.高可用性存储(HAST)
  • 第21章 GEOM: 模块化磁盘转换框架
    • 21.1.概述
    • 21.2.RAID0——条带
    • 21.3.RAID1——镜像
    • 21.4.RAID3——带有专用奇偶校验的字节级条带
    • 21.5.软件 RAID 设备
    • 21.6.GEOM Gate 网络设备
    • 21.7.为磁盘设备添加卷标
    • 21.8.通过 GEOM 实现 UFS 日志
  • 第22章 Z 文件系统(ZFS)
    • 22.1.是什么使 ZFS 与众不同
    • 22.2.快速入门指南
    • 22.3.zpool 管理
    • 22.4.zfs 管理
    • 22.5.委托管理
    • 22.6.高级主题
    • 22.7.更多资源
    • 22.8.ZFS 特性和术语
  • 第23章 其他文件系统
    • 23.1.概述
    • 23.2.Linux® 文件系统
    • 23.3.Windows® 文件系统
    • 23.4.MacOS® 文件系统
  • 第24章 虚拟化
    • 24.1.概述
    • 24.2.使用 macOS® 上的 Parallels Desktop 安装 FreeBSD
    • 24.3.使用 macOS® 上的 VMware Fusion 安装 FreeBSD
    • 24.4.使用 VirtualBox™ 安装 FreeBSD
    • 24.5.在 FreeBSD 上安装 VirtualBox™
    • 24.6.使用 FreeBSD 上的 QEMU 虚拟化
    • 24.7.使用 FreeBSD 上的 bhyve 虚拟机
    • 24.8.基于 FreeBSD 的 Xen™ 虚拟机
  • 第25章 本地化——i18n/L10n 的使用和设置
    • 25.1.概述
    • 25.2.使用本地化
    • 25.3.寻找 i18n 应用程序
    • 25.4.特定语言的区域配置
  • 第26章 FreeBSD 更新与升级
    • 26.1.概述
    • 26.2.更新 FreeBSD
    • 26.3.更新 Bootcode
    • 26.4.更新文档
    • 26.5.追踪开发分支
    • 26.6.从源代码更新 FreeBSD
    • 26.7.多台机器的追踪
    • 26.8.在非 FreeBSD 主机上进行构建
  • 第27章 DTrace
    • 27.1.概述
    • 27.2.实现上的差异
    • 27.3.开启 DTrace 支持
    • 27.4.启用内核外部模块 DTrace
    • 27.5.使用 DTrace
  • 第28章 USB 设备模式/USB OTG
    • 28.1.概述
    • 28.2.USB 虚拟串行端口
    • 28.3.USB 设备模式网络接口
    • 28.4.USB 虚拟存储设备
  • 第四部分:网络通讯
  • 第29章 串行通信
    • 29.1.概述
    • 29.2.串行术语和硬件
    • 29.3.终端
    • 29.4.拨入服务
    • 29.5.拨出服务
    • 29.6.设置串行控制台
  • 第30章 PPP
    • 30.1.概述
    • 30.2.配置 PPP
    • 30.3.PPP 连接的故障排除
    • 30.4.使用以太网 PPP(PPPoE)
    • 30.5.使用 ATM 上的 PPP (PPPoA)
  • 第31章 电子邮件
    • 31.1.概述
    • 31.2.邮件组件
    • 31.3.DragonFly 邮件代理(DMA)
    • 31.4.Sendmail
    • 31.5.修改邮件传输代理
    • 31.6.邮件用户代理
    • 31.7.高级主题
  • 第32章 网络服务器
    • 32.1.概述
    • 32.2.inetd 超级服务器
    • 32.3.网络文件系统(NFS)
    • 32.4.网络信息系统(NIS)
    • 32.5.轻型目录访问协议(LDAP)
    • 32.6.动态主机设置协议(DHCP)
    • 32.7.域名系统(DNS)
    • 32.8.零配置网络(mDNS/DNS-SD)
    • 32.9.Apache HTTP 服务器
    • 32.10.文件传输协议(FTP)
    • 32.11.用于 Microsoft® Windows® 客户端的文件和打印服务(Samba)
    • 32.12.用 NTP 进行时钟同步
    • 32.13.iSCSI target 和 initiator 的配置
  • 第33章 防火墙
    • 33.1.概述
    • 33.2.防火墙的概念
    • 33.3.PF
    • 33.4.IPFW
    • 33.5.IPFILTER(IPF)
    • 33.6.Blacklistd
  • 第34章 高级网络
    • 34.1.概述
    • 34.2.网关和路由
    • 34.3.虚拟主机
    • 34.4.无线高级身份验证
    • 34.5.无线自组织(Ad-hoc)模式
    • 34.6.USB 网络共享
    • 34.7.蓝牙
    • 34.8.桥接
    • 34.9.链路聚合与故障转移
    • 34.10.使用 PXE 进行无盘操作
    • 34.11.共用地址冗余协议(CARP)
    • 34.12.VLAN
  • 第五部分:附录
  • 附录 A.获取 FreeBSD
    • A.1.镜像站
    • A.2.使用 Git
    • A.3.使用 Subversion
    • A.4.光盘
  • 附录 B.书目
    • B.1.FreeBSD 相关书籍
    • B.2.安全性参考文献
    • B.3.UNIX 历史
    • B.4.期刊与杂志
  • 附录 C.网络资源
    • C.1.网站
    • C.2.邮件列表
    • C.3.Usenet 新闻组
  • 附录 D.OpenPGP 密钥
    • D.1.官方成员
  • 术语表
  • 后记
由 GitBook 提供支持
LogoLogo

FreeBSD 中文社区(CFC) 2025

在本页
  • 24.7.1. 准备宿主机
  • 24.7.2. 创建 FreeBSD 虚拟机
  • 24.7.3. 创建 Linux® 虚拟机
  • 24.7.4. 使用 UEFI 固件启动 bhyve 虚拟机
  • 24.7.5. 为 bhyve 虚拟机启用图形 UEFI 帧缓存
  • 24.7.6. 创建 Microsoft Windows® 虚拟机
  • 24.7.6.1. 创建 Windows 11 虚拟机
  • 24.7.7. 在 bhyve 虚拟机中使用 ZFS
  • 24.7.8. 创建虚拟机快照
  • 24.7.8.1. ZFS 快照
  • 24.7.8.2. 内存和 CPU 快照(实验性功能)
  • 24.7.9. 在 Jail 中运行 bhyve
  • 24.7.9.1. 为 bhyve 创建 Jail
  • 24.7.9.2. 配置 Jail
  • 24.7.9.3. 在 Jail 内创建虚拟机
  • 24.7.10. 虚拟机控制台
  • 24.7.11. 管理虚拟机
  • 24.7.12. 工具和实用程序
  • 24.7.13. 持久化配置
在GitHub上编辑
导出为 PDF
  1. 第24章 虚拟化

24.7.使用 FreeBSD 上的 bhyve 虚拟机

bhyve 是一款 BSD 授权的虚拟化管理程序,已在 FreeBSD 10.0-RELEASE 中成为基本系统的一部分。该虚拟化管理程序支持多个操作系统,包括 FreeBSD、OpenBSD、许多 Linux® 发行版以及 Microsoft Windows®。默认情况下,bhyve 提供对串行控制台的访问,而不模拟图形控制台。通过使用新处理器的虚拟化卸载功能,避免了翻译指令和手动管理内存映射的传统方法。

bhyve 的设计要求:

  • 支持 Intel® 处理器的 Intel 扩展页表(EPT),

  • 或支持 AMD® 处理器的 AMD 快速虚拟化索引(RVI)或嵌套页表(NPT),

  • 或 ARM® aarch64 CPU。

在 ARM 上,仅支持纯 ARMv8.0 虚拟化,目前不使用虚拟化主机扩展。托管 Linux® 或 FreeBSD 虚拟机时,如果有多个 vCPU,则需要 VMX 非限制模式支持(UG)。

判断 Intel 或 AMD 处理器是否支持 bhyve 的最简单方法是运行 dmesg 或查看 /var/run/dmesg.boot 文件中的 POPCNT 处理器特征标志(对于 AMD® 处理器)或 EPT 和 UG(对于 Intel® 处理器)的 VT-x 行。

24.7.1. 准备宿主机

创建虚拟机的第一步是配置宿主系统。首先,加载 bhyve 内核模块:

# kldload vmm

将虚拟机与宿主的网络连接有几种方法;一种简单的方式是为虚拟机中的网络设备创建一个 tap 接口。为了让网络设备参与网络,还需要创建一个包含 tap 接口和物理接口作为成员的桥接接口。在此示例中,物理接口是 igb0:

# ifconfig tap0 create
# sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
# ifconfig bridge0 create
# ifconfig bridge0 addm igb0 addm tap0
# ifconfig bridge0 up

24.7.2. 创建 FreeBSD 虚拟机

创建一个文件作为虚拟机的虚拟磁盘。指定虚拟磁盘的大小和名称:

# truncate -s 16G guest.img

下载 FreeBSD 安装镜像:

# fetch https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASE-amd64-bootonly.iso
FreeBSD-14.0-RELEASE-amd64-bootonly.iso                426 MB   16 MBps    22s

FreeBSD 附带了示例脚本 vmrun.sh,用于在 bhyve 中运行虚拟机。该脚本将启动虚拟机并在一个循环中运行,这样如果虚拟机崩溃,它会自动重新启动。vmrun.sh 接受多个选项来控制虚拟机的配置,包括:

  • -c 控制虚拟 CPU 的数量,

  • -m 限制分配给虚拟机的内存,

  • -t 定义使用的 tap 设备,

  • -d 指定使用的磁盘镜像,

  • -i 告诉 bhyve 从 CD 镜像而非磁盘启动,

  • -I 定义使用的 CD 镜像。

最后一个参数是虚拟机的名称,用于跟踪正在运行的虚拟机。以下命令列出了所有可用的程序参数选项:

# sh /usr/share/examples/bhyve/vmrun.sh -h

此示例以安装模式启动虚拟机:

# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M -t tap0 -d guest.img \
     -i -I FreeBSD-14.0-RELEASE-amd64-bootonly.iso guestname

虚拟机将启动并开始安装。当系统在安装结束时询问是否进入 shell 时,选择 Yes。

重启虚拟机。重启虚拟机会导致 bhyve 退出,但 vmrun.sh 脚本会在循环中运行 bhyve 并自动重新启动。当发生这种情况时,选择启动菜单中的重启选项以跳出循环。现在可以从虚拟磁盘启动虚拟机系统:

# sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d guest.img guestname

24.7.3. 创建 Linux® 虚拟机

为此,首先确保已安装该 Port,然后创建一个文件作为虚拟机的虚拟磁盘:

# truncate -s 16G linux.img

使用 grub2-bhyve 启动 Linux 虚拟机是一个两步过程。

  1. 首先加载内核,然后启动虚拟机。

创建一个 device.map 文件,grub 将用它来将虚拟设备映射到宿主系统上的文件:

(hd0) ./linux.img
(cd0) ./somelinux.iso
# grub-bhyve -m device.map -r cd0 -M 1024M linuxguest

这将启动 grub。如果安装 CD 包含 grub.cfg 文件,将显示一个菜单。如果没有,则必须手动定位并加载 vmlinuz 和 initrd 文件:

grub> ls
(hd0) (cd0) (cd0,msdos1) (host)
grub> ls (cd0)/isolinux
boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest
splash.jpg TRANS.TBL vesamenu.c32 vmlinuz
grub> linux (cd0)/isolinux/vmlinuz
grub> initrd (cd0)/isolinux/initrd.img
grub> boot

现在内核已加载,可以启动虚拟机系统:

# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \
    -s 3:0,virtio-blk,./linux.img -s 4:0,ahci-cd,./somelinux.iso \
    -l com1,stdio -c 4 -m 1024M linuxguest

系统将启动并开始安装。在虚拟机中安装系统后,重启虚拟机。重启虚拟机会导致 bhyve 退出。虚拟机实例需要被销毁才能重新启动:

# bhyvectl --destroy --vm=linuxguest

现在,可以直接从虚拟磁盘启动虚拟机。加载内核:

# grub-bhyve -m device.map -r hd0,msdos1 -M 1024M linuxguest
grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1) (cd0) (cd0,msdos1) (host)
(lvm/VolGroup-lv_swap) (lvm/VolGroup-lv_root)
grub> ls (hd0,msdos1)/
lost+found/ grub/ efi/ System.map-2.6.32-431.el6.x86_64 config-2.6.32-431.el6.x86_64
symvers-2.6.32-431.el6.x86_64.gz vmlinuz-2.6.32-431.el6.x86_64
initramfs-2.6.32-431.el6.x86_64.img
grub> linux (hd0,msdos1)/vmlinuz-2.6.32-431.el6.x86_64 root=/dev/mapper/VolGroup-lv_root
grub> initrd (hd0,msdos1)/initramfs-2.6.32-431.el6.x86_64.img
grub> boot

启动虚拟机:

# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \
    -s 3:0,virtio-blk,./linux.img -l com1,stdio -c 4 -m 1024M linuxguest

Linux® 将在虚拟机中启动并最终显示登录提示。登录后使用虚拟机。完成后,重启虚拟机以退出 bhyve。销毁虚拟机实例:

# bhyvectl --destroy --vm=linuxguest

24.7.4. 使用 UEFI 固件启动 bhyve 虚拟机

除了 bhyveload 和 grub-bhyve,bhyve 超级虚拟机还可以使用 UEFI 固件启动虚拟机。这种选项可能支持其他加载器不支持的客操作系统。

将固件安装好后,在 bhyve 命令行中添加 -l bootrom,/path/to/firmware 标志。实际的 bhyve 命令可能如下所示:

# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \
  	-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
	-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
	-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
	guest

为了允许虚拟机存储 UEFI 变量,可以将变量文件附加到 -l 标志中。请注意,bhyve 将会将对虚拟机变量的修改写入指定的变量文件。因此,请确保首先为每个虚拟机创建一个变量模板文件的副本:

# cp /usr/local/share/uefi-firmware/BHYVE_UEFI_VARS.fd /path/to/vm-image/BHYVE_UEFI_VARS.fd

然后,在 bhyve 参数中添加该变量文件:

# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \
  	-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
	-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
	-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd,/path/to/vm-image/BHYVE_UEFI_VARS.fd \
	guest

注意

某些 Linux 发行版要求使用 UEFI 变量存储其 UEFI 启动文件的路径(例如,使用 linux64.efi 或 grubx64.efi,而不是 bootx64.efi)。因此,建议使用变量文件来避免手动修改启动分区文件。

# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \
  	-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
	-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
	-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI_CSM.fd \
	guest

24.7.5. 为 bhyve 虚拟机启用图形 UEFI 帧缓存

UEFI 固件支持对于主要以图形为主的操作系统(如 Microsoft Windows®)特别有用。

可以通过添加 -s 29,fbuf,tcp=0.0.0.0:5900 标志启用 UEFI-GOP 帧缓存。可以使用 w=800 和 h=600 配置帧缓存分辨率,并且可以通过添加 wait 指示 bhyve 在启动虚拟机之前等待 VNC 连接。帧缓存可以从主机或通过网络通过 VNC 协议进行访问。此外,可以添加 -s 30,xhci,tablet 以实现与主机的精确鼠标光标同步。

最终的 bhyve 命令将如下所示:

# bhyve -AHP -s 0:0,hostbridge -s 31:0,lpc \
  	-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
	-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
	-s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait \
	-s 30,xhci,tablet \
	-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
	guest

请注意,在 BIOS 模拟模式下,若控制从固件传递给客操作系统,帧缓存将停止更新。

24.7.6. 创建 Microsoft Windows® 虚拟机

为 Windows 10 或更早版本的操作系统设置虚拟机,可以直接使用原始安装媒体,过程相对简单。除了最低资源要求,运行 Windows 作为虚拟机还需要:

  • 配置虚拟机内存(使用 -w 标志)

  • 使用 UEFI 启动固件启动。

以下是使用 Windows 安装 ISO 启动虚拟机虚拟机的示例:

bhyve \
      -c 2 \
      -s 0,hostbridge \
      -s 3,nvme,windows2016.img \
      -s 4,ahci-cd,install.iso \
      -s 10,virtio-net,tap0 \
      -s 31,lpc \
      -s 30,xhci,tablet \
      -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
      -m 8G -H -w \
      windows2016

在安装过程中,建议只使用一个或两个 VCPU,但安装完成后可以增加此数量。

24.7.6.1. 创建 Windows 11 虚拟机

警告

制造商并不支持修改 Windows 安装媒体以在没有 TPM 模块的情况下运行 Windows 虚拟机。实施此类方法前,请考虑你的应用程序和使用案例。

24.7.7. 在 bhyve 虚拟机中使用 ZFS

如果主机上可用 ZFS,使用 ZFS 卷而不是磁盘镜像文件可以为虚拟机提供显著的性能提升。可以通过以下方式创建 ZFS 卷:

# zfs create -V16G -o volmode=dev zroot/linuxdisk0

启动虚拟机时,指定 ZFS 卷作为磁盘驱动器:

# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \
  	-s3:0,virtio-blk,/dev/zvol/zroot/linuxdisk0 \
	-l com1,stdio -c 4 -m 1024M linuxguest

如果你在主机和虚拟机中都使用 ZFS,请记住两者都会缓存虚拟机的内容,可能会造成内存竞争压力。为缓解此问题,考虑将主机的 ZFS 文件系统设置为仅缓存元数据。为此,请对主机上的 ZFS 文件系统应用以下设置,将 <name> 替换为特定虚拟机 zvol 数据集的名称:

# zfs set primarycache=metadata <name>

24.7.8. 创建虚拟机快照

现代超级虚拟机允许用户创建“快照”,该快照包括虚拟机的磁盘、CPU 和内存内容。快照通常可以在虚拟机运行或关闭的情况下创建。然后,可以将虚拟机恢复到快照拍摄时的精确状态。

24.7.8.1. ZFS 快照

使用 ZFS 卷作为虚拟机的后端存储可以进行虚拟机磁盘的快照。例如:

zfs snapshot zroot/path/to/zvol@snapshot_name

警告

在虚拟机使用 ZFS zvol 时回滚到快照可能会破坏文件系统内容并导致虚拟机崩溃。所有未保存的数据将丢失,且自上次快照以来的修改可能会被销毁。

若虚拟机关闭,可能需要第二次回滚以恢复文件系统的可用状态。这最终会摧毁自快照以来所做的所有更改。

24.7.8.2. 内存和 CPU 快照(实验性功能)

从 FreeBSD 13 开始,bhyve 具有一个实验性的“快照”功能,可以将虚拟机的内存和 CPU 状态转储到文件中,然后暂停虚拟机。稍后可以从快照文件恢复虚拟机。

警告

此功能尚不适合生产环境使用,并且仅适用于特定的虚拟机配置。存在多个限制:

  • nvme 和 virtio-blk 存储后端目前无法工作

  • 快照仅在虚拟机使用每种设备的一种类型时支持,即如果附加了多个 ahci-hd 磁盘,快照创建将失败

  • 此功能在 Intel 系统上可能较为稳定,但可能在 AMD CPU 上无法工作。

注意

首先,在 /etc/src.conf 文件中添加以下内容:

WITH_BHYVE_SNAPHOT=yes
BHYVE_SNAPSHOT=1
MK_BHYVE_SNAPSHOT=yes

注意

如果系统进行了部分或完全重建,建议在继续操作前运行

# cd /usr/src
# make cleanworld

要验证快照功能是否成功启用,可以输入:

# bhyvectl --usage

并检查输出中是否列出了 --suspend 标志。如果没有该标志,说明该功能未正确激活。

然后,你可以快照并暂停你选择的运行中的虚拟机:

# bhyvectl --vm=vmname --suspend=/path/to/snapshot/filename

注意

提供绝对路径和文件名给 --suspend。否则,bhyve 将把快照数据写入启动 bhyve 时所在的目录。

确保将快照数据写入安全目录。生成的输出包含虚拟机的完整内存转储,因此可能包含敏感数据(例如密码)!

此操作会生成三个文件:

  • 内存快照 - 文件名与 --suspend 输入相同

  • 内核文件 - 文件名与 --suspend 输入相同,后缀为 .kern

  • 元数据 - 包含系统状态的元数据,后缀为 .meta

要从快照恢复虚拟机,可以使用 -r 标志与 bhyve:

# bhyve -r /path/to/snapshot/filename

在不同 CPU 架构上恢复虚拟机快照将无法工作。通常,尝试在与创建快照的系统不同的系统上恢复将会失败。

24.7.9. 在 Jail 中运行 bhyve

24.7.9.1. 为 bhyve 创建 Jail

首先,创建一个 jail 环境。如果使用 UFS 文件系统,直接运行:

# mkdir -p /jails/bhyve
# zfs create zroot/jails
# zfs create zroot/jails/bhyve

然后为虚拟机 bhyvevm0 创建一个 ZFS zvol:

# zfs create zroot/vms
# zfs create -V 20G zroot/vms/bhyvevm0

如果不使用 ZFS,使用以下命令直接在 jail 目录结构中创建一个磁盘映像文件:

# mkdir /jails/bhyve/vms
# truncate -s 20G /jails/bhyve/vms/bhyvevm0

下载一个 FreeBSD 镜像,最好是与主机版本相同或更旧的版本,并将其解压到 jail 目录中:

# cd /jails
# fetch -o base.txz http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/13.2-RELEASE/base.txz
# tar -C /jails/bhyve -xvf base.txz

注意

在 jail 中运行高版本的 FreeBSD(例如,在 13.2-RELEASE 主机中运行 14.0-RELEASE)是不支持的。

接下来,向 /etc/devfs.rules 添加 devfs 规则集:

[devfsrules_jail_bhyve=100]
add include $devfsrules_hide_all
add include $devfsrules_unhide_login
add path 'urandom' unhide
add path 'random' unhide
add path 'crypto' unhide
add path 'shm' unhide
add path 'zero' unhide
add path 'null' unhide
add path 'mem' unhide
add path 'vmm' unhide
add path 'vmm/*' unhide
add path 'vmm.io' unhide
add path 'vmm.io/*' unhide
add path 'nmdmbhyve*' unhide
add path 'zvol' unhide
add path 'zvol/zroot' unhide
add path 'zvol/zroot/vms' unhide
add path 'zvol/zroot/vms/bhyvevm0' unhide
add path 'zvol/zroot/vms/bhyvevm1' unhide
add path 'tap10*' unhide

注意

如果 /etc/devfs.rules 文件中已有其他编号为 100 的 devfs 规则,请将列表中的 ID 替换为另一个尚未使用的 ID 号码。

注意

如果不使用 ZFS 文件系统,请跳过 /etc/devfs.rules 中与 zvol 相关的规则:

add path 'zvol' unhide
add path 'zvol/zroot' unhide
add path 'zvol/zroot/vms' unhide
add path 'zvol/zroot/vms/bhyvevm0' unhide
add path 'zvol/zroot/vms/bhyvevm1' unhide

这些规则将导致 bhyve

  • 创建名为 bhyvevm0 和 bhyvevm1 的虚拟机磁盘卷,

  • 使用名为 tap10 的 tap 网络接口。即有效的接口名称将是 tap10、tap100、tap101、… tap109、tap1000 等。限制对可能的 tap 接口名称的访问将防止 jail(从而 bhyve)看到主机和其他 jails 的 tap 接口。

  • 使用以“bhyve”开头的 nmdm 设备,即 /dev/nmdmbhyve0。

可以根据需要扩展和更改这些规则,以适应不同的虚拟机和接口名称。

注意

如果你打算在主机和一个或多个 jails 中使用 bhyve,请记住,tap 和 nmdm 接口名称将在共享环境中操作。例如,你只能将 /dev/nmdmbhyve0 用于主机或 jail 中的 bhyve。

重新启动 devfs 以加载更改:

# service devfs restart

然后,在 /etc/jail.conf 或 /etc/jail.conf.d 中为新的 jail 添加定义。将接口编号 $if 和 IP 地址替换为你的个人变体。

示例 1. 使用 NAT 或路由流量与防火墙

bhyve {
        $if = 0;
        exec.prestart = "/sbin/ifconfig epair${if} create up";
        exec.prestart += "/sbin/ifconfig epair${if}a up";
        exec.prestart += "/sbin/ifconfig epair${if}a name ${name}0";
        exec.prestart += "/sbin/ifconfig epair${if}b name jail${if}";
        exec.prestart += "/sbin/ifconfig ${name}0 inet 192.168.168.1/27";
        exec.prestart += "/sbin/sysctl net.inet.ip.forwarding=1";

        exec.clean;

        host.hostname = "your-hostname-here";
        vnet;
        vnet.interface = "em${if}";
        path = "/jails/${name}";
        persist;
        securelevel = 3;
        devfs_ruleset = 100;
        mount.devfs;

        allow.vmm;

        exec.start += "/bin/sh /etc/rc";
        exec.stop = "/bin/sh /etc/rc.shutdown";

        exec.poststop += "/sbin/ifconfig ${name}0 destroy";
}

示例 2. 使用桥接网络连接

bhyve {
        $if = 0;
        exec.prestart = "/sbin/ifconfig epair${if} create up";
        exec.prestart += "/sbin/ifconfig epair${if}a up";
        exec.prestart += "/sbin/ifconfig epair${if}a name ${name}0";
        exec.prestart += "/sbin/ifconfig epair${if}b name jail${if}";
        exec.prestart += "/sbin/ifconfig bridge0 addm ${name}0";
        exec.prestart += "/sbin/sysctl net.inet.ip.forwarding=1";

        exec.clean;

        host.hostname = "your-hostname-here";
        vnet;
        vnet.interface = "em${if}";
        path = "/jails/${name}";
        persist;
        securelevel = 3;
        devfs_ruleset = 100;
        mount.devfs;

        allow.vmm;

        exec.start += "/bin/sh /etc/rc";
        exec.stop = "/bin/sh /etc/rc.shutdown";

        exec.poststop += "/sbin/ifconfig ${name}0 destroy";
}

注意

如果你之前将 /etc/devfs.rules 中的 devfs 规则集 ID 100 替换为你自己的唯一数字,请记得在 jails.conf 中也替换相应的数字 ID。

24.7.9.2. 配置 Jail

首次启动 Jail 并进行一些额外的配置工作时,输入以下命令:

# cp /etc/resolv.conf /jails/bhyve/etc
# service jail onestart bhyve
# jexec bhyve
# sysrc ifconfig_jail0="inet 192.168.168.2/27"
# sysrc defaultrouter="192.168.168.1"
# sysrc sendmail_enable=NONE
# sysrc cloned_interfaces="tap100"
# exit

重启并启用 Jail:

# sysrc jail_enable=YES
# service jail restart bhyve

之后,你可以在 Jail 内创建虚拟机。首先,下载 FreeBSD 虚拟机操作系统的安装 ISO 文件:

# jexec bhyve
# cd /vms
# fetch -o freebsd.iso https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASE-amd64-bootonly.iso

24.7.9.3. 在 Jail 内创建虚拟机

使用 bhyvectl 初始化虚拟机:

# jexec bhyve
# bhyvectl --create --vm=bhyvevm0

注意

在 Jail 中启动虚拟机时,可能需要使用 bhyvectl 创建虚拟机。跳过此步骤可能会导致启动 bhyve 时出现以下错误信息:

vm_open: vm-name could not be opened. No such file or directory

最后,使用你喜欢的方式启动虚拟机。

示例 3. 使用 vmrun.sh 和 ZFS 启动

在 ZFS 文件系统上使用 vmrun.sh:

# jexec bhyve
# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M \
     -t tap100 -d /dev/zvols/zroot/vms/bhyvevm0 -i -I /vms/FreeBSD-14.0-RELEASE-amd64-bootonly.iso bhyvevm0

示例 4. 使用 vmrun.sh 和 UFS 启动

在 UFS 文件系统上使用 vmrun.sh:

# jexec bhyve
# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M \
     -t tap100 -d /vms/bhyvevm0 -i -I /vms/FreeBSD-14.0-RELEASE-amd64-bootonly.iso bhyvevm0

示例 5. 使用 ZFS 启动 UEFI 虚拟机操作系统

# pkg -j bhyve install bhyve-firmware

然后直接使用 bhyve 启动:

# bhyve -A -c 4 -D -H -m 2G \
        -s 0,hostbridge \
        -s 1,lpc \
        -s 2,virtio-net,tap100 \
        -s 3,virtio-blk,/dev/zvol/zroot/vms/bhyvevm0 \
	-s 4,ahci-cd,/vms/FreeBSD-14.0-RELEASE-amd64-bootonly.iso \
        -s 31,fbuf,tcp=127.0.0.1:5900,w=1024,h=800,tablet \
        -l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
        -l com1,/dev/nmdbbhyve0A \
        bhyvevm0

这能让你通过 VNC 连接到虚拟机 bhyvevm0,并通过 /dev/nmdbbhyve0B 使用串行控制台。

24.7.10. 虚拟机控制台

# kldload nmdm
# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img \
    -l com1,/dev/nmdm0A -c 4 -m 1024M linuxguest
# cu -l /dev/nmdm0B
Connected

Ubuntu 13.10 handbook ttyS0

handbook login:

要从控制台断开连接,输入换行符(即按 RETURN),然后是波浪符(~),最后是点符号(.)。请记住,只有连接会被断开,而登录会话仍然保持活动状态。因此,其他用户连接到同一控制台时,可以在无需重新认证的情况下继续使用任何活动会话。出于安全考虑,建议在断开连接前注销。

nmdm 设备路径中的编号必须对每个虚拟机唯一,并且在 bhyve 启动之前,不能被任何其他进程使用。编号可以随意选择,无需来自连续的数字序列。设备节点对(即 /dev/nmdm0a 和 /dev/nmdm0b)是在 bhyve 连接其控制台时动态创建的,并在 bhyve 关闭时销毁。在创建启动虚拟机的脚本时,请牢记这一点:你需要确保所有虚拟机都分配有唯一的 nmdm 设备。

24.7.11. 管理虚拟机

每个虚拟机都会在 /dev/vmm 中创建一个设备节点。这使得管理员可以轻松查看正在运行的虚拟机列表:

# ls -al /dev/vmm
total 1
dr-xr-xr-x   2 root  wheel    512 Mar 17 12:19 ./
dr-xr-xr-x  14 root  wheel    512 Mar 17 06:38 ../
crw-------   1 root  wheel  0x1a2 Mar 17 12:20 guestname
crw-------   1 root  wheel  0x19f Mar 17 12:19 linuxguest
crw-------   1 root  wheel  0x1a1 Mar 17 12:19 otherguest

可以使用 bhyvectl 销毁指定的虚拟机:

# bhyvectl --destroy --vm=guestname

以这种方式销毁虚拟机会立即将其杀死。任何未保存的数据将丢失,打开的文件和文件系统可能会被损坏。要优雅地关闭虚拟机,请向其 bhyve 进程发送 TERM 信号。这会触发虚拟机的 ACPI 关机事件:

# ps ax | grep bhyve
17424  -  SC      56:48.27 bhyve: guestvm (bhyve)
# kill 17424

24.7.12. 工具和实用程序

有许多工具和应用程序可在 ports 中找到,帮助简化设置和管理 bhyve 虚拟机:

表 1. bhyve 管理工具

名称
许可证
软件包
文档

vm-bhyve

BSD-2

CBSD

BSD-2

Virt-Manager

LGPL-3

Bhyve RC 脚本

未知

bmd

未知

vmstated

BSD-2

24.7.13. 持久化配置

为了在启动时自动启动 bhyve 虚拟机,需要进行一些配置文件的修改。

  1. /etc/sysctl.conf 当使用 tap 接口作为网络后端时,你需要手动将每个使用的 tap 接口设置为 UP,或者仅需设置以下 sysctl 参数:

    net.link.tap.up_on_open=1
  2. /etc/rc.conf 要通过 桥接 将虚拟机的 tap 设备连接到网络,你需要在 /etc/rc.conf 中持久化设备设置。此外,你可以通过 kld_list 配置变量加载必要的内核模块 vmm 用于 bhyve 和 nmdm 用于 nmdm 设备。在配置 ifconfig_bridge0 时,确保将 <ipaddr>/<netmask> 替换为物理接口(在此示例中为 igb0)的实际 IP 地址,并从物理设备中移除 IP 设置。

    # sysrc cloned_interfaces+="bridge0 tap0"
    # sysrc ifconfig_bridge0="inet <ipaddr>/<netmask> addm igb0 addm tap0"
    # sysrc kld_list+="nmdm vmm"
    # sysrc ifconfig_igb0="up"

示例 6. 设置桥接设备的 IP 地址

对于一个与网络连接的 igb0 接口,其 IP 为 10.10.10.1,子网掩码为 255.255.255.0,你将使用以下命令:

# sysrc ifconfig_igb0="up"
# sysrc ifconfig_bridge0="inet 10.10.10.1/24 addm igb0 addm tap0"
# sysrc kld_list+="nmdm vmm"
# sysrc cloned_interfaces+="bridge0 tap0"

警告

修改系统的 IP 地址配置可能会导致远程连接中断(例如通过 SSH 连接)!在执行这些命令时,请确保采取必要的预防措施以保持系统访问,或在本地终端会话中进行这些修改。

上一页24.6.使用 FreeBSD 上的 QEMU 虚拟化下一页24.8.基于 FreeBSD 的 Xen™ 虚拟机

最后更新于21天前

Linux 虚拟机可以像其他常规 虚拟机一样启动,或者可以使用 Port 。

使用 加载 Linux® 内核。

使用 从 ISO 镜像加载 Linux® 内核:

要使用 bhyve 中的 UEFI 支持,首先需要获取 UEFI 固件镜像。可以通过安装 Port 或包 来完成。

要查看或修改变量文件的内容,可以使用 从主机进行操作。

还包含支持 CSM 的固件,用于以传统 BIOS 模式启动没有 UEFI 支持的虚拟机:

必须安装 ,以使用定义的 virtio-net 网络接口。另一种选择是通过将 virtio-net 更改为 e1000(Intel E82545)模拟来切换到 E1000 模式,但性能会受到影响。

从 Windows 11 开始,Microsoft 引入了 TPM 2 模块的硬件要求。bhyve 支持将硬件 TPM 传递到虚拟机。可以修改安装媒体以禁用相关的硬件检查。有关此过程的详细说明,请参见 。

虽然可以在虚拟机运行时对 ZFS 卷进行快照,但请注意,在虚拟机活跃时,虚拟磁盘的内容可能处于不一致的状态。因此,建议在执行此命令之前,先关闭或暂停虚拟机。默认情况下,不支持暂停虚拟机,需要先启用(参见 )

然而,此功能默认情况下未启用,并且需要从源代码重新编译系统。有关编译内核和自定义选项的详细描述,请参见 。

在执行以下步骤之前,请确保 /usr/src 目录是最新的。请参见 以了解如何操作的详细步骤。

然后按照 中的步骤构建并安装世界和内核。

为了提高安全性并将虚拟机与主机操作系统隔离,可以将 bhyve 运行在 jail 中。有关 jail 及其安全性好处的详细描述,请参见 。

如果使用 ,请使用以下命令:

此示例假设使用类似 pf 或 ipfw 的防火墙来 NAT 你的 jail 流量。有关实现此功能的更多详细信息,请参见 章节。

如果你希望使用 UEFI 虚拟机操作系统,请首先在 Jail 内安装所需的固件包 :

将 bhyve 控制台包裹在一个会话管理工具中,如 或 ,是非常有利的,这样可以断开并重新连接到控制台。也可以将 bhyve 的控制台设置为一个 null modem 设备,并通过 cu 访问。要实现这一点,请加载 nmdm 内核模块,并将 -l com1,stdio 替换为 -l com1,/dev/nmdm0A。/dev/nmdm 设备会根据需要自动创建,每对设备对应于 null modem 电缆的两端(/dev/nmdm0A 和 /dev/nmdm0B)。更多信息请参见 。

基于 UEFI 的虚拟机
sysutils/grub2-bhyve
sysutils/grub2-bhyve
sysutils/grub2-bhyve
sysutils/bhyve-firmware
efivar(8)
sysutils/bhyve-firmware
VirtIO 驱动
FreeBSD Wiki
内存和 CPU 快照
从源代码构建
更新源代码
从源代码更新 FreeBSD 快速入门部分
Jails
ZFS 文件系统
防火墙
sysutils/bhyve-firmware
sysutils/tmux
sysutils/screen
nmdm(4)
sysutils/vm-bhyve
文档
sysutils/cbsd
文档
deskutils/virt-manager
文档
sysutils/bhyve-rc
文档
sysutils/bmd
文档
sysutils/vmstated
文档