21.8. 以FreeBSD作为主端安装Xen

Xen是一个以GPLv2授权的一类虚拟机,适用于Intel® 和 ARM®架构。FreeBSD从FreeBSD 8.0开始就包含了对i386™ 和 AMD® 64-Bit DomU,以及Amazon EC2支持,并且在FreeBSD 11.0中包含了对Dom0控制域(主机)的支持。FreeBSD 11 中取消了对准虚拟域 (par-virtualized (PV) 的支持, 转而支持硬件虚拟化 (HVM) 域, 它提供了更好的性能。

Xen™是一个裸机管理程序,这意味着它是BIOS之后加载的第一个程序。然后启动一个名为Domain-0的特殊特权客体(简称为Dom0)。Dom0利用其特殊权限直接访问底层物理硬件,使其成为高性能的解决方案。它能够直接访问磁盘控制器和网络适配器。Dom0还可以使用Xen™管理工具来管理和控制Xen™虚拟机,用于创建、列出和销毁虚拟机。Dom0为非特权域提供虚拟磁盘和网络,通常被称为DomUXen™ Dom0可以与其他虚拟机解决方案的服务控制台相提并论,而DomU则是运行单个访客虚拟机的地方。

Xen™可以在不同的Xen™服务器之间迁移 VM。当两个Xen主机共享相同的底层存储时,无需先关闭虚拟机,即可完成迁移。相反,迁移是在 DomU 运行时实时执行的,不需要重新启动或计划停机时间。这在维护或升级场景中非常有用,可以确保DomU提供的服务仍然可用。更多Xen™特性可以在Xen Wiki Overview page中查看。请注意, 并不是所有的功能都能在 FreeBSD 上使用。

21.8.1. Xen™ Dom0 硬件需求

要在主机上运行Xen™虚拟机,需要硬件支持。硬件虚拟化域需要主机 CPU 支持 Extended Page Table (EPT)和 Input/Output Memory Management Unit (IOMMU)。

注意:

要运行FreeBSD Xen™ Dom0, 必须使用传统启动方式 (BIOS) 启动。

21.8.2. Xen™ Dom0 控制域设置

FreeBSD 11 的用户应该安装 emulators/xen-kernel47sysutils/xen-tools47软件包,这些软件包是基于 Xen 4.7 版本的。运行在 FreeBSD-12.0 或更高版本的系统可以使用由 emulators/xen-kernel411sysutils/xen-tools411 提供的 Xen 4.11。

必须编辑配置文件,以便在安装 Xen 包后为主机集成 Dom0。/etc/sysctl.conf中的一个条目将禁用允许连接的内存页数限制。否则,对内存要求较高的 DomU 虚拟机将无法运行。

# echo 'vm.max_wired=-1' >> /etc/sysctl.conf

另一个与内存相关的设置是修改/etc/login.conf,将memorylocked选项设置为unlimited。否则,创建DomU域可能会出现Cannot allocate memory错误。在对/etc/login.conf进行更改后,运行cap_mkdb更新数据库。请参阅第 13.13 节 “资源限制”了解详情。

# sed -i '' -e 's/memorylocked=64K/memorylocked=unlimited/' /etc/login.conf
# cap_mkdb /etc/login.conf

为使用Xen™控制台,向/etc/ttys添加一个条目:

# echo 'xc0     "/usr/libexec/getty Pc"         xterm   onifconsole  secure' >> /etc/ttys

/boot/loader.conf中选择Xen™内核,会激活Dom0。Xen™也需要主机上的资源,如CPU和内存等资源,用于自己和其他 DomU域。CPU 和内存的多少取决于个人需求和硬件能力。在本例中,为 Dom0 提供了 8GB 内存和 4 个虚拟 CPU。串行控制台也被激活,并定义了记录选项。

以下命令用于 Xen 4.7 包:

# sysrc -f /boot/loader.conf hw.pci.mcfg=0
# sysrc -f /boot/loader.conf if_tap_load="YES"
# sysrc -f /boot/loader.conf xen_kernel="/boot/xen"
# sysrc -f /boot/loader.conf xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0pvh=1 console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"

Xen 4.11 及以上版本应使用以下命令:

# sysrc -f /boot/loader.conf if_tap_load="YES"
# sysrc -f /boot/loader.conf xen_kernel="/boot/xen"
# sysrc -f /boot/loader.conf xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0=pvh console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"

提示:

Xen™为DomU虚拟机创建的日志文件存储在/var/log/xen中。如果遇到问题,请务必检查该目录的内容。

在系统启动时启动 xencommons 服务:

# sysrc xencommons_enable=yes

这些设置足以启动一个支持Dom0的系统。但是,它缺乏DomU机器的网络功能。要解决这个问题,请定义一个与系统的主网卡的桥接接口,DomU虚拟机可以用它来连接到网络。将em0替换为主机网络接口名称。

# sysrc cloned_interfaces="bridge0"
# sysrc ifconfig_bridge0="addm em0 SYNCDHCP"
# sysrc ifconfig_em0="up"

重启主机,加载Xen™内核并启动 Dom0。

# reboot

在成功启动Xen™内核并再次登录系统后,使用Xen™管理工具xl显示域信息。

# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  8192     4     r-----     962.0

输出确认Dom0(称为Domain-0)的ID为0并正在运行。它还拥有之前在/boot/loader.conf中定义的内存和虚拟CPU。更多信息可以在Xen™ Documentation中找到。现在可以创建 DomU 客户端 VM。

21.8.3. Xen™ DomU客端VM设置

非特权域由配置文件和虚拟或物理硬盘组成。DomU的虚拟磁盘存储可以是由truncate(1)创建的文件,也可以是ZFS卷,如 第 19.4.2 节 “创建与删除卷”中描述的那样。在这个例子中,使用了一个 20 GB 的卷。使用 ZFS 卷、 FreeBSD ISO 映像、 1 GB RAM 和两个虚拟 CPU 创建了一个 VM。ISO 安装文件通过 fetch(1) 获取并保存在一个名为 freebsd.iso的文件中。

# fetch ftp://ftp.freebsd.org/pub/FreeBSD/releases/ISO-IMAGES/12.0/FreeBSD-12.0-RELEASE-amd64-bootonly.iso -o freebsd.iso

创建名为xendisk0的 20 GB 的 ZFS 卷,用作 VM 的磁盘空间。

# zfs create -V20G -o volmode=dev zroot/xendisk0

新的 DomU guest VM定义在一个文件中。还定义了一些特定的配置,如名称、密钥映射和VNC连接细节。下面的freebsd.cfg包含了本例中的最低限度的 DomU 配置:

# cat freebsd.cfg
builder = "hvm" 1
name = "freebsd" 2
memory = 1024 3
vcpus = 2 4
vif = [ 'mac=00:16:3E:74:34:32,bridge=bridge0' ] 5
disk = [
'/dev/zvol/tank/xendisk0,raw,hda,rw', 6
'/root/freebsd.iso,raw,hdc:cdrom,r' 7
  ]
vnc = 1 8
vnclisten = "0.0.0.0"
serial = "pty"
usbdevice = "tablet"

接下来详细介绍上面的命令:

1

这定义了要使用什么样的虚拟化。hvm指的是硬件辅助虚拟化或硬件虚拟机。客制化操作系统可以在具有虚拟化扩展的CPU上直接运行,提供与在物理硬件上运行几乎相同的性能。generic为默认值,并创建一个PV域。

2

虚拟机名称,用于区别其他运行在Dom0的虚拟机。不能为空。

3

虚拟机的 RAM 数量,单位为兆字节。这个数量是从hypervisor的总可用内存中减去的,而非Dom0的内存。

4

来宾虚拟机可用的虚拟 CPU 数量。为了获得最佳性能,虚拟 cpu 数量不压迫超过实际 cpu 数量。

5

虚拟网络适配器。这是连接到主机的网络接口的网桥。mac参数是虚拟网络接口上设置MAC地址。这个参数是可选的,如果没有提供MAC,Xen™将生成随机的MAC地址。

6

此VM的磁盘存储的磁盘,文件或 ZFS 卷的完整路径。选项和多个磁盘定义之间用逗号分隔。

7

定义了安装初始操作系统的启动介质。在这个例子中,它是之前下载的ISO镜像。有关其他类型的设备和要设置的选项,请参考Xen™文档。

8

控制 VNC 与 DomU 串行控制台连接的选项。按顺序,它们是:主动VNC支持,定义要监听的IP地址;串行控制台的设备节点,以及用于精确定位鼠标和其他输入方法的输入方法。 keymap 定义了要使用的键映射,默认情况下为 english

在创建了所有必要的选项后,通过传递给xl create作为参数来创建DomU。

# xl create freebsd.cfg

注意:

每次重启Dom0时,必须再次将配置文件传递给xl create以重新创建 DomU。默认情况下,重启后只创建 Dom0,不创建单个虚拟机。虚拟机可以还原到被暂停的那一刻,因为它们在虚拟磁盘上存储了操作系统。虚拟机配置可以随时改变(例如,增加更多内存时)。必须妥善备份虚拟机配置文件并保持可用,以便在需要时重建虚拟机。

xl list 的输出证实 DomU 已经创建好了。

# xl list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0  8192     4     r-----  1653.4
freebsd                                      1  1024     1     -b----   663.9

要开始安装基础操作系统,请启动VNC客户端,将其引导到主机的主网络地址或freebsd.cfgvnclisten行中定义的IP地址。安装好操作系统后,关闭 DomU 并断开 VNC 查看器的连接。编辑freebsd.cfg,删除带有cdrom定义的那行,或者在该行的开头插入一个#字符,将其注释掉。要加载这个新配置,必须用xl destroy来删除旧的DomU,传递名称或id作为参数。然后,使用修改后的freebsd.cfg重新创建。

# xl destroy freebsd
# xl create freebsd.cfg

然后可以使用VNC再次访问该机器。这时,它将从安装了操作系统的虚拟磁盘启动,可以作为虚拟机使用。

21.8.4. 故障排除

本章介绍了一些方法,用于处理 FreeBSD 做 Xen™ 主机或客户机中的问题。

21.8.4.1. 启动故障排除(Host)

请注意,以下故障排除提示适用于Xen™4.11或更新版本。如果您仍在使用Xen™4.7,并遇到问题,请考虑迁移到新版本的Xen™。

为了排除主机启动问题,你可能需要一条串行电缆或调试USB电缆。可以通过在loader.conf中的xen_cmdline选项中添加选项来获得Verbose Xen™ 输出。一些相关的调试选项是:

  • iommu=debug: 可用于打印与 iommu 有关的诊断信息。

  • dom0=verbose:可以用来打印关于dom0构建过程的额外诊断信息。

  • sync_console:强制同步控制台输出。用于调试,避免因速率限制而丢失消息。切勿在生产环境中使用此选项,因为它可能会允许恶意客户使用控制台对Xen™进行DoS攻击。

FreeBSD 也应该在 verbose 模式下启动, 以便识别任何问题。要激活verbose booting, 请执行以下命令:

# sysrc -f /boot/loader.conf boot_verbose="YES"

如果这些选项都不能帮助解决这个问题,请将启动日志发送到,以便进一步分析。

21.8.4.2. 客户机创建故障疑难解答

创建来宾时也会出现问题,以下尝试为那些尝试诊断来宾创建问题的人提供一些帮助。

最常见的原因是 xl命令吐出一些错误,退出时返回值不为 0。 如果提供的错误还不足以帮助识别问题,还可以通过使用xlv选项获取更详细的信息。

# xl -vvv create freebsd.cfg
Parsing config from freebsd.cfg
libxl: debug: libxl_create.c:1693:do_domain_create: Domain 0:ao 0x800d750a0: create: how=0x0 callback=0x0 poller=0x800d6f0f0
libxl: debug: libxl_device.c:397:libxl__device_disk_set_backend: Disk vdev=xvda spec.backend=unknown
libxl: debug: libxl_device.c:432:libxl__device_disk_set_backend: Disk vdev=xvda, using backend phy
libxl: debug: libxl_create.c:1018:initiate_domain_create: Domain 1:running bootloader
libxl: debug: libxl_bootloader.c:328:libxl__bootloader_run: Domain 1:not a PV/PVH domain, skipping bootloader
libxl: debug: libxl_event.c:689:libxl__ev_xswatch_deregister: watch w=0x800d96b98: deregister unregistered
domainbuilder: detail: xc_dom_allocate: cmdline="", features=""
domainbuilder: detail: xc_dom_kernel_file: filename="/usr/local/lib/xen/boot/hvmloader"
domainbuilder: detail: xc_dom_malloc_filemap    : 326 kB
libxl: debug: libxl_dom.c:988:libxl__load_hvm_firmware_module: Loading BIOS: /usr/local/share/seabios/bios.bin
...

如果verbose输出不能帮助诊断问题,那么在/var/log/xen中还有 QEMU 和Xen™日志。请注意,域的名称会附在日志名后面,所以如果域的名称是freebsd,你应该会找到一个/var/log/xen/xl-freebsd.log,很可能会找到一个/var/log/xen/qemu-dm-freebsd.log。这两个日志文件里都可能包含有用的调试信息。如果这些都不能解决问题,请将您所遇到的问题描述和尽可能多的信息发送到 以寻求帮助。

本文档和其它文档可从这里下载: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

如果对于FreeBSD有问题,请先阅读 文档,如不能解决再联系 <questions@FreeBSD.org>.

关于本文档的问题请发信联系 <doc@FreeBSD.org>.