跳转至内容

VMware

来自 ArchWiki

本文档涉及最新的 VMware 主要版本,即 VMware Workstation Pro 和 Player 17、16、15、14 以及 12.5。

您可能还会对 /将 Arch Linux 安装为客户机 感兴趣。

安装

注意 VMware 自 14 版本起放弃了对包括早期 Intel Core i7 在内的多个 CPU 的支持。请查阅 宿主机处理器要求,并确保在 BIOS/UEFI 固件中启用了 CPU 的虚拟化技术(AMD-V 或 VT-x)。如果您的 CPU 不被较新版本支持,您可以使用 vmware-workstation12AUR

安装 vmware-workstationAUR 软件包。

还需要为已安装的内核安装相应的头文件软件包:例如 linux-headerslinux-lts-headers

首先 启动 vmware-networks-configuration.service 以生成 /etc/vmware/networking

然后,根据需要启用以下部分服务:

  • vmware-networks.service 用于客户机网络访问(否则会报错 could no connect 'ethernet 0' to virtual network,且无法使用 vmware-netcfg
  • vmware-usbarbitrator.service 用于将 USB 设备连接到客户机
  • vmware-hostd.service 用于共享虚拟机(自 16 版本起不可用)

最后,加载 VMware 模块

# modprobe -a vmw_vmci vmmon

如果加载时间过长且无响应,请尝试 #无法加载 vmmon 模块

用法

要打开 VMware Workstation Pro

$ vmware

或者 Player

$ vmplayer

技巧与提示

输入 Workstation Pro 许可证密钥

通过终端

# /usr/lib/vmware/bin/vmware-vmx-debug --new-sn XXXXX-XXXXX-XXXXX-XXXXX-XXXXX

其中 XXXXX-XXXXX-XXXXX-XXXXX-XXXXX 是您的许可证密钥。

注意 -debug 二进制文件会提示用户许可证不正确。

通过 GUI

如果上述方法不起作用,您可以尝试

# /usr/lib/vmware/bin/vmware-enter-serial

提取 VMware BIOS

$ objcopy /usr/lib/vmware/bin/vmware-vmx -O binary -j bios440 --set-section-flags bios440=a bios440.rom.Z
$ perl -e 'use Compress::Zlib; my $v; read STDIN, $v, '$(stat -c%s "./bios440.rom.Z")'; $v = uncompress($v); print $v;' < bios440.rom.Z > bios440.rom

提取安装程序

查看安装程序 .bundle 的内容

$ sh VMware-edition-version.release.architecture.bundle --extract /tmp/vmware-bundle/

使用修改后的 BIOS

如果您决定修改提取出的 BIOS,可以通过将其移动到 ~/vmware/虚拟机名称 来使虚拟机使用它

$ mv bios440.rom ~/vmware/Virtual_machine_name/

然后将名称添加到 虚拟机名称.vmx 文件中

~/vmware/Virtual_machine_name/Virtual_machine_name.vmx
bios440.filename = "bios440.rom"

在 Intel、Optimus 和 AMD 上启用 3D 图形加速

由于 3D 加速效果不佳或不稳定,默认情况下会禁用某些显卡驱动。启用 加速 3D 图形 后,日志中可能会出现类似以下内容:

Disabling 3D on this host due to presence of Mesa DRI driver.  Set mks.gl.allowBlacklistedDrivers = TRUE to override.

您可以设置此项的配置文件是 ~/.vmware/preferences

VMware Workstation 16.2 从 OpenGL 切换到了 Vulkan,因此设置有所不同。如果您的驱动程序不受支持,日志中可能会看到类似以下消息:

mks Vulkan Renderer: Only the AMDVLK driver is supported at this time.
mks Vulkan Renderer: No supported Vulkan device/driver found (See mks.vk.allowUnsupportedDevices or mks.vk.forceDevice configuration options).

如果您的 Vulkan 驱动程序被列入黑名单,您可能需要将 mks.vk.allowUnsupportedDevices = "TRUE" 添加到 ~/.vmware/preferences,或者切换到受支持的驱动程序——如果不确定,请检查虚拟机目录中的 vmware.log

注意 您可能还需要在特定虚拟机的 .vmx 文件中添加 mks.gl.allowBlacklistedDrivers = "TRUE",以便启用 intel 驱动程序的 3D 加速。

当在多显卡(GPU)环境下使用 Vulkan 时,可以通过检查 mksSandbox.log 来获取正确的适配器字符串,然后将其放入虚拟机的 .vmx 文件中以选择特定的设备。mksSandbox.log 中的示例:

mks Vulkan Renderer: Name: 'AMD Radeon RX 570 Series (RADV POLARIS10)'

然后,我们需要向虚拟机的 .vmx 文件中添加:

mks.vk.ForceDevice = "AMD Radeon RX 570 Series (RADV POLARIS10)"

在宿主机挂起/休眠前挂起虚拟机

创建一个 可执行 文件:

/usr/lib/systemd/system-sleep/vmware_suspend_all.sh
#!/bin/bash

set -eu

if [[ $# -ne 2 ]]; then
    echo "Usage: $0 <period> <action>"
    exit 1
fi

period=$1
action=$2

echo "vmware system-sleep hook argv: ${period} ${action}"

if ! command -v vmrun &>/dev/null; then
    echo "command not found: vmrun"
fi

if [[ "${period}" = "pre" ]]; then
    readarray -t vms < <(vmrun list | tail -n +2)

    echo "Number of running VMs: ${#vms[@]}"

    if [[ ${#vms[@]} -eq 0 ]]; then
        exit
    fi

    for vm in "${vms[@]}"; do
        echo -n "Suspending ${vm}... "
        vmrun suspend "${vm}"
        echo "done"
    done

    sleep 1
else
    echo "Nothing to do"
fi

另请参阅 电源管理/挂起与休眠#Hooks in /usr/lib/systemd/system-sleep使用 vmrun 挂起所有虚拟机 以及 休眠支持

系统提速技巧

另请参阅 提升性能

禁用透明大页

本文或本章节提议与 提升性能 合并。

备注:并非 VMware 特有。(在 Talk:VMware 中讨论)

如果您注意到运行虚拟机时客户机和/或宿主机频繁冻结,则可能需要禁用透明大页。要为当前会话禁用它们,请(在宿主机上)运行:

# echo never > /sys/kernel/mm/transparent_hugepage/enabled

要使更改在重启后持久生效,请添加 内核参数 transparent_hugepage=never

您也可以使用 madvise 代替 never,这样仍允许针对透明大页优化的应用程序获得性能优势[1]。这对于 VMware 的效果与上述相同。

确保直接访问内存 (RAM)

默认情况下,VMware 会将正在运行的客户机系统的 RAM 写入磁盘文件。如果您确定有足够的空余内存,可以通过将以下内容添加到虚拟机的 .vmx 文件中,确保客户机系统将其内存直接写入宿主机的 RAM:

Virtual_machine_name.vmx
MemTrimRate = "0"
sched.mem.pshare.enable = "FALSE"
prefvmx.useRecommendedLockedMemSize = "TRUE"
mainmem.backing = "swap"

虚拟机内 Chromium 浏览器图形卡顿/缓慢

浏览至 chrome://flags 并启用 "Override software rendering list",然后重启浏览器。

性能优化建议

为提升虚拟机性能,请尝试以下建议:

半虚拟化 SCSI 适配器

VMware 半虚拟化 SCSI (PVSCSI) 适配器 是适用于 VMware ESXi 的高性能存储适配器,可以带来更高的吞吐量并降低 CPU 使用率。PVSCSI 适配器最适用于硬件或应用程序驱动极高 I/O 吞吐量的环境。

SCSI 适配器类型 VMware Paravirtual 可在虚拟机设置中选择。

如果这些设置不在虚拟机的配置中,仍然可以启用半虚拟化 SCSI 适配器。请通过修改 mkinitcpio.conf 确保内核映像中包含半虚拟化 SCSI 适配器模块:

/etc/mkinitcpio.conf
...
MODULES=(... vmw_pvscsi)
...

重新生成 initramfs.

关闭虚拟机并更改 SCSI 适配器:将 .vmx 设置为以下内容:

scsi0.virtualDev = "pvscsi"

半虚拟化网络适配器

VMware 为客户机系统提供 多个网络适配器。默认使用的适配器通常是 e1000,它模拟 Intel 82545EM 千兆以太网网卡。此 Intel 适配器通常与大多数操作系统(包括 Arch)中的内置驱动程序兼容。

为了获得 更高的性能和附加功能(如多队列支持),可以使用 VMware 原生的 vmxnet3 网络适配器。

Arch 的默认安装中提供了 vmxnet3 内核模块。一旦在 mkinitcpio 中启用(或者如果是自动检测到;请运行 lsmod | grep vmxnet3 查看是否已加载),请关闭虚拟机并将 .vmx 文件中的网络适配器类型更改为以下内容:

ethernet0.virtualDev = "vmxnet3"

更改网络适配器后,需要更新网络和 dhcpcd 设置,以使用新的适配器名称和 MAC 地址。

# dhcpcd new_interface_name
# systemctl enable dhcpcd@new_interface_name.service

新的接口名称可以通过运行 ip link 获取。

虚拟机设置

这些设置可以通过减少磁盘 I/O 来帮助提高虚拟机的响应速度,但代价是使用更多的宿主机内存。Vmware 的 KB1008885 提供了以下优化:

mainMem.useNamedFile = "FALSE"
MemTrimRate = "0"
prefvmx.useRecommendedLockedMemSize = "TRUE"
MemAllowAutoScaleDown = "FALSE"
sched.mem.pshare.enable = "FALSE"
  • mainMem.useNamedFile:此设置仅适用于 Windows 宿主机。如果虚拟机关闭时磁盘活动频繁,可以使用此参数。这会阻止 VMware 创建 .vmem 文件。在 Linux 宿主机上,请改用 mainmem.backing = "swap"
  • MemTrimRate:此设置防止客户机释放的内存同时也从宿主机释放。
  • prefvmx.useRecommendedLockedMemSize:遗憾的是,此设置似乎没有合适的解释;它似乎可以防止宿主机交换客户机内存的部分内容。
  • MemAllowAutoScaleDown:如果无法分配足够的内存,此设置可防止 VMware 调整虚拟机的内存大小。
  • sched.mem.pshare.enable:如果同时运行多个虚拟机,VMware 会尝试定位相同的页面并在虚拟机之间共享它们。这可能会导致极高的 I/O 密集度。

以下设置也可以在 VMware Workstation 的配置对话框中设置(Edit -> Preferences... -> Memory/Priority)。

prefvmx.minVmMemPct = "100"
mainMem.partialLazySave = "FALSE"
mainMem.partialLazyRestore = "FALSE"
  • prefvmx.minVmMemPct:设置应在宿主机上为虚拟机保留的 RAM 百分比。如果此值设置得较低,则可以为虚拟机分配比宿主机实际可用更多的内存。但请小心,因为这极有可能导致过度的硬盘使用。如果宿主机有足够的 RAM,此值应保留为 100。
  • mainMem.partialLazySavemainMem.partialLazyRestore:这两个参数将阻止虚拟机在挂起时创建部分快照。使用这些参数时,挂起虚拟机的时间会稍长一些,但 VMware 试图存储此信息时的硬盘活动应该会减少。

故障排除

未找到版本 x.y-zzzz 的内核头文件。如果您已经安装了它们[...]

安装头文件 (linux-headers)。

注意 升级内核和头文件后,您需要启动进入新内核以匹配头文件的版本。这是一个比较常见的错误。

无法加载 vmmon 模块

正如 VMware 社区 所解释,请禁用 安全启动 (Secure Boot) 以使用 vmmon 加载 VMware 模块。

尝试远程访问 VMware 时登录名/密码不正确

VMware Workstation 提供了通过 vmware-workstation-server 服务远程管理共享虚拟机 (Shared VMs) 的功能。但是,由于 vmware-authd 服务的 PAM 配置不正确,这会因 "incorrect username/password" 错误而失败。要修复它,请按如下方式编辑 /etc/pam.d/vmware-authd

/etc/pam.d/vmware-authd
#%PAM-1.0
auth     required       pam_unix.so
account  required       pam_unix.so
password required       pam_permit.so
session  required       pam_unix.so

然后重启 vmware systemd 服务。

现在您可以使用安装期间提供的凭据连接到服务器。

注意 启动虚拟机可能需要 libxslt

ALSA 输出问题

修复音质问题或启用正确的 HD 音频输出,首先运行:

$ aplay -L

如果对从客户机播放 5.1 环绕声 感兴趣,请寻找 surround51:CARD=vendor_name,DEV=num;如果遇到音质问题,请寻找 front:CARD=vendor_name,DEV=num。最后将该名称放入 .vmx 文件中。

~/vmware/Virtual_machine_name/Virtual_machine_name.vmx
sound.fileName="surround51:CARD=Live,DEV=0"
sound.autodetect="FALSE"

还应禁用 OSS 模拟

基于内核的虚拟机 (KVM) 正在运行

要在启动时禁用 KVM,可以使用类似以下的操作:

/etc/modprobe.d/vmware.conf
blacklist kvm
blacklist kvm-amd   # For AMD CPUs
blacklist kvm-intel # For Intel CPUs
提示 如果尽管已加入黑名单,kvm 模块仍然加载,并且您运行的是集成 Intel 显卡 (i915,i965) 的系统,则可能需要直接从内核命令行选项中列出 kvmgt 内核模块的黑名单。更多详细信息请参阅 内核模块#使用内核命令行_2

VMware 应用程序界面的图标和边距在 HiDPI 显示器上缩放不正确

请参阅 HiDPI#VMware

Wayland 相关问题

GNOME 上键盘捕获功能失效

VMWare Player/Workstation 17.5(及更旧版本)存在此处讨论的问题

要允许用户界面捕获键盘:

$ gsettings set org.gnome.mutter.wayland xwayland-allow-grabs "true"
$ gsettings set org.gnome.mutter.wayland xwayland-grab-access-rules "['vmplayer','vmware-vmx','mksSandbox']"

作为替代方案,您可以在 Windows 中使用以下键盘快捷键:

  • Super+Alt+Tab 代替 Alt+Tab 进行任务切换
  • Ctrl+Esc 用于开始菜单

模块问题

找不到 /dev/vmmon

完整的错误是:

Could not open /dev/vmmon: No such file or directory.
Please make sure that the kernel module 'vmmon' is loaded.

这意味着至少 vmmon 模块未加载。启用服务(见 #安装)以实现自动加载。

另一个可能的原因是第 11 代及以后的 Intel 处理器上启用了间接分支跟踪 (Indirect Branch Tracking),且内核版本在 5.18 以上。

ibt=off 添加到您的 内核命令行。更多详细信息请参阅 [2]

找不到 /dev/vmci

完整的错误是:

Failed to open device "/dev/vmci": No such file or directory
Please make sure that the kernel module 'vmci' is loaded.

首先,尝试手动加载模块:

# modprobe -a vmw_vmci

尝试通过以下方式重新编译 VMware 内核模块:

# vmware-modconfig --console --install-all

VMware 无法启动

模块 CPUIDEarly 加电失败

版本 14 对 CPU 的要求比版本 12 更严格。如果您尝试在受影响的 CPU 上启动虚拟机,将会出现以下消息:

 This host does not support virtualizing real mode.
 The Intel "VMX Unrestricted Guest" feature is necessary to run this virtual machine on an Intel processor.

解决方法是卸载版本 14 并安装版本 12 (vmware-workstation12AUR)。

当 VMware 本来可用,但突然出现此错误时,可能是由于热启动/软启动或系统挂起后引起的。请尝试冷启动(关闭系统并重新启动)。

由于旧 Intel 微代码导致的启动段错误

旧的 Intel 微代码可能会导致启动时出现以下段错误:

/usr/bin/vmware: line 31: 4941 Segmentation fault "$BINDIR"/vmware-modconfig --appname="VMware Workstation" --icon="vmware-workstation"

有关如何更新微代码的信息,请参阅 微代码

vmplayer/vmware 版本 14 无法启动

librsvg 版本 2:2.44.0 及以上的系统上,日志文件(位于 /tmp/vmware-<id>)会显示多个以下错误实例:

appLoader| I125+ undefined symbol

解决方法是将 librsvg 降级到旧版本,或者更推荐的做法是,强制 VMware 使用其自带的 librsvg 版本:

# export LD_LIBRARY_PATH=/lib/vmware/lib/librsvg-2.so.2:$LD_LIBRARY_PATH

VMware 还有一个 VMWARE_USE_SHIPPED_LIBS 变量:

$ env VMWARE_USE_SHIPPED_LIBS=1 vmware

vmplayer/vmware 12.5.4 及更高版本无法启动

根据 [3],临时解决方法是将 libpng 软件包降级到 1.6.28-1 版本,并在 /etc/pacman.confIgnorePkg 参数中将其锁定。

更简单的解决方法是让 VMWare 使用系统的 zlib 版本,而不是它自己的版本:

# cd /usr/lib/vmware/lib/libz.so.1
# mv libz.so.1 libz.so.1.old
# ln -s /usr/lib/libz.so.1 .

vmplayer/vmware 12.5.3 至 12.5.5 版本无法启动

这似乎是 /usr/lib/vmware/lib/libstdc++.so.6/libstdc++.so.6 文件的问题,缺少 CXXABI_1.3.8

如果系统已经安装了 gcc-libs,那么该库已经安装。因此,可以删除该文件,vmplayer 将会使用 gcc-libs 提供的库。以 root 身份执行:

# mv /usr/lib/vmware/lib/libstdc++.so.6/libstdc++.so.6 /usr/lib/vmware/lib/libstdc++.so.6/libstdc++.so.6.bak

此外还有一种解决方法:

# export VMWARE_USE_SHIPPED_LIBS='yes'

vmware 12 进程启动后立即终止,未启动 GUI

Mageia 注册了 Bug,但 Arch 终端中似乎没有显示错误信息。检查 /tmp/vmware-<id> 中的日志时,存在 VMWARE_SHIPPED_LIBS_LIST is not setVMWARE_SYSTEM_LIBS_LIST is not setVMWARE_USE_SHIPPED_LIBS is not setVMWARE_USE_SYSTEM_LIBS is not set 等问题。执行 vmware 或 vmplayer 后,进程直接以 Unable to execute /usr/lib/vmware/bin/vmware-modconfig. 终止。解决方法相同,以 root 身份执行:

# mv /etc/vmware/icu/icudt44l.dat /etc/vmware/icu/icudt44l.dat.bak

此外还有一种解决方法:

# export VMWARE_USE_SHIPPED_LIBS='yes'

尽管设置了 VMWARE_USE_SHIPPED_LIBS 变量,VMWare 可能仍然无法找到某些库。例如 libfontconfig.so.1 库。检查 tmp 目录中的 vmware 日志以查看哪些库仍未找到。将它们复制到系统中现有库的相应路径中。

# cp /usr/lib/libfontconfig.so.1 /usr/lib/vmware/lib/libfontconfig.so.1/

除了手动复制所有这些文件,您可以尝试导出额外的设置:

# export VMWARE_USE_SYSTEM_LIBS='yes'

在 fontconfig 版本 2.13.0 及以上的系统上,可能需要强制 VMware 使用自带的 libfontconfig 文件,而不是更新的系统文件。在这种情况下,还需要为自带的 fontconfig 提供共享对象库文件 libexpat.so.0。这适用于至少 VMware 12.5.9 版本。以 root 身份执行:

# ln -s /usr/lib/libexpat.so /usr/lib/vmware/lib/libfontconfig.so.1/libexpat.so.0
# export LD_LIBRARY_PATH=/usr/lib/vmware/lib/libfontconfig.so.1:$LD_LIBRARY_PATH

客户机问题

无法为客户机下载 VMware Tools

要手动下载工具,请访问 VMware 存储库[失效链接 2025-04-06—域名无法解析]

导航至:"应用程序名称 / 版本 / 构建 ID / linux / packages/" 并下载相应的工具。

使用以下命令提取:

$ tar -xvf vmware-tools-name-version-buildID.x86_64.component.tar

并使用 VMware 安装程序进行安装。

# vmware-installer --install-component=/path/vmware-tools-name-version-buildID.x86_64.component

如果上述方法不起作用,请尝试安装 ncurses5-compat-libsAUR

系统重启后客户机网络不可用

这很可能是因为 vmnet 模块没有被加载 [4]启用服务(见 #安装)以实现自动加载。

鼠标问题

鼠标第 5 个以上的按键无效

如果鼠标的侧键或其他附加按键无效,请 设置客户机使用高级鼠标

客户机中鼠标滚轮行为异常

这与宿主机系统当前的 Xorg 键盘布局有关。在客户机工作时,请保持宿主机上的主布局(例如英文)为选中状态。

嵌套虚拟机没有 IP 地址和网络连接

此问题与混杂模式 (promiscuous mode) 有关,根据 Linux 的标准做法,该模式只能由 root 用户启用。为了解决这些限制,必须更改相关网络设备的权限。

向一个组授予权限:

# chgrp group /dev/vmnetX
# chmod g+rw /dev/vmnetX

向所有用户授予权限:

# chmod a+rw /dev/vmnetX

© . 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.