在 Windows Server 2012 R2 Hyper-V 上提供 Linux 支持

本博文是“Windows Server 和 System Center 2012 R2 新增功能”系列博文(共 9 篇)之一,该系列是 Brad Anderson 云端瞭望博客中的精选内容。今天的博文将介绍 Windows Server 2012 R2 中对 Linux 的支持,以及这将如何应用到 Brad“转型数据中心”这一较大主题之中。要阅读此内容以及查看所探讨的其他技术,请阅读今天的博文“2012 R2 新增内容:启用开放源代码软件”。

在 Hyper-V 和 Windows Azure 上配置 Linux 是 Microsoft 为启用开放源代码软件支持所进行的一个核心工作。作为这一活动中的一部分,Microsoft Linux 集成服务 (LIS) 团队持续开发出色的 Linux 驱动程序,这一驱动程序将直接包含于 Linux 上游内核之中,因而可直接集成到诸如 CentOS、Debian、Red Hat、SUSE 和 Ubuntu 等今后主要发行版中。

集成服务最初作为 Microsoft 站点中的下载内容推出。Linux 用户能够下载并安装这些驱动程序,并联系 Microsoft 获取任何必要的支持。由于驱动程序已经成熟,因此现在驱动程序将直接通过 Linux 发行版推出。这一方法不仅能避免从 Microsoft 网站下载驱动程序的额外步骤,而且还可让用户利用其与 Linux 供应商的现有支持合约。

例如,Red Hat 在 Red Hat Enterprise Linux (RHEL) 5.9 上认证面向 Hyper-V 的卓越驱动程序,而对于 RHEL 6.4 的认证将于 2013 年夏天之前完成。这可让客户在 Hyper-V 上运行 RHEL 5.9/6.4 遇到问题时,直接获取 Red Hat 的支持。

为了进一步实现为在 Microsoft 基础结构上运行的 Linux 提供卓越功能和性能的目标,基于虚拟化平台的 Windows Server 2012 R2 中现已推出如下新功能:

 

  1. Linux 合成帧缓冲驱动程序 – 为 Linux 桌面用户提供增强的显卡性能和卓越的分辨率。
  2. Linux 动态内存支持 – 为 Linux 宿主提供较高的虚拟机密度/主机。
  3. 实时虚拟机备份支持 – 为实时 Linux 虚拟机提供无中断的备份支持。
  4. 动态扩展固定大小的 Linux VHD – 扩展实时安装的固定大小的 Linux VHD。
  5. 面向 Linux 虚拟机的 Kdump/kexec 支持 – 可创建 Linux 虚拟机内核转储。
  6. 面向 Linux 虚拟机的 NMI(不可屏蔽的中断)支持 – 为在 Hyper-V 上运行的 Linux 虚拟机提供手动触发的中断。
  7. 内存映射 I/O (MMIO) 间隙的规格 – 为虚拟设备制造商提供针对可用 RAM 的精细控制。

所有功能都已经集成到 SUSE Linux Enterprise Server 11 SP3 中,该版本可从 SUSE 网站 (https://www.suse.com/products/server/) 下载。此外,面向 Ubuntu 13.10 版本和 RHEL 6.5 版本的集成工作也正在进行之中。

 以下部分介绍了这些新功能及其优势:

 1.        合成帧缓冲驱动程序

全新的合成 2D 帧缓冲驱动程序为在 Hyper-V 上运行的 Linux 虚拟机提供了坚实的显卡性能改进。此外,该驱动程序还为以桌面模式托管于 Hyper-V 中的 Linux 来宾提供了全高清分辨率 (1920x1080) 功能。

 合成帧缓冲驱动程序的另一重大意义在于其可消除双重光标的问题。当在较旧 Linux 发行版的桌面模式中使用时,很多客户报告称可见两个鼠标指针在屏幕中相互追逐。这个会分散用户注意力的问题现已通过合成 2D 帧缓冲驱动程序得以解决,因而能够改善 Linux 桌面用户的视觉体验。

2.        动态内存支持

 面向 Linux 来宾的动态内存的可用性将提高每台主机的虚拟机密度。这将为希望使用 Hyper-V 来整合其服务器工作负荷的 Linux 管理员创造了巨大价值。内部测试结果表明,当运行配置有动态内存的 Linux 计算机时,服务器容量将提高 30-40%。

Linux 动态内存驱动程序将监控 Linux 虚拟机的内存使用,并定期报告给 Hyper-V。Hyper-V 将基于使用情况报告而跨托管的多个虚拟机动态安排内存分配和取消分配。请注意 Linux 和 Windows 虚拟机的动态内存配置用户界面完全一致。

 

面向 Linux 虚拟机的动态内存驱动程序提供了热插拔和扩展支持,并可使用如图文块 1 所示的启动参数、最小 RAM 参数和最大 RAM 参数配置。

当系统启动 Linux 虚拟机时,启动参数中所指定的内存容量也将启动。

如果虚拟机需要更多内存,那么 Hyper-V 将使用热插拔机制来动态增加虚拟机可用的内存容量。

另一方面,如果虚拟机所需内存少于所分配的容量,那么 Hyper-V 将使用扩展机制来减少虚拟机可用的内存,以达到一个合理的容量。

 

图文块 1 为 Linux 虚拟机配置动态内存

 提高虚拟机的密度是使用动态内存的一个显著优势。而使用动态内存扩展应用工作负荷是其另一出色应用。下图显示了当发生客户端工作负荷增加的情况时能够利用动态内存扩展操作的 Web 服务器的示例。

 为了说明情况,我们在 Hyper-V 服务器上设置了两个托管于独立 Linux 虚拟机内的 Apache 服务器。其中一台 Linux 虚拟机配置了 786 MB 静态 RAM,而另一台 Linux 虚拟机则配置了动态内存。动态内存参数设置如下:启动 RAM 为 786 MB,最大 RAM 为 8 GB,最小 RAM 为 500 MB。接下来,两个 Apache 服务器将有可能通过托管于 Windows 虚拟机内的客户端应用承受单向增加的 Web 服务器的工作负荷。

 在静态内存配置下,由于 Apache 服务器超载,服务器每秒执行的事务数量将因为较高的内存需求而继续下降。这一点体现在了图文块 2 和图文块 3 中。图文块 2 表示初始热机阶段,这时有大量可供 Linux 虚拟机承载 Apache 使用的内存。在这一期间,每秒处理的事务数量高达 103,平均延迟/事务为 58 毫秒。

 

 图文块 2 配置了静态 RAM 的 Linux Apache 服务器的初始热机阶段静态服务器和客户端

 由于工作负荷增加和可用内存变得稀缺,每秒事务处理数量降至 32,而平均延迟/事务则增至 485 毫秒。图文块 3 显示了这一情形。

 

 图文块 3 面向配置了静态 RAM 的超载 Linux Apache 服务器的静态服务器和客户端

 接下来,让我们考虑托管于配置了动态内存的 Linux 虚拟机中的 Apache 服务器的情形。图文块 4 表明这一服务器的可用内存量通过 Hyper-V 的热插拔机制在热机阶段迅速增至 2 GB 以上,而每秒事务数量为 120,平均延迟/交易为 182 毫秒。

 

图文块 4 配置有动态 RAM 的 Linux Apache 服务器启动阶段的静态服务器和客户端

随着工作负荷的增加,形成了超过 3 GB 的可用内存,因此服务器能够将每秒事务处理数量维持在 130,尽管平均延迟/事务增至 370 毫秒。请注意内存增加只有在 Hyper-V 服务器主机上有足够可用内存的情况下才能实现。如果 Hyper-V 主机内存较低,那么来宾虚拟机提出的任何增加内存的需求都可能不会得到满足,而应用可能收到无可用内存的错误。

 

图文块 5 配置有动态 RAM 的超载 Linux Apache 服务器

3.        实时虚拟机备份支持

在 Hyper-V 上运行 Linux 的客户提出最多的请求是获得创建实时 Linux 虚拟机的无缝备份的能力。在过去,客户需要挂起或关闭 Linux 虚拟机才能创建备份。这一过程不仅难于自动化,而且还将延长关键工作负荷的停机时间。

为了消除这一弊端,文件系统快照驱动程序现已面向在 Hyper-V 上运行的 Linnux 来宾可用。Hyper-V 上可用的标准备份 API 可用于触发驱动程序来创建与附加到 Linux 虚拟上的 VHD 快照一致的文件系统,而无需中断虚拟内存执行的任何操作。

试用这一功能的最佳方式是通过 Windows 备份来备份一个运行 Linux 的虚拟机。如图文块 6 所示,备份可从 Windows Server Backup UI 触发。正如您可看到的,标有 OSTC-Workshop-WWW2 的实时虚拟机将被备份。当备份操作完成后,将显示类似于图文块 7 的一个消息屏幕。

 

 图文块 6 使用 Windows Server Backup 来备份一个实时 Linux 虚拟机

 图文块 7 实时 Linux 虚拟机的备份操作完成

Linux 虚拟机和 Windows 虚拟机备份之间的一个重大差异是 Linux 备份仅与文件系统一致,而 Windows 备份将于文件系统和应用同时保持一致。这一差异是由 Linux 中缺乏标准卷影复制服务 (VSS) 基础结构所造成的。

4.        实时固定大小 VHD 的动态扩展

有了动态重设固定大小 VHD 的能力,管理员可以向 VHD 分配更多存储,并保持固定大小格式的性能优势。在 Hyper-V 上运行的 Linux 虚拟机上,该功能已可用。值得注意的是 Linux 文件系统非常能够适应基础磁盘驱动器大小的动态变化。为了说明这一功能,让我们看看附加到 Linux 虚拟机的固定大小 VHD 在安装后可如何重设大小。

首先,如图文块 8 所示,1 GB 固定大小的 VHD 通过 SCSI 控制器附加到了 Linux 虚拟机中。如图文块 9 所示,VHD 中的可用空间大小可通过 df 命令查看。

图文块 8 固定大小 VHD 通过 SCSI 控制器附加到了 Linux 虚拟机中

 

图文块 9 固定大小 VHD 中的空间使用情况

接下来,工作负荷开始消耗固定大小 VHD 上的更多空间。当工作负荷运行时,使用的空间量超过基线的 50%(图文块 10),管理员可能将如图文块 11 所示,使用 Hyper-V manager UI 将 VHD 的大小提高到 2 GB。

 

图文块 10 使用空间超过固定大小 VHD 当前大小的 50%。

   

图文块 11 将固定大小 VHD 从 1 GB 扩展到 2 GB

当 VHD 扩展后,df 命令将如图文块 12 所示,将磁盘空间容量动态更新到 2 GB。请务必注意,当磁盘和文件系统被安装并作为运行的工作负荷时,其将适应 VHD 的这一大小增加。

 

图文块 12 当固定大小 VHD 的大小增加时,动态调整 df 统计

5.        Linux kdump/kexec 支持

在 Windows Server 2012 和 Windows Server 2008 R2 环境中运行 Linux 的宿主的一个特殊难点在于旧式驱动程序(KB 2858695 中提及)必须被用于为 Linux 虚拟机创建内核转储。

在 Windows Server 2012 R2 中,Hyper-V 基础结构发生了变化,以使用出色的存储和网络驱动程序来无缝创建故障转储,因而不再需要任何特殊配置。Linux 用户能够在网络或附加的存储设备中进行转储。

6.        NMI 支持

如果在 Hyper-V 上运行的 Linux 系统变得彻底无响应,那么用户现在可使用不可屏蔽的中断 (NMI) 解决系统问题。对于因为内核或用户模型组件造成死锁的诊断系统而言,这一点尤为有用。

下图表明了如何测试这一功能。首个步骤是通过如图文块 13 所示在 Linux 终端会话中执行命令,观察 Linux 虚拟机中是否有任何 NMI 挂起。

 

图文块 13 签发给 Linux 虚拟机的现有 NMI

接下来,使用如下所示的命令,签发一个来自 powershell 窗口的 NMI:

Debug-VM -Name <Virtual Machine Name> -InjectNonMaskableInterrupt -ComputerName <Hyper-V host name> Confirm:$False –Force

在通过重复图文块 13 中所示的命令检查 NMI 是否已提供给 Linux 虚拟机。输出应类似于以下图文块 14:

 

图文块 14 签发给 Linux 虚拟机的新 NNMI

7.        内存映射 I/O (MMIO) 间隙的规格

基于 Linux 的设备制造商将使用 MMIO 间隙(又称 PCI 洞)来在能启动设备的足够操作系统 (JeOS) 和支持设备的实际软件基础结构之间分隔可用物理内存。如无法配置 MMIO 间隙,那么 JeOS 将使用所有可用内存,而设备的自定义软件基础结构则无法使用任何内存。这一缺陷阻碍了基于 Hyper-V 的虚拟设备的开发。

Windows Server 2012 R2 Hyper-V 基础结构可让设备制造商配置 MMIO 间隙的位置。这一功能的推出有助于在托管环境中配置基于 Hyper-V 的虚拟机。下图提供了这一功能的技术详情。

在 Hyper-V 上运行的虚拟机的内存进行了分段,以适应两个 MMIO 间隙。较低的间隙位于 4 GB 地址正下方,而较高的间隙则位于 128 GB 地址的正下方。设备制造商先可将较低间隙值设置于 128 MB 到 3.5 GB 之间。这可间接形成 MMIO 间隙的启动地址的规格。

可使用以下示例 PowerShell 脚本函数创建 MMIO 间隙的位置:

############################################################################
#
# GetVmSettingData()
#
# Getting all VM's system settings data from the host hyper-v server
#
############################################################################

function GetVmSettingData([String] $name, [String] $server)
{
    $settingData = $null

    if (-not $name)
    {
            return $null
    }

    $vssd = gwmi -n root\virtualization\v2 -class Msvm_VirtualSystemSettingData -ComputerName $server
     if (-not $vssd)
    {
        return $null
    }

    foreach ($vm in $vssd)
    {
        if ($vm.ElementName -ne $name)
        {
            continue
        }

        return $vm
    }

    return $null
}

###########################################################################
#
# SetMMIOGap()
#
# Description:Function to validate and set the MMIO Gap to the linux VM
#
###########################################################################
function SetMMIOGap([INT] $newGapSize)
{

    #
    # Getting the VM settings
    #
    $vssd = GetVmSettingData $vmName $hvServer
    if (-not $vssd)
    {
        return $false
    }

    #
    # Create a management object
    #
    $mgmt = gwmi -n root\virtualization\v2 -class Msvm_VirtualSystemManagementService -ComputerName $hvServer
    if(-not $mgmt)
    {
        return $false
    }

    #
    # Setting the new MMIO gap size
    #
    $vssd.LowMmioGapSize = $newGapSize

    $sts = $mgmt.ModifySystemSettings($vssd.gettext(1))

       if ($sts.ReturnValue -eq 0)
    {
        return $true
    }

    return $false
}

MMIO 间隙的位置可通过在 Linux 虚拟机内后启动 dmesg 日志中搜索关键字“pci_bus”进行验证。这一输出所包含的关键字应该能提供 MMIO 间隙的起始内存地址。MMIO 间隙的大小可通过从以十六进制表示的 4GB 中减去起始地址进行验证。

总结

在过去一年中,LIS 团队新增了许多功能来为在 Hyper-V 上运行的 Linux 虚拟机提供卓越支持。这些功能并不会简化 Hyper-V 上承载 Linux 的过程,但将为 Linux 工作负荷提供卓越的整合和改进的性能。到目前为止,团队与众多 Linux 供应商积极开展合作,以在较新的版本中推出这些功能。团队希望获得客户反馈,以及任何有助于改善 Hyper-V 上 Linux 宿主的任何功能建议。客户可发送电子邮件到 linuxic@microsoft.com 或通过 Linux 内核邮件列表 (https://lkml.org/) 联系团队。

要阅读本系列的所有博文,请查看 Windows Server 和 System Center 2012 R2 新增功能存档