Xen
来自 Xen Overview
- Xen 是一款开源的 type-1(裸机)虚拟机监控器,它允许在一台机器(或主机)上并行运行多个操作系统实例,甚至不同的操作系统。Xen 是唯一一款开源的 type-1 虚拟机监控器。
Xen Hypervisor 是一个精简的软件层,它模拟计算机架构,允许多个操作系统同时运行。Hypervisor 由安装了它的计算机的 引导加载程序 启动。Hypervisor 加载后,它会启动 dom0—“domain 0”的缩写,有时也称为主机或特权域—在我们的情况下,它运行 Arch Linux。一旦 dom0 启动,一个或多个 domU(用户域的缩写,有时也称为虚拟机或客户机)就可以从 dom0 启动和控制。对于 domU,Xen 支持半虚拟化 (PV) 域、硬件虚拟化域 (HVM) 以及硬件虚拟化包装器内的半虚拟化域 (PVH)。有关完整概述,请参阅 Xen.org。
Xen Hypervisor 依赖于完整安装的基础操作系统。在尝试安装 Xen Hypervisor 之前,主机应已安装一个完全可操作且最新的 Arch Linux。此安装可以是仅包含基础软件包的最小安装,不需要 桌面环境 甚至 Xorg。
如果您正在从头开始构建新主机,请参阅 安装指南 以获取安装 Arch Linux 的说明。
安装
系统要求
Xen Hypervisor 需要内核级别的支持,这包含在最新的 Linux 内核中,并且内置于 linux 和 linux-lts Arch 内核软件包中。要运行 HVM domU,物理硬件必须支持 Intel VT-x 或 AMD-V (SVM) 虚拟化。为了验证这一点,请在 Xen Hypervisor 未运行时检查 vmx 或 svm CPU 标志。
$ grep -E 'vmx|svm' --color -m 1 /proc/cpuinfo
如果上述命令没有输出,则表示硬件虚拟化支持不可用,您的硬件无法运行 HVM domU(或者您已在运行 Xen Hypervisor)。如果您认为 CPU 支持其中一项功能,您应该在引导过程中访问主机系统的 BIOS 配置菜单,并查看与虚拟化支持相关的选项是否被禁用。如果存在此类选项且已被禁用,则启用它,引导系统并重复上述命令。Xen Hypervisor 还支持 PCI 直通,允许将 PCI 设备直接传递给 domU,即使 dom0 不支持该设备。要使用 PCI 直通,CPU 必须支持 IOMMU/VT-d。
安装 Xen Hypervisor
要安装 Xen Hypervisor,请安装 xenAUR 软件包。它提供了 Xen Hypervisor、当前的 xl 接口以及所有配置和支持文件,包括 systemd 服务。要运行大多数虚拟机,您还需要安装 xen-qemuAUR。
要为虚拟机提供 BIOS 支持,请安装 seabios。要提供 UEFI 支持,请安装 edk2-ovmf。要直接在 PVH 虚拟机中引导虚拟机本地内核,请安装 xen-grub-pvhAUR。
构建 xen
建议在干净的环境中构建 xen 及其组件,无论是虚拟机还是 chroot。构建 Xen 时,可以将环境变量传递给 makepkg。
- build_stubdom -- 构建运行 Xen stubdom 的组件,主要用于 dom0 分离。如果构建了 stubdom,其组件将被拆分成 xen-stubdom 软件包。默认为 false。
- boot_dir -- 您的引导目录。默认为 /boot。
- efi_dir, efi_mountpoint -- 您的 EFI 目录和挂载点。默认为 /boot。
将这些参数作为变量传递给 makepkg
$ build_stubdom=true efi_dir="/boot/EFI" makepkg
xen-docsAUR 将会一起构建,以提供 man pages 和文档。如果您选择构建 stubdom 支持,则会构建 xen-stubdom 软件包。
修改引导加载程序
- 修改引导系统后,切勿假定您的系统将正常启动。
- 在对引导系统进行更改之前,请确保您有其他方式来引导您的系统,例如 USB 启动盘或其他 Live 介质。
必须修改引导加载程序以加载一个特殊的 Xen 内核(xen.gz,或 UEFI 情况下的 xen.efi),然后使用该内核来引导正常内核。为此,需要一个新的引导加载程序条目。
UEFI
Xen 支持从 UEFI 引导,如 Xen EFI systems 中所述。可能还需要使用 efibootmgr 来设置引导顺序和其他参数。
首先,请确保 xen.efi 文件与您的内核和 ramdisk 文件一起位于 EFI 系统分区 中。
其次,Xen 需要一个 ASCII(无 UTF-8、UTC-16 等)配置文件,该文件指定哪个内核应作为 dom0 引导。此文件必须放置在与二进制文件相同的 EFI 系统分区 中。Xen 会搜索几个配置文件,并使用它找到的第一个。搜索顺序是从二进制文件的扩展名 .efi 替换为 .cfg 开始,然后删除末尾的组件,直到 .、- 和 _,直到找到匹配项。通常,会使用一个名为 xen.cfg 的文件,其中包含系统要求,例如:
xen.cfg
[global] default=xen [xen] options=console=vga iommu=force:true,qinval:true,debug:true loglvl=all noreboot=true reboot=no vga=ask ucode=scan kernel=vmlinuz-linux root=/dev/sdaX rw add_efi_memmap #earlyprintk=xen ramdisk=initramfs-linux.img
xen.cfg 文件中的 options 行以指定附加参数。systemd-boot
添加一个新的 EFI 类型引导条目。有关详细信息,请参阅 systemd-boot#UEFI Shells or other EFI applications。例如:
/boot/loader/entries/10-xen.conf
title Xen Hypervisor efi /xen.efi
efi 行上传递参数。但是,Xen 文档指出 -cfg=file.cfg 可以用作 UEFI Shell 参数,但对于 efi 行选项则不然。目前,您只能有一个 Xen EFI 条目,这限制您只能有一个配置文件。EFI 引导存根
可以通过使用 EFI 引导存根 直接从 UEFI 引导 EFI 内核。
进入内置的 UEFI shell 并直接调用 EFI 文件。例如:
Shell> fs0: FS0:\> xen.efi
请注意,如上所述,仍然需要在 EFI 系统分区 中提供一个 xen.cfg 配置文件。此外,可以使用 -cfg=file.cfg 参数指定另一个配置文件。例如:
Shell> fs0: FS0:\> xen.efi -cfg=xen-rescue.cfg
这些附加配置文件必须与 Xen EFI 二进制文件和 Linux 存根文件位于同一目录中。
BIOS
Xen 支持从配置为 BIOS 的系统固件引导。
GRUB
对于 GRUB 用户,请安装 grub-xen-gitAUR 软件包来引导 dom0,并构建 PvGrub2 镜像来引导用户域。
可以编辑 /etc/default/grub 文件来定制 Xen 引导命令。例如,要在启动时为 dom0 分配 512 MiB 内存,请修改 /etc/default/grub,将以下行替换为:
#GRUB_CMDLINE_XEN_DEFAULT=""
与
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=512M"
有关 GRUB Xen 配置键的更多信息,请参阅 GRUB 文档。
自定义选项后,使用以下命令更新引导加载程序配置:
# grub-mkconfig -o /boot/grub/grub.cfg
为引导虚拟机构建 GRUB 镜像
除了通常的平台目标外,grub-xen-gitAUR 软件包为三个额外目标构建 GRUB,可用于引导 Xen 虚拟机:i386-xen、i386-xen_pvh 和 x86_64-xen。要从这些目标之一创建引导镜像,首先创建一个 GRUB 配置文件。根据您的偏好,此文件可以定位并加载虚拟机中的 GRUB 配置文件,或者它可以从 dom0 管理更多的引导过程。假设只需要定位并加载虚拟机中的配置文件,则将以下内容添加到文件中:
grub.cfg
search -s root -f /boot/grub/grub.cfg configfile /boot/grub/grub.cfg
然后创建一个 GRUB/Tips and tricks#GRUB standalone 镜像,该镜像将包含该文件:
# grub-mkstandalone -O x86_64-xen -o /usr/lib/xen/boot/pv-grub2-x86_64-xen "/boot/grub/grub.cfg=./grub.cfg"
最后,在 domU 配置文件中将该镜像作为 kernel 的值添加(在此示例中为 64 位客户机):
kernel = "/usr/lib/xen/boot/pv-grub2-x86_64-xen"
有关为 GRUB 虚拟机配置 GRUB 镜像的更多示例,请参阅 Xen Project 的 PvGrub2 文档。
Syslinux
对于 Syslinux 用户,请在 /boot/syslinux/syslinux.cfg 中添加类似这样的节:
LABEL xen
MENU LABEL Xen
KERNEL mboot.c32
APPEND ../xen-X.Y.Z.gz --- ../vmlinuz-linux console=tty0 root=/dev/sdaX ro --- ../initramfs-linux.img
其中 X.Y.Z 是您的 xen 版本,/dev/sdaX 是您的 根分区。
这也要求 mboot.c32(和 libcom32.c32)与 syslinux.cfg 在同一目录下。如果 /boot/syslinux 中没有 mboot.c32,请从以下位置复制:
# cp /usr/lib/syslinux/bios/mboot.c32 /boot/syslinux
创建网络桥接
Xen 要求 domU 和 dom0(及更远)之间的网络通信需要手动设置。可以使用 DHCP 和静态地址,选择应由网络拓扑决定。可以实现复杂的设置,有关详细信息,请参阅 Xen wiki 上的 Xen Networking 文章,以及 /etc/xen/scripts 中用于各种网络配置的脚本。可以通过创建名为 xenbr0 的 网络桥接 来设置基本的桥接网络,其中在 dom0 中创建一个虚拟交换机,所有 domU 都连接到该交换机。
有关详细信息,请参阅 Network bridge#Creating a bridge。
systemd-networkd
有关详细信息,请参阅 systemd-networkd#Bridge interface。
Network Manager
GNOME 的 Network Manager 有时可能会出现问题。如果 wiki 桥接 部分概述的桥接创建步骤不清楚或无效,那么以下步骤可能有效。
打开网络设置,并禁用您希望在桥接中使用的接口(例如 enp5s0)。将设置编辑为“关闭”,并取消勾选“自动连接”。
通过单击网络设置左下角的“+”符号来创建一个新的桥接连接配置文件。可选地,运行
# nm-connection-editor
以立即打开窗口。窗口打开后,选择“Bridge”。
在“Bridged Connections”旁边单击“Add”,然后选择您希望在桥接中使用的接口(例如 Ethernet)。选择与您要使用的接口相对应的设备 MAC 地址,并保存设置。
如果您的桥接将通过 DHCP 接收 IP 地址,请将 IPv4/IPv6 部分保持原样。如果此特定连接没有运行 DHCP,请确保为您的桥接分配一个 IP 地址。毋庸置疑,如果未为桥接分配 IP 地址,所有连接都将失败。如果您在首次创建桥接时忘记添加 IP 地址,以后可以随时编辑。
现在,以 root 用户身份运行:
# nmcli con show
您应该会看到一个与您刚刚创建的桥接名称匹配的连接。突出显示并复制该连接的 UUID,然后运行(再次以 root 用户身份):
# nmcli con up <UUID OF CONNECTION>
网络设置中应该会出现一个新连接。可能需要 30 秒到一分钟。要确认它已启动并正在运行,请运行:
# brctl show
以显示活动桥接的列表。
重启。如果重启后一切正常(例如,桥接自动启动),那么您就设置好了。
《可选》在您的网络设置中,删除您桥接接口上不连接到桥接的连接配置文件。这只是为了避免以后混淆。
安装 Xen systemd 服务
Xen dom0 需要 启动 xenstored.service、xenconsoled.service、xendomains.service 和 xen-init-dom0.service,并可能需要 启用 它们。
确认安装成功
重新启动您的 dom0 主机,并确保 Xen 内核能正确引导,并且所有设置在重启后都能保留。一个配置正确的 dom0 在您以 root 用户运行 xl list 时应该会报告以下内容:
# xl list
Name ID Mem VCPUs State Time(s) Domain-0 0 511 2 r----- 41652.9
当然,Mem、VCPUs 和 Time 列将根据机器配置和正常运行时间而有所不同。重要的是 dom0 已列出。
除了上述必需步骤外,请参阅 运行 Xen 的最佳实践,其中包括有关分配固定内存量和如何为 dom0 分配(固定)CPU 核心的信息。通过在 /etc/fstab 中包含以下内容,创建一个 xenfs 文件系统挂载点也可能很有益:
none /proc/xen xenfs defaults 0 0
配置最佳实践
在使用 Xen 之前,请查阅 Xen Project Best Practices。
使用 Xen
Xen 支持半虚拟化 (PV) 和硬件虚拟化 (HVM) domU。在以下各节中,将介绍创建运行 Arch Linux 的 HVM 和 PV domU 的步骤。通常,创建 HVM domU 的步骤与 domU 的操作系统无关,HVM domU 支持包括 Microsoft Windows 在内的各种操作系统。要使用 HVM domU,dom0 硬件必须具有虚拟化支持。半虚拟化 domU 不需要虚拟化支持,但需要修改客户机操作系统,这使得每个操作系统的安装过程不同(有关说明链接,请参阅 Xen wiki 上的 Guest Install 页面)。某些操作系统(例如 Microsoft Windows)无法安装为 PV domU。通常,HVM domU 的运行速度通常比 PV domU 慢,因为 HVM 在模拟硬件上运行。虽然设置 PV 和 HVM domU 涉及一些共同的步骤,但过程却大不相同。在这两种情况下,对于每个 domU,都需要创建一个“硬盘”并编写一个配置文件。此外,对于安装,每个 domU 都需要访问存储在 dom0 上的安装 ISO 副本(请参阅 下载页面 以获取 Arch Linux ISO)。
创建 domU "硬盘"
Xen 支持多种不同类型的“硬盘”,包括 逻辑卷、原始分区和镜像文件。要创建一个名为 domU.img 的 稀疏文件,该文件最大将增长到 10GiB,请使用:
$ truncate -s 10G domU.img
如果文件 IO 速度比域的可移植性更重要,那么使用 逻辑卷或 原始分区可能是更好的选择。
Xen 可以将主机可用的任何分区/磁盘作为分区或磁盘呈现给域。这意味着,例如,主机上的 LVM 分区可以显示为主驱动器(并且可以容纳多个分区)给域。请注意,在分区内创建子分区将使在主机上访问这些分区变得更加困难。有关如何映射分区内分区的信息,请参阅 kpartx(8)。
创建 domU 配置文件
每个 domU 都需要一个单独的配置文件,用于创建虚拟机。有关配置文件的完整详细信息,请参阅 Xen Wiki 或 xl.cfg(5) man page。HVM 和 PV domU 共享配置文件的一些组件。这些包括:
name = "domU" memory = 512 disk = [ "file:/path/to/ISO,sdb,r", "phy:/path/to/partition,sda1,w" ] vif = [ 'mac=00:16:3e:XX:XX:XX,bridge=xenbr0' ]
name= 是 xl 工具管理 domU 所使用的名称,并且在所有 domU 中必须是唯一的。disk= 包含有关安装介质(file:)和为 domU 创建的分区(phy)的信息。如果使用的是镜像文件而不是物理分区,则需要将 phy: 更改为 file:。vif= 定义一个网络控制器。00:16:3e MAC 地址块保留给 Xen 域,因此 mac= 的最后三位数字必须随机填充(仅使用十六进制值 0-9 和 a-f)。
管理 domU
如果 domU 应该在启动时启动,请在 /etc/xen/auto 中创建指向该配置文件的符号链接,并确保 xendomains 服务已正确设置。用于管理 domU 的一些有用命令是:
# xl top # xl list # xl console domUname # xl shutdown domUname # xl destroy domUname
配置硬件虚拟化 (HVM) Arch domU
要使用 HVM domU,请安装 mesa、numactl 和 bluez-libs 软件包。
HVM Arch domU 的最小配置文件是:
name = 'HVM_domU' builder = 'hvm' memory = 512 vcpus = 2 disk = [ 'phy:/dev/vg0/hvm_arch,xvda,w', 'file:/path/to/ISO,hdc:cdrom,r' ] vif = [ 'mac=00:16:3e:00:00:00,bridge=xenbr0' ] vnc = 1 vnclisten = '0.0.0.0' vncdisplay = 1
由于 HVM 机器没有控制台,因此只能通过 vncviewer 连接到它们。配置文件允许对 domU vncserver 进行未经身份验证的远程访问,不适用于不安全的网络。vncserver 将在 dom0 的端口 590X 上可用,其中 X 是 vncdisplay 的值。可以使用以下命令创建 domU:
# xl create /path/to/config/file
其状态可以通过以下方式检查:
# xl list
创建 domU 后,通过 vncserver 连接到它,并按照 安装指南 中的说明安装 Arch Linux。
配置半虚拟化 (PV) Arch domU
PV Arch domU 的最小配置文件是:
name = "PV_domU" kernel = "/mnt/arch/boot/x86_64/vmlinuz-linux" ramdisk = "/mnt/arch/boot/x86_64/initramfs-linux.img" extra = "archisobasedir=arch archisodevice=UUID=YYYY-mm-dd-HH-MM-SS-00" memory = 512 disk = [ "phy:/path/to/partition,sda1,w", "file:/path/to/ISO,sdb,r" ] vif = [ 'mac=00:16:3e:XX:XX:XX,bridge=xenbr0' ]
此文件需要根据您的具体用途进行调整。最重要的是,必须编辑 archisodevice=UUID=YYYY-mm-dd-HH-MM-SS-00 行以使用所用 ISO 的创建日期和时间。
在创建 domU 之前,必须挂载安装 ISO。为此,请确保目录 /mnt 存在且为空,然后运行以下命令(请确保填写正确的 ISO 路径):
# mount -o loop /path/to/iso /mnt
ISO 挂载后,可以使用以下命令创建 domU:
# xl create -c /path/to/config/file
“-c”选项将在成功创建 domU 后进入其控制台。然后,您可以按照 安装指南 中的说明安装 Arch Linux,但有以下例外。cfg 文件中的 disks 行中列出的块设备将显示为 /dev/xvd*。在分区 domU 时使用这些设备。安装后,在 domU 重启之前,必须将 xen-blkfront、xen-fbfront、xen-netfront、xen-kbdfront 模块添加到 Mkinitcpio。没有这些模块,domU 将无法正确引导。对于引导,安装 Grub 不是必需的。Xen 有一个基于 Python 的 grub 模拟器,因此需要一个 grub.cfg 文件:(可能需要创建 /boot/grub 目录)
/boot/grub/grub.cfg
menuentry 'Arch GNU/Linux, with Linux core repo kernel' --class arch --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-core repo kernel-true-__UUID__' {
insmod gzio
insmod part_msdos
insmod ext2
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 __UUID__
else
search --no-floppy --fs-uuid --set=root __UUID__
fi
echo 'Loading Linux core repo kernel ...'
linux /boot/vmlinuz-linux root=UUID=__UUID__ ro
echo 'Loading initial ramdisk ...'
initrd /boot/initramfs-linux.img
}
必须编辑此文件以匹配根分区的 UUID。在 domU 内部,运行以下命令:
# blkid
将所有 __UUID__ 的实例替换为根分区的实际 UUID(挂载为 / 的那个)。
# sed -i 's/__UUID__/12345678-1234-1234-1234-123456789abcd/g' /boot/grub/grub.cfg
使用 poweroff 命令关闭 domU。域完全关闭后,控制台将返回到虚拟机监控器,并且该域将不再出现在 xl 域列表中。现在可以卸载 ISO 文件:
# umount /mnt
现在应该编辑 domU cfg 文件。删除 kernel =、ramdisk = 和 extra = 行,并用以下行替换它们:
bootloader = "pygrub"
同时从 disk = 行中删除 ISO 磁盘。
Arch domU 现在已设置好。可以使用与之前相同的行启动它:
# xl create -c /etc/xen/archdomu.cfg
故障排除
"xl list" 报告 libxl 错误
要么您尚未引导至 Xen 系统,要么 xencommons 脚本中列出的 Xen 模块未安装。
"xl create" 失败
检查客户机内核是否位于正确的位置,检查 pv-xxx.cfg 文件是否有拼写错误(例如,使用 initrd 而不是 ramdisk)。
创建 HVM 失败
如果创建 HVM 失败并出现以下错误:
libxl: error: libxl_dm.c:3131:device_model_spawn_outcome: Domain 33:domain 33 device model: spawn failed (rc=-3) libxl: error: libxl_dm.c:3351:device_model_postconfig_done: Domain 33:Post DM startup configs failed, rc=-3 libxl: error: libxl_create.c:1837:domcreate_devmodel_started: Domain 33:device model did not start: -3 libxl: error: libxl_aoutils.c:646:libxl__kill_xs_path: Device Model already exited
您错过了安装 numactl。
Arch Linux 客户机在显示 ctrl-d 消息后挂起
按 ctrl-d 直到回到提示符,然后按描述重新构建其 initramfs。
"udev_event" 失败
类似以下的错误:
failed to execute '/usr/lib/udev/socket:/org/xen/xend/udev_event' 'socket:/org/xen/xend/udev_event': No such file or directory
是由 /etc/udev/rules.d/xend.rules 引起的。Xend 已弃用且未使用,因此可以安全地删除该文件。