跳转至内容

Hyper-V

来自 ArchWiki

Hyper-V 是一款包含在部分 Microsoft Windows 版本中的虚拟化管理程序(Hypervisor)。它能够运行 Arch Linux 虚拟机。Hyper-V 主要面向企业环境而非桌面使用,其界面不如 VirtualBoxParallelsVMware 等消费级虚拟化软件那样便捷简单。不过,较新版本的 Windows 10 和 Windows Server 2016 提供了更简易的配置选项,并对 Arch Linux 有了更好的兼容性。网络功能(如用于内部交换机的 NAT、多重 NAT 以及端口转发)现已无需配置 Internet 连接共享(ICS)即可使用。第 2 代虚拟机目前也已能妥善支持 Arch Linux。

安装

自 Windows Server 2008 以及 Windows 8、8.1、10 和 11 的专业版(Pro)起,Hyper-V 已被内置。

有关安装说明,请参阅 在 Windows 和 Windows Server 中安装 Hyper-V | Microsoft Learn

网络配置

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

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

设置虚拟交换机

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

并非所有网络功能(如 NAT 配置)都能通过 Hyper-V 管理器图形界面完成。使用以管理员身份运行的 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 接口进行了桥接。随后,可以在 Arch Linux 中通过常用方式(systemd-networkd、netctl 等)设置静态 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 交换机(名为“Default Switch”),如果您将其设置为使用 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 连接共享。打开“网络和共享中心”及“更改适配器设置”,您需要为您通常使用的互联网适配器启用互联网连接共享。一旦连接可以共享,请将其与您在上述步骤中创建的虚拟交换机一起添加到一个网桥中。

创建虚拟机

在左侧边栏,选择“Hyper-V 管理器”下的计算机名。在右侧边栏,选择“新建” > “虚拟机...”。在“新建虚拟机向导”中,您可以根据需要指定设置,但某些设置必须进行特定配置。

在“指定代数”下,您可以选择“第 1 代”或“第 2 代”。第 1 代虚拟机模拟基于 BIOS 的机器和旧版端口。第 2 代提供基于 UEFI 的机器。通常情况下,除非出于兼容性或可移植性原因需要使用第 1 代,否则请使用第 2 代。此外,在为 Arch Linux 虚拟机使用第 2 代时,请务必在虚拟机的设置中进入“硬件”->“安全”,并禁用“安全启动”。

在“分配内存”下的“启动内存”中,选择足够的内存以确保 Arch 和相关程序能正常运行。

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

在“连接虚拟硬盘”下,选择“创建虚拟硬盘”,并确保“大小”适合您的用例。虚拟硬盘是稀疏的,因此它仅占用存储虚拟操作系统写入数据所需的物理空间。

在“安装选项”下,选择“从可引导的 CD/DVD-ROM 安装操作系统”。如果您通过光盘或 USB 设备安装 Arch,请在“媒体”下选择“物理 CD/DVD 驱动器”并指定相应的盘符。如果您从 ISO 文件安装 Arch,请选择“映像文件 (.iso)”并在“浏览...”对话框中选择该文件。对于第 2 代虚拟机,不支持从物理 CD/DVD 驱动器启动。

配置虚拟机

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

如有需要,您可以为虚拟机添加更多虚拟处理器。这将允许虚拟机使用多个处理器核心,在许多情况下会提高性能。如果您打算高强度使用虚拟机,建议分配不超过处理器核心数的一半。要更改虚拟处理器数量,请在左侧边栏选择“处理器”,然后调整“虚拟处理器数量”。

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

安装 Arch

一旦虚拟机配置完毕,您就可以安装 Arch 了。在右侧边栏选择“启动” > “连接...”,将会打开一个连接窗口。当 Arch 安装介质运行时,网络应该会自动工作;请使用 ping 检查一个已知会响应的地址,例如:

$ ping ping.archlinux.org

如果没有收到响应,则说明连接未正常工作。如果出现这种情况,您可能遇到了 Microsoft 已确认的错误。您可以尝试安装知识库页面中的补丁,或者稍等片刻后再试。

通常,您现在可以像在任何其他系统上一样安装 Arch。第 1 代虚拟机仅支持 BIOS(无 UEFI),因此您必须按照 引导加载程序 的 BIOS 相关说明进行操作。

安装后的后续步骤

安装 Arch Linux 后,您可以继续配置功能。要使用 Hyper-V 集成服务,请 安装 hyperv,然后 启动/启用 hv_kvp_daemon.servicehv_vss_daemon.service 服务。

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

文件复制守护进程

hyperv 目前未为 hv_fcopy_daemon 安装 systemd 服务。[1] 要配置文件复制功能,请创建一个 systemd 单元文件

/etc/systemd/system/hv_fcopy_uio_daemon.service
[Unit]
Description=Hyper-V file copy service (uio_hv_generic)
ConditionPathExists=/dev/vmbus/uio_hv_generic

[Service]
ExecStart=/usr/bin/hv_fcopy_uio_daemon -n

[Install]
WantedBy=multi-user.target

然后 启动/启用 hv_fcopy_uio_daemon.service 服务。

共享目录

在主机和客户机之间共享文件非常简单。首先,在主机上选择您想要与客户机共享的文件夹,或创建一个新文件夹。打开该文件夹的属性对话框(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

通过 xf86-video-fbdev 软件包,图形程序可以轻松通过 Xorg 运行。只需安装它以及您希望使用的窗口管理器或桌面环境,通常即可正常启动 X。

设置分辨率

屏幕分辨率在启动后是固定的。可以通过向 内核参数 添加 video=hyperv_fb:[目标分辨率] 进行调整,最大支持 1920x1080(实际限制为 8MB 帧缓冲内存)。

如果更改引导选项无效且已安装 PowerShell,请在 PowerShell 中使用 Set-VMVideo 命令。该命令的文档可以在 Microsoft 页面 [2] 上找到。命令中选择的分辨率也必须反映在引导配置中,正如之前提到的那样。一个示例是按照上述相关的配置更改,将任何 video=hyperv_fb:1920x1080 替换为 video=2560x1440,并在 PowerShell 中执行以下命令:

Set-VMVideo -VMName 'Name-of-VM' -HorizontalResolution 2560 -VerticalResolution 1440 -ResolutionType Single

增强会话模式

默认情况下,您可能会遇到鼠标和桌面体验不佳的情况。增强会话模式 提供了更好的鼠标和视频体验以及集成的剪贴板。该模式利用 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 默认客户端更好的体验。一种方法是使用像 TigerVNC 这样的 VNC 服务器,并从 Windows 连接到它。或者,更好的方法是安装 Windows X 服务器,例如 VcXsrv(免费)或 x410(商业),并使用 X 转发以获得更快的 GUI 体验。X410 支持 vsock,它比 TCP/IP 连接更可靠。

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

© . This site is unofficial and not affiliated with Arch Linux.

Content is available under GNU Free Documentation License 1.3 or later unless otherwise noted.