23 设置虚拟机主机 #
本节介绍如何将 SUSE Linux Enterprise Server 15 SP6 设置为并用作虚拟机主机。
Dom0 的硬件要求通常与 SUSE Linux Enterprise Server 操作系统的硬件要求相同。应该添加额外的 CPU、磁盘、内存和网络资源才能满足规划的所有 VM Guest 系统的需求。
请记住,如果 VM Guest 系统在更快的处理器上运行并且可以访问更多系统内存,其性能就会更好,这与物理机一样。
虚拟机主机要求安装多个软件包及其依赖项。要安装全部所需的软件包,请运行 YaST
,选择 › ,然后选择 进行安装。也可以在 YaST 中使用模块 › 来执行安装。安装 Xen 软件后,重启动计算机,并在引导屏幕上选择新添加的具有 Xen 内核的选项。
通过更新通道可使用更新。为了确保安装最新的更新,请在完成安装后运行 YaST
。23.1 最佳实践和建议 #
在主机上安装和配置 SUSE Linux Enterprise Server 操作系统时,请遵循以下最佳实践和建议:
如果该主机应始终作为 Xen 主机运行,请运行 YaST
› ,并激活 Xen 引导项作为默认引导部分。在 YaST 中单击
。将默认引导更改为
标签,然后单击 。单击
。
为获得最佳性能,请仅在虚拟机主机上安装虚拟化所需的应用程序和进程。
如果您打算使用挂接到 Xen 主机的检查包设备,请每次仅使用一个设备。建议使用提供实际硬件集成的驱动程序,而不要使用通用软件驱动程序。
Dom0 内核以虚拟化模式运行,因此 irqbalance
或 lscpu
等工具不会反映真实的硬件特征。
Xen 不支持可信引导 (Tboot)。为了确保 Xen 主机可正确引导,请在 GRUB 2 配置对话框中校验
选项是否已停用。23.2 管理 Dom0 内存 #
在以前的 SUSE Linux Enterprise Server 版本中,Xen 主机的默认内存分配模式是将所有主机物理内存都分配给 Dom0,并启用自动气球式调节功能。当有其他域启动后,内存会自动从 Dom0 进行气球式调节。此行为总是容易出错,因此强烈建议将其禁用。从 SUSE Linux Enterprise Server 15 SP1 开始,默认已禁用自动气球式调节,并会为 Dom0 分配 10% 的主机物理内存外加 1GB。例如,在物理内存大小为 32 GB 的主机上,将为 Dom0 分配 4.2 GB 内存。
我们仍支持并建议在 /etc/default/grub
中使用 dom0_mem
Xen 命令行选项。可以通过将 dom0_mem
设置为主机物理内存大小,并在 /etc/xen/xl.conf
中启用 autoballoon
设置,来恢复旧行为。
为 Dom0 预留的内存容量取决于主机上运行的 VM Guest 数量,因为 Dom0 会为每个 VM Guest 提供后端网络和磁盘 I/O 服务。计算 Dom0 内存分配时,还应考虑到 Dom0 中运行的其他工作负载。应该像确定任何其他虚拟机的内存大小一样来确定 Dom0 的内存大小。
23.2.1 设置 Dom0 内存分配 #
确定需要为 Dom0 分配的内存。
在 Dom0 中,键入
xl info
以查看计算机上可用的内存量。可以使用xl list
命令确定当前为 Dom0 分配的内存。编辑
/etc/default/grub
并调整GRUB_CMDLINE_XEN
选项,使其包含dom0_mem=MEM_AMOUNT
。将 MEM_AMOUNT 替换为要分配给 Dom0 的最大内存量。添加K
、M
或G
以指定大小单位。例如:GRUB_CMDLINE_XEN="dom0_mem=2G"
重启动计算机以应用更改。
有关 Xen 相关引导配置选项的更多细节,请参见第 18.2.2 节 “ 文件 /etc/default/grub
”。
对 GRUB 2 中的 Xen 超级管理程序使用 XL 工具堆栈和 dom0_mem=
选项时,需在 etc/xen/xl.conf
中禁用 xl autoballoon。否则,启动 VM 时将会失败,并出现有关无法压缩 Dom0 内存气球的错误。因此,如果您为 Xen 指定了 dom0_mem=
选项,请在 xl.conf
中添加 autoballoon=0。另请参见 Xen
dom0 memory
23.3 全虚拟化 Guest 中的网卡 #
在全虚拟化 Guest 中,默认网卡是一个模拟的 Realtek 网卡。不过,您也可以使用分离式网络驱动程序来管理 Dom0 与 VM Guest 之间的通讯。默认情况下,这两个接口都会呈现给 VM Guest,因为某些操作系统的驱动程序要求这两个接口都存在。
使用 SUSE Linux Enterprise Server 时,默认只有半虚拟化网卡可供 VM Guest 使用。可用的网络选项如下:
- 模拟
要使用模拟 Realtek 网卡之类的模拟网络接口,请在域 xl 配置的
vif
设备部分指定type=ioemu
。示例配置如下所示:vif = [ 'type=ioemu,mac=00:16:3e:5f:48:e4,bridge=br0' ]
xl.conf
手册页man 5 xl.conf
中提供了有关 xl 配置的更多细节。- 半虚拟化
如果指定
type=vif
但不指定型号或类型,将使用半虚拟化网络接口:vif = [ 'type=vif,mac=00:16:3e:5f:48:e4,bridge=br0,backen=0' ]
- 模拟和半虚拟化
如果要为管理员提供上述两个选项,只需同时指定类型和型号即可。xl 配置如下所示:
vif = [ 'type=ioemu,mac=00:16:3e:5f:48:e4,model=rtl8139,bridge=br0' ]
在这种情况下,应在 VM Guest 上禁用其中一个网络接口。
23.4 启动虚拟机主机 #
如果正确安装了虚拟化软件,计算机引导时会显示 GRUB 2 引导加载程序,且其菜单中会包含
选项。选择此选项即可启动虚拟机主机。
引导 Xen 系统时,dom0 的 /var/log/messages 日志文件或 systemd
日记中可能会出现如下所示的错误消息:
isst_if_mbox_pci: probe of 0000:ff:1e.1 failed with error -5 isst_if_pci: probe of 0000:fe:00.1 failed with error -5
请忽略这些错误,因为它们不会产生问题,之所以发生这些错误,是因为 ISST 驱动程序无法为虚拟机提供任何电源或频率调节功能。
在 Xen 中,超级管理程序会管理内存资源。如果您需要为 Dom0 中的恢复内核预留系统内存,需由超级管理程序预留此内存。因此,请务必在 /etc/dfault/grub
文件的 GRUB_CMDLINE_XEN_DEFAULT
变量中添加 crashkernel=size
,然后保存文件并运行以下命令:
>
sudo
grub2-mkconfig -o /boot/grub2/grub.cfg
有关 crashkernel 参数的详细信息,请参见第 19.4 节 “计算 crashkernel
分配大小”。
如果 GRUB 2 菜单中不包含
选项,请检查安装步骤,并校验是否已更新 GRUB 2 引导加载程序。如果安装是在未选择 Xen 软件集的情况下完成的,请运行 YaST ,选择 过滤器,然后选择 进行安装。引导超级管理程序后,Dom0 虚拟机将会启动并显示其图形桌面环境。如果您未安装图形桌面,则会显示命令行环境。
有时可能会发生图形系统无法正常工作的问题。在这种情况下,请将 vga=ask
添加到引导参数。要激活永久设置,请使用 vga=mode-0x???
,其中 ???
的计算方式为 0x100
+ https://en.wikipedia.org/wiki/VESA_BIOS_Extensions 中所述的 VESA 模式,例如 vga=mode-0x361
。
在开始安装虚拟 Guest 之前,请确保系统时间正确。为此,请在控制域上配置 NTP(网络时间协议):
在 YaST 中选择
› 。选择在引导期间自动启动 NTP 守护程序的选项。提供现有 NTP 时间服务器的 IP 地址,然后单击
。
硬件时钟并不精确。所有新式操作系统都会尝试通过一个额外的时间源来更正系统时间(对比硬件时间)。要使所有 VM Guest 系统上的时间正确,请也在每个相应 Guest 上激活网络时间服务,或确保 Guest 使用主机的系统时间。有关 SUSE Linux Enterprise Server 中的Independent Wallclocks
的详细信息,请参见第 18.2 节 “Xen 虚拟机时钟设置”。
有关管理虚拟机的详细信息,请参见第 25 章 “管理虚拟化环境”。
23.5 PCI 直通 #
为了充分利用 VM Guest 系统,有时需要将特定的 PCI 设备分配给专用的域。如果使用的是全虚拟化 Guest,那么仅当系统的芯片组支持并且已在 BIOS 中激活此功能时,此功能才可用。
AMD* 和 Intel* 都提供此功能。对于 AMD 计算机,该功能称为 IOMMU。在 Intel 术语中称为 VT-d。请注意,具备 Intel-VT 技术还不足以对全虚拟化 Guest 使用此功能。为确保您的计算机支持此功能,需专门要求您的供应商提供一个支持 PCI 直通的系统。
PCI 直通的配置要兼顾两个方面。首先,在引导时必须告知超级管理程序应使某个 PCI 设备可供重新分配。其次,必须将该 PCI 设备分配给 VM Guest。
23.5.1 配置超级管理程序以使用 PCI 直通 #
选择要重分配给 VM Guest 的设备。为此,请运行
lspci -k
,并读取设备编号以及分配给该设备的原始模块的名称:06:01.0 Ethernet controller: Intel Corporation Ethernet Connection I217-LM (rev 05) Subsystem: Dell Device 0617 Kernel driver in use: e1000e Kernel modules: e1000e
在本例中,PCI 编号为
(06:01.0)
,相关的内核模块为e1000e
。指定模块依赖项以确保
xen_pciback
是用于控制设备的第一个模块。添加包含以下内容的/etc/modprobe.d/50-e1000e.conf
文件:install e1000e /sbin/modprobe xen_pciback ; /sbin/modprobe \ --first-time --ignore-install e1000e
指示
xen_pciback
模块使用hide
选项来控制设备。编辑或创建包含以下内容的/etc/modprobe.d/50-xen-pciback.conf
文件:options xen_pciback hide=(06:01.0)
重新启动系统。
使用以下命令检查该设备是否在可分配设备列表中
xl pci-assignable-list
23.5.1.1 通过 xl 进行动态分配 #
为了避免重启动主机系统,您可以利用通过 xl 进行的动态分配来使用 PCI 直通。
首先确保 Dom0 中已加载 pciback 模块:
>
sudo
modprobe pciback
然后使用 xl
pci-assignable-add
使设备可供分配。例如,要使设备 06:01.0 可供 Guest 使用,请运行以下命令:
>
sudo
xl pci-assignable-add 06:01.0
23.5.2 将 PCI 设备分配给 VM Guest 系统 #
可通过多种方法来使 PCI 设备专用于某个 VM Guest:
- 安装时添加该设备:
在安装期间,在配置文件中添加
pci
行:pci=['06:01.0']
- 将 PCI 设备热插入到 VM Guest 系统
可以使用
xl
命令即时添加或去除 PCI 设备。要将编号为06:01.0
的设备添加到名为sles12
的 Guest,请使用:xl pci-attach sles12 06:01.0
- 将 PCI 设备添加到 Xend
要将设备永久添加到 Guest,请在 Guest 配置文件中添加以下代码段:
pci = [ '06:01.0,power_mgmt=1,permissive=1' ]
将 PCI 设备分配给 VM Guest 后,Guest 系统必须负责处理此设备的配置和设备驱动程序。
23.5.3 VGA 直通 #
Xen 4.0 和更高版本支持在全虚拟化 VM Guest 上实现 VGA 图形适配器直通。Guest 可以全面控制提供高性能全 3D 和视频加速的图形适配器。
VGA 直通功能与 PCI 直通类似,因此也需要主板芯片组和 BIOS 提供 IOMMU(或 Intel VT-d)支持。
只有主图形适配器(打开计算机电源时使用的图形适配器)能够与 VGA 直通搭配使用。
仅支持对全虚拟化 Guest 使用 VGA 直通。不支持半虚拟 (PV) Guest。
不能在多个使用 VGA 直通的 VM Guest 之间共享显卡 — 显卡只能供一个 Guest 专用。
要启用 VGA 直通,请在全虚拟化 Guest 配置文件中添加以下设置:
gfx_passthru=1 pci=['yy:zz.n']
其中,yy:zz.n
是使用 lspci -v
在 Dom0 上找到的 VGA 图形适配器的 PCI 控制器 ID。
23.5.4 查错 #
在某些情况下,安装 VM Guest 期间可能会出现问题。本节将说明多个已知问题及其解决方法。
- 系统在引导期间挂起
软件 I/O 转换缓冲区会提前在引导进程中分配一大块低速内存。如果内存请求超出了缓冲区大小,可能会导致引导进程挂起。要检查是否存在这种情况,请切换到控制台 10,并检查其输出是否包含如下所示的消息
kernel: PCI-DMA: Out of SW-IOMMU space for 32768 bytes at device 000:01:02.0
在这种情况下,您需要增加
swiotlb
的大小。在 Dom0 的命令行中添加swiotlb=VALUE
(其中 VALUE 指定为 slab 项数)。可以通过增大或减小该数字来找到适合计算机的最佳大小。
要在 PV Guest 上正常进行 PCI 设备的 DMA 访问,必须指定 swiotlb=force
内核参数。有关 IOMMU 和 swiotlb
选项的详细信息,请参见软件包 kernel-source
中的 boot-options.txt
文件。
23.5.5 更多信息 #
互联网上的一些资源提供了有关 PCI 直通的有趣信息:
23.6 USB 直通 #
可通过两种方法将单个主机 USB 设备直通到 Guest。第一种方法是使用模拟的 USB 设备控制器,第二种方法是使用 PVUSB。
23.6.1 标识 USB 设备 #
在将 USB 设备直通到 VM Guest 之前,需要先在 VM 主机服务器上标识该设备。使用 lsusb
命令列出主机系统上的 USB 设备:
#
lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 003: ID 0461:4d15 Primax Electronics, Ltd Dell Optical Mouse
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
例如,要直通 Dell 鼠标,请以 vendor_id:device_id
(0461:4d15) 格式指定设备标记,或以 bus.device
(2.3) 格式指定总线地址。请记得去除前导零,否则 xl
会将数字解释为八进制值。
23.6.2 模拟的 USB 设备 #
在模拟的 USB 中,设备模型 (QEMU) 会向 Guest 呈现模拟的 USB 控制器。然后,将通过 Dom0 控制 USB 设备,而 USB 命令将在 VM Guest 与主机 USB 设备之间转换。此方法仅适用于全虚拟化域 (HVM)。
使用 usb=1
选项启用模拟的 USB 集线器。然后使用 host:USBID
在配置文件中指定设备列表中的设备以及其他模拟的设备。例如:
usb=1 usbdevice=['tablet','host:2.3','host:0424:460']
23.6.3 半虚拟化 PVUSB #
PVUSB 是以高性能方式实现从 Dom0 到虚拟化 Guest 的 USB 直通的新方法。借助 PVUSB,可以通过两种方式将 USB 设备添加到 Guest:
在创建域时通过配置文件添加
当 VM 正在运行时通过热插入方式添加
PVUSB 使用半虚拟化前端和后端接口。PVUSB 支持 USB 1.1 和 USB 2.0,适用于 PV 和 HVM Guest。要使用 PVUSB,Guest 操作系统中需要有 USB 前端,并且 Dom0 中需要有 USB 后端或者 QEMU 中需要有 USB 后端。在 SUSE Linux Enterprise Server 上,QEMU 已随附了 USB 后端。
从 Xen 4.7 开始引入了 xl
PVUSB 支持和热插入支持。
在配置文件中,使用 usbctrl
和 usbdev
指定 USB 控制器和 USB 主机设备。例如,对于 HVM Guest:
usbctrl=['type=qusb,version=2,ports=4', 'type=qusb,version=1,ports=4', ] usbdev=['hostbus=2, hostaddr=1, controller=0,port=1', ]
必须为 HVM Guest 的控制器指定 type=qusb
。
要管理 PVUSB 设备的热插入,请使用 usbctrl-attach
、usbctrl-detach
、usb-list
、usbdev-attach
和 usb-detach
子命令。例如:
创建版本为 USB 1.1 并包含 8 个端口的 USB 控制器:
#
xl usbctrl-attach test_vm version=1 ports=8 type=qusb
在域中找到第一个可用的 controller:port,并将 busnum:devnum 为 2:3 的 USB 设备挂接到该端口;您也可以指定 controller
和 port
:
#
xl usbdev-attach test_vm hostbus=2 hostaddr=3
显示域中的所有 USB 控制器和 USB 设备:
#
xl usb-list test_vm
Devid Type BE state usb-ver ports
0 qusb 0 1 1 8
Port 1: Bus 002 Device 003
Port 2:
Port 3:
Port 4:
Port 5:
Port 6:
Port 7:
Port 8:
分离控制器 0 端口 1 下的 USB 设备:
#
xl usbdev-detach test_vm 0 1
去除具有所示 dev_id
的 USB 控制器,以及其下的所有 USB 设备:
#
xl usbctrl-detach test_vm dev_id
有关详细信息,请参见https://wiki.xenproject.org/wiki/Xen_USB_Passthrough。