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  :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
/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 :

 
Sélectionnez
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 :

Image non disponible

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 :

Image non disponible

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 :

 
Sélectionnez
mkfs.ext4 /dev/sdb1

Nous lui affectons le nom new_sys :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
/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 :

 
Sélectionnez
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 :

 
Sélectionnez
/dev/disk/by-label/old_sys    /old    ext4    rw    0    0

Nous effectuons le montage préenregistré avec la commande :

 
Sélectionnez
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 :

 
Sélectionnez
/old/home/partages    /home/partages    none    bind

Suivi également de la commande :

 
Sélectionnez
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 :

 
Sélectionnez
swapoff -a

Créons le swap dans la nouvelle partition dédiée :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
/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 :

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 :

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.