Bhyve Vm Manager (bvm) 是一款基于 FreeBSD 系统下 Bhyve 的虚拟机管理工具,初衷就是要实现一款简单易用且便于扩展的 Bhyve vm 管理工具,为我们管理员在 FreeBSD 下使用虚拟机提供便利。bvm 项目在 2017 年 11 月 发起,于 2018 年 2 月由我和社区的 iceage 使用 C 语言联合开发完成,并于 2018 年 7 月在 ygy 的大力帮助下成功地将 bvm 提交到 FreeBSD 官方软件库,再次向 iceage 和 ygy 表示感谢。
bvm 的基本特性
bvm 可以为虚拟机提供 NAT 以及 Bridged 等基本联网方式,内部模拟了层交换机的理念,基本满足宿主机内复杂环境下组网需求。满足开机自启动,以及热重启等功能,且通过 uefi 固件支持常用的图形界面操作系统。
- bvm 支持 *BSD / CentOS / Debian / Ubuntu / Kali / openSUSE / Gentoo / Fedora / Windows10 / WinServer2016 等
- bvm 支持多网卡、多硬盘
- bvm 提供了 Bridged / NAT 两种网络模式
- bvm 支持 GRUB / UEFI 启动模式
- bvm 支持 ZFS 文件系统
bvm 源代码
bvm 是一款使用 c 语言开发的开源软件,源代码可以在 https://github.com/bigdragonsoft/bvm 中查看或者在命令行克隆 bvm 项目:
git clone https://github.com/bigdragonsoft/bvm.git
bvm 的安装
由于 bvm 已经被收录在 FreeBSD 官方软件仓库中,所以安装非常简便,可以使用 pkg 或者 ports 方式进行安装。
#pkg 方式安装
pkg update
pkg install bvm
#ports 方式安装
portsnap fetch update
cd /usr/ports/sysutils/bvm/
make install clean
bvm 首次运行前的配置
安装 bvm 后,首先要在 bvm 的配置文件中设置工作目录,之后所有的虚拟机将会被创建在这个目录之下:
#编辑 bvm.conf 文件
vi /usr/local/etc/bvm/bvm.conf
#设置 vmdir 变量,确定工作目录
vmdir=/mypath/
然后还要在几个系统配置文件中增加几行配置,以便 bvm 能正常工作:
#编辑 /boot/loader.conf 文件
vi /boot/loader.conf
#新增如下行
vmm_load="YES"
if_bridge_load="YES"
if_tap_load="YES"
#编辑 /etc/sysctl.conf 文件
vi /etc/sysctl.conf
#新增如下行
net.link.tap.up_on_open=1
#编辑 /boot/loader.conf 文件
vi /boot/loader.conf
#新增如下行
ipfw_load="YES"
ipfw_nat_load="YES"
libalias_load="YES"
net.inet.ip.fw.default_to_accept=1
bvm 内置了 dhcp 服务器,若要正常使用,需要将虚拟机设置为 NAT 网络模式并填写 dhcp 的配置文件,文件中已经预置了默认参数值,根据自己实际需求修改即可:
#编辑 /usr/local/etc/bvm/dhcp.conf
vi /usr/local/etc/bvm/dhcp.conf
########################
# DHCP default parameter
# The following parameters act on all network segments.
########################
lease_time=86400
dns="8.8.8.8 114.114.114.114"
domain_name="your.domain.com"
########################
# nat0=172.16.1.1/24
# For the following parameters only net0 valid
########################
nat0_lease_time=36000
nat0_dns="114.114.115.115 180.76.76.76"
nat0_domain_name="nat0.doamin.com"
nat0_dynamic_ip="172.16.1.100 172.16.1.254"
########################
# nat1=10.10.30.1/24
# For the following parameters only net1 valid
########################
nat1_dynamic_ip="10.10.30.50 10.10.30.150"
########################
# nat2=192.168.1.1/24
# For the following parameters only net2 valid
########################
nat2_dynamic_ip="192.168.1.100 192.168.1.200"
bvm 常用命令解析
bvm 共有各种命令 38 条,详情请查阅 FreeBSD Manual Pages ,这里仅对部分命令进行解析。
虚拟机管理相关命令:
- bvm --config
用于编辑虚拟机的配置。此命令需要在虚拟机关机状态下使用,可允许管理员独立配置的选项有:选项 说明 cpus 虚拟机使用 cpu 的数量(非内核数) ram 虚拟机分配的内存容量,比如:512M 或 1G ios path 安装虚拟机时所需的 iso 镜像文件的目录(并非文件),bvm 会自动列出目录中的 ios 文件供管理员选择 boot from 这是个重要的选项,当虚拟机安装了系统并第一次启动时,bvm 会自动将这个选项调整为 hd0 ,以便系统能正常从硬盘引导启动,当你需要从光盘引导维护系统时,你也能将这个选项调整为 cd0 uefi 该选项多为安装图形界面的操作系统所使用,此选项需要配合 VNC 获取桌面,另外此选项会使 bvm --login 选项失效,因为 --login 为文本控制台,不具备图形界面操作条件。 auto boot 详情查阅命令 bvm --autobot 的解析 hostbridge hostbridge 为架构属性,当使用 intel 系列 CPU 时其属性值应为 hostbridge;当使用 AMD 系列 CPU 时其属性值应为 amd_hostbridge disk config 该选项可以增加或者删除当前虚拟机的硬盘,如果为增加硬盘的话建议使用 --addisk 快捷命令 network config 该选项可以配置虚拟机的组网或者联网方式 - bvm --lock
锁定指定虚拟机,不可更改、删除、运行等一切写操作。只能进行简单的读操作,比如 --vminfo 或 --ls 等 - bvm --unlock
对指定虚拟机进行解锁 - bvm --encrypt
对指定虚拟机进行加密处理,bvm 需要输入一个密码,这个密码必须牢记,否则无法正确解密 - bvm --decrypt
对指定虚拟机进行解密处理,如果输入的密码与加密密码不一致,将导致虚拟机崩溃
网络相关命令:
- bvm --setnat
bvm 预留 3 个与宿主机的 NAT 通信界面,它们在配置文件 /usr/local/etc/bvm/nat.conf 中定义如下:
此命令就是重新设置某个 nat 的 IP 地址,比方:nat0=172.16.1.1/24 nat1=10.10.30.1/24 nat2=192.168.1.1/24
# bvm --setnat nat0 172.18.1.0/24
- bvm --setsw
bvm 预留 8 个与宿主机的交换机通信接口,它们在配置文件 /usr/local/etc/bvm/switch.conf 中有定义如下:
管理员可根据需要自行设置某台交换机的 IP 地址(通常不需要设置,除非特殊情况),方法与 --setnat 相同。switch0=10.0.1.0/24 switch1=10.0.2.0/24 switch2=10.0.3.0/24 switch3= switch4= switch5= switch6= switch7=
- bvm --unsetsw
解除 switch 上设定的 IP 地址。 - bvm --showdev
精简显示网络设备信息,其中 default-bridge 为虚拟机默认与宿主机桥接器;nat0-nat2 为预留 3 个与宿主机 NAT 通信界面;switch0-switch7 为预留 8 个虚拟机通信界面,此界面同样实为网桥,但是与默认桥接器区别是此界面多数情况下为内部组网所需,通常不包括宿主机物理网卡。 - bvm --setpr
设置端口转发规则,一般来说,设置端口转发规则需要在虚拟机关机的状态下操作,但这个命令可以在虚拟机运行状态下的任何时刻进行动态设置,并且立即生效。# bvm --setpr 10.10.30.10
- bvm --showpr
打印出所有端口转发规则。# bvm --showpr udp 192.168.1.254:53 -> 9953 abc tcp 10.10.30.10:22 -> 3322 guo tcp 172.16.1.3:622 -> 2224 fb tcp 172.16.1.3:80 -> 8888 fb tcp 172.16.1.3:23 -> 2003 fb
- bvm --showdhcp
显示所有 dhcp 客户机的信息。
# bvm --showdhcp
ip mac bind_time status
-- --- --------- ------
172.16.1.100 00:a0:98:ad:89:74 03/26 09:30:37 - 03/26 19:30:37 ASSOCIATED
192.168.1.100 00:a0:98:dc:ff:5b 03/26 09:34:26 - 03/27 09:34:26 ASSOCIATED
自启动命令:
- bvm --autoboot
开机启动选项,通常管理员手动维护模式下不需要此选项。有时宿主机在关机或者意外宕机的情况下再次开机,这时可以通过 rc 脚本自动启动管理员设定的虚拟机。其方法为使用 bvm --config vmname 修改 auto boot 菜单的默认值为 yes。在自启动模式下 bvm 会参考 vm 的启动级别和延时选项,启动级别 (boot index) 为启动优先级,当存在多个自启动虚拟机时,启动优先级数值越低的虚拟机启动顺序越靠前。启动延时(boot time) 为启动当前虚机之后也可以说在启动下一个虚拟机之前暂定的秒数。之所以设计这两个参数是因为有的业务可能需要优先启动,以保证业务正常。比如,数据库与 web 服务的关系,如果数据虚拟机库不优先启动那么有可能导致 web 服务异常!正确使用此选项的方法为:加入开启启动脚本:
sysrc bvmd_enable=yes
输出所有自启动虚拟机信息。
bvm 视频演示
对于 bvm 的基本应用,我会录制几段视频以供参考。