本文来自churchers/vm-bhyve
- 简介
- 速览
- 详细介绍
- 安装
- 初始配置
- 虚拟机模板
- 虚拟交换机
- 创建虚拟机
- 使用云镜像
- 使用云初始化
- 添加定制磁盘
- Windows支持
- 来宾配置
- 安装
- 添加VirtIO网卡驱动
- 关于CPUs
- 关于NVMe
- 自动完成
简介
vm-bhyve是FreeBSD bhyve虚拟机管理系统,主要功能包括:
- 支持Windows/UEFI
- 可以使用简单的命令来创建/启动/停止bhyve实例
- 简单的配置文件格式
- 支持vlan和自动设备创建的虚拟交换机
- 支持ZFS
- 支持FreeBSD/NetBSD/OpenBSD/Linux来宾
- 自动分配控制台设备以访问来宾控制台
- 与rc.d启动/关闭集成
- 来宾重启处理
- 设计时考虑了多个计算节点+共享存储(NFS/iSCSI等)
- 多个数据存储
- VNC图形和tmux支持(仅限1.1+)
- 无依赖
在某些情况下可能需要一些额外的软件包
- 该port依赖于port维护者添加的ca_root_nss,以帮助避免在使用该vm iso命令下载FreeBSD ISO文件时出现任何SSL错误
- 运行Linux或任何其他需要Grub引导加载程序的来宾需要sysutils/grub2-bhyve
- 运行UEFI来宾需要sysutils/bhyve-firmware
- 使用tmux控制多台访问而不是cu/nmdm的来宾需要sysutils/tmux
速览
以下是一个简单的安装vm bhyve和启动FreeBSD来宾的实例:
- pkg install vm-bhyve
- zfs create pool/vm
- sysrc vm_enable="YES"
- sysrc vm_dir="zfs:pool/vm"
- vm init
- cp /usr/local/share/examples/vm-bhyve/* /pool/vm/.templates/
- vm switch create public
- vm switch add public em0
- vm iso https://download.freebsd.org/ftp/releases/ISO-IMAGES/11.2/FreeBSD-11.2-RELEASE-amd64-bootonly.iso
- vm create myguest
- vm install [-f] myguest FreeBSD-11.2-RELEASE-amd64-bootonly.iso
- vm console myguest
- 第一行,安装vm-bhyve
- 第二行,为虚拟机创建数据集。如果没有使用ZFS,只需要创建普通文件夹
- 第三、四行,在/etc/rc.conf中启用vm-bhyve并设置数据集。如果没有使用ZFS,格式应该是
vm_dir="/my/vm/folder"
- 第五行,运行vm init命令在$vm_dir目录下创建必要的文件夹,并加载内核模块
- 第六行,将vm-bhyve提供的简单模板复制到工作目录
- 第七、八行,创建一个名为“public”的虚拟交换机,并把网卡接口附加到上面。网卡名称"em0"根据实际情况而定
- 第九行,从ftp站点下载FreeBSD拷贝
- 第十到十二行,使用default.conf模板创建虚拟机,运行安装器并连接到它的控制台。
此时,按照正常方式进行安装。通过在install命令之前指定-f选项,虚拟机将直接在终端上运行,因此不需要console命令。
注意,在来宾完全关机之前无法回到原终端。
详细介绍
安装
从GitHub下载最终版本,或者安装sysutils/vm-bhyve。
在vm-bhyve源代码目录中运行以下命令即可安装:
# make install
如果要运行FreeBSD以外的虚拟机,需要安装grub2-bhyve包:
# pkg install grub2-bhyve
初始配置
所有事情的第一步,需要为保存所有的虚拟机和vm-bhyve配置创建文件夹。
- 如果不使用ZFS
# mkdir /somefolder/vm
- 如果使用ZFS
# zfs create pool/vm
然后修改/etc/rc.conf文件启用vm-bhyve,并且告诉它前面设定的文件夹在哪里:
- 对于不使用ZFS:
vm_enable="YES"
vm_dir="/somefolder/vm"
- 对于使用ZFS:
vm_enable="YES"
vm_dir="zfs:/pool/vm"
以后的描述中,此目录将被称为$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设备。安装这些驱动程序有几种方法:
- 如果机器可以通过e1000访问Internet,可以在虚拟机中下载并安装virtio驱动。
安装完成之后关闭虚拟机,修改虚拟机配置中的设备,然后重启。
- 在安装模式下启动虚拟机,但指定VirtIO ISO文件
# vm install winguest virtio-installer.iso
- 将ISO文件作为虚拟光驱挂载到虚拟机上
disk1_type="ahci-cd"
disk1_dev="custom"
disk1_name="/full/path/to/virtio-install.iso"
关于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,请执行以下步骤:
- 使用ahci hd控制器安装windows 7 guest,就像正常过程一样。
- 安装后,将额外的disk.img于nvme控制器连接。
- 安装MS nvme修补程序,即Windows6.1-KB2990941-v3-x64.msu和Windows6.1-KB3087873-v2-x64.msu,确保nvme控制器和disk1出现在Windows7来宾设备管理器中
- 关闭来宾,在来宾配置中替换disk0.img和disk1.img文件,然后再开机。
- 关闭来宾,删除ahci控制器和disk1.img。将nvme控制器和disk0.img保留,再次重启。现在Windows7来宾设备管理器将只具有nvme控制器,没有achi控制器。
自动完成
如果使用的时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"`@'