VMware (简体中文)
本文是关于在 Arch 中安装 VMware,你也许想寻找的是 在 VMware 中安装 Arch Linux
- 这篇文章适用于最新的 VMware 正式版,即 VMware Workstation Pro / Player 12.5.
- 对于旧版本的 VMware,建议安装本体后追加安装 vmware-patchAUR[损坏的链接:package not found] 包
安装
安装 依赖项:
- fuse2 - 提供 vmware-vmblock-fuse
- gksuAUR - 支持需要 root 权限的操作(比如内存分配、注册许可证等等)
- gtkmm - 支持 GUI
- linux-headers - 模块编译所需
-
ncurses5-compat-libsAUR - 支持安装程序的
--console
选项 - libcanberra - 支持事件提示音
下载最新的 VMware Workstation Pro 或Player (或者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[损坏的链接:package not found]包),而不是直接使用 /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
处是你的许可密钥。
-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。
无法识别 USB 设备
如果不使用#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
然后重新启动vmware
systemd服务。
现在你能通过安装时提供的身份信息来登录这个服务器了。
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[损坏的链接:replaced by 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或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_LIBS
为yes
不起作用,或者在终端内执行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 SpeedStep和AMD 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.
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/
是空的话,删除它。