VMware

来自 ArchWiki

本文介绍最新的主要 VMware 版本,即 VMware Workstation Pro 和 Player 17、16、15、14 和 12.5。

您可能也对 /以访客机身份安装 Arch Linux 感兴趣。

安装

注意: 自版本 14 以来,VMware 已停止支持许多 CPU,包括早期的 Intel Core i7 CPU。查看主机系统的处理器要求,并确保您的 CPU 的虚拟化技术(AMD-V 或 VT-x)已在 BIOS/UEFI 固件中启用。如果较新版本不支持您的 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 二进制文件会通知用户许可证不正确。

从图形界面

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

# /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 或切换到受支持的驱动程序 - 如果不确定,请检查 VM 目录中的 vmware.log

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

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

创建一个可执行文件

/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

另请参阅 电源管理/挂起和休眠#/usr/lib/systemd/system-sleep 中的钩子使用 vmrun 挂起所有虚拟机对休眠的支持

系统加速技巧

另请参阅 提高性能

禁用透明大页

本文或本节是与提高性能合并的候选对象。

注意: 不特定于 VMware。(在 Talk:VMware 中讨论)

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

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

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

您也可以使用 madvise 而不是 never,以便仍然允许针对透明大页优化的应用程序获得性能优势[1]。这对于 vmware 的作用与上述相同。

确保直接内存访问

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

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

性能提示

要提高虚拟机的性能,请尝试以下提示

半虚拟 SCSI 适配器

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

SCSI 适配器类型 VMware 半虚拟 在虚拟机设置中可用。

如果虚拟机的配置中没有这些设置,仍然可以启用半虚拟 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 的配置对话框中设置(编辑 -> 首选项... -> 内存/优先级)。

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 社区 解释的那样,请禁用 安全启动 以使用 vmmon 加载 VMware 模块。

USB 设备未识别

如果未使用 systemd 服务 自动处理服务,则每次都需要以 root 身份手动启动 vmware-usbarbitrator 二进制文件。

启动

# vmware-usbarbitrator

停止

# vmware-usbarbitrator --kill

尝试远程访问 VMware 时密码/用户名不正确

VMware Workstation 提供了通过 vmware-workstation-server 服务远程管理共享虚拟机的可能性。但是,由于 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 应用程序 UI 中的图标和填充在高 DPI 显示器上未正确缩放

请参阅 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 模块未加载。请参阅 #systemd 服务 部分以了解自动加载。

另一个可能的原因是第 11 代及更高版本的 Intel 处理器以及内核 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

安装程序启动失败

如果您在打开 .bundle 后只是返回到提示符,那么您可能有一个已弃用或损坏的 VMware 安装程序版本,应该将其删除(您也可以参考本文的 #卸载 部分)

# rm -r /etc/vmware-installer/

用户界面初始化失败

您可能还会看到类似这样的错误

 Extracting VMware Installer...done.
 No protocol specified
 No protocol specified
 User interface initialization failed.  Exiting.  Check the log for details.

可以通过安装 ncurses5-compat-libsAUR 依赖项或临时允许 root 访问 X 来解决此问题

 $ xhost +
 $ sudo ./<vmware filename>.bundle
 $ xhost -

VMware 启动失败

模块 CPUIDEarly power on failed

版本 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.conf 中的 IgnorePkg 参数中。

一种更简单的解决方法是使 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 注册的错误,但似乎在 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 存储库

导航到:“应用程序名称 / 版本 / 内部版本号 / linux / packages/” 并下载相应的 Tools。

使用以下命令解压

$ 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

访客操作系统系统时钟不正确或无法启动:“[...]timeTracker_user.c:234 bugNr=148722”

本文或本节已过时。

原因: ondemand 不再 是默认调速器,这是否仍然适用于 schedutil 调速器?(在 Talk:VMware 中讨论)

这是由于 VMware Linux 中对电源管理功能(Intel SpeedStepAMD PowerNow!/Cool'n'Quiet[死链接 2024-10-12 ⓘ] 不完整 的支持,这些功能会改变 CPU 频率。在 2012 年 3 月,随着 linux 3.3-1 的发布,最大频率 Performance 调速器被动态的 Ondemand 取代。当主机 CPU 频率改变时,访客操作系统系统时钟会运行得太快或太慢,但也可能导致整个访客操作系统无法启动。

为了防止这种情况,可以在全局配置中指定最大主机 CPU 频率,并禁用 时间戳计数器 (TSC)

/etc/vmware/config
host.cpukHz = "X"  # The maximum speed in KHz, e.g. 3GHz is "3000000".
host.noTSC = "TRUE" # Keep the Guest system clock accurate even when
ptsc.noTSC = "TRUE" # the time stamp counter (TSC) is slow.
提示: 要定期校正时间(每分钟一次),请在 VMware Tools 的选项选项卡中启用:“虚拟机和主机操作系统之间的时间同步”。

访客操作系统上的网络在系统重启后不可用

这很可能是由于 vmnet 模块未加载 [4]。另请参阅 #systemd 服务 部分以了解自动加载。

鼠标问题

鼠标 5 个以上的按钮不起作用

如果鼠标的拇指按钮或其他附加按钮不起作用,设置访客操作系统使用高级鼠标

访客操作系统上奇怪的鼠标滚轮行为

这与主机系统上当前的 Xorg 键盘布局有关。在访客操作系统上工作时,请保持主机上选择的主键盘布局(例如,英语)。

嵌套虚拟机没有 IP 地址和网络访问

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

授予一个组权限

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

授予所有用户权限

# chmod a+rw /dev/vmnetX

卸载

要卸载 VMware,您需要产品名称(vmware-workstationvmware-player)。要列出所有已安装的产品

$ vmware-installer -l

并使用以下命令卸载(--required 跳过确认)

# vmware-installer -u product --required
提示: 使用 --console 进行控制台 UI。

记住还要禁用并移除服务

# rm /etc/systemd/system/vmware.service
# rm /etc/systemd/system/vmware-usbarbitrator.service

您可能还需要查看 /usr/lib/modules/kernel_name/misc/ 中的模块目录以查找任何残留文件,如果 /etc/init.d/ 现在为空,也将其删除。