Depuis quelques mois (septembre dernier, pour être précis), je me suis plongé dans les questions de supports de données anciens – par un concours de circonstances. Et je me demande pourquoi nous n’avons pas commencé par cela. C’est tellement la quintessence de l’activité de préservation numérique, ça combine tellement de problématiques concrètes liées à la matérialité du numérique et à l’obsolescence logicielle et matérielle, tout fait sens, tout à coup, dans ce qu’on a appris. Et puis c’est visuel, c’est beaucoup plus simple à montrer et ça associe des outils particuliers et concrets à notre identité professionnelle.

J’ai donc commencé petit, en évoquant les disquettes ZIP, lorsque mes collègues de la TIB en avaient sous la main. Facile : un lecteur ZIP USB, quelques outils de création d’image disque, quelques utilitaires de restauration de fichiers supprimés. Puis j’ai tenté le disque dur interne – il fallait ouvrir le ventre d’une unité centrale, démonter le disque, retrouver un câble avec une interface IDE/PATA. Rien de très sorcier non plus, mais j’allais un peu plus loin dans l’expérimentation et dans des outils de digital forensics.

En parallèle, dans le petit monde de la préservation numérique, on s’est mis à parler pas mal de disquettes. Jusqu’à présent, c’était un domaine de niche, même au sein de la préservation numérique. Et puis, au début de cette année, la DPC a proposé plusieurs événements autour du traitement des disquettes, et a également publié un guide, joliment intitulé Copy that Floppy !1, écrit par Leontien Talboom, sur ce sujet2. L’objectif de Leontien est de démystifier ce savoir-faire, assez peu répandu dans les bibliothèques et archives : dans la plupart des cas, l’opération est simple. (Mais l’expérience apprend vite que, dans une minorité de cas, elle peut se révéler beaucoup plus délicate.)

Le guide prend acte du fait qu’une communauté a déjà ces compétences – et bien plus encore – et c’est celle de la rétro-informatique. Comme il s’agit surtout de hobbyistes, et non de professionnels, leur savoir-faire, bien que très conséquent, n’est pas très formalisé. Le travail de recueil et de compilation est donc fondamental. Je sais, c’est difficile d’accepter qu’on doive apprendre notre métier de gens qui l’ont développé comme loisir, mais c’est un fait.

Rentrons dans le vif du sujet donc. Le cas le plus simple que vous pouvez rencontrer est le suivant :

  • La disquette est de format 3 pouces et demi
  • Elle est propre et en bon état,
  • Elle est double face, haute densité (ça c’est le format physique), et au format DOS/IBM (ça c’est le format logique), et a donc une capacité de 1440 kibioctets – ou, à la rigueur, 720 kibioctets (si vous ne savez pas ce que c’est qu’un kibioctet, allez lire ce billet de Grisebouille, surtout la dernière case, qui montre que les fabricants de disquettes ont décidé de mixer les kilooctets et les kibioctets pour bien perturber tout le monde).

Dans ce cas précis, il est possible de se contenter d’acheter un lecteur de disquettes USB externe et d’espérer que ça marche. Il vaut mieux éviter les lecteurs récents, qui sont faits pour des usages très occasionnels de récupération de souvenirs oubliés, parce qu’ils ont des composants de très mauvaise qualité. Les lecteurs USB du début des années 2000 sont généralement plus fiables, et certaines marques, comme TEAC, sont souvent recommandées pour leur solidité.

Un lecteur de disquettes externe TEAC FD-05PUB
Un lecteur de disquettes externe TEAC FD-05PUB

Le lecteur USB est cependant limité dans ses fonctionnalités : il reste moins robuste qu’un lecteur interne des années 1990 qui est conçu pour un usage intensif. Il est incapable de lire des disquettes d’un format logique autre qu’IBM 1440/720 (eh oui, il existe vraiment BEAUCOUP de formats logiques différents, spécifiques à la machine qui a écrit la disquette !) et enfin, selon Leontien, il peut lui arriver de ne pas respecter le blocage physique en écriture.

Photo du volet de protection et de sa légende : quand le volet est à droite et laisse voir le trou dans la disquette, il est protégé. Quand le volet occulte le trou, il est possible d'écrire sur la disquette.
(Vous savez, le petit bouton carré qu’on glisse pour protéger l’écriture de la disquette, oui, ça voilà.)

La conséquence, c’est que la meilleure solution reste d’acquérir un lecteur d’époque, les câbles adaptés, et un contrôleur de lecteur (floppy controller), qui servira à piloter un lecteur physique, puisque les ordinateurs modernes ont abandonné cette compétence. Cette solution s’avère beaucoup plus polyvalente et robuste.

  • Le lecteur : pas trop difficile à trouver sur leboncoin ou ebay, ou dans les fonds de placard d’à peu près n’importe qui. Personnellement, j’en ai réuni quatre, et le constat c’est que tous ne se valent pas. Ils ont des performances variables sur certains types de disquettes. Donc si vous en avez plusieurs vous pouvez les essayer sur la même disquette et prendre le résultat le plus satisfaisant (oui parce que les contrôleurs vous donnent un pourcentage de lecture de secteurs, mais on verra ça un peu plus loin).
  • Des câbles : il vous faut une nappe 34 pins (ribbon cable en anglais, si vous devez chercher ça sur ebay) et un câble d’alimentation Berg 5 volts – cet ensemble, standardisé, est appelé une interface Shugart.
  • Un contrôleur de lecteur de disquettes : il y en a plusieurs différents (Leontien en fait une liste complète ici) mais la Greaseweazle a l’avantage d’être libre, compatible avec les formats physiques de disquettes 3.5, 5.25 et 8 pouces, et très facile à trouver pour quelques dizaines d’euros. Si vous optez pour la Greaseweazle, il vous faudra aussi un câble USB-C pour la connecter à votre ordinateur – attention de bien prendre un câble qui fait du transfert de données et pas seulement de l’alimentation.
  • Un logiciel : personnellement, j’utilise l’interface en ligne de commande de la Greaseweazle, mais il existe des interfaces graphiques développées par des tiers comme HamsterWeazle ou la GreaseweazleGUI. L’outil FluxEngine est compatible avec la Greaseweazle, ce qui est également pratique car les résultats de lecture varient aussi d’un logiciel à l’autre.

Pour la suite de ce billet, je vais vous montrer ce que j’ai appris dans les quelques cas que j’ai rencontrés avec l’équipement décrit plus haut. Contrairement aux guides Copy that floppy!3 déjà cité et A Guide to Imaging Obscure Floppy Disk Formats, je vais parler de manière très concrète de matériels et logiciels particuliers et de leur utilisation, et aborder des questions que je me suis posé à la suite de la lecture de ces guides, une fois placé devant mon matériel tout neuf. Par ailleurs, je sais bien que les lignes de commande de la Greaseweazle qui figurent ci-dessous ne répondront pas à tous les cas de figure. Mais d’abord je fais ce que je veux (c’est mon blog, na) et ensuite je pense que cela a un effet positif parce que ça permet d’illustrer mon propos et de constater que la capacité à accéder ou non aux données découle directement de la connaissance des supports.

J’ai pu comparer les performances du lecteur USB et de la Greaseweazle plus un lecteur interne : sur les quatorze disquettes usagées qui m’ont été livrées avec un des lecteurs internes, le lecteur USB a pu en lire sept. La Greaseweazle, elle, a pu en sauver treize. Et pourtant, les disquettes n’étaient pas d’un format logique atypique : uniquement IBM 1440, IBM 720 et Mac 800.

Voici donc mon outil de travail mis en place :

L'ordinateur connecté à la Greaseweazle (la petite boîte noire), elle-même connectée à un lecteur interne avec une nappe grise et un connecteur Berg noir, jaune et rouge.
L’ordinateur connecté à la Greaseweazle (la petite boîte noire), elle-même connectée à un lecteur interne avec une nappe grise et un connecteur Berg noir, jaune et rouge.

On va donc commencer avec le cas le plus simple : les « micro-diskettes »4 double face haute densité (DSHD), On voit également les termes « MF2HD », ou « MF2-HD » ou encore « MF-2HD » (« MF » signifie Micro Floppy), mais aussi « MC2HD », qui indiquent tous le même format physique. C’est le format que vous connaissez, celui dont la capacité est souvent notée « 1.44 MB ». Le formatage logique est indiqué « IBM-formatted » ou « DOS-formatted ».

Différentes disquettes IBM 1440.
Différentes disquettes IBM 1440.

Les disquettes double face double densité (DSDD, ou MFD-2DD) sont également très courantes. Elles ont une capacité de 720 KB lorsqu’elles sont formatées IBM.

Trois disquettes IBM 720.
Trois disquettes IBM 720.

Notez que la capacité est parfois notée avant formatage logique, donc on peut trouver des disquettes indiquant une capacité de 2.0 MB (haute densité) ou de 1.0 MB (double densité)5.

Une disquette de l’un de ces deux types est organisée en deux faces comprenant chacune 80 pistes6 concentriques, la piste 0 est la plus à l’extérieur, la piste 80 est la plus proche du centre. En outre, chaque piste est fractionnée en neuf (double densité) ou dix-huit (haute densité) « secteurs ». Je n’irai pas plus loin sur l’anatomie d’une disquette, et j’avoue c’est un peu difficile à se représenter sans visuel, mais vous devriez arriver à vous y retrouver en consultant notamment cette page ou ce schéma sur Wikimedia Commons – ou tout autre source, il y en a des quantités en ligne.

Lecture selon un format logique particulier

Lorsque lisez une disquette, les têtes de lecture (une par face, dans le cas le plus courant) se déplacent, piste par piste, pour lire l’ensemble des données présentes. Dans l’extrait vidéo suivant, on voit comment les têtes de lecture se déplacent pour passer de la piste 0 à la piste 40, puis à la piste 807.

Un lecteur de disquettes ouvert. On y voit la tête de lecture supérieure se déplacer deux fois vers le centre de la disquette, avec un bourdonnement.

Avec la ligne de commande suivante, il est possible de lire une disquette de ce type et d’en faire une image disque au format .img (c’est ce que j’utilise la plupart du temps)8 :

$ gw read --format ibm.1440 image.img
Le processus de lecture commence, on entend le lecteur produire un « clic » à chaque fois qu’il passe d’une piste à une autre. En parallèle, le terminal affiche une ligne par tentative de lecture d’une piste, et le nombre de secteurs lus.

(Je trouve ça important de vous faire entendre le bruit de la lecture. Au début c’est surprenant, et c’est difficile de savoir si ces clics sont normaux ou pas.)

Le lecteur lit les données par piste et secteur selon ce qu’il sait de la structure du format logique, puis calcule une somme de contrôle pour vérifier que les données sont intègres. L’avantage, c’est qu’il peut renvoyer le nombre de secteurs reconnus par piste et face. S’il n’arrive pas à lire tous les secteurs, il s’y reprend à plusieurs fois (en l’occurrence, dans l’exemple suivant, il retente trois fois – c’est le paramètre par défaut – la lecture de la piste 19, face 1) :

T19.1: IBM MFM (17/18 sectors) from Raw Flux (170086 flux in 400.78ms)
T19.1: IBM MFM (17/18 sectors) from Raw Flux (255030 flux in 600.93ms) (Retry #1.1)
T19.1: IBM MFM (17/18 sectors) from Raw Flux (255021 flux in 600.89ms) (Retry #1.2)
T19.1: IBM MFM (18/18 sectors) from Raw Flux (255039 flux in 600.92ms) (Retry #1.3)

S’il n’y arrive pas après un certain nombre de tentatives, il abandonne :

T56.1: IBM MFM (17/18 sectors) from Raw Flux (151539 flux in 400.82ms)
T56.1: IBM MFM (17/18 sectors) from Raw Flux (227212 flux in 600.93ms) (Retry #1.1)
T56.1: IBM MFM (17/18 sectors) from Raw Flux (227214 flux in 601.00ms) (Retry #1.2)
T56.1: IBM MFM (17/18 sectors) from Raw Flux (227219 flux in 601.03ms) (Retry #1.3)
T56.1: Giving up: 1 sectors missing

A la fin, il vous donne le nombre total de secteurs lus :

Found 2876 sectors of 2880 (99%)

… et surtout, une image disque de votre disquette, nommée “image.img” (ou le nom que vous lui aurez donné, bien sûr).

Accès aux fichiers

Pour accéder aux fichiers stockés sur le disquette, il suffit ensuite de monter le fichier « image.img » avec la commande mount, mais, si vous êtes sous GNU/Linux, vous pouvez aussi tout simplement double-cliquer sur le fichier et le système le monte comme un support de stockage physique.

Et si le format logique est inconnu ? – la capture du flux brut

Maintenant imaginons que nous avons tenté de lire une disquette comme si elle était formatée IBM, mais que ça ne marchait pas :

$ gw read --drive=1 --format=ibm.720 image.img
Reading c=0-79:h=0-1 revs=2
Format ibm.720
T0.0: IBM MFM (0/9 sectors) from Raw Flux (89808 flux in 400.76ms)
T0.0: IBM MFM (0/9 sectors) from Raw Flux (134639 flux in 600.88ms) (Retry #1.1)
T0.0: IBM MFM (0/9 sectors) from Raw Flux (134633 flux in 600.93ms) (Retry #1.2)
T0.0: IBM MFM (0/9 sectors) from Raw Flux (134625 flux in 600.90ms) (Retry #1.3)
T0.0: Giving up: 9 sectors missing
^C

Là, l’outil nous indique qu’aucun secteur n’est reconnu. Si vous ne savez pas sur quelle machine la disquette a été créée, donc quel est son formatage logique, il faut faire une capture brute :

$ gw read –raw image00.0.raw
Reading c=0-81:h=0-1 revs=3
T0.0: Raw Flux (255206 flux in 613.00ms)
T0.1: Raw Flux (339545 flux in 733.59ms)
T1.0: Raw Flux (299679 flux in 710.58ms)

Dans ce cas, vous êtes un peu au jugé : il lit chaque piste sans vérifier que ce qu’il capture a du sens ou pas. Aucune nouvelle tentative donc. Chaque piste sera enregistrée dans un fichier .raw dédié9, donc vous aurez 82 (nombre de pistes maximal pour une disquette 3 pouces 1/2) * 2 (nombre de faces) = 164 fichiers, pour un poids total de plusieurs dizaines de mégaoctets10 !

Analyse visuelle

On peut alors glisser le premier des fichiers RAW obtenus dans l’outil HxC – HxC est un autre projet logiciel, couplé à un matériel d’émulation de lecteur de diquettes, mais qui peut s’utiliser seul. Il suffit de lancer l’interface graphique, puis de faire glisser une image (le fichier .scp ou le premier fichier .raw) sur l’interface, et enfin de cliquer sur « Track Analyzer » pour obtenir une vue des données. Ici, l’analyse avec un encodage MFM (l’encodage utilisé par toutes les disquettes IBM 720 et 1440 kio) ne donne rien (les zones où des secteurs ont été reconnus devraient apparaître en vert) :

Une capture d'écran de la fenêtre "Track Analyzer" de l'outil HxC. Lorsque l'option "MFM" est cochée, on ne voit que des zones rouges (erreurs de lecture) et des zones bleues (données non reconnues) sur la représentation visuelle des deux faces de la disquette.
Une capture d’écran de la fenêtre « Track Analyzer » de l’outil HxC. Lorsque l’option « ISO MFM » est cochée, on ne voit que des zones rouges (erreurs de lecture) et des zones bleues (données non reconnues) sur la représentation visuelle des deux faces de la disquette.

En revanche, si on décoche « ISO MFM » dans le menu de droite, et qu’on sélectionne « Apple », ça commence à faire sens !

Même fenêtre que précédemment, mais au lieu de "ISO MFM", c'est l'option "Apple" qui est cochée. Maintenant, des données lues en vert sont affichées à la place des zones bleues.
Même fenêtre que précédemment, mais au lieu de « ISO MFM », c’est l’option « Apple » qui est cochée. Maintenant, des données lues en vert sont affichées à la place des zones bleues.

Voilà qui peut aider à identifier le format de la disquette, mais aussi des problèmes de saleté ou d’altération, comme dans l’image ci-dessous :

Une autre disquette analysée par HxC. La majorité des secteurs sont verts, mais sur la face 1 (la seconde, puisque la première est la face 0), une zone est rouge.
Une autre disquette analysée par HxC. La majorité des secteurs sont verts, mais sur la face 1 (la seconde, puisque la première est la face 0), une zone est rouge.

Conversion du flux brut en une image dans un format logique

Désormais, vous savez, grâce à l’interprétation du flux brut par HxC, qu’il s’agit d’une disquette Apple. Vous pouvez alors retransformer votre flux brut dans n’importe quel format logique – en l’occurrence, en mac.800 (la disquette Mac II double densité) :

$ gw convert --format mac.800 image00.0.raw image.img
Format mac.800
Converting c=0-79:h=0-1 -> c=0-79:h=0-1
T0.0: Macintosh GCR (12/12 sectors) from Raw Flux (46443 flux in 200.01ms)
T0.1: Macintosh GCR (12/12 sectors) from Raw Flux (49782 flux in 200.01ms)
T1.0: Macintosh GCR (12/12 sectors) from Raw Flux (52419 flux in 200.01ms)

Notez qu’il suffit de donner à l’outil le nom du premier fichier RAW, et il devinera qu’il doit aller chercher les suivants selon leur nommage.

Reprise d’une lecture problématique

Maintenant mettons que vous avez correctement identifié le format logique de la disquette, mais que vous arrivez à un pourcentage de lecture un peu trop bas – 81 %, par exemple. Je vous recommande, là aussi, de faire une lecture brute, puis de cibler des pistes spécifiques en demandant au lecteur de faire davantage d’efforts avec les options --revs (pour « revolutions ») et –retries. Par exemple, si les pistes 0 et 1 de la face 1 ont été mal lues, vous pouvez retenter la lecture de la manière suivante :

$ gw read --revs=10 --retries=6 --format ibm.1440 --tracks=c=0-1:h=1 retry00.1.raw

Si vous arrivez de cette manière à lire davantage de secteurs, vous pouvez remplacer la précédente lecture des pistes par la nouvelle.

Création de journaux de lecture (logs)

Un autre truc que je trouve important, c’est la possibilité d’enregistrer le journal (log) de votre capture, avec les données des pistes elles-mêmes. Ainsi, si par la suite vous vous apercevez que vous auriez pu vous y prendre autrement, vous pouvez comparer le résultat de vos deux lectures. Pour cela, il faut utiliser la commande tee, qui redirige vers un fichier le retour de l’outil mais l’affiche aussi dans le terminal11 :

gw read --format ibm.1440 image.img 2>&1 | tee log.txt

Conclusion

Bon, le sujet, même pour le traitement de disquettes aussi « simples » qu’IBM 1440, n’est pas clos – il faudrait encore parler du nettoyage du lecteur et des disquettes, mais je pense que ce billet est déjà bien trop long. On va donc s’arrêter là pour cette fois-ci. Pour aller plus loin, le tutoriel de Yann Serra sur la Greaseweazle est vraiment bien. Mais j’essaierai de vous illustrer tout cela dans des billets à venir. Le prochain sera consacré à la mise en application pour lire le seul jeu vidéo auquel j’ai pu jouer entre mes dix et douze ans – pauvre de moi –, et dont j’ai miraculeusement retrouvé une copie.

Quelle conclusion à tout ça ? Eh bien, que le traitement de supports anciens, c’est à la fois pas facile et vraiment passionnant. Ça nous confronte à la saleté, la dégradation, l’entropie, ça démystifie énormément le stockage numérique. Ça nous rappelle la fragilité extrême de ces supports, et la nôtre par la même occasion. Et je reviendrai là-dessus plus tard, mais ça met l’intégrité de l’information numérique au coeur de notre processus : il y a de multiples manières de copier des données, toutes ne sont pas équivalentes, et la réussite ou l’échec peut dépendre de multiples facteurs. Bref, ça rend la préservation numérique passionnante.

  1. La trouvaille du titre revient à Tyler Thorsted, en référence « Don’t copy that floppy ! », une pub de 1992 qui tentait de décourager les particuliers de copier les disquettes pour leur usage personnel. ↩︎
  2. Et le monde de la rétro-informatique en a parlé : https://2137.social/@13/116882105834185079. ↩︎
  3. Ce dernier annonce en effet : « This guide will not be a step-by-step demonstration of all the different tools and floppy controllers; this decision was made as the hardware and software around floppy controllers can change quite quickly. » ↩︎
  4. Les disquettes 8 pouces étaient appelées « diskettes ». Quand les disquettes 5 pouces 1/4 sont sorties, on les a appelées « mini-diskettes » et, logiquement, « micro-diskettes » les disquettes 3 pouces 1/2. Source : https://www.youtube.com/watch?v=QPFVfgaMv68&t. ↩︎
  5. Le formatage logique réduit l’espace disponible, puisqu’une partie de celui-ci est employé pour les besoins du système de fichiers. ↩︎
  6. Vous trouverez aussi le terme « cylindre » pour désigner une piste. ↩︎
  7. Cette opération est obtenue avec la ligne de commande suivante : gw seek 40. ↩︎
  8. Dans la vidéo, je suis obligé de spécifier le lecteur avec --drive=1 parce que ma nappe est plate. Si elle avait eu la torsion habituelle de ces nappes, ça n’aurait pas été nécessaire. Pour plus d’informations là-dessus, vous pouvez consulter cette page. ↩︎
  9. Il est aussi possible de demander que ce flux brut soit embarqué dans un fichier unique, au format scp : gw read --raw flux.scp ↩︎
  10. Ces fichiers enregistrent la totalité des bits lus sur un support, sans en interpréter le format, d’où leur taille. ↩︎
  11. Il faut spécifier 2>&1 pour que le flux d’erreur, qui est utilisé par la Greaseweazle pour renvoyer toutes les informations sur le processus en cours, soit traité. C’est un peu bizarre pour ce que j’en sais, mais c’est comme ça. ↩︎