2022/11/06

Sauvegarder, charger et écrire une image de disque dur avec dd, losetup et mount

Après IBM 560Z, SSD M.2 NGFF et FreeDos 1.3, j'ai continué à pousser un IBM 600X (Pentium III 495? MHz 576 MB de RAM, disque dur de 20Go) à ses limites.

L'ordinateur fabriqué en 1999 a un lecteur disque et deux ports PCMCIA et est venu avec Windows 2000 Professionnel. J'ai utilisé une carte Wifi PCMCIA D-Link et je me suis connecté à mon réseau local pour atteindre internet pour installer Debian 9.13.0 i386.

J'allège le texte en assumant que vous savez certaines choses. Si quelque chose n'est pas clair, allez voir les notes supplémentaires plus bas.

Étapes:

1. Sauvegarder le vieux disque dur mécanique de 20Go.

2. Monter l'image dans un autre ordinateur pour l'inspecter.

3. Mettre l'image sur le nouveau SSD. Attention! Il doit être déjà initialisé.

4. Installer Debian 9.13.0 i386. 


Étape 1 : Sauvegarder le vieux disque dur mécanique de 20Go.

On garde le disque dur dans le portable. On met le CD de Damn Small Linux dans le lecteur CD. On ouvre un terminal, on sudo su pour avoir les privilèges administrateurs (root).

On utilise un disque dur externe qu'on peut connecter avec un fil micro USB. Même un disque dur externe récent USB3.0 devrait supporter micro USB et fonctionner dans un ancien mode USB.

Utiliser fdisk -l pour s'assurer que le disque USB est reconnu et pour s'assurer que le disque dur est présent. Le disque dur était à /dev/hda pour moi et le disque USB était à /dev/sda et la partition ext2 à /dev/sda1. Tout ça peut changer selon votre matériel.

Il faut monter le disque USB avec mkdir mon_dossier et mount /dev/sda1 mon_dossier.

Entrer dd if=/dev/hda of=./mon_dossier/600x1.dd conv=sync,noerror bs=65536. Pourquoi bs=65536? Initialement, j'ai eu des  problèmes à copier à partir d'un adapteur IDE à USB semi-défectueux. Je suis seulement capable d'initialiser de nouveaux disques avec. J'ai ensuite réalisé que je pouvais utiliser un disque USB moderne et j'ai gardé cette même valeur. La sauvegard m'a pris environ 9 heures 30 minutes.


Étape 2 : Inspecter l'image.

Avec fdisk -l, on peut voir les détails de l'image faite avec dd. Les détails devraient être très similaires à ce qu'on voit pour le disque dur d'origine. Voici un exemple :

# fdisk -l 600x1.dd
Disk 600x1.dd: 18.63 GiB, 20003880960 bytes, 39070080 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x899e899e

Device     Boot Start      End  Sectors  Size Id Type
600x1.dd1  *       63 39070079 39070017 18.6G  c W95 FAT32 (LBA) 

On voit que les secteurs sont de 512 octets. On voit la taille de la première partition et son format de fichier. Je voyais le même arrangement au niveau binaire pour le disque dur. On calcule le début de la partition avec 63 x 512 = 32256 octets à partir du début de l'image. La grandeur de la partition est de 39070017 x 512 = 20003848704 octets.

Ensuite, on utilise losetup -v -r -f -o 32256 --sizelimit 20003848704 600x1.dd. La partition FAT32 dans l'image sera montée dans un des répertoires /dev/loop. Pour trouver lequel, losetup -r -f --show 600x1.dd. Dans mon cas, c'était /dev/loop0 c'est ce que j'utilise dans les commandes suivantes. À vous d'ajuster!

Ensuite, on utilise mkdir mon_dossier_2 et mount /dev/loop0 mon_dossier_2 pour monter la partition.

 Si vous vous retrouvez avec une erreur du genre «wrong fs type, bad option, bad superblock on /dev/loop5, missing codepage or helper program, or other error», ça m'est arrivé lorsque je suis passé en mode root avec su - et j'ai réglé mon problème en repassant à mon utilisateur normal et en utilisant sudo pour rouler la commande. Si ça ne fonctionne toujours pas, sudo losetup -l pour voir la liste des loop devices. Peut-être que votre image a été montée plusieurs fois. Ça semble être un bogue. On peut essayer de monter la première loop dev dans ce cas et ça a fonctionné pour moi. Exemple d'une partition montée 3 fois:

NAME        SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                                                        DIO LOG-SEC
/dev/loop1 7920912384  32256         0  1 /media/user/image.dd   0     512
/dev/loop2          0      0         0  1 /media/user/image.dd   0     512
/dev/loop0 7920912384  32256         0  1 /media/user/image.dd   0     512

On peut vérifier que quelques fichiers sont présents et c'est assez. On peut aussi faire des recherches avec un script (voir la section des notes supplémentaires). On peut ensuite démonter l'image avec umount /dev/loop0 et losetup -d /dev/loop0.


Étape 3 : Écrire l'image sur le nouveau SSD.

Il suffit d'éteindre le portable, de retirer le disque dur mécanique original et d'insérer le disque IDE avec un SSD M.2 sur lequel on écrira l'image. Une fois le SSD installé, dd if=./mon_dossier/600x1.dd of=/dev/hda conv=sync,noerror bs=65536. Cette partie a pris 8 heures environ pour se compléter.

 

Étape 4 : Installer Debian 9.13.0 i386

Pourquoi Debian 9.13.0? Son support s'est arrêté en juin 2022. Il dispose the paquets suffisamment récents pour être intéressant à utiliser. Il s'installe contrairement à Debian 11.5 qui « panique ». 

Il faut partitionner manuellement le disque parce que le partionnement guidé échouera avec une erreur qui indiquera qu'on essaiera de lire à l'extérieur de hd0. J'utilise un SSD de 500 Go ici. Le fait qu'un disque dur IDE soit de 500 Go sur un IBM 600X doit confondre le programme guidé qui a rarement vu une telle configuration probablement. On évite facilement cette situation en créant :

1. Une partition primaire de 1024 Mo avec le point de montage /boot et le drapeau d'amorçage (boot flag).

2. Une seconde partition primaire de 65 536 Mo avec le point de montage /. C'est la racine du disque et c'est là que le système d'exploitation sera installé.

3. Une dernière partition logique de 5120 Mo utilisé pour la zone d'échange mémoire (swap area). 

Durant l'installation, grub2 sera installé. Il détectera automatiquement Windows 2000 et à la fin de l'installation de Debian après avoir redémarré l'ordinateur, Windows 2000 sera disponible au côté de Debian dans le menu de chargement au tout début du démarrage après l'écran du BIOS.


Notes supplémentaires

Pour initialiser le nouveau disque dur, j'ai utilisé Windows 10. Clic-droit sur le menu démarrer et ouvrir le gestionnaire de disques. Ensuite clic-droit sur le nouveau disque et initialiser. Choisir MBR pour une plus grande compatibilité avec de vieux ordinateurs.

J'ai utilisé une partition ext2 pour être certain d'être compatible avec DSL qui est vieux de plusieurs années et la sauvegarde s'est bien passée. J'ai créé et formatté la partition avec GParted dans Debian 11.5 AMD 64.

À l'étape de l'inspection, si vous avez copié l'image sur un autre ordinateur plus performant (j'utilisais mon Debian 11.5 AMD 64 pour cette étape) je vous conseille le script suivant si vous vous y connaissez un peu avec python.

from datetime import datetime
import glob
import os
from pathlib import Path
import shutil

type_fichier = input("Entrer un type de fichier: ")
maintenant = datetime.now().isoformat()
dossier = Path(f"{maintenant}_{type_fichier}")
os.mkdir(dossier)
with open(f"{maintenant}_resultat_recherche_{type_fichier}.txt", "a+", encoding="utf-8") as resultats:
    resultats.write(f"Résultats pour destination {dossier}:")
    for chemin in glob.glob(f"./monter/**/*.{type_fichier}", recursive=True):
        chemin = Path(chemin)
        print(chemin)
        fichier_final = dossier / chemin.name

        compte = 1
        while fichier_final.exists():
            fichier_final = dossier / (str(compte) + chemin.name)
            compte += 1

        shutil.copy2(chemin, fichier_final)
        resultats.write(f"{chemin}, {fichier_final}")

Il permet de facilement de trouver et copier des jpg ou des gif ou tout autre type de fichier qui vous intéresse. Dans une vieille installation de Windows, on peut en sortir les vieux fonds d'écrans!


Liens externes qui m'ont aidés (en anglais) :

1. Pour comprendre losetup, les décallages dans les images disques et monter les bonnes partitiions: https://www.suse.com/c/accessing-file-systems-disk-block-image-files/
2. Plus de détails sur l'erreur de grub rescue. https://copyprogramming.com/tutorial/what-to-do-when-i-get-an-attempt-to-read-or-write-outside-of-disk-hd0-error-and-boot-repair-does-not-solve-the-problem

Aucun commentaire:

Publier un commentaire