3

Я обновился до Ubuntu 18.04, а модуль vmmon.ko для VMWare Workstation 12.5.9 теперь не удается собрать.

вывод ошибки компиляции vmmon

/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

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

3 ответа3

2

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

1

Используя предложенный Чарли скрипт, я смог собрать необходимые модули для ядра 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

0

Я столкнулся с той же проблемой в 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .