Vor ein paar Tagen hatte ich darüber berichtet, dass mir Kernel-Updates gelegentlich Sorgen bereiten. Unter anderem, weil die Kernel-Module von VMware nach einem Kernel-Update manchmal nicht mehr kompilieren. Das geht auch anders herum, nach einem Update von VMware.

So ist es mir heute geschehen: VMware bietet mir ein Update auf Workstation Pro 14.1.1 an, das ich in einem Anflug von Leichtsinn installiere. Es passiert, was passieren muss:

VMware mag nicht

Die Kernel-Module von VMware können nicht mehr kompiliert werden. Ich kann in der Kommandozeile mehr Informationen über das Problem erhalten, indem ich das hier eingebe:

sudo vmware-modconfig --console --install-all

Was ich sehe, hilft mir nicht wirklich weiter:

make: Entering directory '/tmp/modconfig-OghMNh/vmmon-only'
Using kernel build system.
/usr/bin/make -C /lib/modules/4.14.12-44.current/build/include/.. SUBDIRS=$PWD SRCROOT=$PWD/. \
  MODULEBUILDDIR= modules
make[1]: Entering directory '/usr/src/linux-headers-4.14.12-44.current'
make[2]: *** No rule to make target '/tmp/modconfig-OghMNh/vmmon-only/linux/driverLog.o', needed by '/tmp/modconfig-OghMNh/vmmon-only/vmmon.o'.  Stop.
make[1]: *** [Makefile:1507: _module_/tmp/modconfig-OghMNh/vmmon-only] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.14.12-44.current'
make: *** [Makefile:110: vmmon.ko] Error 2
make: Leaving directory '/tmp/modconfig-OghMNh/vmmon-only'

Ich habe gestern über meine Schwierigkeiten mit dem Kompilieren berichtet, hier ist es ähnlich. Warum ich Quelltext manchmal kompilieren kann, und manchmal nicht, verstehe ich noch nicht so richtig. Eine ausgedehnte Internet-Recherche zum Thema “no rule to make target” hilft mir in diesem Fall eher durch Zufall: Im Makefile muss ich eine zusätzliche Variable definieren, nämlich so:

CONFIG_STACK_VALIDATION = 

Sobald ich das getan habe, kompilieren die Kernel-Module. Warum, ist mir (noch) ein Rätsel, es funktioniert aber. Das finde ich nicht optimal, aber man muss Kompromisse eingehen.

Die betroffenen Kernel-Module von VMware liegen nur als tar-Dateien vor, daher habe ich das manuelle Kompilieren der Module über ein Bash-Skript automatisiert:

#!/bin/bash

# Check if we are root
if [ "$EUID" -ne 0 ]
  then echo "Please run this script as root. Exiting."
  exit
fi

# Extract tar archives
cd /usr/lib/vmware/modules/source
tar xf vmmon.tar
tar xf vmnet.tar

# Patch make files
sed -i '1 i\CONFIG_STACK_VALIDATION = ' vmmon-only/Makefile
sed -i '1 i\CONFIG_STACK_VALIDATION = ' vmnet-only/Makefile

# Create backup of original tar archives
mv vmmon.tar vmmon.tar.bak
mv vmnet.tar vmnet.tar.bak

# Create updated archives
tar cf vmmon.tar vmmon-only
tar cf vmnet.tar vmnet-only

# Remove working directories
rm -r vmmon-only
rm -r vmnet-only

# Compile kernel modules
vmware-modconfig --console --install-all