Top
本文来自churchers/vm-bhyve

简介

vm-bhyve是FreeBSD bhyve虚拟机管理系统,主要功能包括:

速览

以下是一个简单的安装vm bhyve和启动FreeBSD来宾的实例:
  1. pkg install vm-bhyve
  2. zfs create pool/vm
  3. sysrc vm_enable="YES"
  4. sysrc vm_dir="zfs:pool/vm"
  5. vm init
  6. cp /usr/local/share/examples/vm-bhyve/* /pool/vm/.templates/
  7. vm switch create public
  8. vm switch add public em0
  9. vm iso https://download.freebsd.org/ftp/releases/ISO-IMAGES/11.2/FreeBSD-11.2-RELEASE-amd64-bootonly.iso
  10. vm create myguest
  11. vm install [-f] myguest FreeBSD-11.2-RELEASE-amd64-bootonly.iso
  12. vm console myguest

详细介绍

安装

从GitHub下载最终版本,或者安装sysutils/vm-bhyve
在vm-bhyve源代码目录中运行以下命令即可安装:
# make install
如果要运行FreeBSD以外的虚拟机,需要安装grub2-bhyve包:
# pkg install grub2-bhyve

初始配置

所有事情的第一步,需要为保存所有的虚拟机和vm-bhyve配置创建文件夹。
然后修改/etc/rc.conf文件启用vm-bhyve,并且告诉它前面设定的文件夹在哪里: 以后的描述中,此目录将被称为$vm_dir。

现在运行以下命令来创建用于存储vm-bhvye配置和加载任何必要内核模块的目录。这需要在每次主机重新启动后运行一次,这通常由rc.d脚本处理。
# vm init

虚拟机模板

模板可以为需要创建的虚拟机定义一些基本参数,例如内存大小、CPU核心数量、网络/磁盘配置。
所有的模板都存放在$vm_dir/.templates。vm-bhyve提供了一些模板,把它们复制到这里就可以用了:
# cp /usr/local/share/examples/vm-bhyve/* /$vm_dir/.templates
使用文本编辑器可以查看模板文件内部,可以根据对应格式创建自己的模板。
默认模板的内容如下:
guest="freebsd"
loader="bhyveload"
cpu=1
memory=256M
disk0_type="virtio-blk"
disk0_name="disk0.img"
network0_type="virtio-net"
network0_switch="public"		
注意,每个模板都设置为创建一个网络接口。通过复制两个网络配置选项并增加数量,可以轻松添加更多网络接口。
一般情况下,不建议更改“virtio-net”的类型,但会注意到第一个接口设置为连接名为“public”的虚拟交换机。

虚拟交换机

启动来宾时,每个网络接口都会自动连接到配置文件中指定的虚拟交换机。
默认情况下,所有示例模板都连接到名为“public”的交换机,也可以改成其它名称。
以下部分说明如何创建名为“public”的交换机,并配置各种设置:
# vm switch create public
如果只想将来宾连接到物理网络,应向交换机添加适当的物理接口:
# vm switch add public em0
如果希望来宾流量在离开主机时定位于特定的VLAN上,应指定vlan编号。要关闭vlan,只需将vlan编号设置为0:
# vm switch vlan public 10
# vm switch vlan public 0
使用以下命令可以查看当前交换机设置:
# vm switch list

创建虚拟机

使用下面任意一个命令都可以创建一个新的虚拟机:
# vm create testvm
# vm create -t templatename -s 50g testvm
第一条命令使用默认模板(dafault.conf)创建一个有默认大小(20GB)磁盘的虚拟机。
第二条命令使用指定的templatename.conf模板,并且指定磁盘为50GB。

如果需要为虚拟机下载ISO用于安装,可以使用iso命令:
# vm iso https://download.freebsd.org/ftp/releases/ISO-IMAGES/11.2/FreeBSD-11.2-RELEASE-amd64-disc1.iso
使用以下命令开始安装虚拟机,vn-bhyve将在后台运行,所以需要使用vm console命令连接到虚拟机以完成安装:
vm install testvm FreeBSD-11.2-RELEASE-amd64-disc1.iso
# vm console testvm
也可以指定前台选项,以便直接在终端上运行虚拟机(效果等同于上面两条命令依次执行):
# vm -f install testvm FreeBSD-11.2-RELEASE-amd64-disc1.iso
安装完成后,可以从控制台内部重启虚拟机,它将启动到新的操作系统中(假定安装成功)。进一步重启将按预期工作,虚拟机可以正常关闭。
当控制台使用cn命令时,按~+Ctrl-D退出回到主机。(有时候会退不出,多试几次)

以下命令可以启动和停止虚拟机:
# vm start testvm
#vm stop testvm

使用list命令可以查看每台机器的基本配置和状态:
# vm list
NAME            GUEST      LOADER      CPU    MEMORY    AUTOSTART    STATE
alpine          linux      default     1      512M      No           Stopped
c7              linux      default     1      512M      Yes [2]      Stopped
centos          linux      default     1      512M      No           Stopped
debian          linux      default     1      512M      No           Stopped
fbsd            freebsd    default     1      256M      No           Stopped
netbsd          generic    grub        1      256M      No           Stopped
openbsd         generic    grub        1      256M      No           Stopped
pf              freebsd    default     1      256M      Yes [1]      Stopped
ubuntu          linux      default     1      512M      No           Stopped
wintest         windows    default     2      2G        No           Running (2796)		
所有正在运行的虚拟机可以使用以下命令全部停止:
# vm stopall

在主机启动时,vm-bhyve将使用vm startall命令启动所有虚拟机,在/etc/rc.conf中使用以下变量来控制哪些虚拟机自动启动:
vm_list="vm1 vm2"
vm_delay="5"
第一行定义主机启动时依次启动的虚拟机名称。第二行定义两个虚拟机启动之间等待的时间,已秒为单位,推荐5秒。
还有一个命令可以在默认文本编辑器中打开虚拟机的配置文件,允许修改配置。更改后的内容要在虚拟机完全关闭并重启后才生效。
# vm configure testvm
参考手册页了解更多详情。

使用云镜像

可以使用云镜像创建虚拟机。vm img命令将把镜像下载到数据存储中,并在需要时解压缩它(支持.xz、.tar.gz、.gz文件)。
镜像应为RAW或QCOW2格式。
要使用此功能,需要安装qemu-utils包。
# pkg install qemu-utils
使用云镜像加载FreeBSD:
# vm img https://download.freebsd.org/ftp/releases/VM-IMAGES/11.2-RELEASE/amd64/Latest/FreeBSD-11.2-RELEASE-amd64.raw.xz
# vm create -t freebsd-zvol -i FreeBSD-11.2-RELEASE-amd64.raw freebsd-cloud
# vm start freebsd-cloud		
以下命令可以列出已经下载的镜像:
# vm img
DATASTORE           FILENAME
default             CentOS-7-x86_64-GenericCloud-20180930_02.raw
default             debian-9-openstack-amd64.qcow2
default             Fedora-AtomicHost-28-1.1.x86_64.raw
default             FreeBSD-11.2-RELEASE-amd64.raw
default             xenial-server-cloudimg-amd64-uefi1.img		

使用云初始化

vm-bhyve对向来宾提供云初始化配置提供了基本支持。可以在使用vm create命令时带上-c选项启用它。还可以使用选项-k 传递要注入来宾的公共SHH密钥。
举例:
# vm create -t linux -i xenial-server-cloudimg-amd64-uefi1.img -C -k ~/.ssh/id_rsa.pub cloud-init-ubuntu
# vm start cloud-init-ubuntu
Starting cloud-init-ubuntu
* found guest in /zroot/vm/cloud-init-ubuntu
* booting...
# ssh ubuntu@192.168.0.91
The authenticity of host '192.168.0.91 (192.168.0.91)' can't be established.
ECDSA key fingerprint is SHA256:6s9uReyhsIXRv0dVRcBCKMHtY0kDYRV7zbM7ot6u604.
No matching host key fingerprint found in DNS.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.91' (ECDSA) to the list of known hosts.
Welcome to Ubuntu 16.04.5 LTS (GNU/Linux 4.4.0-141-generic x86_64)		

添加定制磁盘

场景:如果在一个zpool上有一个vm,并且希望向其中添加一个驻留在另一个zpool上的新虚拟磁盘。
手动创建一个sparse-zvol(本例中为50GB):
# zfs create -sV 50G -o volmode=dev "zpool2/vm/yourvm/disk1"
将它添加到你的vm配置文件。谨记,Windows来宾需要ahci-hd,因为它没有virtio-blk驱动。
# vm configure yourvm

disk1_name="/dev/zvol/zpool2/vm/yourvm/disk1"
disk1_type="virtio-blk"
disk1_dev="custom"		
然后重启vm。

Windows支持

如果计划运行Windows,应使用UEFI图形支持。
首先安装UEFI固件:
# pkg install bhyve-firmware

来宾配置

使用Windows模板创建来宾。此客户机默认有2个CPU和2GB内存。它还使用了一个e1000 Intel网卡,该网卡对Windows即插即用。
如果还想更改配置选项,请使用vm configure guest命令。

注意,如果运行的Windows版本早于Windows10,则需要使用disk0_opts="sectorsize=512"选项将扇区大小设置为512。在Windows系统上安装Microsoft SQL Server时,还必须将磁盘扇区大小设置为512。

# vm create -t window winguest

安装

通过指定Windows iso文件以正常方式安装。在安装模式下运行时,vm-bhyve将等待VNC客户端连接后在启动来宾。这允许您捕获Windows可能显示的“Boot from CD/DVD”选项。使用vm list命令可以看到此时来宾处于锁定状态。
# vm install winguest windows-installer.iso
使用VNC客户端连接后,可按正常方式完成Windows安装。

添加VirtIO网卡驱动

虽然e1000网卡对Windows即插即用,并允许来宾访问网络,但建议尽可能使用virtio-net设备。安装这些驱动程序有几种方法:

关于CPUs

某些Windows版本(大多数桌面版本)不支持多个物理CPU。默认情况下,bhyve配置每个虚拟CPU和一个单独的包。
可以修改sysctl中hw.vmm.topology.cores_per_package参数告诉bhyve创建一个多核CPU,而不是单独的包。
例如,将此sysctl设置为4将导致具有8个vCPU的来宾具有2x4个核心包。
/boot/loader.conf中必须要有hw.vmm.topology.cores_per_package,如果没有,添加后要重启。

在FreeBD12上,当使用vm-bhyve 1.3时,可以使用配置选项控制每个来宾的CPU拓扑:
cpu=8
cpu_sockets=2
cpu_cores=4
cpu_threads=1

关于NVMe支持

从FreeBSD12.1R开始,bhyve支持NVMe仿真。对于vm-bhyve配置,应遵循以下选项:
disk0_type="nvme"
disk0_name="disk0.img"
disk0_opts="maxq=16,qsz=8,ioslots=1,sectsz=512,ser=ABCDEFGH"
甚至可以在没有虚拟磁盘的情况下将Guest安装到物理NVMe磁盘,例如:
loader="uefi"
graphics="yes"
xhci_mouise="yes"
cpu=2
memory=8G
network0_type="e1000"
network0_switch="public"
utctime="no"
passthru0="4/0/0"
4/0/0是NVMe SSD的密码短语。

目前,NVMe引导支持Windows 8.1和更高版本的Windows操作系统,如果要从NVMe磁盘引导Windows 7,请执行以下步骤:

自动完成

如果使用的时FreeBSD内置的默认csh/tcsh shell,那么可以运行以下命令允许autocomplete对所有当前支持的函数起作用。这对于查看和填写来宾和ISO文件名特别有用
注意,出现了三次"/path/to/vm",需要将其更改为包含虚拟机的目录。

要使自动完成功能永久可用,需将以下内容添加到$HOME/.cshrc文件中。然后注销再登录,或运行~/.cshrc来重新加载.cshrc文件。
complete vm \
 'p@1@(list create install start stop console configure reset poweroff destroy clone snapshot rollback add switch iso)@' \
 'n@create@n@' \
 'n@list@n@' \
 'n@iso@n@' \
 'n@switch@(list create add remove destroy vlan nat)@' \
 'N@switch@`sysrc -inqf /path/to/vm/.config/switch switch_list`@' \
 'N@install@`ls -1 /path/to/vm/.iso`@' \
 'N@nat@(off on)@' \
 'p@2@`ls -1 /path/to/vm | grep -v "^\." | grep -v "^images"`@'