VMWare Workstation vmmon не работает на Ubuntu 18.04

Я обновился до 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

Любые предложения о том, как я мог бы начать это исправить?

4 ответа

Я нашел решение и создал файл сценария на основе исходников 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
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

Затем вам просто нужно запустить VMware Workstation без сборки модулей.

Используя предложенный Чарли скрипт, я смог собрать необходимые модули для ядра 4.15.0-29-generic на 16.04 LTS. В конце скрипта есть опечатка, между строкой не должно быть возврата 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

`` `

Извините, это не комментарий к ответу Чарли, у меня нет репутации в этом аккаунте.

Обратите внимание, что это будет работать только для Workstation 12.5.9, вы можете легко сказать, какая у вас версия, запустив vmware --version

Я столкнулся с той же проблемой в Ubuntu 18.04 при установке новой рабочей станции vmware (14.1.3 build-9474260) и после обновления ядра. Кажется, это проблема с импортом модулей в ядро ​​на машине с безопасной загрузкой, поэтому на основе этой статьи я сделал этот скрипт 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

Еще одно дополнение к этому исправлению в Ubuntu 20.04 LTS и Ubuntu 22.04 LTS : похоже, что VMware аварийно завершает работу с исключением (ошибка сегментации) в этих новых версиях ОС даже после того, как вы выполните все шаги, описанные здесь!

Однако это все еще можно легко исправить, просто это не очень интуитивно понятно — вам просто нужно вызвать vmplayer, используя полный путь к appLoader!

Вот так ужасно вылетает:

      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 с таким полным путем, и теперь он также запустится из графического интерфейса.

Кстати, вы можете установить vmplayer в другое место, кроме /usr/lib. Например, чтобы установить вместо этого каталог /opt , просто добавьте аргумент--set-setting vmware-installer libdir /optпри запуске установочного пакета.

Теперь с нетерпением жду новых проблем с запуском VMware Player в более поздней версии Ubuntu, но рад, что он все еще работает даже в 2022 году (а также в чем-то старом, в 2008 году, с еще одной небольшой поправкой в ​​Hardy).

Другие вопросы по тегам