rrync - Transferts de fichiers - Application à la sauvegarde d'un système chiffré

Mise à jour : Debian 9.0

L'objectif est de réaliser la copie d'une installation chiffrée d'un disque système sur un disque externe, en conservant la même structure de partitionnement et de chiffrage, tout en se donnant la possibilité de redimensionner les systèmes de fichier.

Le système d'origine comprend

# lsblk -f
NAME FSTYPE LABEL UUID MOUNTPOINT
sda
├─sda2 crypto_LUKS 6905bf4a-d80b-41eb-8e70-16b05d5f8c34
│ └─luks LVM2_member Ylohnm-aA4Z-jshO-u0GF-qNS4-KdYI-m9JW4T
│ ├─vg-debian ext4 debian ba7c9456-d86d-43d4-a240-207057ee0192 /
│ ├─vg-swap swap swap 47dc4f3a-750c-4f91-9a1d-50fd6181e723 [SWAP]
│ └─vg-home ext4 home bedf43cd-9875-43dc-b6fd-43228d52f120 /home
└─sda1 ext4 boot d8f68a4e-3a86-481c-877e-8957d58ba320 /boot

Références

Sommaire

1 - Principe

La copie s'effectue en trois grandes étapes :

Dans ce qui suit on suppose que le disque système a pour identifiant /dev/sda et que le disque pour la copie a pour identifiant /dev/sdb.

2 - Partitionnement et chiffrage du disque externe

L'objectif est de créér une structure identique à celle du disque d'origine, avec le nommage suivant :

# lsblk -f
NAME FSTYPE LABEL
sda
├─sdb2 crypto_LUKS
│ └─luks-dd1 LVM2_member
│ ├─vgdd1-debian ext4 debiandd1
│ ├─vgdd1-swap swap swapdd1
│ └─vgdd1-home ext4 homedd1
└─sdb1 ext4 bootdd1

2.1 - Création de la structure

2.1.1 - Partitionnement

Effacer les données sur le nouveau disque

# dd if=/dev/zero of=/dev/sdb bs=4M

# Partitionner le disque :

# parted -s /dev/sdb mklabel msdos mkpart primary ext4 2MiB 8GiB mkpart primary ext4 8GiB 100%

# Vérifier le partitionnement

# fdisk -l /dev/sdb

Disque /dev/sdb : 149,1 GiB, 160041885696 octets, 312581808 secteurs
Unités : secteur de 1 × 512 = 512 octets
Taille de secteur (logique / physique) : 512 octets / 512 octets
taille d'E/S (minimale / optimale) : 512 octets / 512 octets
Type d'étiquette de disque : dos
Identifiant de disque : 0x4343a23b

Device Boot Start End Sectors Size Id Type
/dev/sdc1 4096 16777215 16773120 8G 83 Linux
/dev/sdc2 16777216 312580095 295802880 141,1G 83 Linux

2.1.2 Système de fichier

# Formater la partition 1 pour le boot en ext4

# mkfs.ext4 -L bootdd1 /dev/sdb1

# Chiffrer la partition 2 et l'ouvrir avec le nom de luks-dd1

# cryptsetup luksFormat -s 512 -h sha512 /dev/sdb2
# cryptsetup open /dev/sdb2 luks-dd1

2.1.3 Volumes logiques

# Créer un volume physique dans le container chiffré de nom luks-dd1

# pvcreate /dev/mapper/luks-dd1

# Créer un groupe de volume vgdd1 contenant ce volume physique

# vgcreate vgdd1 /dev/mapper/luks-dd1

# Créer les 3 volumes logiques

# lvcreate -n debian -L 30G vgdd1
Logical volume "debian" created.
# lvcreate -n swap -L 10GG vgdd1
Logical volume "swap" created.
# lvcreate -n home -L 101G vgdd1
Logical volume "home" created.

#Formater les 3 volumes logiques

# mkfs.ext4 -L debian /dev/mapper/vgdd1-debian 
# mkfs.ext4 -L home /dev/mapper/vgdd1-home
# mkswap -L swap /dev/mapper/vgdd1-swap

2.2 - Récapitulatif

# lvs vgdd1
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
debian vgdd1 -wi-a----- 30,00g
home vgdd1 -wi-a----- 101,00g
swap vgdd1 -wi-a----- 10,00g

# vgs vgdd1
VG #PV #LV #SN Attr VSize VFree
vgdd1 1 3 0 wz--n- 141,05g 48,00m

# lsblk -f /dev/sdb
NAME FSTYPE LABEL UUID MOUNTPOINT
sdb
├─sdb2 crypto_L 7669bda2-de09-45f9-b168-ee82cfae6f04
│ └─luks-dd1 LVM2_mem 9OF5Yl-FUtZ-YOF8-pHPz-NzMq-6yv0-X2C6GI
│ ├─vgdd1-home ext4 home e408b8ff-91b2-49dd-9783-9d10fa2e2ecd
│ ├─vgdd1-debian ext4 debian 8062b446-b89f-48ba-bdc2-a0eefbc2f546
│ └─vgdd1-swap swap swap f4bb64b2-fbf8-4012-8763-2ca7f66cee22
└─sdb1 ext4 bootdd1 b930d4d2-08ec-4ef0-b8fa-2a9b9fcca8cc

3 - Recopie

3.1 - Copie de /home

# mount /dev/mapper/vgdd1-home /mnt
# rsync -av --delete /home/ /mnt/
# umount /mnt

3.2 - Copie de /boot

# mount /dev/sdb1 /mnt
# rsync -av --delete /boot/ /mnt/
# umount /mnt

3.3 - Copie de / (sans le répertoire boot)

# mount /dev/mapper/vgdd2-debian /mnt
# rsync -aAXv --delete-excluded --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/home/*","/boot/*"} / /mnt/
# umount /mnt

4 - Mise à jour de fstab, grub, crypttab, resume

Monter la racine / puis le boot :

# mount /dev/mapper/vgdd2-debian /mnt
# mount /dev/sdb1 /mnt/boot

Préparer, puis effectuer le changement de racine :

# cd /mnt
# mount --bind /proc proc
# mount --bind /sys sys
# mount --bind /run run # En cas d'utilisation de apt, évite le message : E: Impossible d'ouvrir le fichier verrou /var/lock/aptitude - open (2: Aucun fichier ou dossier de ce type)
# mount --bind /dev dev # Pour l'accès aux partitions externes, par exemple, pour la mise en place de grub sur la MBR
# cp /etc/resolv.conf etc # En de problème de connexion internet
# chroot ./

Mettre à jour fstab

# cat etc/fstab
LABEL=bootdd1 /boot ext4 defaults 0 2
/dev/mapper/vgdd1-debian / ext4 errors=remount-ro 0 1
/dev/mapper/vgdd1-home /home ext4 defaults 0 2
/dev/mapper/vgdd1-swap none swap sw 0 0

Mette à jour grub

# update-grub
# grub-install /dev/sdb

Mettre à jour crypttab

$ cat etc/crypttab 
# <target name> <source device> <key file> <options>
luks-dd1 UUID=6905bf4a-d80b-41eb-8e70-16b05d5f8c34 none luks

Note : utiliser blkid pour obtenir l'uuid

# blkid -s UUID -o value /dev/sdb1
6905bf4a-d80b-41eb-8e70-16b05d5f8c34

Mettre à jour resume

# cat /etc/initramfs-tools/conf.d/resume
RESUME=/dev/mapper/vgdd1-swap

Mise à jour initramfs

# update-initramfs -u

Fin du changement de racine et démontage

/# exit
exit
# umount dev
# umount run
# umount sys
# umount proc
# umount boot
# cd ..
# umount /mnt

Désactivation des volumes logiques et fermeture du container

# lvchange -an /dev/vgdd1/*
# vgchange -an vgdd1
# pvchange -x n /dev/mapper/luks-dd1
# cryptsetup close luks-dd1

Le disque dd1 peut-être utilisé en remplacement du disque d'origine.