Problème de géométrie (Debian 1.3 sur VirtualBox ≥ 7.1.2)

Divulgâchage : Comme toujours avec les tutoriels, il arrive un moment où une mise à jour casse tout. Il faut alors chercher d’où vient le problème et comment le corriger.

Il y a quelques jours, nous avons reçus le courriel d’un stagiaire en archéologie du numérique qui étudie les liens entre usages et technologies du passé (c.à.d. des années 90). Il n’arrivait pas à installer une Debian 1.3 dans une VM VirtualBox. Il avait suivi notre tutoriel pas à pas et rencontrait une erreur fatale dans l’étape de partitionnement ; le système indiquant être incapable de lire la géométrie du disque dur. Comment se fait-ce ?

TL;DR: La solution est à la fin de cette page.

Nous avons donc commencé par reproduire la situation. Sous Windows 10 (22h02) avec VirtualBox 7.1.6, nous effectuons les premières étapes du tutoriel sans problème jusqu’au partitionnement et là, c’est le drame…

Erreur fatale lors du partitionnement, impossible de lire la géométrie du disque.

Nous sommes plutôt sûrs de notre tutoriel car nous les testons toujours mais une erreur est peut être passée inaperçue dans celui-là… Alors on reprend une configuration d’origine (VirtualBox 6.0) et cette fois, tout passe sans aucun problème ; le système s’installe et fonctionne.

On aurait put s’arrêter là en répondant, comme l’aurait fait un service de support informatique : ça vient pas de chez nous. Après tout, ce n’est pas notre problème. Mais on est judokas ; Jita Kyoei. Après avoir répondu à notre lecteur, on a écrit cet article.

Recherches initiales côté VirtualBox

Au moment où on découvre le problème, inutile de chercher sur le net pour une solution ; nous ne sommes pas assez nombreux pour avoir rencontré cette erreur, pour l’avoir résolue et encore moins nombreux pour l’avoir documentée. Il va falloir chercher par nous même.

Et comme toujours, il y a plusieurs solutions potentielles. On sait d’avance que seules certaines marcherons mais pour savoir lesquelles, il faut les essayer. Voici une petite liste de choses que tbowan a tenté :

Comme vous vous en doutez, aucune de ces solutions n’a fonctionné. C’est normal et ça explique pourquoi il est toujours plus long de trouver une solution que de la mettre en œuvre (serait-ce un problème NP-complet ?).

En parallèle, Aryliin a cherché quelle version introduit le problème. Il y en a 53 publiées entre la 6.0 et la 7.1.6. Installations après installations, elle trouve finalement que c’est la 7.1.2 (publiée le 26 septembre 2024) qui est la première à ne plus supporter l’installation de Debian 1.3.

Le changelog ne mentionne rien concernant l’IDE ou la gestion des disques et pour trouver l’origine du problème, il faudrait donc chercher dans le code source… sauf qu’à un moment, il faut aussi savoir dire stop et passer à autre chose.

Recherches côté Debian

Plutôt que continuer à creuser côté Virtualbox, on s’est alors tournés vers Debian 1.3 et son processus d’installation. Et plus particulièrement cfdisk, l’outil qu’il utilise pour le partitionnement et qui affiche le message. Ça ne corrigera pas l’erreur mais au moins ça résoudra le problème.

Pour commencer, si vous tapez man cfdisk dans un moteur de recherche, vous pourriez tomber sur des pages de manuel (e.g. man-linux-magique.net ou linux.die.net) qui mentionnent cette géométrie et stipulent que cfdisk regarde d’abord la table de partition, puis demande au noyau, puis utilise des valeurs par défaut (255 têtes, 63 secteurs et calcule le nombre de cylindre d’après la taille). Sauf si vous lui fournissez des valeurs en ligne de commande (options courtes -c, -h et -s).

Mais sur une version plus récente, les choses sont différentes ; cfdisk ne gère plus ces options pour stipuler le nombre de cylindres, de têtes et de secteurs. Et pour cause, il ne gère plus du tout ce mode d’adressage :

Depuis la version 2.25, cfdisk […] ne fournit plus de fonctionnalité pour l’adressage CTS (cylindre tête secteur).

Karel Zak, traduction par Vincent Renardias et Jean-Luc Coulon (paquet manpages-fr-extra).

On peut pousser la curiosité en allant le vérifier dans le code source (dont le dépôt git est disponible en ligne ici) et, effectivement, avant la version 2.25-rc1 (juin 2014), ou plus précisément le commit 8c3a5a440 (mars 2014), la fonction decide_on_geometry() se chargeait de déterminer le nombre de cylindres, de têtes et de secteurs. Voici son code :

static void
decide_on_geometry(void) {
    heads = (user_heads ? user_heads :
         pt_heads ? pt_heads :
         kern_heads ? kern_heads : 255);
    sectors = (user_sectors ? user_sectors :
           pt_sectors ? pt_sectors :
           kern_sectors ? kern_sectors : 63);
    cylinder_size = heads*sectors;
    cylinders = actual_size/cylinder_size;
    if (user_cylinders > 0)
        cylinders = user_cylinders;

    if (cylinder_size * cylinders > actual_size)
        print_warning(_("You specified more cylinders than fit on disk"));
}

Mais était-ce le cas sur notre Debian 1.3 ? Cette fonction et son système de plans B sont apparus dans la version 2.9v (décembre 2006) et plus particulièrement lors du commit 7eda085c4. Il n’était donc pas présent à l’époque.

La version qu’on trouve sur la Debian 1.3 (e.g. via ce dépôt github) est plus sommaire. cfdisk interroge le noyau et utilise les valeurs retournées si d’autres n’étaient pas déjà fournies en ligne de commande. La fonction qui s’en charge, fill_p_info() est un peu longue. Voici les extraits qui nous intéressent :

#define BAD_GEOMETRY "Cannot read disk drive geometry"

/* ... */

void fill_p_info(void)
{
    /* ... */

    if (!ioctl(fd, HDIO_GETGEO, &geometry)) {
        if (!heads)
            heads = geometry.heads;
        if (!sectors)
            sectors = geometry.sectors;
        if (!cylinders)
            cylinders = geometry.cylinders;
    }

    if (!heads || !sectors || !cylinders)
        fatal(BAD_GEOMETRY);

    /* ... */
}

Lors de la rédaction de notre tutoriel avec VirtualBox 6.0, le noyau Linux arrivait à interroger le matériel pour trouver le nombre de cylindres, de têtes et de secteurs et cfdisk pouvait utiliser ces valeurs pour partitionner le disque.

La mise à jour de VirtualBox 7.1.2 a donc introduit un changement de comportement du matériel virtuel qui empêche Linux de trouver la géométrie du disque. cfdisk se retrouve avec des valeurs nulles et, ne sachant pas comment poursuivre, nous affiche un message d’erreur.

Heureusement pour nous, cette version historique de cfdisk accepte de prendre des options pour spécifier la géométrie. Ne reste donc plus qu’à trouver un moyen de passer ces options lors de l’installation de Debian 1.3.

Et ça tombe bien, l’installateur fourni, à chaque étape, la possibilité d’exécuter une invite de commande temporaire. Lors du partitionnement, nous utilisons cette possibilité pour lancer cfdisk en ligne de commande. En quittant l’invite de commande, nous revenons à l’installeur et pouvons poursuivre avec les autres étapes.

On vérifie que ça marche (c’est le cas) et on répond rapidement au stagiaire qui nous valide que ça a résolu de son côté aussi. On peut commencer à rédiger un article tranquillement.

Tentatives finales sur Virtualbox

Pendant qu’on rédigeait, nous avons été recontacté par le stagiaire qui, à force d’autres tentatives, avait fini par trouver une solution qui marche avec un disque de 1Go (ce qui nous étonne puisque nous avons fait ce test).

Puisqu’il nous envoie gentiment son OVA, nous pouvons tester (elle marche) et, paramètre après paramètre, changer les nôtres et tester pour voir lequel fait la différence…

Jusque là, ça ne marche pas. Jusqu’à ce qu’on arrive sur le contrôleur SATA. Il n’est pas nécessaire et pas utilisé puisqu’aucun disque ou lecteur n’est branché dessus mais nos VM en ont un (par défaut) et la sienne n’en a pas.

On supprime ce contrôleur inutile, et là, ça marche 🎉 On remet les autres paramètres à nos valeurs (processeurs, IO ACPI, RAM et CD-ROM) et ça marche. On teste alors avec d’autres tailles de disques et ça passe à chaque fois (mais avec un disque de 20 Go, cfdisk n’en verra que 8 car c’est le maximum avec ce type de géométrie cylindre/tête/secteur). C’est bien la présence du contrôleur SATA qui pose problème.

Par contre, pourquoi ce changement avec Virtualbox 7.1.2 ? mystère.

Résolution

Nous avons donc deux solutions indépendantes pour pouvoir installer une Debian 1.3 dans un Virtualbox ≥ 7.1.2.

Côté Virtualbox

Une fois la machine virtuelle créée, aller dans les paramètres, puis dans ceux du stockage, cliquer sur le contrôleur SATA et le supprimer (icone en bas de la liste avec la croix rouge).

Côté Debian

Pour installer Debian 1.3, au moment du partitionnement, il faut choisir Execute a Shell (en bas de la liste) et une fois dans cette invite de commande, lancer la commande cfdisk avec les paramètres de géométrie de votre disque. Voici un exemple pour un disque de 8Go :

cfdisk -c 1024 -h 255 -s 63
Exécuter un shell puis lancer cfdisk manuellement.

Le partitionnement se fait comme d’habitude et une fois qu’on a écrit les partitions et quitté cfdisk, il faut quitter l’invite de commande (avec la commande exit). L’installeur reprend alors la main et on peut poursuivre le tutoriel.

Et après ?

Après avoir trouvé la solution, nous nous sommes demandé comment s’en seraient sorties ces IA génératives révolutionnaires qui vont sauver le monde…

Après leur avoir dit que nous suivions tel tutoriel, qu’il s’agissait d’installer une Debian 1.3 dans un VirtualBox, et donné le message d’erreur, voici les solutions qu’elles nous ont proposé :

On a pu, parfois, comparer ces IA avec des stagiaires qui savent rien faire. Et bien nous prouvons aujourd’hui, par l’exemple, qu’elles valent même pas un stagiaire. Puisque le stagiaire, lui, a trouvé une solution (contacter les arsouyes supprimer le contrôleur SATA).

La conclusion de cet article est simple : si vous voulez sauver le monde, recrutez des stagiaires.