Sauvegarde Disque Dur avec DD

J’ai pris l’habitude de faire une copie des disque dur sur lesquels je travail. Au cas ou, on ne sait jamais. Pour faire cette sauvegarde j’utilise l’application dd. Pour faire la sauvegarde du disque dur il faut savoir comment le retrouver pour ce faire j’utilise l’application lsblk

lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
sda           8:0    0   1,8T  0 disk 
└─sda1        8:1    0   1,8T  0 part /mnt/34CEBD1CCEBCD6F8
...
nvme1n1     259:1    0 931,5G  0 disk 
├─nvme1n1p1 259:2    0   100M  0 part /boot/efi
├─nvme1n1p2 259:3    0    16M  0 part 
├─nvme1n1p3 259:5    0 930,6G  0 part 
└─nvme1n1p4 259:6    0   862M  0 part

voici un exemple du retour de lsblk on y retrouve le nom des périphériques dont celui qu’on veut sauvegarder sda

Faire la sauvegarde

Avant toute opération nous allons démonter le disque pour s’assurer qu’aucune interaction du système arrive durant la copie avec la commande umount [nom du point de montage] puis nous allons utiliser la commande dd pipé à la commande gzip pour l’écrire dans un fichier .gz

umount /mnt/34CEBD1CCEBCD6F8  
sudo dd if=/dev/sda bs=2k conv=noerror,sync status=progress | gzip -c > /tmp/hdd.gz

La commande doit obligatoirement s’éxécuter avec sudo et va prendre comme argument

  • if=FILE: renseigne le fichier qui doit être copié dans notre exemple notre disque sda, se trouvant dans le dossier /dev/
  • bs=BYTES: taille des paquet lu et écris par defaut c’est 512 nous montons jusqu’a 2k
  • conv=CONVS: utilsation de paramètre de convertion, nous allons utiliser les paramètres noerror (continue apres la lecture d’un bloc en erreur) sync (pour tout copier meme les méta données)
  • status=LEVEL renseigne ce qui doit etre afficher a l’ecran durant la sauvegarde, nous voulons la progression progress
  • gzip -c: ecrire la sortie de la commande dans la sortie standard
  • > /tmp/hdd.gz: écrire le retour de la commande gzip dans le fichier /tmp/hdd.gz

C’est un processus qui est long, je suis toujours en train de chercher une solution qui est aussi sécurisé que celle-ci (copie uniquement les fichiers sans faire un dd avec mon script CopyMedia)

Faire la restauration

C’est bien beau de faire la sauvegarde, mais il faut être également capable de faire la restauration de cette sauvegarde. Il faut également s’assurer que le disque n’est plus monté.

umount /mnt/34CEBD1CCEBCD6F8  
gzip -d -c /mnt/hdd.gz | sudo dd of=/dev/sda bs=2k conv=noerror,sync status=progress

la commande gzip permettra de décompresser le fichier pipé à dd pour envoyer sur le disque, les paramètres suivant pour gzip

  • d: pour décompresser
  • c: pour pour envoyer le résultat sur la sortie standard stdout.
  • /mnt/hdd.gz c’est le fichier correspondant à la sauvegarde

Les paramètres pour dd

  • of: renseigner le fichier de destination
  • bs: 2k pour la taille des packets
  • conv=noerror,sync: ne s’arrete pas si il rencontre une erreur et sync pour la copie des metat données
  • status=progress: pour permettre l’affichage de la progression

Il suffit de remonter la/les partition(s) qui ont étés restaurée(s)

Peertube

Copies de Media cp_media.sh

Je suis régulièrement confronté a devoir faire des sauvegardes de disque dur qu’on vient me donner avec la consigne « peux tu me retrouver mes photos, viedeos etc… »

J’ai crée un script Bash permettant en renseignant un dossier source (qui sera le point de montage du disque dur) de rechercher le type de média que l’ont veut copier dans un dossier destination. Ce script ce nomme cp_media.sh et je l’ai mis à disposition sur Github

Ce script permet de faire une comparaison sur le nom de fichier ainsi que sa taille, si il tombe sur 2 fichiers avec le meme nom, il compare la taille, si les fichiers ont la même taille le nouveau fichier ne sera pas copié et présenté dans le rapport de en fin de process. Si la taille du fichier est différente le fichier sera renommé Filename.ext en Filename_c1.ext (c2, c3, c4…. pour les fichiers suivant avec le meme nom mais pas la meme taille)

Le script se base sur le fichier mime type se trouvant /etc/mime.type reprenant les extension de fichier en fonction de leur utilisation commune. `cat /etc/mime.type` vous donnera le contenue de ce fichier.

image/x-epson-erf				erf
image/x-jg					art
image/x-jng					jng
image/x-nikon-nef				nef
image/x-olympus-orf				orf
image/x-portable-anymap				pnm
image/x-portable-bitmap				pbm
image/x-portable-graymap			pgm
image/x-portable-pixmap				ppm
image/x-rgb					rgb
image/x-xbitmap					xbm
image/x-xcf					xcf
image/x-xpixmap					xpm
image/x-xwindowdump				xwd

en fonction du paramètre passé `–images|–videos`, je vais chercher l’extension du fichier à passer à la commande find avec les paramètre -iname *.jpg -o -iname *.png ...

Paramètres

  • –source: renseigne le repertoire source ou se trouve les médias a copier
  • –destination: renseigne le repertoire ou doit être copié les médias, si ce répertoire n’existe pas il sera crée.
  • — images|–videos: selecteur permettant de choisir le type de média a copier. Si aucun paramètre est passé c’est image qui est utilisé.
  • –size: Permet de renseigner la taille minimum a utiliser nous renseignerons la taille en kilo octet k en méga octet M en Giga octet G (e.g --size +500k les fichiers faisant plus de 500 kilo octet)
  • –verbose: permet de montrer a l’écran tout ce qui se passe

Exemples

# Copie des images du repertoire home images vers le repertoire /var/tmp/Images
cp_media.sh --source ~/home/Images/ --destination /var/tmp/Images/ --images  --size +100k --verbose