Xen

来自 ArchWiki

此文章或章节需要语言、Wiki 语法或风格改进。请参阅 Help:Style 以供参考。

原因: 章节需要更好的结构。(在 Talk: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 时,请勿运行其他虚拟化软件(如 VirtualBox),这可能会使您的系统挂起。请参阅此错误报告(wontfix)

安装

系统要求

Xen hypervisor 需要内核级别支持,这包含在最新的 Linux 内核中,并内置于 linuxlinux-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。

  1. build_stubdom -- 构建运行 Xen stubdom 的组件,主要用于 dom0 分离。stubdom 的组件在构建后会分离到 xen-stubdom 中。默认为 false。
  2. boot_dir -- 您的启动目录。默认为 /boot
  3. efi_dir, efi_mountpoint -- 您的 EFI 目录和挂载点。默认为 /boot

将这些参数作为变量传递给 makepkg

$ build_stubdom=true efi_dir="/boot/EFI" makepkg

xen-docsAUR 也将为手册页和文档构建。如果您选择构建 stubdom 支持,则将构建 xen-stubdom 软件包。

注意: Arch Linux 上 Xen 的计划是最终逐步淘汰 stubdom,转而支持 PVH 域。

引导加载程序的修改

警告: 永远不要假设在更改启动系统后您的系统会启动。这可能是新用户和老用户最常犯的错误。在您更改启动系统之前,请确保您有其他启动系统的方法,例如 USB 驱动器或其他 Live 介质BEFORE

必须修改引导加载程序以加载特殊的 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 efi.cfg。对于 options 行,请参阅 Xen 命令行选项,以获取可用选项的完整列表,例如串行控制台、限制 dom0 vCPU 和内存、调度、Intel 和 AMD 微码等。例如,《Xen 项目最佳实践》规定禁用 dom0 的内存气球。为此,请编辑 xen.cfg 中的 options 行以指定其他参数。
systemd-boot
提示: 即使在安装和配置 Xen 后,您也可以继续直接引导 dom0 内核。这在 Xen 安装变得无法启动或配置错误的情况下可能很有用。因此,建议将系统上配置的原始 systemd-boot 加载程序条目保留为救援启动选项,并仅为 Xen 添加其他条目。
注意: 在系统 systemd-boot 安装时,ESP 分区应已挂载到 /boot,因为这是配置和构建 XenAUR 软件包和 EFI 二进制文件的位置,而不是 /boot/efi

添加一个新的 EFI 类型加载程序条目。有关更多详细信息,请参阅 systemd-boot#UEFI Shells or other EFI applications。例如

/boot/loader/entries/10-xen.conf
title   Xen Hypervisor
efi     /xen.efi
注意: 当前的 systemd-boot 和 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-xeni386-xen_pvhx86_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 要求手动设置 domUdom0(以及更远)之间的网络通信。 可以使用 DHCP 和静态寻址,选择应由网络拓扑结构确定。 可以进行复杂的设置,有关详细信息和各种网络配置的脚本,请参阅 Xen wiki 上的 网络 文章和 /etc/xen/scripts。 可以通过创建具有预期名称 xenbr0网络桥接 来设置基本的桥接网络,其中在 dom0 中创建一个虚拟交换机,每个 domU 都连接到该交换机。

有关详细信息,请参阅 网络桥接#创建桥接

Systemd-networkd

有关详细信息,请参阅 Systemd-networkd#桥接接口

网络管理器

本文或本节是与 网络桥接#使用 NetworkManager 合并的候选对象。

注意: 与主页面重复。(在 Talk:Xen 中讨论)

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.servicexenconsoled.servicexendomains.servicexen-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 domUdom0 硬件必须具有虚拟化支持。 半虚拟化 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 Wikixl.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,请安装 mesanumactlbluez-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-blkfrontxen-fbfrontxen-netfrontxen-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 已弃用且未使用,因此删除该文件是安全的。

另请参阅