Guo Qiang

虚拟机管理器 BVM

Bhyve VM Manager
image
bvm 可以很轻松的帮你配置和管理虚拟机

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 常用命令解析

bvm 共有各种命令 37 条,详情请查阅 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 --setnat
    bvm 预留 3 个与宿主机的 NAT 通信界面,它们在配置文件 /usr/local/etc/bvm/nat.conf 中定义如下:
    nat0=172.16.1.1/24
    nat1=10.10.30.1/24
    nat2=192.168.1.1/24
    
    此命令就是重新设置某个 nat 的 IP 地址,比方:
    # bvm --setnat nat0 172.18.1.0/24
    
  • bvm --setsw
    bvm 预留 8 个与宿主机的交换机通信接口,它们在配置文件 /usr/local/etc/bvm/switch.conf 中有定义如下:
    switch0=10.0.1.0/24
    switch1=10.0.2.0/24
    switch2=10.0.3.0/24
    switch3=
    switch4=
    switch5=
    switch6=
    switch7=
    
    管理员可根据需要自行设置某台交换机的 IP 地址(通常不需要设置,除非特殊情况),方法与 --setnat 相同。
  • 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 --autoboot
    开机启动选项,通常管理员手动维护模式下不需要此选项。有时宿主机在关机或者意外宕机的情况下再次开机,这时可以通过 rc 脚本自动启动管理员设定的虚拟机。其方法为使用 bvm --config vmname 修改 auto boot 菜单的默认值为 yes。在自启动模式下 bvm 会参考 vm 的启动级别和延时选项,启动级别 (boot index) 为启动优先级,当存在多个自启动虚拟机时,启动优先级数值越低的虚拟机启动顺序越靠前。启动延时(boot time) 为启动当前虚机之后也可以说在启动下一个虚拟机之前暂定的秒数。之所以设计这两个参数是因为有的业务可能需要优先启动,以保证业务正常。比如,数据库与 web 服务的关系,如果数据虚拟机库不优先启动那么有可能导致 web 服务异常!正确使用此选项的方法为:加入开启启动脚本:
  • sysrc bvmd_enable=yes
  • bvm --abinfo
    输出所有自启动虚拟机信息。

bvm 视频演示

对于 bvm 的基本应用,我会录制几段视频以供参考。