VMware (简体中文)

From ArchWiki
Jump to: navigation, search
翻译状态: 本文是英文页面 VMware翻译,最后翻译时间:2017-08-18,点击这里可以查看翻译后英文页面的改动。

本文是关于在 Arch 中安装 VMware,你也许想寻找的是 在 VMware 中安装 Arch Linux

注意:
  • 这篇文章适用于最新的 VMware 正式版,即 VMware Workstation Pro / Player 12.5.
  • 对于旧版本的 VMware,建议安装本体后追加安装 vmware-patchAUR

安装

安装 依赖项:

下载最新的 VMware Workstation ProPlayer (或者beta版,如果有的话)。

开始安装:

# sh VMware-edition-version.release.architecture.bundle
提示: 一些常用的选项:
  • --eulas-agreed - 跳过各种许可协议
  • --console - 使用命令行界面,而非 GUI
  • --custom - 允许自定义安装目录,比如/usr/local(记得修改#Systemd 服务一节下,vmware-usbarbitrator.service中的路径)
  • -I, --ignore-errors - 忽略致命错误
  • --set-setting=vmware-workstation serialNumber XXXXX-XXXXX-XXXXX-XXXXX-XXXXX - 设置安装时使用的序列号(有利于脚本化安装)
  • --required - 只询问必要的问题(当结合--eulas-agreed--console时可以实现静默安装)

当安装程序询问 System service scripts directory 的设置时,输入 /etc/init.d 即可。

注意: 安装过程中会收到"No rc*.d style init script directories"错误。这可以安全忽略,因为Arch使用的是systemd.
提示: 如需重新编译模块,用这条命令:
# vmware-modconfig --console --install-all

配置

内核模块

VMware Workstation 12.5 最高支持内核 4.8.

Systemd 服务

(可选) 你也可以创建一个 .service 文件 (也可以用AUR中的vmware-systemd-servicesAUR包),而不是直接使用 /etc/init.d/vmware (start|stop|status|restart) 和 /usr/bin/vmware-usbarbitrator 来管理服务:

/etc/systemd/system/vmware.service
[Unit]
Description=VMware daemon
Requires=vmware-usbarbitrator.service
Before=vmware-usbarbitrator.service
After=network.target

[Service]
ExecStart=/etc/init.d/vmware start
ExecStop=/etc/init.d/vmware stop
PIDFile=/var/lock/subsys/vmware
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
/etc/systemd/system/vmware-usbarbitrator.service
[Unit]
Description=VMware USB Arbitrator
Requires=vmware.service
After=vmware.service

[Service]
ExecStart=/usr/bin/vmware-usbarbitrator
ExecStop=/usr/bin/vmware-usbarbitrator --kill
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

如果你想在另一个Workstation服务器控制台上连接此次安装的VMware Workstation,请添加下面的服务

/etc/systemd/system/vmware-workstation-server.service
[Unit]
Description=VMware Workstation Server
Requires=vmware.service
After=vmware.service

[Service]
ExecStart=/etc/init.d/vmware-workstation-server start
ExecStop=/etc/init.d/vmware-workstation-server stop
PIDFile=/var/lock/subsys/vmware-workstation-server
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

之后您就可以在启动时enable它们.

Workstation Server服务

服务vmware-workstation-server.service将调用wssc-adminTool,即使后者已经被重命名作vmware-wssc-adminTool.

这将阻止该服务启动。创建一个文件链接可以修复这个问题:

# ln -s wssc-adminTool /usr/lib/vmware/bin/vmware-wssc-adminTool

启动程序

启动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 处是你的许可密钥。

Note: The -debug binary informs the user of an incorrect license.

从 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/<Virtual machine name>来让虚拟机使用它:

$ mv bios440.rom ~/vmware/Virtual_machine_name/

然后在 <Virtual machine name>.vmx 文件中加入它的名称:

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

在Intel和Optimus上启用3D图形

由于不理想和(或)不稳定的3D加速,某些图形驱动是默认被阻止的。当启用Accelerate 3D graphics后,log中应该会出现:

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

这表示:

~/.vmware/preferences
mks.gl.allowBlacklistedDrivers = TRUE

疑难解答

错误:Kernel headers for version 4.x-xxxx were not found. If you installed them[...]

安装 linux-headers

Note: 更新内核和头文件会需要你启动新的内核以匹配头文件的版本。这是一个相对常见的错误。

无法识别 USB 设备

提示: 可以通过 vmware-patchAUR 解决。

如果不使用#Systemd 服务来处理服务,你每次都需要以root身份手动启动vmware-usbarbitrator.

启动:

# vmware-usbarbitrator

停止:

# vmware-usbarbitrator --kill

当远程访问VMware时,遇到不正确的用户名/密码错误

VMware Workstation通过vmware-workstation-server服务来提供远程管理共享的虚拟机的功能。然而,这将以错误"incorrect username/password"而告终,因为vmware-authd服务中,PAM的相关配置出错了。通过编辑/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

然后重新启动vmwaresystemd服务。

现在你能通过安装时提供的身份信息来登录这个服务器了。

Note: 也许会需要libxslt来启动虚拟机

ALSA输出的问题

修复音质问题或正确启用高清音频输出。首先执行:

$ 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模拟也应该被禁用.

错误:Kernel-based Virtual Machine (KVM) is running

禁止KVM自动启动,你可以:

/etc/modprobe.d/vmware.conf
blacklist kvm
blacklist kvm-amd   # For AMD CPUs
blacklist kvm-intel # For Intel CPUs

组件问题

错误:/dev/vmmon not found

完整的错误是:

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

这意味着未加载vmmon模块.参见#Systemd 服务章节

错误:/dev/vmci not found

完整的错误是:

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

尝试重新编译VMware内核模块:

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

在Linux 4.9后内核模块无法编译

对于VMware Workstation Pro 12.5.2,模块的源码必须作出修改,以便于在Linux 4.9上编译 [1]

# cd /usr/lib/vmware/modules/source
# tar xf vmmon.tar
# mv vmmon.tar vmmon.old.tar
# sed -i 's/uvAddr, numPages, 0, 0/uvAddr, numPages, 0/g' vmmon-only/linux/hostif.c
# tar cf vmmon.tar vmmon-only
# rm -r vmmon-only
# tar xf vmnet.tar
# mv vmnet.tar vmnet.old.tar
# sed -i 's/addr, 1, 1, 0/addr, 1, 0/g' vmnet-only/userif.c
# tar cf vmnet.tar vmnet-only
# rm -r vmnet-only

VMware模块在Linux内核4.11+上(在GCC7下)编译失败

运行vmware-modconfig时返回:

Failed to get gcc information.

详细的错误信息能在日志中被找到:

modconfig| I125: Got gcc version "6.3.1".
modconfig| I125: GCC major version 6 does not match Kernel GCC major version 7.
modconfig| I125: The GCC compiler "/sbin/gcc" cannot be used for the target kernel.

为跳过检查,使用下面的解决方案:

# sed 's/gcc version 7/gcc version 6/' /proc/version > /tmp/version
# mount --bind /tmp/version /proc/version
# vmware-modconfig --console --install-all
# umount /proc/version && rm /tmp/version

VMware 模块在 Linux 4.13 版内核上编译失败

VMware Workstation Pro 12.5.7 版本的内核模块代码需要做出一定修改,才能够成功地为 4.13 版 Linux 内核编译。出处:[2]

# cd /usr/lib/vmware/modules/source
# tar xf vmnet.tar
# mv vmnet.tar vmnet.old.tar
# sed -i 's/atomic_inc(&clone->users);/clone = skb_get(clone);/g' vmnet-only/bridge.c
# tar cf vmnet.tar vmnet-only
# rm -r vmnet-only

安装程序启动失败

如果你回到了执行.bundle时的终端提示,则这个版本的VMware Installer也许坏掉了或者不完整,你应该删掉它(你也许也应该参照#卸载一节中的内容):

# 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或者临时允许X拥有root权限来解决:

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

VMware启动失败

旧的Intel微指令在启动时产生段错误

旧的Intel微指令可能会在启动时产生这样的段错误:

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

参阅Microcode了解如何更新微指令

版本号为12.5.4的vmplayer/vmware无法启动

[3]中所述,临时的解决方案是将包libpng降级至1.6.28-1版本,并将其加入IgnorePkg参数以忽略升级(参见/etc/pacman.conf)。

更方便的解决方案是令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 .

版本号为12.5.3-12.5.5的vmplayer/vmware无法启动

这貌似是文件/usr/lib/vmware/lib/libstdc++.so.6/libstdc++.so.6中的问题,CXXABI_1.3.8缺失。

如果系统安装了gcc-libs或者gcc-libs-multilib,那个库就已经被安装了。因此,直接移除那个出错的文件将使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或vmplaer后,产生了VMWARE_SHIPPED_LIBS_LIST is not set, VMWARE_SYSTEM_LIBS_LIST is not set, VMWARE_USE_SHIPPED_LIBS is not set, VMWARE_USE_SYSTEM_LIBS is not set问题。进程在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'

如果在版本12.5.7上出现问题,并且移动icudt44l.dat或者设置VMWARE_USE_SHIPPED_LIBSyes不起作用,或者在终端内执行vmplayer无输出,尝试以root权限执行:

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

尽管设置了VMWARE_USE_SHIPPED_LIBS变量,VMware仍有可能找不到某些库文件,比如libfontconfig.so.1。查看VMware位于tmp目录中的日志来检查哪些库文件未被找到,并将对应的系统库文件拷贝至合适的路径:

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

客户机问题

无法为客户机下载VMware Tools

访问VMware repository来手动下载这些工具。

导航至:"application name / version / build 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

错误:Guests have incorrect system clocks or are unable to boot: "[...]timeTracker_user.c:234 bugNr=148722"

这是由于在VMware Linux中不完整的对电源管理功能的支持导致的CPU频率的变化(Intel SpeedStepAMD PowerNow!/Cool'n'Quiet)。2012年,随着linux 3.3-1的发布,最大CPU频率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下的Options选项卡中,启用: "Time synchronization between the virtual machine and the host operating system".

Guests系统启动后网络不可用

这可能是 vmnet 模块没有加载 [4]。又见#Systemd 服务自动加载。

卸载

为卸载VMware你首先需要知道产品名称(vmware-workstation 或是 vmware-player)。列出所有的产品:

# vmware-installer -l

然后通过下面的指令卸载(使用--required跳过所有的确认):

# vmware-installer -u product --required
提示: 加上--console来使用终端UI

记得要disable和删除.service文件:

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

你可能还需要清理在/usr/lib/modules/kernel_name/misc/下的冗余文件,并且如果目录/etc/init.d/是空的话,删除它。