Xen
来自 Xen Overview
- Xen 是一个开源的 1 类或裸机虚拟机监控程序,它使得在单台机器(或主机)上并行运行多个操作系统实例或实际上不同的操作系统成为可能。Xen 是唯一可作为开源提供的 1 类虚拟机监控程序。
Xen hypervisor 是一个薄软件层,它模拟计算机架构,允许同时运行多个操作系统。 hypervisor 由其安装计算机的引导加载程序启动。一旦 hypervisor 加载,它会启动 dom0(“domain 0”的缩写,有时称为主机或特权域),在我们的例子中运行 Arch Linux。一旦 dom0 启动,就可以从 dom0 启动和控制一个或多个 domU(用户域的缩写,有时称为 VM 或客户机)。对于 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 未运行时运行以下命令
$ grep -E "(vmx|svm)" --color=always /proc/cpuinfo
如果上述命令没有产生输出,则硬件虚拟化支持不可用,并且您的硬件无法运行 HVM domU(或者您已经在运行 Xen hypervisor)。如果您认为 CPU 支持这些功能之一,您应该在启动过程中访问主机系统的 BIOS 配置菜单,并查看是否禁用了与虚拟化支持相关的选项。如果存在此类选项并且已禁用,请启用它,启动系统并重复上述命令。 Xen hypervisor 还支持 PCI 直通,即使在 dom0 不支持该设备的情况下,PCI 设备也可以直接传递给 domU。为了使用 PCI 直通,CPU 必须支持 IOMMU/VT-d。
Xen Hypervisor 的安装
要安装 Xen hypervisor,请安装 xenAUR 软件包。它提供了 Xen hypervisor、当前的 xl 接口以及所有配置和支持文件,包括 systemd 服务。要运行大多数 VM,您还需要安装 xen-qemuAUR。
为了在 VM 中支持 BIOS,请安装 seabios。为了支持 UEFI,请安装 edk2-ovmf。要在 PVH VM 中启动 VM 本地内核,请安装 xen-pvhgrubAUR。
构建 Xen
建议在干净的环境中构建 xen 及其组件,无论是在 VM 还是 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 也将为手册页和文档构建。如果您选择构建 stubdom 支持,则将构建 xen-stubdom 软件包。
引导加载程序的修改
必须修改引导加载程序以加载特殊的 Xen 内核(xen.gz
或 UEFI 情况下的 xen.efi
),然后用于引导正常内核。为此,需要一个新的引导加载程序条目。
UEFI
Xen 支持从 UEFI 启动,如 Xen EFI 系统中所述。也可能需要使用 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 的 RAM,请修改 /etc/default/grub
,方法是替换行
#GRUB_CMDLINE_XEN_DEFAULT=""
使用
GRUB_CMDLINE_XEN_DEFAULT="dom0_mem=512M"
关于 Xen 的 GRUB 配置键的更多信息,请参阅 GRUB 文档。
自定义选项后,使用以下命令更新引导加载程序配置
# grub-mkconfig -o /boot/grub/grub.cfg
有关使用 GRUB 引导加载程序的更多信息,请访问 GRUB。
为引导客户机构建 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/技巧和窍门#GRUB 独立 镜像,该镜像将合并该文件
# grub-mkstandalone -O x86_64-xen -o /usr/lib/xen/boot/pv-grub2-x86_64-xen "/boot/grub/grub.cfg=./grub.cfg"
最后,将该镜像添加为 domU 配置文件中内核的值(在此示例中为 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 上的 网络 文章和 /etc/xen/scripts
。 可以通过创建具有预期名称 xenbr0
的 网络桥接 来设置基本的桥接网络,其中在 dom0 中创建一个虚拟交换机,每个 domU 都连接到该交换机。
有关详细信息,请参阅 网络桥接#创建桥接。
Systemd-networkd
有关详细信息,请参阅 Systemd-networkd#桥接接口。
网络管理器
Gnome 的网络管理器有时可能会很麻烦。 如果 wiki 的 桥接 部分中概述的桥接创建部分不清楚或不起作用,则以下步骤可能会起作用。
打开网络设置并禁用您希望在桥接中使用的接口(例如 enp5s0)。 将设置编辑为关闭并取消选中“自动连接”。
通过单击网络设置左下角的“+”符号来创建新的桥接连接配置文件。 或者,运行
# nm-connection-editor
立即调出窗口。 窗口打开后,选择桥接。
单击“桥接连接”旁边的“添加”,然后选择您希望在桥接中使用的接口(例如以太网)。 选择与您打算使用的接口对应的设备 mac 地址并保存设置
如果您的桥接将通过 DHCP 接收 IP 地址,请将 IPv4/IPv6 部分保持原样。 如果此特定连接未运行 DHCP,请确保为您的桥接提供 IP 地址。 不用说,如果没有为桥接分配 IP 地址,则所有连接都将失败。 如果您忘记在首次创建桥接时添加 IP 地址,则可以随时稍后编辑它。
现在,以 root 身份运行
# nmcli con show
您应该看到一个与您刚刚创建的桥接名称匹配的连接。 突出显示并复制该连接上的 UUID,然后运行(再次以 root 身份)
# nmcli con up <UUID OF CONNECTION>
新连接应显示在网络设置下。 可能需要 30 秒到 1 分钟。 要确认它已启动并正在运行,请运行
# brctl show
以显示活动桥接的列表。
重启。 如果重启后一切正常(即桥接自动启动),那么您就一切就绪了。
<可选> 在您的网络设置中,删除桥接接口上未连接到桥接的连接配置文件。 这只是为了防止以后造成混淆。
安装 Xen systemd 服务
Xen dom0 需要 启动 并且可能 启用 xenstored.service
、xenconsoled.service
、xendomains.service
和 xen-init-dom0.service
。
确认安装成功
重启您的 dom0 主机,并确保 Xen 内核正确引导,并且所有设置在重启后仍然存在。 当您以 root 身份运行 xl list
时,正确设置的 dom0 应报告以下内容
# 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 最佳实践。
使用 Xen
Xen 支持半虚拟化 (PV) 和硬件虚拟化 (HVM) domU。 在以下部分中,描述了创建运行 Arch Linux 的 HVM 和 PV domU 的步骤。 通常,创建 HVM domU 的步骤独立于 domU 操作系统,并且 HVM domU 支持各种操作系统,包括 Microsoft Windows。 要使用 HVM domU,dom0 硬件必须具有虚拟化支持。 半虚拟化 domU 不需要虚拟化支持,但需要修改客户机操作系统,这使得每个操作系统的安装过程都不同(有关说明链接,请参阅 Xen wiki 的 客户机安装 页面)。 某些操作系统(例如 Microsoft Windows)无法作为 PV domU 安装。 通常,HVM domU 的运行速度通常比 PV domU 慢,因为 HVM 在模拟硬件上运行。 虽然设置 PV 和 HVM domU 涉及一些常见步骤,但过程却大相径庭。 在这两种情况下,对于每个 domU,都需要创建一个“硬盘”并编写一个配置文件。 此外,对于安装,每个 domU 都需要访问存储在 dom0 上的安装 ISO 的副本(请参阅 下载页面 以获取 Arch Linux ISO)。
创建 domU “硬盘”
Xen 支持多种不同类型的“硬盘”,包括 逻辑卷、原始分区 和镜像文件。 要创建一个最大增长到 10GiB 的 稀疏文件,名为 domU.img
,请使用
$ truncate -s 10G domU.img
如果文件 IO 速度比域可移植性更重要,则使用 逻辑卷 或 原始分区 可能是更好的选择。
Xen 可以将主机上可用的任何分区/磁盘呈现给域,作为分区或磁盘。 这意味着,例如,主机上的 LVM 分区可以作为硬盘驱动器(并包含多个分区)出现在域中。 请注意,在分区上创建子分区将使在主机上访问这些分区更加困难。 有关如何映射分区内的分区的更多信息,请参阅 kpartx(8)。
创建 domU 配置
每个 domU 都需要一个单独的配置文件,该文件用于创建虚拟机。 有关配置文件的完整详细信息,请访问 Xen Wiki 或 xl.cfg(5) 手册页。 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 文件的磁盘行中列出的块设备将显示为 /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(如前所述)。
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 已弃用且未使用,因此删除该文件是安全的。