Hyper-V

来自 ArchWiki

Hyper-V 是一种虚拟机监控程序,包含在某些版本的 Microsoft Windows 中。它能够运行 Arch Linux 虚拟机。Hyper-V 通常面向企业而非桌面使用,并且不像 VirtualBoxParallelsVMware 等消费级虚拟化程序那样提供方便和简单的界面。但是,较新版本的 Windows 10 和 Windows Server 2016 包含了更简单的配置选项和更好的 Arch Linux 兼容性。无需设置 Internet 连接共享 (ICS) 即可添加网络功能,例如内部交换机的 NAT、多个 NAT 和端口转发。第二代虚拟机现在也可以在 Arch Linux 上正常工作。

安装

自 Windows Server 2008 以及 Windows 8、8.1、10 和 11 的专业版以来,Hyper-V 已包含在 Windows 中。

本文或章节需要扩充。

原因: 如果有人有 Windows Server 2008+ 的经验,并且知道如何启用 Hyper-V,他们可以在此处添加吗?(在 Talk:Hyper-V 中讨论)

可以从控制面板的“启用或关闭 Windows 功能”下的“程序和功能”中启用它。激活“Hyper-V”复选框,应用更改,然后按照屏幕上的指示进行操作。

网络配置

首先,您必须配置一个新的虚拟交换机,以便您的虚拟机能够连接到互联网。启用 Hyper-V 后,启动 Hyper-V 管理器:搜索它,或使用以下命令从命令提示符启动它

%windir%\system32\mmc.exe "%windir%\system32\virtmgmt.msc"

设置虚拟交换机

为了将您的虚拟机连接到现有网络,请使用内部或外部网络交换机(虚拟网络适配器)。外部交换机必须绑定(桥接)到主机现有的网络适配器之一(例如,以太网或 Wi-Fi)。内部交换机可用于主机和虚拟机之间的网络通信,而虚拟机无法访问外部网络。为内部交换机添加 NAT 功能使主机充当虚拟机的路由器,从而使虚拟机能够访问外部网络。

并非所有网络功能(例如 NAT 配置)都可以通过 Hyper-V 管理器 GUI 进行设置。使用 PowerShell(以管理员身份运行)可以更好地控制配置。

外部交换机

要创建外部交换机,请在右侧边栏中选择“虚拟交换机管理器...”。在打开的对话框的左侧边栏中,选择“新建虚拟网络交换机”。在“您要创建哪种类型的虚拟交换机?”下,选择“外部”,然后选择“创建虚拟交换机”。为虚拟交换机键入新名称。在“外部网络”下,选择要与外部交换机绑定的网络适配器。

系统将提示您有关网络中断的信息;继续操作,您的网络将在配置交换机时短暂断开连接。

使用 PowerShell(以管理员身份运行),可以使用以下命令完成上述步骤

# Get a list of the network adapters in the host. In a laptop you should typically see 'Ethernet' and 'Wi-Fi'
PS C:\WINDOWS\system32> Get-NetAdapter

# Create the external switch with a name of VM-External-Switch, bound to the network adapter named Wi-Fi retrieved from the previous command
PS C:\WINDOWS\system32> New-VMSwitch -Name "VM-External-Switch" -AllowManagementOS $True -NetAdapterName "Wi-Fi"

在 Arch Linux 虚拟机上,选择外部交换机作为虚拟机网络适配器可有效地将 Windows 主机的网络适配器与虚拟机的 eth0 接口桥接起来。然后可以通过常用方式(systemd-networkd、netctl 等)在 Arch Linux 中设置接口,使用静态 IP 地址或 DHCP。虚拟机将像外部网络中的另一台主机一样运行。

例如,如果您希望 Arch Linux 虚拟机使用静态 IP,并且 Windows 主机配置为 192.168.0.100/24,则 Arch Linux 虚拟机接口应配置为 192.168.0.101/24,并使用与主机中设置的相同的网关和 DNS 服务器。

如果虚拟机使用 DHCP,则 IP 地址将由外部网络中的 DHCP 服务器分配。

内部交换机

从 1803 版本(“秋季创意者更新”)开始,Windows 10 内置了一个 NAT 交换机(名为“默认交换机”),如果您将其设置为使用 DHCP,则在安装虚拟机后,您可以立即访问互联网,请参阅 这篇 Technet 博客文章,因此您不需要下面的说明来获得可用的 NAT 交换机。

要创建内部交换机,请按照与外部交换机相同的步骤操作,但是将相关选项替换为“内部交换机”。从 Windows 10 周年更新(版本 1607,操作系统版本 14393)开始,Hyper-V 添加了对内部交换机的本机 NAT 支持。对于早期版本,可以使用 Internet 连接共享 (ICS) 为内部交换机上的虚拟机启用网络访问。

要查找您正在使用的 Windows 版本和版本号,请在命令提示符或 PowerShell 中运行

> winver

使用 PowerShell(以管理员身份运行),可以使用以下命令创建内部交换机

# Create the internal switch with a name of VM-Internal-Switch
PS C:\WINDOWS\system32> New-VMSwitch -Name "VM-Internal-Switch" -SwitchType Internal

# Verify that the internal switch was created
PS C:\WINDOWS\system32> Get-VMSwitch

# Get the ifIndex of the newly created internal switch, usually named 'vEthernet (name)'
PS C:\WINDOWS\system32> Get-NetAdapter

# Set the IP address of the internal switch, noting the ifIndex retrieved from the previous command.
# In this example, the network address of the internal switch is 192.168.3.0/24, and the ifIndex is 50.
PS C:\WINDOWS\system32> New-NetIPAddress -IPAddress 192.168.3.1 -PrefixLength 24 -InterfaceIndex 50

# The virtual machines using the internal switch must use static IP addresses, such as 192.168.3.2/24.
# Support for DHCP in internal switches is not included in current Windows versions (as of Version 1703, OS Build 15063).

通过以上步骤,主机和虚拟机已经可以相互通信,因为它们将位于同一虚拟网络 (192.168.3.0/24) 上。但是,在配置 NAT 或 ICS 之前,虚拟机将无法访问外部网络。

在 Windows 10 版本 14393 或更高版本上,可以为 NAT 和端口转发配置内部交换机

# Create the NAT with IP address of the internal switch
PS C:\WINDOWS\system32> New-NetNat -Name "VM-NAT-Network" -InternalIPInterfaceAddressPrefix 192.168.3.1/24

# Verify that the NAT was created
PS C:\WINDOWS\system32> Get-NetNat

# Enable SSH port forwarding on port 2222 of any interface on the host, to a virtual machine with an IP address of 192.168.3.2/24
PS C:\WINDOWS\system32> Add-NetNatStaticMapping -NatName "VM-NAT-Network" -Protocol TCP -ExternalIPAddress 0.0.0.0 -ExternalPort 2222 -InternalIPAddress 192.168.3.2 -InternalPort 22

# Verify that the port forward is active
PS C:\WINDOWS\system32> Get-NetNatStaticMapping

有关命令的完整列表,请查阅 Microsoft 的 NetNat 文档。

对于早期版本的 Windows,可以使用 Internet 连接共享。打开网络和共享设置,然后打开适配器设置,您需要在其中为您通常使用的 Internet 适配器启用 Internet 连接共享。连接可以共享后,将其与您在上一步中创建的虚拟交换机一起添加到桥接器。

创建虚拟机

在左侧边栏中,选择“Hyper-V 管理器”下的计算机。在右侧边栏中,选择“新建”>“虚拟机...”。在新虚拟机向导中,您通常可以指定任何您喜欢的设置,但有些设置必须专门配置。

在“指定代数”下,您可以选择“第一代”或“第二代”。第一代虚拟机模拟基于 BIOS 的机器和旧式端口。第二代提供基于 UEFI 的机器。通常,使用第二代,除非出于兼容性或可移植性原因您需要使用第一代。此外,当为 Arch Linux 虚拟机使用第二代时,请确保在虚拟机的设置中的“硬件”->“安全”下禁用安全启动。

对于“分配内存”下的“启动内存”,请选择足够的内存以确保 Arch 和任何程序能够正常运行。

对于“配置网络”下的“连接”,选择您之前创建的虚拟交换机。

对于“连接虚拟硬盘”,选择“创建虚拟硬盘”,并确保“大小”适合您的用例。虚拟硬盘是稀疏的,因此虚拟硬盘将仅使用存储虚拟操作系统写入其中的内容所需的实际存储空间。

对于“安装选项”,选择“从可引导 CD/DVD-ROM 安装操作系统”。如果您要从光盘或 USB 设备安装 Arch,请在“介质”下选择“物理 CD/DVD 驱动器”,然后选择相应的盘符。如果您要从 ISO 文件安装 Arch,请选择“镜像文件 (.iso)”,然后在“浏览...”对话框中选择文件。对于第二代计算机,不支持从物理 CD/DVD 驱动器启动。

虚拟机配置

接下来,您需要配置虚拟机的设置。

如果您愿意,可以为虚拟机添加更多虚拟处理器。这允许虚拟机使用多个处理器核心,这将在许多情况下提高性能。如果您计划密集使用虚拟机,您可能希望分配最多一半的处理器核心。要更改虚拟处理器的数量,请在左侧边栏中选择“处理器”,然后调整“虚拟处理器数量”。

更改任何设置,然后选择“确定”以应用更改并退出设置对话框。

Arch 安装

虚拟机完全配置后,您就可以安装 Arch 了。在右侧边栏中,选择启动 > 连接...,然后将打开一个连接窗口。当 Arch 安装介质运行时,网络应自动工作;通过在您知道正在响应的地址上使用 ping 来检查,例如

$ ping archlinux.org

如果未收到响应,则连接不工作。如果是这种情况,您可能遇到了 Microsoft 已确认的错误。您可以尝试从知识库页面安装修补程序,或者稍等片刻再试一次。

通常,您现在可以像在任何其他系统上一样安装 Arch。第一代虚拟机仅支持 BIOS(不支持 UEFI),因此您必须遵循各种 引导加载器 的 BIOS 特定说明。

您可能需要添加内核参数 ibt=off 才能启动。“ibt”是“间接分支跟踪”的缩写,Hyper-V 尚不支持该功能。请参阅讨论:BBS#281111

安装后配置

安装 Arch 后,您可以继续配置功能。

本文或章节已过时。

原因: hv_fcopy_daemon 已被新的 uio_hv_generic 驱动程序取代[1](在 Talk:Hyper-V 中讨论)

为了使用 Hyper-V 集成服务安装 hyperv启动/启用 服务 hv_fcopy_daemon.servicehv_kvp_daemon.servicehv_vss_daemon.service

关闭虚拟机,再次打开“设置”对话框,然后在左侧边栏中,选择“IDE 控制器”或“SCSI”下的“DVD 驱动器”。在“介质”下,选择“无”。这将阻止虚拟机在每次启动时尝试从安装介质启动。

共享目录

主机和访客之间可以轻松共享文件。首先,在主机上,选择要与访客共享的文件夹,或创建该文件夹。打开文件夹的“属性”对话框(alt + Enter 或右键单击并选择“属性...”)。转到“共享”选项卡,然后选择“高级共享...”。激活“共享此文件夹”复选框。默认情况下,该文件夹将具有只读权限,这意味着虚拟机可以从该文件夹读取,但无法向其中写入任何内容。如果您想修改这些权限,请选择“权限”。在这里,您可以选择哪些用户可以访问共享文件夹以及他们拥有的权限。通常,您可能会在两个方向上共享,并且应为“更改”和“读取”都选中“允许”。在退出共享文件夹的“属性”对话框之前,请记下其“网络路径”,该路径应为 \\计算机名\文件夹名 的形式。

接下来,您需要找到主机的 IP 地址。退出“属性”对话框,然后打开命令提示符或 PowerShell。运行 ipconfig。您应该看到一个条目,其名称以您创建的虚拟交换机的名称结尾(例如 Ethernet adapter vEthernet (New Virtual Switch))。在此条目下,查找 IPv4 地址 并记下它。

接下来,您需要从 Arch 挂载共享文件夹。启动虚拟机。虚拟机运行后,您首先需要安装 cifs-utils,这将允许您挂载 CIFS 共享(CIFS 是 Windows 用于共享文件夹的协议)。接下来,您需要决定将共享文件夹挂载到哪里。一个合理的选择是 /mnt 中的某个位置,例如 /mnt/Hyper-V

在挂载共享的命令中,将之前“网络路径”中的任何反斜杠替换为正斜杠。

# mount -t cifs [Network Path with forward slashes] mountpoint -o user=[user you wish to authenticate as],ip=[host IP noted earlier]

系统将提示您输入您要身份验证的用户的密码。您可以在命令选项中通过 password=密码 指定密码,但这在安全性方面不是一个好主意,因为主机的密码现在将位于您的命令历史记录文件中;或者如果您从脚本运行命令,则会无限期地存储在脚本中。相反,您可以使用凭据文件,该文件允许您在具有受限访问权限的文件中指定用户名和密码。它可以被称为任何名称;例如,如果它被称为 .credentials 并存储在您的主目录中,它将采用以下形式

~/.credentials
username=username
password=password

创建文件后,更改权限以限制读取访问权限

chmod 600 ~/.credentials

然后,您可以向 mount 命令添加另一个选项:credentials=~/.credentials。现在,在挂载共享时,将自动应用您的用户名和密码。

为了更具体的示例,假设您要将网络路径为 \\PC\share 的共享挂载到 /mnt/Hyper-V,其中您在主机上的用户名是“John”,并且主机的 IP 是 198.123.151.23。因此,挂载命令将是

# mount -t cifs //PC/share /mnt/Hyper-V -o credentials=~/.credentials,ip=198.123.151.23

此方法的一个问题是,如果主机的 IP 发生变化(例如,它具有通过 DHCP 分配的动态 IP,或移动到新网络),则必须替换访客上主机的 IP 的每个实例。但是,smbclient 软件包提供了 nmblookup,这是一个查找与 SMB 主机关联的 IP 地址的实用程序。因此,在上述示例的情况下,您将运行

nmblookup PC
198.123.151.23 PC<00>

您只需要 IP 地址,因此可以使用 headcut 来解析它

nmblookup PC | head -n 1 | cut -d ' ' -f 1
192.123.151.23

然后,您可以简单地替换 mount 命令中的 IP 地址

# mount -t cifs //PC/share /mnt/Hyper-V -o credentials=~/.credentials,ip="$(nmblookup PC | head -n 1 | cut -d ' ' -f 1)"

有关挂载共享文件夹的更多方法,包括在启动时自动挂载,请参见 Samba 文章。

Xorg

可以通过 Xorg 轻松运行图形程序,方法是使用 xf86-video-fbdev 软件包。只需安装它以及您希望使用的窗口管理器或桌面环境,您就应该能够毫无问题地启动 X。

设置分辨率

屏幕分辨率在启动后是固定的。可以通过更改启动参数来调整它,最大尺寸为 1920x1080(实际限制为 8MB 帧缓冲区内存)。当使用 GRUB 启动时,可以通过编辑 /etc/default/grub 并在 GRUB_CMDLINE_LINUX_DEFAULT 行的末尾添加 video=hyperv_fb:[所需分辨率] 来完成此操作。之后,运行 update-grub 以写入更改。示例行可能如下所示

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1920x1080"

如果您使用 systemd-boot 直接引导内核,只需将 video=hyperv_fb:1920x1080 添加到条目配置中的选项即可。例如

/boot/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options video=hyperv_fb:1920x1080 root=PARTUUID=xxxx-xxxx rw

增强会话模式

默认情况下,您可能会遇到鼠标和桌面体验不佳的问题。增强会话模式 具有更好的鼠标和视频体验以及集成的剪贴板。此模式利用 Xrdphv_sock 内核模块。运行以下代码以在访客中启用此模式

git clone https://github.com/Microsoft/linux-vm-tools
cd linux-vm-tools/arch
./makepkg.sh
./install-config.sh

编辑 ~/.xinitrc 以在登录 Xrdp 会话时启动您自己的 桌面环境。请参阅 xinit 以配置 ~/.xinitrc

然后关闭您的 Arch 虚拟机,然后使用 PowerShell(以管理员身份运行),您需要在您的计算机上启用 hv_sock

Set-VM -VMName __Your_Arch_Machine__ -EnhancedSessionTransportType HvSocket

启用增强会话模式后,Hyper-V 客户端会在启动后自动连接到 Xrdp 会话。

您可以通过在 Powershell 上运行以下命令(以管理员身份运行)永久禁用增强会话模式

Set-VM -VMName __Your_Arch_Machine__ -EnhancedSessionTransportType VMBus

要连接到 TTY 虚拟控制台,您可以临时禁用 增强会话模式。可以从虚拟机的“查看”菜单中为单个虚拟机启用或禁用 增强会话模式 功能。

如果 powershell 提示找不到与“-EnhancedSessionTransportType”相关的信息,请确保您的 Windows 操作系统是企业版。专业版似乎不支持它。

如果以上方法不起作用,您可以参考 https://github.com/k247tEK/archVM-Hyper-V

技巧与窍门

您还可以进行 X 转发以获得比 Hyper-V 的默认客户端更好的体验。一种方法是使用 VNC 服务器(如 TigerVNC)并从 Windows 连接到它。或者,一种更好的方法是安装 Windows X Server(如 VcXsrv(免费)或 x410(商业))并进行 X 转发以获得更快的 GUI 体验。X410 支持 vsock,它比 TCP/IP 连接更可靠。

Xrdp (xrdpAURxorgxrdpAUR) 提供了一种方便简单的方式,通过远程桌面客户端连接到 Arch Linux 虚拟机 GUI