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

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

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

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

  • 创建 VHDX 时,请在 PowerShell 中将 BlockSizeBytes 设置为 1 MB(从默认的 32 MB),例如:
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 引导

由于 PIT 计时器在第 2 代虚拟机中不存在,因此与 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

将启动文件指定到内核也会避免在安装过程中需要键盘和鼠标输入。

将静态 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 表头。 执行此手动步骤是安全的,不会丢失数据。