Convertir un système Linux existant en RAID 1

RAIDLorsque j’installe une station de travail Linux, j’utilise assez régulièrement le RAID 1 logiciel pour la redondance du stockage. Les distributions de type serveur comme CentOS, Ubuntu Serveur ou Debian proposent généralement ce type de fonctionnalité dans l’installateur. Sur le matériel récent, j’ai un faible pour la distribution KDE neon, un mix assez épuré d’un bureau KDE en rolling release sur une base stable d’Ubuntu LTS. Malheureusement, l’installateur de cette distribution n’offre pas la possibilité de configurer les disques en grappe RAID. Du coup j’ai profité d’un long weekend pluvieux pour expérimenter. Voici donc un tutoriel complet sur la configuration d’un RAID 1 logiciel sur une installation classique.

KDE neon RAID 1

Nettoyage des disques et installation initiale

Le DVD d’installation de KDE neon offre deux options au démarrage.

  1. LiveCD
  2. Installation

Je démarre sur l’option LiveCD (Try without installing) pour pouvoir effectuer quelques manipulations préliminaires.

Dans ma session Live, j’active le compte root pour m’éviter d’invoquer sudo à tire-larigot.

$ sudo passwd root

La machine est munie de deux disques durs sda et sdb. Les disques sont identiques, ce qui nous facilitera le travail.

# fdisk -l /dev/sd?
Disk /dev/sda: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
...
Disk /dev/sdb: 931.5 GiB, 1000204886016 bytes, 1953525168 sectors
...

Avant de lancer l’installateur, c’est une bonne idée de faire un brin de ménage sur les disques pour partir sur des bases saines. Dans mon cas précis, je dois d’abord supprimer les vestiges d’une ancienne grappe RAID. Je vais me servir de l’utilitaire mdadm, qui ne figure pas sur le LiveCD.

# apt-get update && apt-get install mdadm

Une fois que j’ai identifié mes partitions, j’invoque mdadm comme ceci.

# mdadm --zero-superblock /dev/sda1
# mdadm --zero-superblock /dev/sda5
# mdadm --zero-superblock /dev/sdb1
# mdadm --zero-superblock /dev/sdb5

Notons que je me suis retrouve confronté à deux messages d’erreur pour les partitions /dev/sda5 et /dev/sdb5.

mdadm: Couldn't open /dev/sda5 for write - not zeroing
mdadm: Couldn't open /dev/sdb5 for write - not zeroing

Pour des raisons mystérieuses, l’installateur semble avoir décidé d’activer toutes les partitions swap existantes. Je les ai donc désactivées comme ceci avant de réinvoquer mdadm --zero-superblock.

# swapoff /dev/sda5
# swapoff /dev/sdb5

Une fois que j’ai supprimé toutes les traces des précédentes grappes RAID, j’efface le contenu du MBR des deux disques. Pour ma part, j’aime bien utiliser gdisk pour ce genre d’opération.

# gdisk /dev/sda
GPT fdisk (gdisk) version 1.0.1
...
Command (? for help): x
Expert command (? for help): z
About to wipe out GPT on /dev/sda. Proceed? (Y/N): y
GPT data structures destroyed! You may now partition the disk 
using fdisk or other utilities.
Blank out MBR? (Y/N): y

Je procède de même pour /dev/sdb.

À partir de là, je peux lancer l’installateur graphique. Je ne vais pas rentrer dans les détails de la procédure d’installation, à plus forte raison qu’elle est triviale. J’installe le système sur le disque sda, en acceptant le schéma de partitionnement automatique par défaut.

KDE neon partitionnement

Préparation de la grappe RAID

Après le redémarrage initial, j’active le compte root comme je l’avais fait sur le LiveCD.

$ sudo passwd root

Pareillement, je récupère l’outil mdadm, qui ne fait pas partie d’une installation standard.

# apt-get update && apt-get install mdadm

Le schéma de partitionnement par défaut est simpliste.

  • une partition principale /dev/sda1 formatée en ext4
  • une partition d’échange /dev/sda5

Mon disque sdb n’est pas encore partitionné. Étant donné qu’il est parfaitement identique à mon disque sda, je vais pouvoir utiliser l’outil sfdisk pour cloner le schéma de partitionnement du disque sda.

# sfdisk -d /dev/sda | sfdisk /dev/sdb

On constate que le disque sdb est partitionné exactement comme sda.

Partitionnement

La prochaine étape consiste à modifier les types de partitions pour sdb. Lancer fdisk ou cfdisk et définir le type FD (Linux RAID autodetect) pour /dev/sdb1 et /dev/sdb5.

RAID

Voici – à peu de choses près – ce que nous devons obtenir au final.

RAID

Une fois que les types de partitions sont correctement définis, nous pouvons créer la grappe RAID. Dans un premier temps, il s’agira d’une grappe incomplète, configurée à l’aide de l’option missing.

# modprobe raid1
# mdadm --create /dev/md1 --level=1 --raid-disks=2 --metadata=0.90 \
  missing /dev/sdb1
mdadm: array /dev/md1 started.
# mdadm --create /dev/md5 --level=1 --raid-disks=2 --metadata=0.90 \
  missing /dev/sdb5
mdadm: array /dev/md5 started.

Affichons l’état de cette grappe.

# cat /proc/mdstat 
Personalities : [raid1] 
md5 : active raid1 sdb5[1]
      7820224 blocks [2/1] [_U]
      
md1 : active raid1 sdb1[1]
      968939456 blocks [2/1] [_U]
      bitmap: 0/8 pages [0KB], 65536KB chunk

Pour formater cette grappe, nous utiliserons les mêmes systèmes de fichiers que ceux en vigueur sur le disque sda.

# mkfs.ext4 /dev/md1
# mkswap /dev/md5

Écrire une configuration provisoire dans /etc/mdadm/mdadm.conf. On conservera l’original pour plus tard, lorsqu’on ajoutera le disque sda à la grappe.

# cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf.orig
# mdadm --examine --scan >> /etc/mdadm/mdadm.conf

Créer un point de montage pour la grappe /dev/md1 et monter cette grappe.

# mkdir /mnt/md1
# mount /dev/md1 /mnt/md1

Copier l’intégralité du système de fichiers de notre installation vers le deuxième disque.

# cp -dpRx / /mnt/md1/

Les options utilisées méritent quelques explications.

  • -d préserve les liens symbolique sans les suivre
  • -p préserve l’horodatage et les permissions
  • -R effectue une copie récursive
  • -x reste sur le même système de fichiers

La prochaine étape consiste à éditer le fichier /etc/fstab de notre montage, en l’occurrence /mnt/md1/etc/fstab. Les entrées respectives de /dev/sda1 et /dev/sda5 (ou plus exactement les UUID correspondants) devront être remplacés par /dev/md1 et /dev/md5.

# /etc/fstab
#              
# / was on /dev/sda1 during installation
/dev/md1  /     ext4     errors=remount-ro  0       1
# swap was on /dev/sda5 during installation
/dev/md5  none  swap     sw                 0       0

Modifier le chargeur de démarrage

À présent, il va falloir configurer GRUB pour qu’il démarre sur la grappe. Le fichier /etc/grub.d/40_custom nous servira de modèle, faute de mieux. La nomenclature 09_raid1 s’explique par le fait que les fichiers sont traités en ordre alphanumérique, et que notre configuration provisoire est censée précéder celle du fichier 10_linux.

# cd /etc/grub.d
# cp 40_custom 09_raid1

Éditer 09_raid1 pour démarrer sur la grappe RAID.

#!/bin/sh
exec tail -n +3 $0
# This file provides an easy way to add custom
# menu entries.  Simply type the menu entries you
# want to add after this comment.  Be careful not
# to change the 'exec tail' line above.
menuentry 'KDE neon RAID 1' \
  --class ubuntu --class gnu-linux --class gnu --class os { 
    recordfail 
    insmod mdraid09 
    insmod mdraid1x 
    insmod ext2 
    set root='(md/md1)' 
    linux /boot/vmlinuz-4.10.0-38-generic root=/dev/md1 ro quiet 
    initrd /boot/initrd.img-4.10.0-38-generic 
}

Là aussi, quelques explications sur les options utilisées, qui sont le fruit d’une série de tentatives et d’échecs dont je vous passe les détails.

  • Les modules de GRUB sont rangés dans /boot/grub/i386-pc.
  • Le module mdraid09 fournit le support RAID de base.
  • Le module mdraid1x fournit le support RAID 1.
  • Le module ext2 permet d’accéder aux systèmes de fichiers EXT2 et dérivés.
  • Pour trouver le nom md/md1 de ma grappe, il a fallu que je fasse un redémarrage initial et que j’appuie sur C à l’invite de GRUB pour accéder à la console interactive du chargeur de démarrage. Ensuite, la commande ls m’a affiché les systèmes de fichiers théoriquement accessibles dans la nomenclature biscornue de GRUB.
  • Pour le reste, on indique l’emplacement du kernel et du disque mémoire initial, avec les options de démarrage qui vont bien.

Mettre à jour la configuration de GRUB. Si tout se passe bien, on doit voir quelque chose comme ceci.

# update-grub
Generating grub configuration file ...
Found theme: /boot/grub/themes/breeze/theme.txt
Found linux image: /boot/vmlinuz-4.10.0-38-generic
Found initrd image: /boot/initrd.img-4.10.0-38-generic
Found memtest86+ image: /boot/memtest86+.elf
Found memtest86+ image: /boot/memtest86+.bin
done

Copier le fichier de configuration personnalisé de GRUB vers le deuxième disque.

# cp /etc/grub.d/09_raid1 /mnt/md1/etc/grub.d/

Mettre à jour le disque mémoire initial. L’option -u force simplement la mise à jour d’un fichier existant.

# update-initramfs -u
update-initramfs: Generating /boot/initrd.img-4.10.0-38-generic

Copier le disque mémoire mis à jour vers le deuxième disque.

# cp /boot/initrd.img-4.10.0-38-generic /mnt/md1/boot/

Installer GRUB sur les deux disques, ce qui lui permettra ultérieurement, en cas de défaillance d’un disque, de démarrer sur l’autre.

# grub-install /dev/sda
Installing for i386-pc platform.
Installation finished. No error reported.
# grub-install /dev/sdb
Installing for i386-pc platform.
Installation finished. No error reported.

Il ne reste plus qu’à croiser les doigts et à redémarrer.

# reboot

Redémarrage initial

Une fois qu’on a redémarré, on vérifie qu’on est bien sur la moitié de grappe RAID.

# mount | grep md1
/dev/md1 on / type ext4 (rw,relatime,errors=remount-ro,data=ordered)

Maintenant que le disque sdb est actif, nous allons pouvoir définir les types de partitions corrects pour le disque sda, comme nous l’avons fait plus haut. Lancez fdisk ou cfdisk et changez le type des partitions /dev/sda1 et /dev/sda5 en FD (Linux RAID autodetect). Pour être sûr, vérifiez si le schéma de partitionnement des deux disques est absolument identique.

RAID

À partir de là, je peux compléter ma grappe RAID en ajoutant le disque sda comme ceci.

# mdadm --add /dev/md1 /dev/sda1
mdadm: added /dev/sda1
# mdadm --add /dev/md5 /dev/sda5
mdadm: added /dev/sda5

La commande watch cat /proc/mdstat me permet de surveiller l’état de la synchronisation des disques. Suivant la taille des disques et la puissance de la machine, il va falloir patienter un petit moment.

RAID

Une fois que la synchronisation est terminée, on peut remettre à jour la configuration du chargeur de démarrage.

# update-grub

Remettre à jour le disque mémoire initial.

# update-initramfs -u

Redémarrer une dernière fois.

# reboot

Si tout s’est bien passé. on peut supprimer /etc/grub.d/09_raid1 et passer par la configuration automatique de GRUB.

Ce contenu a été publié dans Documentation Microlinux, avec comme mot(s)-clé(s) , , , , . Vous pouvez le mettre en favoris avec ce permalien.

2 réponses à Convertir un système Linux existant en RAID 1

  1. D0uD dit :

    Bonjour Nikki,

    Je visite assez régulièrement ton blog que j’apprécie pour ses nombreux tutos détaillées et simples.

    J’ai suivi ton exemple et j’ai aussi testé de mon coté KDE neon dont j’apprécie le côté épuré.

    J’ai cru remarqué sur un précédent post que tu utilisais la User Edition LTS.

    Sauf erreur de ma part cette version propose Plasma en version LTS sur une base Ubuntu 16.04 LTS mais les logiciels KDE sont régulièrement mis à jour, au contraire de la version User Edition qui met à jour Plasma ainsi que les logiciels KDE.

    Il y a t’il une raison qui te pousse à utiliser une version plutôt qu’une autre ? Pour moi l’intérêt de cette distro était justement de bénéficier de l’intégralité des updates de KDE (desktop + softwares).

    • kikinovak dit :

      Bonjour Benjamin,

      Étant donné que la majorité de mes installations se font dans un contexte professionnel (ou de “production”), j’ai une préférence marquée pour les versions stables et dûment testées, et de préférence avec un support à long terme. Voir à ce sujet mon article sur la qualité entreprise. C’est également ce qui explique ma préférence marquée pour CentOS. Sur le matériel exotique et/ou récent, la distribution KDE neon me semble être un bon compromis.

      Un gentil bonjour de la garrigue gardoise,

      Nico

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.