• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

Gelöst Leap 15.4: Inkompatible GCC Versionen: vboxdrv Kompiler-Fehler mit Backport-Kernel

wbwb

Hacker
Sorry für den folgenden Roman, aber bevor ich meine Fragen stelle, möchte ich bitte erst mal das Problem beschreiben. Also:

Problem: Ich habe hier eine openSUSE Leap 15.4 auf einem Laptop laufen. Aus Hardware-Gründen nutze ich die Backport Kernels aus Kernel:/stable:/Backport/standard/(und Kernel:/stable:/Backport:/KMP/standard/). Außerdem läuft auf dem Ding auch eine Virtualbox (die Version 7.0.8_SUSE r156879 von openSUSE).

Heute habe ich den Kernel von 6.3.8-lp154.5.1.ge044c8e.x86_64 auf 6.4.0-lp154.8.g192b657-default upgedated.
Danach startete die Virtualbox nicht mehr. Fehlermeldung: Das vboxdrv sei nicht installiert und im journalctl -b bekam ich Fehler
Code:
systemd[1]: vboxdrv.service: Failed with result 'exit-code'.
systemd[1]: Failed to start VirtualBox Linux kernel module.
Ein Blick in /lib/modules/6.4.0-lp154.8.g192b657-default/misc/ zeigte, dass das vboxdrv Module gar nicht kompiliert war und ein Versuch das Kernel Module händisch mit /usr/sbin/vboxconfig zu kompilieren zeigte dann auch in /var/log/virtualbox.log das Problem: Der 6.4.0-lp154.8.g192b657-default wird mit gcc11 kompiliert, die Leap 15.4 hat defaultmäßig aber den gcc7 und das scheint just ab dieser Kernel Version bei diversen Kompiler-Switches Schwierigkeiten zu machen.

Zur 'Lösung' habe ich Folgendes unternommen: (1) Das Repo devel:/gcc/openSUSE_Leap_15.4/ zusätzlich eingebunden und daraus den gcc11 installiert. (2) Unter /usr/bin den Symlink gcc-> gcc-7 auf gcc -> gcc-11 geändert. (3) Für dieses eine Mal das vboxdrv Module mit /usr/sbin/vboxconfig von Hand kompiliert - was dann auch fehlerfrei klappte. Die Hoffnung wäre, dass es beim nächsten Kernel update dann auch wieder automatisch kompiliert wird.

Jetzt läuft die VirtualBox wieder.

Fragen:
  1. Hätte ich damit rechnen müssen, dass ein mit Backport Kernels betriebenes System irgendwann Schwierigkeiten mit den gcc Versionen bekommt? Oder kann/soll man das durch eine bestimmte clevere Kombination aus Repos zusätzlich zu den Kernel Backport Repos verhindern? Oder sollte man erwarten, dass die Distro-Maintainer:innen solche Inkompatibilitäten eigentlich nicht zulassen ... was dann heißen würde, dass es sich um einen kleinen Bug handelt (was wahrscheinlich eine fromme Hoffnung ist)?
  2. Ist meine 'Billigheimer'-Variante mit dem Ändern des Symlinks nur für das gcc Executable ausreichend, oder sollte man da etwas mit update-alternatives machen?
 

Sauerland

Ultimate Guru
Du kannst aber mit update-alternatives den ggc auswählen, mit dem du kompilieren willst, musst du nur selber machen z.B.:
User:Tsu2/gcc update-alternatives - openSUSE Wiki
Code:
update-alternatives --config gcc
Es gibt 4 Auswahlmöglichkeiten für die Alternative gcc (welche /usr/bin/gcc bereitstellen).

  Auswahl      Pfad             Priorität Status
------------------------------------------------------------
  0            /usr/bin/gcc-11   2         automatischer Modus
  1            /usr/bin/gcc-10   2         manueller Modus
* 2            /usr/bin/gcc-11   2         manueller Modus
  3            /usr/bin/gcc-12   2         manueller Modus
  4            /usr/bin/gcc-7    1         manueller Modus
oder auch g++:
Code:
update-alternatives --config g++
Es gibt 4 Auswahlmöglichkeiten für die Alternative g++ (welche /usr/bin/g++ bereitstellen).

  Auswahl      Pfad             Priorität Status
------------------------------------------------------------
  0            /usr/bin/g++-11   2         automatischer Modus
  1            /usr/bin/g++-10   2         manueller Modus
* 2            /usr/bin/g++-11   2         manueller Modus
  3            /usr/bin/g++-12   2         manueller Modus
  4            /usr/bin/g++-7    1         manueller Modus
 
OP
W

wbwb

Hacker
Du kannst aber mit update-alternatives den ggc auswählen, mit dem du kompilieren willst, musst du nur selber machen z.B.: User:Tsu2/gcc update-alternatives - openSUSE Wiki
Genau wegen dieser Seite von Tsu2 hatte ich zunächst nur die von mir beschriebene (sicher nicht so 'profi-mäßige') Verbiegung ausschließlich des symbolischen Links vom gcc von gcc7 auf gcc11 vorgenommen und genau deshalb auch meine 2. Frage gestellt. ... Ich frage also aus Interesse noch mal nach. Bisher ergibt bei mir nämlich:
Code:
update-alternatives --config gcc
update-alternatives: error: no alternatives for gcc
Obwohl ich jetzt den gcc7 und den gcc11 installiert habe. Man sieht dann im man update-alternatives, dass man mit update-alternatives --install Alternativ-Gruppen selbst erstellen sollen kann. Hast Du das auf Deinem System erst so machen müssen? Oder hast Du nach Installation mehrerer gcc-s 'magisch' solche Alternativen im update-alternatives --config gcc einfach vorgefunden?
 

Sauerland

Ultimate Guru
Ich hab mehrere gcc Versionen installiert und dann jede Version einzeln mit
Code:
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-XX
(XX natürlich ersetzen) zu updates-alternatives hinzugefügt und hinterher ausgewählt.
Code:
ls -al /usr/bin/* | grep -i gcc
lrwxrwxrwx  1 root root              5 23. Aug 2021  /usr/bin/cc -> gcc-7
-rwxr-xr-x  1 root root            963 22. Mai 11:51 /usr/bin/custom_gcc_64.sh
lrwxrwxrwx  1 root root             21 13. Mai 11:25 /usr/bin/gcc -> /etc/alternatives/gcc
-rwxr-xr-x  1 root root        1153968 18. Jul 2022  /usr/bin/gcc-10
-rwxr-xr-x  2 root root        1182712  3. Sep 2022  /usr/bin/gcc-11
-rwxr-xr-x  2 root root        1305664 22. Mai 16:44 /usr/bin/gcc-12
-rwxr-xr-x  1 root root        1022416  2. Nov 2021  /usr/bin/gcc-7
ergibt:
Code:
update-alternatives --config gcc
Es gibt 4 Auswahlmöglichkeiten für die Alternative gcc (welche /usr/bin/gcc bereitstellen).

  Auswahl      Pfad             Priorität Status
------------------------------------------------------------
  0            /usr/bin/gcc-11   2         automatischer Modus
  1            /usr/bin/gcc-10   2         manueller Modus
* 2            /usr/bin/gcc-11   2         manueller Modus
  3            /usr/bin/gcc-12   2         manueller Modus
  4            /usr/bin/gcc-7    1         manueller Modus

Drücken Sie die Eingabetaste, um die aktuelle Wahl[*] beizubehalten,
oder geben Sie die Auswahlnummer ein: 0

Gleiches hab ich dann auch mit g++ gemacht.
 
Oben