Tentative pour installer les Additions Invité de VirtualBox

dans une machine récente (Debian 10) hostée par un vieux coucou toujours fidèle (Debian 7 Wheezy 32 bits)

Bonsoir,

Et ça coince à l’exécution du script sh VBoxLinuxAdditions.run avec un message m’engageant à jeter un œil au log /var/lib/dkms/vboxguest/4.2.8/build/make.log, ce qui donne (un poil allégé) :

DKMS make.log for vboxguest-4.2.8 for kernel 4.19.0-18-686 (i686)
samedi 19 février 2022, 13:18:36 (UTC+0100)
make : on entre dans le répertoire « /usr/src/linux-headers-4.19.0-18-686 »
  CC [M]  /var/lib/dkms/vboxguest/4.2.8/build/vboxguest/VBoxGuest-linux.o
In file included from /usr/src/linux-headers-4.19.0-18-common/include/linux/module.h:18,
                 from /var/lib/dkms/vboxguest/4.2.8/build/vboxguest/r0drv/linux/the-linux-kernel.h:78,
                 from /var/lib/dkms/vboxguest/4.2.8/build/vboxguest/VBoxGuest-linux.c:26:
6 fois cette erreur
/usr/src/linux-headers-4.19.0-18-common/include/linux/moduleparam.h:233:24: note: in definition of macro ‘module_param_call’
   { .flags = 0, .set = _set, .get = _get };  \
                        ^~~~
6 fois celle-ci
/usr/src/linux-headers-4.19.0-18-common/include/linux/moduleparam.h:233:37: note: in definition of macro ‘module_param_call’
   { .flags = 0, .set = _set, .get = _get };  \
                                     ^~~~
6 fois celle-là
/var/lib/dkms/vboxguest/4.2.8/build/vboxguest/VBoxGuest-linux.c:1059:35: error: initialization of ‘int (*)(const char *, const struct kernel_param *)’ from incompatible pointer type ‘int (*)(const char *, struct kernel_param *)’ [-Werror=incompatible-pointer-types]
 module_param_call(log,            vboxguestLinuxParamLogGrpSet,   vboxguestLinuxParamLogGrpGet,   NULL, 0664);
                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
et 6 fois ça
/var/lib/dkms/vboxguest/4.2.8/build/vboxguest/VBoxGuest-linux.c:1059:67: error: initialization of ‘int (*)(char *, const struct kernel_param *)’ from incompatible pointer type ‘int (*)(char *, struct kernel_param *)’ [-Werror=incompatible-pointer-types]
 module_param_call(log,            vboxguestLinuxParamLogGrpSet,   vboxguestLinuxParamLogGrpGet,   NULL, 0664);
                                                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~

J’avoue que je donne ma langue au chat, et je ne sais absolument pas quoi (= avec quels mots-clé) chercher sur le web…

La ligne 1059 de /var/lib/dkms/vboxguest/4.2.8/build/vboxguest/VBoxGuest-linux.c dans son contexte :

/*
 * Define module parameters.
 */
module_param_call(log,            vboxguestLinuxParamLogGrpSet,   vboxguestLinuxParamLogGrpGet,   NULL, 0664);

et la ligne 233 de /usr/src/linux-headers-4.19.0-18-common/include/linux/moduleparam.h :

/* Obsolete - use module_param_cb() */
#define module_param_call(name, _set, _get, arg, perm)			\
	static const struct kernel_param_ops __param_ops_##name =	\
		{ .flags = 0, .set = _set, .get = _get };		\

Face à ça je suis comme une poule qui aurait trouvé un couteau, alors grand merci pour le coup de main.

Bonjour,
il faut installer le package linux-headers correspondant au noyau.
Accessoirement il faut aussi faire: apt install build-essential

Merci pour le retour, mais j’avais déjà les deux.

En fait, je suspecte une incohérence entre la version VBox du host qui est un pur i386 et le kernel du guest qui doit être un truc bâtard entre le i386 et l’amd64, j’ai nommé le 686.

Parce que quand je regarde bien avec synaptic les paquets installés dans le guest, tout est correct et correspond à uname -r. À partir de là, je ne vois pas ce que je peux faire de plus.
EDIT : La phrase qui tue, pendant l’exécution du script (que j’ai fait tourner un nombre incalculable de fois depuis 8 ans), c’est « The headers for the current running kernel were not found. »

$ uname -r
4.19.0-18-686
$ dpkg -l linux-headers*
ii  linux-headers-4.19.0-18-686    4.19.208-1   i386         Header files for Linux 4.19.0-18-686
ii  linux-headers-4.19.0-18-common 4.19.208-1   all          Common header files for Linux 4.19.0-18

les autres lignes de la liste sont inintéressantes et de toute façon elles sont « un = Unknown-Not installed »

Bonjour,

j’ai fait des recherches dans le script VBoxLinuxAdditions.run, j’y ai découvert ce test, ligne 2036 :

test_sane_kernel_dir()
{
    KERN_VER=`uname -r`
    KERN_DIR="/lib/modules/$KERN_VER/build"
    if [ -d "$KERN_DIR" ]; then
        KERN_REL=`make -sC $KERN_DIR --no-print-directory kernelrelease 2>/dev/null || true`
        if [ -z "$KERN_REL" -o "x$KERN_REL" = "x$KERN_VER" ]; then
            return 0
        fi
    fi
    printf "\nThe headers for the current running kernel were not found. If the following\nmodule compilation fails
 then this could be the reason.\n"

et ça tombait bien car ce message, je l’ai, je le vois dans la sortie de l’exécution.

Donc le if [ -z... return 0 échoue.
Étant entendu que je fais un test local avec la combinaison des 3 premières lignes de ce test :

$ KERN_VER=`uname -r` && KERN_DIR="/lib/modules/$KERN_VER/build" && if [ -d "$KERN_DIR" ]; then echo $KERN_DIR; fi
/lib/modules/4.19.0-18-686/build

que la ligne suivante avec son make silencieux doit être une espèce de génération de kernelrelease,
j’ai un peu de mal à comprendre ce que fait le test de la ligne d’après :
if [ -z "$KERN_REL" -o "x$KERN_REL" = "x$KERN_VER" ].
-z c’est « true if string is empty », -o OPTION c’est « true if the shell option OPTION is enabled », en français ça donne quoi, avec ce « x » devant le $ ?
Parce que c’est ce test qui fait que le return 0 ne s’exécute pas et que je vois le message ensuite.

Merci et bon dimanche,

Bon, j’ai fait une bidouille sordide : j’ai extrait le test de son contexte, l’ai collé dans un nouveau fichier Bash, et lui ai rajouté 4 lignes facilement repérables, au milieu, alignées au fer à gauche :

#!/bin/sh
    KERN_VER=`uname -r`
    KERN_DIR="/lib/modules/$KERN_VER/build"
    if [ -d "$KERN_DIR" ]; then
        KERN_REL=`make -sC $KERN_DIR --no-print-directory kernelrelease 2>/dev/null || true`
echo "$KERN_REL"
echo "x$KERN_REL"
echo "x$KERN_VER"
if [ -z "$KERN_REL" -o "x$KERN_REL" = "x$KERN_VER" ]; then echo "test"; fi
        if [ -z "$KERN_REL" -o "x$KERN_REL" = "x$KERN_VER" ]; then
            return 0
        fi
    fi
    printf "\nThe headers for the current running kernel were not found. If the following\nmodule compilation fails then this could be the reason.\n"

puis je l’ai fait exécuter, et le résultat est sans appel :

$ ./LinuxAdditionsmod 
4.19.208
x4.19.208
x4.19.0-18-686

The headers for the current running kernel were not found. If the following
module compilation fails then this could be the reason.

Pour ne pas mourir idiot, j’ai ensuite tapé

$ uname -r
4.19.0-18-686

En résumé,

echo "$KERN_REL"  -->  4.19.208 généré par make
echo "x$KERN_REL" --> x4.19.208 idem
echo "x$KERN_VER" --> x4.19.0-18-686 

donc normal que le test échoue, normal du coup que les additions ne s’installent pas.

Comment corriger ça ? (je n’ai pas trouvé de Makefile…)

Si ça ne marche pas c’est que tu t’es violement planté, car ça marche facilement.

Où peut-on bien se planter dans ce genre de manip où il y a mille tutos qui disent tous la même chose ?
Je suis tout prêt à admettre que je me suis planté, mais qu’on me dise où ça coince car moi, le nez sur le guidon, je ne vois pas le paysage…

Tu as un kernel compilé à la main actif dans ta configuration?

C’est possible, pour cette machine.
Me souviens plus précisément, et la machine en question dort, tout comme le host dont elle dépend.
On verra ça domani !

Et la réponse est « non ». Kernel pur jus du paquet Debian.
Pour les machines virtuelles de test, j’essaie de rester au plus près des fichiers originaux.

On est donc pas plus avancé : tout vient des paquets, et le script se vautre…
Mais j’ai une piste, pifométrique : en examinant les paquets installés avec le mot-clé « kernel » dans synaptic, je remarque un paquet linux-config-4.19 dont la colonne « Version installée » me montre la valeur 4.19.208-1, valeur qui a fait échouer le test du script que j’ai signalé et donc l’install des GA.
Ai-je besoin de ce paquet ? L’avez-vous dans vos machines ? En tout cas, je ne l’ai pas dans une autre machine, qui va bien (mais ce n’est pas le même host).
Et sa suppression risque de ne pas régler le problème, puisque mon script de test échoue tout autant…
Merci,

EDIT : une install ça va vite, et un échec sur une install encore plus vite, donc voilà : ça a échoué.
Il me resterait une option, mais je la sens mal : désinstaller les paquets -686 et prendre les paquets -pae. Possible ou catastrophe à venir ?

Bonjour,

comme j’ai du temps à perdre et que j’aime perdre mon temps, j’ai pris un dd virtuel qui avait déjà une buster depuis un iso de chez debian.org, et j’ai fait ça :
— install de mc
— edit de /etc/apt/sources.list
apt update
apt dist-upgrade
apt install wget
wget de la clé VBox
apt install make gcc dkms linux-source linux-headers-$(uname -r)
— aucune erreur alors un reboot pour marquer le coup et la prise en compte de tout ça, puis
— menu Périphériques de la mv, « Installer les additions… »
cd /media/... puis
sh VBoxLinuxAdditions.run, des lignes Verifying Copying Installing Removing Building… et bim !,
The headers for the current running kernel were not found.

Y a qqchse de pourri au royaume de l’informatique…

Je recommencerai, mais pas aujourd’hui, plus le temps.

il te faut les headers pour TOUS les linux-images installés sur ta machine.

Donc si tu as plusieurs versions, soit tu fais le menage soit tu installe TOUS les linux-headers de TOUS les linux-images.

Il n’y a rien de pourri dans le royaume, c’est juste le roi qui n’a pas tout compris.

Mais je n’ai qu’une version, la dernière, après apt update puis apt dist-upgrade, et ensuite je fais un peu le ménage mais des fois je tremble car l’aide, euh…

Le roi il suit les tutos de VirtualBox et les man de Debian…

que donne :

dpkg --list | grep -i 'linux-'

Bonjour,

Désolé pour le retard à répondre mais j’ai dû m’absenter depuis le début d’après-midi hier.

J’avais déjà fait ce genre de vérif’, et ça donne ça (un poil édité pour une meilleure lisibilité) :

# dpkg --list | grep -i 'linux-'
ii  binutils-i686-linux-gnu          2.31.1-16    i386   GNU binary utilities, for i686-linux-gnu target
ii  util-linux-locales               2.33.1-0.1   all    locales files for util-linux
ii  firmware-linux-free              3.4          all    Binary firmware for various drivers in the Linux kernel
ii  linux-base                       4.6          all    Linux image base package
ii  linux-compiler-gcc-8-x86         4.19.208-1   i386   Compiler for Linux on x86 (meta-package)
ii  linux-config-4.19:i386           4.19.208-1   i386   Debian kernel configurations for Linux 4.19
ii  linux-headers-4.19.0-18-686      4.19.208-1   i386   Header files for Linux 4.19.0-18-686
ii  linux-headers-4.19.0-18-686-pae  4.19.208-1   i386   Header files for Linux 4.19.0-18-686-pae
ii  linux-headers-4.19.0-18-common   4.19.208-1   all    Common header files for Linux 4.19.0-18
ii  linux-image-4.19.0-18-686        4.19.208-1   i386   Linux 4.19 for older PCs (signed)
ii  linux-kbuild-4.19                4.19.208-1   i386   Kbuild infrastructure for Linux 4.19
ii  linux-libc-dev:i386              4.19.208-1   i386   Linux support headers for userspace development
ii  linux-source-4.19                4.19.208-1   all    Linux kernel source for version 4.19 with Debian patches

Merci…