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…

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é :
- Changer le format du disque. Si ça se trouve, c’est le format VDI qui n’est plus géré pareil qu’avant. Il y a eu un bogue à propos de géométrie il y a quelques temps (cf. #2251), peut être qu’en changeant de format de disque ça passera mieux…
- Changer la taille du disque. Les coordonnées Cylindre/Tête/Secteur permettent d’adresser jusqu’à 8Go (ou 7.8Gio), essayons avec un disque plus petit… (et plusieurs formats).
- Changer la géométrie du disque. L’outil
vbox-img
et sa commandegeometry
permet de lire et d’écrire la géométrie des disques virtuels. On constate qu’elle vaut 0/0/0 pour les disques d’au moins 8Go, peut être qu’en écrivant une valeur conforme, ou une valeur plus petite… - Changer le type de contrôleur IDE. Le tutoriel utilise PIIX4 mais un des 10 autres pourrait ne pas avoir le problème spécifique…
- Changer le type de carte mère. Comme elle fait le lien entre les périphériques, peut être que ça vient de là ?
- Changer l’OS hôte. Et si plutôt qu’un Windows 10 on utilisait une Ubuntu 22.04 ou une Debian 12 ?
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
(void) {
decide_on_geometry= (user_heads ? user_heads :
heads ? pt_heads :
pt_heads ? kern_heads : 255);
kern_heads = (user_sectors ? user_sectors :
sectors ? pt_sectors :
pt_sectors ? kern_sectors : 63);
kern_sectors = heads*sectors;
cylinder_size = actual_size/cylinder_size;
cylinders if (user_cylinders > 0)
= user_cylinders;
cylinders
if (cylinder_size * cylinders > actual_size)
(_("You specified more cylinders than fit on disk"));
print_warning}
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)
= geometry.heads;
heads if (!sectors)
= geometry.sectors;
sectors if (!cylinders)
= geometry.cylinders;
cylinders }
if (!heads || !sectors || !cylinders)
(BAD_GEOMETRY);
fatal
/* ... */
}
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…
- Nombre de CPU : de 2 on passe à 1,
- Activation de l’IO ACPI : on la désactive,
- RAM : on passe de 2048 Mo à 16 Mo,
- Branchement du CD-ROM : d’esclave primaire, on le passe en maître secondaire.
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

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é :
- Configurer les disques en IDE. Genre c’est pas déjà ce qu’on a fait ?
- Utiliser une machine virtuelle. Genre c’est pas déjà ce qu’on vient de faire ?
- Utiliser des disques IDE. Heu, on vient de dire que c’est déjà le cas…
- Installer une distribution plus récente. On rate un peu l’objectif d’archéologie expérimentale si on met une Debian 13…
- Plutôt que SATA, utiliser de l’IDE. Est-ce que ces IA lisent nos réponses ?
- Passer l’installeur en mode expert. Ce mode n’existe pas, installer GNU/Linux en 97, c’est déjà une mode d’expert.
- Brancher le disque en IDE. Je crois qu’on a compris l’ID(É)E…
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.