在 Hyper-V 上运行 Linux 的最佳做法

适用于:Windows Server 2022、Azure Stack HCI 版本 20H2;Windows Server 2019、Windows Server 2016、Hyper-V Server 2016、Windows Server 2012 R2、Hyper-V Server 2012 R2、Windows Server 2012、Hyper-V Server 2012、Windows Server 2008 R2、Windows 10、Windows 8.1、Windows 8、Windows 7.1、Windows 7

本主题包含在 Hyper-V 上运行 Linux 虚拟机的建议列表。

在动态 VHDX 文件上优化 Linux 文件系统

有些 Linux 文件系统可能会消耗大量的实际磁盘空间,即使文件系统大部分是空的。 要减少动态 VHDX 文件的实际磁盘空间使用量,请考虑以下建议:

  • 创建 VHDX 时,在 PowerShell 中使用 1MB BlockSizeBytes(默认为 32MB),例如:
PS > New-VHD -Path C:\MyVHDs\test.vhdx -SizeBytes 127GB -Dynamic -BlockSizeBytes 1MB
  • ext4 格式优先于 ext3,因为与动态 VHDX 文件一起使用时,ext4 比 ext3 更节省空间。

  • 创建文件系统时,将组数指定为 4096,例如:

# mkfs.ext4 -G 4096 /dev/sdX1

第 2 代虚拟机上的 GRUB 菜单超时

由于第 2 代虚拟机的仿真中删除了旧硬件,导致 grub 菜单倒计时计时器的倒计时速度太快,无法显示 grub 菜单,因而会立即加载默认条目。 在 GRUB 固定为使用 EFI 支持的计时器之前,请修改 /boot/grub/grub.conf, /etc/default/grub 或等效条目,将其修改为“timeout=100000”而不是默认的“timeout=5”。

第 2 代虚拟机上的 PXE 引导

由于第 2 代虚拟机中不存在 PIT 计时器,因此与 PXE TFTP 服务器的网络连接可能会提前终止,并阻止引导加载程序读取 GRUB 配置和从服务器加载内核。

在 RHEL 6.X 上,可以使用传统的 grub v0.97 EFI 引导加载程序来代替 grub2,如下所述:https://access.redhat.com/documentation/Red_Hat_Enterprise_Linux/6/html/Installation_Guide/s1-netboot-pxe-config-efi.html

在 RHEL 6.X 以外的 Linux 发行版上,可以按照类似的步骤配置 grub v0.97 以从 PXE 服务器加载 Linux 内核。

此外,在 RHEL/CentOS 6.6 上,键盘和鼠标输入不适用于预安装内核,这将阻止在菜单中指定安装选项。 必须配置串行控制台以允许选择安装选项。

  • 在 PXE 服务器上的 EFIdefault 文件中,添加以下内核参数“console=ttyS1”

  • 在 Hyper-V 中的虚拟机上,使用此 PowerShell cmdlet 设置 COM 端口:

Set-VMComPort -VMName <Name> -Number 2 -Path \\.\pipe\dbg1

为预安装内核指定一个 kickstart 文件还可以避免在安装过程中使用键盘和鼠标输入。

将静态 MAC 地址用于故障转移群集

对于将使用故障转移群集部署的 Linux 虚拟机,应为每个虚拟网络适配器配置静态媒体访问控制 (MAC) 地址。 在某些版本的 Linux 中,网络配置可能会在故障转移后丢失,因为新的 MAC 地址被分配给虚拟网络适配器。 为避免丢失网络配置,请确保每个虚拟网络适配器都具有静态 MAC 地址。 可以通过在 Hyper-V 管理器或故障转移群集管理器中编辑虚拟机的设置来配置 MAC 地址。

使用 Hyper-V 专用的网络适配器,而不是旧版网络适配器

配置并使用虚拟以太网适配器,后者是具有增强性能的 Hyper-V 特定网卡。 如果旧版网络适配器和特定于 Hyper-V 的网络适配器都连接到虚拟机,则 ifconfig-a 输出中的网络名称可能会显示随机值,例如 _tmp12000801310。 要避免此问题,请在 Linux 虚拟机中使用特定于 Hyper-V 的网络适配器时删除所有旧版网络适配器。

使用 I/O 调度程序 noop/none 以提高磁盘 I/O 性能

Linux 内核提供了两组磁盘 I/O 调度程序来对请求进行重新排序。 一组用于较旧的“blk”子系统,另一组用于较新的“blk-mq”子系统。 在这两种情况下,对于目前流行的固态磁盘,建议使用将调度决策传递给底层 Hyper-V 虚拟机管理程序的调度程序。 对于使用“blk”子系统的 Linux 内核,也就是“noop”调度程序。 对于使用“blk-mq”子系统的 Linux 内核,这是“none”调度程序。

对于特定磁盘,可以在以下文件系统位置看到可用的调度程序:/sys/class/block/<diskname>/queue/scheduler,方括号中为当前选定的调度程序。 可以通过写入此文件系统位置来更改调度程序。 必须将更改添加到初始化脚本中,以便在重新启动后保留。 有关详细信息,请参阅你的 Linux 发行版文档。

NUMA

低于 2.6.37 的 Linux 内核版本不支持具有更大 VM 大小的 Hyper-V 上的 NUMA。 此问题主要影响使用上游 Red Hat 2.6.32 内核的旧分发版,在 Red Hat Enterprise Linux (RHEL) 6.6 (kernel-2.6.32-504) 中已解决。 运行版本低于 2.6.37 的自定义内核的系统,或者版本低于 2.6.32-504 的基于 RHEL 的内核必须在 grub.conf 中的内核命令行上设置启动参数 numa=off。 有关详细信息,请参阅 Red Hat KB 436883

为 kdump 预留更多内存

如果转储捕获内核在启动时出现崩溃的情况,请为内核预留更多内存。 例如,将 Ubuntu grub 配置文件中的参数 crashkernel=384M-:128M 更改为 crashkernel=384M-:256M。

缩小 VHDX 或扩展 VHD 和 VHDX 文件可能会导致 GPT 分区表出现错误

Hyper-V 允许缩小虚拟磁盘 (VHDX) 文件,而无需考虑磁盘上可能存在的任何分区、卷或文件系统数据结构。 如果 VHDX 收缩到 VHDX 的末尾在分区的末尾之前的位置,则数据可能会丢失,该分区可能会损坏,或者在读取分区时可能会返回无效数据。

调整 VHD 或 VHDX 大小后,管理员应使用 fdisk 或 parted 等实用程序更新分区、卷和文件系统结构,以反映磁盘大小的变化。 使用分区管理工具检查分区布局时,缩小或扩大具有 GUID 分区表 (GPT) 的 VHD 或 VHDX 的大小将导致警告,并警告管理员修复第一个和第二个 GPT 表头。 执行此手动步骤是安全的,不会丢失数据。

其他参考