我升级到了 Ubuntu 18.04,vmmon.ko
现在无法构建 VMWare Workstation 12.5.9 的模块。
/usr/lib/vmware/modules/source/vmmon-only/linux/driver.c: In function ‘LinuxDriverInitTSCkHz’:
/usr/lib/vmware/modules/source/vmmon-only/linux/driver.c:268:22: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
tscTimer.function = LinuxDriverEstimateTSCkHzDeferred;
^
/usr/lib/vmware/modules/source/vmmon-only/linux/driver.c:270:12: error: ‘struct timer_list’ has no member named ‘data’
tscTimer.data = 0;
^
/usr/lib/vmware/modules/source/vmmon-only/linux/driver.c: In function ‘init_module’:
/usr/lib/vmware/modules/source/vmmon-only/linux/driver.c:312:4: error: implicit declaration of function ‘init_timer’; did you mean ‘init_timers’? [-Werror=implicit-function-declaration]
init_timer(&linuxState.pollTimer);
^~~~~~~~~~
init_timers
/usr/lib/vmware/modules/source/vmmon-only/linux/driver.c:313:24: error: ‘struct timer_list’ has no member named ‘data’
linuxState.pollTimer.data = 0;
^
/usr/lib/vmware/modules/source/vmmon-only/linux/driver.c:314:34: error: assignment from incompatible pointer type [-Werror=incompatible-pointer-types]
linuxState.pollTimer.function = LinuxDriverPollTimeout;
这看起来像是一个导致 vmmon 编译失败的小变化,可能是内核版本之间的数据结构发生了变化?
编辑:似乎在 Linux 内核 v4.15 中init_timer()
接口已被删除
uname -a
Linux hostnema 4.15.0-22-generic #24-Ubuntu SMP Wed May 16 12:15:17 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
关于如何开始解决这个问题,有什么建议吗?
答案1
我找到了一个解决方案,并根据 mkucebek 的 github 源创建了一个脚本文件。
您必须创建一个包含此内容的文件,并在每次需要时运行它:
#!/bin/bash
VMWARE_VERSION=workstation-12.5.9
TMP_FOLDER=/tmp/patch-vmware
rm -fdr $TMP_FOLDER
mkdir -p $TMP_FOLDER
cd $TMP_FOLDER
git clone https://github.com/mkubecek/vmware-host-modules.git
cd $TMP_FOLDER/vmware-host-modules
git checkout $VMWARE_VERSION
make
sudo make install
sudo rm /usr/lib/vmware/lib/libz.so.1/libz.so.1
sudo ln -sv /lib/x86_64-linux-gnu/libz.so.1 /usr/lib/vmware/lib/libz.so.1/libz.so.1
sudo /etc/init.d/vmware restart
然后,您只需启动 VMware Workstation,无需构建模块。
答案2
使用 Charly 建议的脚本,我能够在 16.04 LTS 上为内核 4.15.0-29-generic 构建所需的模块。脚本末尾有一个拼写错误,在sudo ln -s /lib/x86_64-linux-gnu/libz.so.1
和之间不应该有换行符/usr/lib/vmware/lib/libz.so.1/libz.so.1
我建议的另一个补充是将sudo /etc/init.d/vmware restart
命令添加到上述脚本的末尾。
因此经过调整的实际解决方案脚本是:
#!/bin/bash
VMWARE_VERSION=workstation-12.5.9
TMP_FOLDER=/tmp/patch-vmware
rm -fdr $TMP_FOLDER
mkdir -p $TMP_FOLDER
cd $TMP_FOLDER
git clone https://github.com/mkubecek/vmware-host-modules.git
cd $TMP_FOLDER/vmware-host-modules
git checkout $VMWARE_VERSION
git fetch
make
sudo make install
sudo rm /usr/lib/vmware/lib/libz.so.1/libz.so.1
sudo ln -s /lib/x86_64-linux-gnu/libz.so.1 /usr/lib/vmware/lib/libz.so.1/libz.so.1
sudo /etc/init.d/vmware restart
```
抱歉,这不是对 Charly 的回答的评论,我在 这个帐户上没有声誉。
请注意,这仅适用于Workstation 12.5.9
,您可以通过运行轻松判断您拥有哪个版本vmware --version
答案3
我在新安装的 vmware 工作站(14.1.3 build-9474260)上安装了 Ubuntu 18.04 并更新了内核后也遇到了同样的问题。这似乎是在具有安全启动功能的计算机上将模块导入内核时出现的问题,因此基于此文章我做了这bash 脚本:
#!/bin/bash
sudo vmware-modconfig --console --install-all
echo "signing vmmon module"
sudo /usr/src/linux-headers-`uname -r`/scripts/sign-file sha256 ./MOK.priv
./MOK.der $(modinfo -n vmmon)
echo "signing vmnet module"
sudo /usr/src/linux-headers-`uname -r`/scripts/sign-file sha256 ./MOK.priv
./MOK.der $(modinfo -n vmnet)
echo "importing MOK cert"
mokutil --import MOK.der
答案4
此修复的另一个附加组件Ubuntu 20.04 LTS和Ubuntu 22.04 LTS:即使您按照这里的所有步骤操作,VMware 似乎也会在这些新版本的操作系统上因异常(分段错误)崩溃!
但是,它仍然可以轻松修复,只是不是很直观 --- 您只需要使用 appLoader 的完整路径调用“vmplayer”!
因此,就像这样,它崩溃得很厉害:
ubuntu@ubuntu:~$ vmplayer
... (harmless errors and warnings)
/usr/bin/vmplayer: line 106: 28048 Segmentation fault (core dumped) "$BINDIR"/vmware-modconfig --appname="VMware Player" --icon="vmware-player"
但如果你像这样加载它,它就可以完美启动!:
ubuntu@ubuntu:~$ /usr/lib/vmware/bin/vmplayer
为了使图标正常工作,只需编辑桌面文件以/usr/share/applications
使用完整路径调用 vmplayer,它现在也将从 GUI 启动。
顺便说一句 - 您可以选择将 vmplayer 安装在 /usr/lib 以外的其他位置。例如,安装在/选择--set-setting vmware-installer libdir /opt
相反,只需在运行安装程序包时添加参数。
现在期待在 Ubuntu 的更高版本中 VMware Player 仍会出现更多启动问题,但令人欣慰的是,它仍然可以在最近的 2022 版本上运行(以及 2008 版之前的版本,在 hardy 中进行了另一项小调整)。