2019-07-21: Création
2019-07-28: Nouvelle stratégie de disque
2019-08-09: Backup vers NAS
2019-08-17: NAS QNAP → Disk1 DATA

Situation

Suite à un freeze du PC suivi d'un power off forcé, voici l'accueil du reboot suivant :-/ :

Le système n'arrive pas à monter la partition /dev/sda6 qui correspond à /home.

Il semple y avoir une incohérence dans le système de fichier BTRFS.

Sauvegarde

Le principe est de :

  • faire une image de la partition vers un disque externe
  • Tenter une correction de la partition

Utilisation de dd, création de l'image sans compression :

# dd if=/dev/sda6 of=/mnt/wd-1to/pc-jc-debian-home/image.sda6.home.201-07-21 bs=4096 conv=notrunc,noerror status-progress

Pour la petite histoire, j'ai refait l'image le lendemain, le 22 car j'ai halt le PC sans unmount le disque externe. Donc dans le doute j'ai supprimé et recommencé l'image avec dd.

Tentative de correction

Les commandes suivantes n'ont rien données :

# btrfs check --readonly -p /dev/sda6
# mount -o ro,usebackuproot /dev/sda6 /mnt
# btrfs rescue zero-log /dev/sda6
# btrfs check /dev/sda6
# btrfs check --repair /dev/sda6
# btrfsck --init-extent-tree /dev/sda6

Test de restauration

J'ai presque appris par cœur ce retour d’expérience :
linuxfr.org/.../btrfs-restore-a-la-rescousse

Donc voici la commande btrfs de restauration vers un autre disque :

# yes | btrfs restore -s -x -m -S -v -i -o /dev/sda6 /mnt/usb-8go/

Explications : (de raphj linuxfr.org/.../btrfs-restore-a-la-rescousse

  • -s récupère aussi les sous-volumes
  • -x récupère aussi les attributs étendus
  • -m récupère aussi les métadonnées (droits, dates)
  • -S récupère aussi les liens symboliques
  • -v pour moins s'ennuyer, ça fait défiler des trucs à l'écran (et surtout on sait où on en est dans la récupération)
  • -i ne pas s'arrêter à cause des erreurs (très important pour la suite, et de toute façon si on veut tout récupérer on ne veut pas que ça s'arrête)
  • -o pour réécrire les fichiers qui existeraient déjà sur la destination (oui, il a fallu que je relance la commande plusieurs fois en apprenant à l'utiliser)
  • yes, parce que même avec l'option -i, btrfs restore s'arrête de temps en temps en affichant We seem to be looping a lot on XXX, do you want to keep going on ? (y/N):, donc oui on veut que ça continue.

Testé vers une clé USB 8go avec un Ctrl+C juste pour voir, en attendant l'arrivé d'un disque dur pour recevoir la restauration, et qui finira dans un NAS (c'était prévu, c'est le moment d'upgrader le 160go en 4to :-D ).

Lors de la restauration complète, il serait bien de le faire en user jc et non en root car sinon, tous les fichiers/dossier seront estampillés root :-/

Bonus: Montage image partition faite avec dd

GNU Linux est définitivement plein d'utilitaires de dingue !

Commande file

La commande file retrouve plein d'info sur l'image dd
(j'ai juste ajouté qq passage à la ligne pour la lisibilité)

$ file -s image.sda6.home.2019-07-22 
image.sda6.home.2019-07-22: 
BTRFS Filesystem label "DATA", 
sectorsize 4096, 
nodesize 16384, 
leafsize 16384, 
UUID=d4c14b15-8cda-41ee-b83d-71fa77b927d5, 
336804290560/634998751232 bytes used, 
1 devices

Commande parted

# parted image.sda6.home.2019-07-22 unit s print
Modèle:  (file)
Disque /media/jc/My_Passport/pc-jc-ssd-debian-home/image.sda6.home.2019-07-22 : 1240231936s
Taille des secteurs (logiques/physiques): 512B/512B
Table de partitions : loop
Disk Flags: 
 
Numéro  Début  Fin          Taille       Système de fichiers  Fanions
 1      0s     1240231935s  1240231936s  btrfs

Méthode 1: parted+mount

Grace à parted, on vois qu'il n'y a pas d'offset comme dans cet exemple: can-i-mount-a-partition-from-a-full-drive-image

  • Dans cet exemple, start (début de la partition) est en 2048s

donc offset = 2048 x 512 = 1048576

  • Dans mon cas, le début de la partition est un 0s

donc calcul de l'offset = 0 x 512 = 0

# mount -t btrfs -o ro,loop,offset=0 image.sda6.home.2019-07-22 /mnt/debian-home-sda6-img
  • Si comme moi, l'image provient d'une partition défectueuse, le montage ne fonctionnera pas.
  • Pour une image correcte, il est possible de naviguer à l'intérieur et de prendre des fichiers.
  • On note l'option -o ro pour readonly affin de ne pas effacer des données par erreur dans l'image.

Méthode 2: losetup+lsblk+mount

  • Cette méthode consiste à allouer un 'loop device' :
# losetup -Prf image.sda6.home.2019-07-22
  • Visu du 'loop device' -f pour file system
# lsblk -f
NAME   FSTYPE   LABEL       UUID                                 MOUNTPOINT
sda                                                              
├─sda1 ntfs                 7616AE0F16ADD103                     
├─sda2 ntfs                 985EA4E05EA4B900                     
├─sda3                                                           
├─sda5 btrfs    SYSTEM      8062d387-20e4-4ad0-92cd-2087f55142d1 
├─sda6 btrfs    DATA        d4c14b15-8cda-41ee-b83d-71fa77b927d5 
└─sda7 swap                 1d410210-c509-4894-b010-cc9becb30bb1 
sdb                                                              
├─sdb1 vfat     RECOVERY    32EC-CB7F                            
├─sdb2 ntfs     OS          AAA6F0E3A6F0B0C5                     
├─sdb3 ntfs     LOGICIELS   BC6652E266529D48                     
├─sdb4                                                           
├─sdb5 ntfs     HOME_COMMUN 8CDE58D8DE58BC60                     /media/home_commun
├─sdb6 swap                 266a37d4-4cf9-4d8d-b8f2-1b671ceadfe1 
├─sdb7 ext4                 74ddd380-7130-4399-b561-41124928cad0 /
└─sdb8 ext4                 836cf27d-d1cd-4daa-b688-7f7de6abc221 /home
sdg                                                              
└─sdg1 ntfs     My_Passport 97E68384FF65B81B                     /media/jc/My_Passport
sr0                                                              
loop0  btrfs    DATA        d4c14b15-8cda-41ee-b83d-71fa77b927d5 
loop1  squashfs                                                  /snap/spotify/35
loop2  btrfs    DATA        d4c14b15-8cda-41ee-b83d-71fa77b927d5 
loop3  squashfs                                                  /snap/core/7270
loop4  squashfs                                                  /snap/core/6964
loop5  squashfs                                                  /snap/spotify/36
J'ai taper 2 fois la commande losetup donc on a loop0 et loop2
  • Montage de l'image de la partition
# mount -r /dev/loop0 /mnt/debian-home-sda6-img/
L'erreur de montage persiste, c'est normal, l'image comporte les même erreurs de super blocks comme la partition sda6 d'origine
Mais on peut utiliser /dev/loop0 pour restaurer les données btrfs

Exemple /dev/loop0 vers une clé usb :

# yes | btrfs restore -s -x -m -S -v -i -o /dev/loop0 /media/jc/USB/
Voir plus loin dans la page, la restauration de /dev/sda6 via cette méthode

Nouvelle stratégie de disque

Suite à ce crash, je décide de mettre en place une nouvelle stratégie de stockage sur le PC.
Ce PC portable accueil 2 disques :

  • Le disque 1 contient:
    • Une partition win7 pour les jeux
    • Une partition debian système formatée en btrfs
    • Une partition debian home formatée en btrfs
    • un swap
  • Le disque 2 contient actuellement le win7 d'origine, Ubuntu 16.04. Ce disque vas être démonté.
  • Le nouveau disque 2 sera dédié archivage avec une seule partition btrfs :
    • Clonage du disque 1 partion win7 vers le disque 2 avec dd
    • Clonage du disque 1 partion système debian vers le disque 2 avec dd
    • rsync des datas [/home] du disque 1 vers le disque 2
    • Formaté en btrfs, le disque 2 aura des snapshots pour versionner les rsyn.
  • NAS QNAP 4to
    • Disque 2: image dd du win7 rsync vers le NAS.
    • Disque 2: image dd du systèmes debian rsync vers le NAS.
    • Disque 2 [/home] sera rsyn vers le NAS pour sortir les datas du portable. L'idéal serais de créer un nouveaux dossier horodaté à chaque rsync et de faire une rotation de ces dossiers horodatés pour générer un archivage efficace dans le temps. Les très ancien serait supprimés au profit des nouveaux arrivants :

Ca sent le script qui pique les yeux ! :-D

 -DISQUE 1-----------------
|  win7  | debian | debian |
|        |   /    | /home  |
|  ntfs  | btrfs  | btrfs  |
 --------------------------
     |       |         |
     dd      dd      rsync
     |       |         |
     v       v         v
 -DISQUE 2-----------------
|     backup + snapshot    |
|          btrfs           |----------------
 --------------------------                 |
             |                              |
           rsync                          rsync
             |                              |
             v                              v
 -NAS QNAP-----------------      -DISK EXTERNE-------------
|         4to ext4         |    |          750go           |
| Rotation dossiers horo.  |    |    Dock station usb3     |
 --------------------------      --------------------------
Les rsync seront vraisemblablement scriptés et cadencés par le cron, ainsi que les snapshots du disque 2.

Préparation disque 2

Suppression de la partition existante avec fdisk:

Visu des disques avec fdisk -l :

Formatage du disque 2 avec mkfs.btrfs :

Visu des disques avec fdisk -l :

Visu des disque avec btrfs filesystem show :

Montage du disque 2 :

Restauration sda6 vers disque2

Restauration avec snapshot

Restauration sans snapshot

Restauration image en Disque2 vers Disque1 sda6

  1. Formatage de la partition défectueuse.

  2. On affecte sda6 à /home :
    # mount -t btrfs /dev/sda6 /home
  3. On reprend le disque sauvegarde avec l'image de sda6 faite au début.
  4. Ce disque est monté dans le 2ème logement de pc portable, ce qui optimise la vitesse de transfert : Pas d'adaptateur USB.
  5. On monte ce disque2 vue comme sdb1 :
    # mount -t ntfs /dev/sdb1 /media/jc/WD-1to/
  6. On applique la méthode 2 du montage d'image (vue plus haut) avec assignation de /dev/loop0.
  7. Restauration de l'image pointée en /dev/loop0 vers /home
    # time yes | btrfs restore -x -m -S -v -i -o /dev/loop0 /home; date



    Charge disques :

  8. Mise à jour de l'UUID de la partition /home dans fstab

DISQUE1 sda5 -> DISQUE2

$ sudo time dd if=/dev/sda5 of=/media/user/BACKUP/sda5-SYSTEM/sda5-debian-system-2019-08-12_before-upgrade-debian-10.0.img bs=4096 conv=notrunc,noerror status=progress
 
49643884544 bytes (50 GB, 46 GiB) copied, 105 s, 473 MB/s
12206848+0 records in
12206848+0 records out
49999249408 bytes (50 GB, 47 GiB) copied, 106.681 s, 469 MB/s
6.21user 71.90system 1:46.71elapsed 73%CPU (0avgtext+0avgdata 1980maxresident)k
97654856inputs+97654912outputs (5major+96minor)pagefaults 0swaps

synchro rsync DISQUE1/DATA -> DISQUE2/BACKUP

$ rsync -avp --delete jc/ /media/jc/BACKUP/jc/
[...]
sent 183,607,789,776 bytes  received 10,932,404 bytes  223,244,647.03 bytes/sec
total size is 440,659,881,860  speedup is 2.40

après suppression des VMs :

$ rsync -avp --delete jc/ /media/jc/BACKUP/jc/
[...]
deleting VirtualBox VMs/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)/Logs/VBox.log.3
deleting VirtualBox VMs/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)/Logs/VBox.log.2
deleting VirtualBox VMs/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)/Logs/VBox.log.1
deleting VirtualBox VMs/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)/Logs/VBox.log
deleting VirtualBox VMs/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)/Logs/
deleting VirtualBox VMs/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)_2019-03-05-disk001.vmdk
deleting VirtualBox VMs/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b).vbox-prev
deleting VirtualBox VMs/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b).vbox
deleting VirtualBox VMs/TIA PORTAL V14 SP1 UP7  (W7 SP1 64b)/
deleting VirtualBox VMs/Debian Stretch 9.5 non-free/Logs/VBox.log.3
deleting VirtualBox VMs/Debian Stretch 9.5 non-free/Logs/VBox.log.2
deleting VirtualBox VMs/Debian Stretch 9.5 non-free/Logs/VBox.log.1
deleting VirtualBox VMs/Debian Stretch 9.5 non-free/Logs/VBox.log
deleting VirtualBox VMs/Debian Stretch 9.5 non-free/Logs/
deleting VirtualBox VMs/Debian Stretch 9.5 non-free/Debian Stretch 9.5 non-free_2018-11-17a-disk002.vmdk
deleting VirtualBox VMs/Debian Stretch 9.5 non-free/Debian Stretch 9.5 non-free.vbox-prev
deleting VirtualBox VMs/Debian Stretch 9.5 non-free/Debian Stretch 9.5 non-free.vbox
deleting VirtualBox VMs/Debian Stretch 9.5 non-free/
deleting VirtualBox VMs/Debian Stretch 9.5 Docker/Logs/VBox.log
deleting VirtualBox VMs/Debian Stretch 9.5 Docker/Logs/
deleting VirtualBox VMs/Debian Stretch 9.5 Docker/Debian Stretch 9.5 Docker.vbox-prev
deleting VirtualBox VMs/Debian Stretch 9.5 Docker/Debian Stretch 9.5 Docker.vbox
deleting VirtualBox VMs/Debian Stretch 9.5 Docker/Debian Stretch 9.5 Docker-disk1.vmdk
deleting VirtualBox VMs/Debian Stretch 9.5 Docker/
VirtualBox VMs/
 
sent 65,584,754 bytes  received 305,898 bytes  630,532.56 bytes/sec
total size is 377,256,182,225  speedup is 5,725.49

DISQUE2 -> NAS QNAP

$ rsync -avp --delete /media/jc/BACKUP/jc/ jc@192.168.1.202:~/rsync/jc-portable/jc/
[...]
sent 377,463,892,679 bytes  received 33,834,990 bytes  11,936,120.90 bytes/sec
total size is 377,256,182,225  speedup is 1.00
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1196) [sender=3.1.2]

Variante :

$ time rsync -a --delete --progress /media/jc/BACKUP/sda6-DATA/jc/ jc@192.168.1.202:~/rsync/jc-portable/jc/
 
sent 10,877,075,811 bytes  received 2,937,754 bytes  6,338,487.37 bytes/sec
total size is 387,710,351,768  speedup is 35.64
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at main.c(1196) [sender=3.1.2]
 
real	28m36,483s
user	3m46,664s
sys	2m33,300s

NAS QNAP -> Disk1 DATA

Exemple de restauration de données depuis un NAS vers le dossier user, avec un fichier d'exclusion de dossier :

$ pwd 
/home/jc
$ time rsync -a --progress --exclude-from=rsync-exclude.txt jc@192.168.1.202:~/rsync/jc-portable/jc/ ~
[...]
real	238m37,763s
user	78m5,333s
sys	45m18,364s

Avec rsync-exclude.txt

.ICEauthority
.Xauthority
.bash_history
.bash_logout
.bashrc
.cache/
.config/
.dbus/
.directory
.dmrc
.gnupg/
.java/
.kde/
.lesshst
.local/
.mozilla/
.nv/
.nvidia-settings-rc
.pki/
.profile
.pulse-cookie
.python_history
.selected_editor
.steam/
.steampath@
.steampid@
.xfce4-session.verbose-log
.xfce4-session.verbose-log.last
.xsession-errors
.xsession-errors.old