1. Introduction▲
Cet article va vous montrer une façon de remplacer un disque dur dans une machine en production de façon à limiter au maximum l'interruption de service, ceci soit pour un remplacement de disque avec risque de panne imminente, soit pour mettre un disque de taille plus importante.
Nous prendrons l'exemple d'un serveur de fichiers Samba pouvant contenir un volume important de données.
1-1. Procédure▲
La procédure utilisée sera la suivante :
- montage physique du nouveau disque dur ;
- copie du système en production sur le nouveau disque sans arrêt du serveur ;
- démarrage du système sur le nouveau disque ;
- modification de la partition de swap ;
- utilisation de l'ancien disque via un point de montage ;
- synchronisation des données de l'ancien vers le nouveau disque ;
- désactivation du point de montage vers l'ancien disque ;
- débranchement de l'ancien disque une fois que tout est OK.
2. Travaux préparatoires▲
Pour nous faciliter les choses, nous allons utiliser les labels pour identifier nos disques.
Ma partition root actuelle est /dev/sda1. Je vais la nommer « old_sys » avec la commande e2label  :
e2label /dev/sda2 old_sys
Cette opération est faite avant le montage du nouveau disque, car elle nécessite un redémarrage.
Si votre disque dur comporte plusieurs partitions (exemple /home, /usr,/var séparés), il faut effectuer cette opération pour toutes ces partitions.
Nous arrêtons ensuite la machine pour y ajouter le nouveau disque.
Au reboot, nous pouvons voir la présence du nouveau disque avec la commande fdisk -l :
Disque /dev/sda : 10 GiB, 10737418240 octets, 20971520 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 : 0xbd7917f6
Device Boot Start End Sectors Size Id Type
/dev/sda1 * 2048 20013055 20011008 9,6G 83 Linux
/dev/sda2 20015102 20969471 954370 466M 5 Extended
/dev/sda5 20015104 20969471 954368 466M 82 Linux swap / Solaris
Disque /dev/sdb : 20 GiB, 21474836480 octets, 41943040 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
Dans cet exemple, on peut voir que le disque d'origine fait 10 Go et que le nouveau, non formaté fait 20 Go (les disques sont de faibles capacités car les tests ont été faits dans une machine virtuelle).
Nous pouvons aussi voir la présence de notre label avec la commande blkid :
/dev/sda1: LABEL
=
"old_sys"
UUID
=
"f93e4a26-478e-403f-9dff-4be5c12ddb22"
TYPE
=
"ext4"
PARTUUID
=
"bd7917f6-01"
/dev/sda5: UUID
=
"ba666551-a96f-4177-a9c3-4c40c933bc12"
TYPE
=
"swap"
PARTUUID
=
"bd7917f6-05"
3. Copie du système actuel▲
3-1. Formatage et partitionnement▲
Commençons par partitionner le nouveau disque avec la commande :
sfdisk /dev/sdb
Dans le cas d'utilisation d'UEFI, il faudra utiliser la commande sgdisk au lieu de sfdisk. Reportez-vous au chapitre évoquant l'UEFICe qu'implique UEFI/Secureboot pour notre opération :.
Au premier écran, il est demandé de créer une table de partitions :
Si vous avez un disque de 2 To ou plus, ou que vous utilisez l'UEFI, il faut sélectionner « GPT » et non pas MBR,
Créez ensuite vos partitions comme sur le disque d'origine ou si vous souhaitez changer le partitionnement, restez cohérent dans la configuration.
Dans l'exemple ci-dessous, vous pouvez voir une partition pour la racine et une pour le swap :
Après enregistrement des partitions, nous créons le système de fichiers qui hébergera le système, dans notre cas sur la partition /dev/sdb1 avec système de fichiers ext4 :
mkfs.ext4 /dev/sdb1
Nous lui affectons le nom new_sys :
e2label /dev/sdb1 new_sys
Pour la prise en compte du nom, un redémarrage du système est nécessaire.
Nous pouvons observer la prise en compte en regardant dans le dossier /dev/disk/by-label :
ls /dev/disk/by-label
new_sys old_sys
3-2. Copie du système actuel▲
Nous montons le nouveau disque via son label dans un dossier nommé new :
mkdir /new
mount /dev/disk/by-label/new_sys /new
Nous copions ensuite le système en dupliquant le contenu du disque, sauf le dossier contenant les données :
rsync -av /* /new --exclude
=
/new/* -exclude
=
/home/partages/* --exclude
=
/dev/* --exclude
=
/proc/* --exclude
=
/sys/*
J'exclue le dossier correspondant au point de montage du nouveau disque (/new), de façon à ne pas créer de boucle de copie, le dossier contenant les données proprement dites (/home/partages) et les dossiers /dev/ /proc/sys qui correspondent à des pseudo-filesystem de Linux. Les dossiers seront créés mais sans leur contenu.
3-3. Finalisation de la copie système▲
Nous allons effectuer des modifications dans le système copié en chroot :
cd /new
mount --bind /proc proc
mount --bind /sys sys
mount --bind /dev dev
mount --bind /run run
chroot .
Il nous faut mettre à jour le fstab dans la copie chrootée pour faire pointer sur notre nouveau disque
Nous remplaçons l'UUID de la ligne du point de montage « / » par le label du nouveau disque, ce qui donnera ceci :
/dev/disk/by-label/new_sys / ext4 errors
=
remount-ro 0
1
Nous installons ensuite grub, le chargeur du système, sur le nouveau disque :
grub-install /dev/sdb
update-grub
En cas d'utilisation UEFI, reportez-vous au chapitre sur lUEFILe cas UEFI/Secureboot.
4. Démarrage sur le nouveau disque▲
Nous sortons du chroot via la commande exit, et nous éteignons ensuite la machine. Nous inversons la position des disques de façon à démarrer sur le nouveau disque.
À ce stade, nous avons démarré sur le système copié, il nous manque par contre les données restées sur le disque d'origine. Nous allons monter l'ancien dossier de données dans un dossier vide du même nom (et au même emplacement) sur le nouveau disque, nous aurons alors accès aux données et le système fonctionnera dans un état intermédiaire, avec le système sur le nouveau disque et les données sur l'ancien.
4-1. Activation de l'accès aux données présentes sur l'ancien disque▲
Nous ajoutons la ligne suivante en fin de fichier /etc/fstab :
/dev/disk/by-label/old_sys /old ext4 rw 0
0
Nous effectuons le montage préenregistré avec la commande :
mount -a
À ce stade, le contenu de l'ancien disque est accessible dans /old.
Nous montons ensuite le dossier contenant les données au même endroit qu'à l'origine :
/old/home/partages /home/partages none bind
Suivi également de la commande :
mount -a
À ce stade, le système fonctionne sur le nouveau disque, mais utilise les données depuis l'ancien disque, les données n'étant pas encore copiées.
4-2. Gestion du swap▲
Actuellement, les réglages de swap correspondent toujours au swap sur l'ancien disque. Il nous faut activer le nouveau swap.
Je désactive le swap actuel :
swapoff -a
Créons le swap dans la nouvelle partition dédiée :
mkswap /dev/sdb3
Il n'est pas possible d'utiliser la commande e2label avec une partition de swap. L'utilisation de blkid est nécessaire :
blkid /dev/sda3 >>
/etc/fstab
Cela va ajouter le retour de la commande blkid à la fin du fichier fstab. Vous n'aurez plus qu'à effectuer un copier-coller de l'UUID pour remplacer celui de l'ancienne partition.
Pensez bien à mettre les deux signes  « supérieur à  » (>>) sous peine d'écraser votre fichier fstab. Je vous recommande d'en faire une copie de sauvegarde avant l'opération.
Une fois le fichier /etc/fstab mis à jour, il ne reste qu'à activer le nouveau swap :
swapon -a
Si vous utilisez la veille prolongée, il faut mettre à jour l'UUID dans le fichier /etc/initramfs-tools/conf.d/resume et effectuer un :
update-initramfs -u
5. Copie des données▲
Nous lançons maintenant la copie de toutes les données dans un dossier du nouveau disque :
mkdir /home/partage_new
rsync -av /home/partages/* /home/partages_new/
Le temps de copie n'est pas important, la machine étant toujours en production, dans des conditions identiques d'un point de vue extérieur. Cette copie peut être interrompue et relancée avec la même commande.
6. Finalisation▲
Une fois la copie terminée, il faut mettre le serveur en maintenance le temps d'effectuer les dernières opérations, ce qui devrait être très rapide.
6-1. Copie finale▲
Nous effectuons une dernière synchronisation :
rsync -av --delete-after /home/partages/* /home/partages_new/
L'option -delete-after va supprimer les fichiers présents dans la destination, mais qui ne le sont plus dans la source, ce que rsync ne fait pas par défaut (il existe aussi l'option --delete-before qui, comme son nom l'indique, effectue la suppression des fichiers à enlever avant l'opération de synchronisation).
6-2. Désactivation de l'ancien disque▲
Nous démontons (dans le sens utilisation de la commande umount) l'ancien disque et donnons le nom d'origine au dossier contenant les données via les commandes :
umount /home/partages
rmdir /home/partages
mv /home/partages_new /home/partages
umount /old
Il nous reste ensuite à retirer les deux lignes suivantes du fichier /etc/fstab :
/dev/disk/by-label/old_sys /old ext4 rw 0
0
/old/home/partages /home/partages none bind
L'opération est à ce stade terminée. Il ne reste qu'à débrancher l'ancien disque après arrêt du serveur, une fois que vous êtes sûr qu'il n'y a pas de problèmes. Il reste remontable si nécessaire via la commande mount.
7. Le cas UEFI/Secureboot▲
7-1. Quelques explications :▲
Si vous connaissez l'UEFI, vous pouvez directement passer à la partie suivanteCe qu'implique UEFI/Secureboot pour notre opération : donnant les impacts pour ce tutoriel.
7-1-1. Qu'est-ce que l'UEFIÂ ?▲
L'UEFI (Unified Extensible Firmware Interface) est ce qui remplace le BIOS dans les machines récentes. C'est un microsystème à part entière, chargé de démarrer les systèmes d'exploitation. Il comprend un Shell UEFI. Il est possible de développer des applications UEFI. Les cartes mères intègrent une émulation BIOS pour la rétrocompatibilité. Votre disque dur contiendra une partition ESP qui est en fait une partition FAT32.
Un fichier .efi est un fichier au format Windows PE.
Windows peut booter en UEFI depuis Windows Vista SP2. Le SecureBoot activé par défaut (et donc la présence d'UEFI) est obligatoire pour qu'un appareil obtienne le logo « Windows Compatible » depuis Windows 8.
Concrètement, les machines modernes contiennent des clés Microsoft permettant de contrôler les signatures des systèmes d'exploitation. Si le SecureBoot est actif, un système non signé par une clé présente ne s'amorcera pas.
Il est possible d'ajouter ses propres clés, mais cela est complexe. La solution adoptée par Ubuntu est d'avoir son bootloader signé par Microsoft. Debian, par exemple, refuse cet état de fait.
Soit votre BIOS vous propose un menu pour booter au choix en mode UEFI ou en mode compatibilité, soit il faut chercher l'option dans ses menus. L'activation du mode compatibilité empêchera le boot de l'OS installé en UEFI et empêchera l'accès aux disques partitionnés en GPT.
La désactivation de l'option SecureBoot permettra l'amorce d'un système non signé avec les clés Microsoft.
7-1-2. GPT▲
GPT (GUID Partition Table) remplace le MBR (Master Boot Record) dans les environnements UEFI. GPT permet de dépasser la limitation à 2,2 To de MBR et d'avoir jusqu'à 128 partitions au lieu de 4 pour le MBR. Le début d'une table GPT contient un MBR pour rétrocompatibilité. L'utilisation d'UEFI implique l'utilisation d'une table GPT à la place d'une table MBR.
7-1-3. Secureboot▲
Le SecureBoot est une option UEFI permettant de faire un contrôle de signature avant de booter un noyau ou un autre programme UEFI. Les signatures numériques sont stockées dans le firmware de la carte mère.
Microsoft impose la présence de SecureBoot pour qu'une machine soit estampillée Windows Compatible.
Extrait du « Windows Hardware Compatibility Program Requirements » :
« Windows 8 and later WHCP requires that systems implement UEFI native boot as the firmware boot mode and Secure Boot as the default out-of-box configuration. »
Cette fonctionnalité complexifie l'installation et l'utilisation de Linux sur les machines ayant Windows préinstallé. Nous vous recommandons la lecture des articles suivants :
- La Linux Foundation arrache une solution pour le SecureBoot ;
- Linus Torvalds s'oppose radicalement au SecureBoot et déverse sa colère sur RedHat qui propose d'intégrer un patch à Linux ;
- Les PC Windows seront-ils fermés à Linux ?.
Ceci implique que toute machine neuve avec Windows 8/10 préinstallé aura le SecureBoot activé.
Il est à noter que la master key SecureBoot de Microsoft a été dévoilée par erreur.
Si vous voulez utiliser Linux sur une machine UEFI avec SecureBoot, voici les solutions :
- désactiver SecureBoot ;
- utiliser une distribution Linux ayant acheté une clé à Microsoft telle que Redhat ou Ubuntu ;
- utiliser la solution proposée par la Linux Foundation ;
- utiliser Shim.
7-2. Ce qu'implique UEFI/Secureboot pour notre opération :▲
Pour ce tutoriel, l'utilisation de l'UEFI a un impact sur :
- le partitionnement d'un disque ;
- l'amorce du système depuis une partition de boot ESP.
7-2-1. Formatage/partionnement▲
Avec un disque UEFI, il faut plutôt utiliser la commande gdisk en remplacement de sfdisk. Vous pouvez aussi utiliser parted.
7-2-2. Amorce du système▲
L'amorce du système se fera via la partition ESP (une partition FAT32), contenant Grub pour les systèmes Linux, et winload pour Windows. En cas de multi-boot, chaque système aura un dossier avec son fichier efi d'amorce.
Pour pouvoir effectuer ces réglages, Grub aura besoin d'accéder à cette partition montée dans /boot/efi.
8. Pour aller plus loin▲
En lien avec ce tutoriel, je vous recommande la lecture de mon tutoriel sur la migration d'un système en RAID 1 (la procédure est très proche).
Si vous n'avez pas de RAID matériel, il peut être judicieux d'utiliser du RAID logiciel et dans ce cas de l'implémenter au moment du remplacement du disque. Il faudra dans ce cas transférer directement l'ancien système sur un ou des volumes RAID préparé(s) comme évoqué dans le tutoriel cité.
9. Remerciements▲
Je remercie Siguillaume pour sa relecture technique.
Je remercie Jacques Jean pour sa relecture orthographique.