Configurer un RAID 1 logiciel sur une installation existante

ATTENTION ! Cette page est en cours de rédaction ; elle n'est donc pas terminée et la procédure qu'elle détaille n'est pas complète.
À moins de bien savoir ce que vous faites, ne suivez pas ces instructions.

Préambule

Objectif

J'explique dans ce tutoriel la marche à suivre pour ajouter un disque dur en RAID 1 logiciel sur une installation existante de Ubuntu Server Lucid Lynx (10.04), version 32 bits.

Limite de responsabilité

Plutôt qu'un véritable guide, il s'agit d'une synthèse des étapes par lesquelles je suis moi-même passé pour y parvenir. N'étant pas du tout un spécialiste de la question, je ne fournis aucune garantie sur le résultat que vous pourriez obtenir en suivant ces instructions ; vous êtes prévenus que certaines d'entre elles peuvent rendre votre système inutilisable et vous contraindre à le réinstaller. Je vous invite vivement à faire une sauvegarde complète de vos données avant de commencer.

Sources

Ce tutoriel est très largement basé sur celui de Falko Timme que vous trouverez à cette adresse : http://www.howtoforge.com/software-raid1-grub-boot-debian-etch. Je l'ai traduit, légèrement adapté pour Ubuntu 10.04, et actualisé pour ce qui concerne la configuration de GRUB2. Il faut noter que Falko Timme est allé au bout de l'installation avec prise en compte de GRUB2 dans l'article suivant qui semble être une mise à jour du précédent : https://www.howtoforge.com/how-to-set-up-software-raid1-on-a-running-system-incl-grub2-configuration-ubuntu-10.04 .

Pré-requis

Avant de commencer, je disposais :

  • d'une installation fonctionnelle de Ubuntu Server Lucid Lynx (10.04) sur un disque de 500 Go (/dev/sda) ;
  • des droits d'administration ;
  • d'un disque de 500 Go, identique au premier, complètement vierge (ni formaté, ni partitionné), branché et reconnu par le système (/dev/sdb) ;
  • d'un Live CD d'Ubuntu Server Lucid Lynx (10.04) ;
  • du tutoriel (soit imprimé, soit affiché sur un autre ordinateur).
J'avais au préalable copié l'intégralité du disque sda sur un autre ordinateur (je sais, je l'ai déjà dit, mais il faut vraiment sauvegarder vos données).

Notes préliminaires

Le disque /dev/sda est divisé en trois partitions :

  • /dev/sda1 pour la racine, qui contient tout le système (/);
  • /dev/sda2 pour du stockage, monté dans un dossier (/multimedia) ;
  • /dev/sda3 pour la partition d'échange (swap).

Je souhaite aboutir à la situation suivante :

  • /dev/md0 composé des partitions /dev/sda1 et /dev/sdb1 ;
  • /dev/md1 composé des partitions /dev/sda2 et /dev/sdb2 ;
  • /dev/md2 composé des partitions /dev/sda3 et /dev/sdb3.
Autres variantes d'Ubuntu
Je n'ai pas installé d'environnement de bureau sur mon serveur, raison pour laquelle toutes les instructions qui suivent sont en ligne de commande. Dans le doute, comme je ne sais pas si elles s'exécuteraient correctement en mode graphique, je vous suggère de fermer votre session graphique et d'appuyer sur CTRL+ALT+F1 pour vous connecter dans une console.

Voici donc la situation actuelle :

blueduck@serveur:~$ df -h

Sys. de fich.        Tail.   Occ. Disp. %Occ. Monté sur
/dev/sda1              39G  7,2G   30G    20% /
none                  244M  200K  244M     1% /dev
none                  249M  4,0K  249M     1% /dev/shm
none                  249M  352K  249M     1% /var/run
none                  249M     0  249M     0% /var/lock
none                  249M     0  249M     0% /lib/init/rw
none                   39G  7,2G   30G    20% /var/lib/ureadahead/debugfs
/dev/sda2             420G  367G   32G    93% /multimedia

blueduck@serveur:~$ sudo fdisk -l

Disque /dev/sda: 500.1 Go, 500107862016 octets
255 têtes, 63 secteurs/piste, 60801 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0x000860a2
  
Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sda1   *           1        5099    40957686   83  Linux
/dev/sda2            5100       60670   446374057+  83  Linux
/dev/sda3           60671       60801     1052257+  82  Linux swap / Solaris
  
Disque /dev/sdb: 500.1 Go, 500107862016 octets
255 têtes, 63 secteurs/piste, 60801 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
  
Le disque /dev/sdb ne contient pas une table de partition valide

Installer mdadm

Il faut installer le paquet mdadm pour configurer le RAID.

Puis, après avoir redémarré votre machine, exécutez :

sudo cat /proc/mdstat

ce qui devrait vous afficher quelque chose comme :

Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
unused devices: <none>

Préparer le second disque dur

Cloner la table des partitions

Afin d'être sûr que le second disque dur (/dev/sdb) sera divisé en partitions absolument identiques à celles du premier disque dur (/dev/sda), on clône la table des partitions du premier pour l'appliquer au second :

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

Ce qui doit provoquer l'affichage suivant :

Vérification qu'aucun autre n'utilise le disque en ce moment ...
OK

Disque /dev/sdb : 60801 cylindres, 255 têtes, 63 secteurs/piste
Vieille situation:
Unités= cylindres de 8225280 octets, blocs de 1024 octets, décompte à partir de 0

   Périph Amor Début     Fin   #cyls    #blocs    Id  Système
/dev/sdb1          0       -       0          0    0  Vide
/dev/sdb2          0       -       0          0    0  Vide
/dev/sdb3          0       -       0          0    0  Vide
/dev/sdb4          0       -       0          0    0  Vide

Nouvelle situation:
Unités= secteurs de 512 octets, décompte à partir de 0

   Périph Amorce  Début       Fin   #secteurs Id  Système
/dev/sdb1   *        63  81915434   81915372  83  Linux
/dev/sdb2      81915435 974663549  892748115  83  Linux
/dev/sdb3     974663550 976768064    2104515  82  Linux swap / Solaris
/dev/sdb4             0         -          0   0  Vide
Succès d'écriture de la nouvelle table de partitions

Relecture de la table de partitions ...

Si vous créez ou modifiez une partition DOS, /dev/foo7, par exemple, alors
utiliser dd(1) pour mettre à zéro les premiers 512 octets:
dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(Consulter fdisk(8).)

La commande :

sudo fdisk -l

doit montrer que les deux disques durs ont maintenant exactement la même structure :

Disque /dev/sda: 500.1 Go, 500107862016 octets
255 têtes, 63 secteurs/piste, 60801 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0x000860a2

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sda1   *           1        5099    40957686   83  Linux
/dev/sda2            5100       60670   446374057+  83  Linux
/dev/sda3           60671       60801     1052257+  82  Linux swap / Solaris

Disque /dev/sdb: 500.1 Go, 500107862016 octets
255 têtes, 63 secteurs/piste, 60801 cylindres
Unités = cylindres de 16065 * 512 = 8225280 octets
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Identifiant de disque : 0x4caa4880

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sdb1   *           1        5099    40957686   83  Linux
/dev/sdb2            5100       60670   446374057+  83  Linux
/dev/sdb3           60671       60801     1052257+  82  Linux swap / Solaris

Plus simple et rapide que de partitionner à la main, non ;-) ?

Changer le type des partitions (sdb)

Ensuite, il faut régler le type des partitions sur Linux raid autodetect. On continue d'utiliser fdisk.
Rapidement, je rappelle que fdisk est une ligne de commande : chaque commande est une lettre, que l'on valide avec ENTRÉE. Les modifications ne sont pas appliquées tant qu'on ne les a pas écrites avec la commande w. La commande m affiche les commandes disponibles :

  blueduck@serveur:~$ sudo fdisk /dev/sdb

  Commande (m pour l'aide): m
  Commande d'action
     a   bascule le fanion d'amorce
     b   éditer l'étiquette BSD du disque
     c   basculer le fanion de compatibilité DOS
     d   supprimer la partition
     l   lister les types de partitions connues
     m   afficher ce menu
     n   ajouter une nouvelle partition
     o   créer une nouvelle table vide de partitions DOS
     p   afficher la table de partitions
     q   quitter sans enregistrer les changements
     s   créer une nouvelle étiquette vide pour disque de type Sun
     t   modifier l'id de système de fichiers d'une partition
     u   modifier les unités d'affichage/saisie
     v   vérifier la table de partitions
     w   écrire la table sur le disque et quitter
     x   fonctions avancées (pour experts seulement)
  
  Commande (m pour l'aide):

Pour changer le type d'une partition, on utilise la commande t :

  Commande (m pour l'aide): t

Il faut ensuite indiquer le numéro de la partition à modifier (ici la 1) :

  Numéro de partition (1-4): 1

Puis le code du type de partition voulu (L affiche la liste des codes possibles) :

  Code Hexa (taper L pour lister les codes): L
  
   0  Vide            24  NEC DOS         81  Minix / Linux a bf  Solaris
   1  FAT12           39  Plan 9          82  Linux swap / So c1  DRDOS/sec (FAT-
   2  XENIX root      3c  PartitionMagic  83  Linux           c4  DRDOS/sec (FAT-
   3  XENIX usr       40  Venix 80286     84  OS/2 cachée di  c6  DRDOS/sec (FAT-
   4  FAT16 <32M      41  PPC PReP Boot   85  Linux étendue   c7  Syrinx
   5  Etendue         42  SFS             86  NTFS volume set da  Non-FS data
   6  FAT16           4d  QNX4.x          87  NTFS volume set db  CP/M / CTOS / .
   7  HPFS/NTFS       4e  QNX4.x 2nd part 88  Linux plaintext de  Dell Utility
   8  AIX             4f  QNX4.x 3rd part 8e  Linux LVM       df  BootIt
   9  AIX amorçable   50  OnTrack DM      93  Amoeba          e1  DOS access
   a  OS/2 Boot Manag 51  OnTrack DM6 Aux 94  Amoeba BBT      e3  DOS R/O
   b  W95 FAT32       52  CP/M            9f  BSD/OS          e4  SpeedStor
   c  W95 FAT32 (LBA) 53  OnTrack DM6 Aux a0  IBM Thinkpad hi eb  BeOS fs
   e  W95 FAT16 (LBA) 54  OnTrackDM6      a5  FreeBSD         ee  GPT
   f  W95 Etendue (LB 55  EZ-Drive        a6  OpenBSD         ef  EFI (FAT-12/16/
  10  OPUS            56  Golden Bow      a7  NeXTSTEP        f0  Linux/PA-RISC b
  11  Cachée FAT12    5c  Priam Edisk     a8  UFS Darwin      f1  SpeedStor
  12  Compaq diagnost 61  SpeedStor       a9  NetBSD          f4  SpeedStor
  14  Cachée FAT16 <  63  GNU HURD or Sys ab  Amorce Darwin   f2  DOS secondaire
  16  Cachée FAT16    64  Novell Netware  af  HFS / HFS+      fb  VMware VMFS
  17  Cachée HPFS/NT  65  Novell Netware  b7  BSDI fs         fc  VMware VMKCORE
  18  AST SmartSleep  70  DiskSecure Mult b8  BSDI swap       fd  Linux raid auto
  1b  Cachée W95 FAT  75  PC/IX           bb  Boot Wizard hid fe  LANstep
  1c  Cachée W95 FAT  80  Minix ancienne  be  Amorce Solaris  ff  BBT
  1e  Cachée W95 FAT

Le type Linux raid autodetect correspond au code fd :

  Code Hexa (taper L pour lister les codes): fd

  Type système de partition modifié de 83 à fd (Linux raid autodetect)
  
  Commande (m pour l'aide):

On répète l'opération pour les deux autres partitions (la 2 et la 3) :

Commande (m pour l'aide): t
Numéro de partition (1-4): 2
Code Hexa (taper L pour lister les codes): fd
Type système de partition modifié de 83 à fd (Linux raid autodetect)

Commande (m pour l'aide): t
Numéro de partition (1-4): 3
Code Hexa (taper L pour lister les codes): fd
Type système de partition modifié de 82 à fd (Linux raid autodetect)

Commande (m pour l'aide):

Et on termine en appliquant les changements :

Commande (m pour l'aide): w
La table de partitions a été altérée!

Appel de ioctl() pour relire la table de partitions.
Synchronisation des disques.
Vérifier les partitions

Pour s'assurer qu'il n'y a pas de restes d'une précédente installation RAID, on exécute les commandes suivantes :

blueduck@serveur:~$ sudo mdadm --zero-superblock /dev/sdb1
blueduck@serveur:~$ sudo mdadm --zero-superblock /dev/sdb2
blueduck@serveur:~$ sudo mdadm --zero-superblock /dev/sdb3

S'il ne reste rien d'une précédente installation, chacune de ces commandes renverra une erreur de ce type :

mdadm: Unrecognised md component device - /dev/sdb1

Dans le cas contraire, rien ne s'affichera.

Configurer le RAID 1

Créer les grappes

On crée /dev/md0 avec /dev/sdb1 ; /dev/md1 et /sdv/sdb2 : /dev/md2 à partir de /dev/sdb3. Les partitions correspondantes du premier disque ne peuvent pas être ajoutées pour le moment, car le système fonctionne dessus. C'est pourquoi on les remplace par le mot missing dans les commandes suivantes :

sudo mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
sudo mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb2
sudo mdadm --create /dev/md2 --level=1 --raid-disks=2 missing /dev/sdb3

La commande :

sudo cat /proc/mdstat

devrait maintenant montrer que vous avez trois grappes RAID dégradées :

  Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
  md2 : active raid1 sdb3[1]
        1052160 blocks [2/1] [_U]
  
  md1 : active raid1 sdb2[1]
        446373952 blocks [2/1] [_U]
  
  md0 : active raid1 sdb1[1]
        40957568 blocks [2/1] [_U]
  
  unused devices: <none>
Les indicateurs [_U] ou [U_] signifient qu'une grappe est dégradée, alors que [UU] signifie que la grappe est normale.

Créer les systèmes de fichiers (sdb)

On peut désormais choisir le système de fichiers de chaque grappe, ext4 pour /dev/md0 et /dev/md1, swap pour /dev/md2 :

blueduck@serveur:~$ sudo mkfs.ext4 /dev/md0

mke2fs 1.41.11 (14-Mar-2010)

Étiquette de système de fichiers=
Type de système d'exploitation : Linux
Taille de bloc=4096 (log=2)
Taille de fragment=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
2564096 i-noeuds, 10239392 blocs
511969 blocs (5.00%) réservés pour le super utilisateur
Premier bloc de données=0
Nombre maximum de blocs du système de fichiers=0
313 groupes de blocs
32768 blocs par groupe, 32768 fragments par groupe
8192 i-noeuds par groupe
Superblocs de secours stockés sur les blocs :
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
        4096000, 7962624

Écriture des tables d'i-noeuds : complété
Création du journal (32768 blocs) : complété
Écriture des superblocs et de l'information de comptabilité du système de
fichiers : complété

Le système de fichiers sera automatiquement vérifié tous les 24 montages ou
après 180 jours, selon la première éventualité. Utiliser tune2fs -c ou -i
pour écraser la valeur.

Continuer avec :

sudo mkfs.ext4 /dev/md1

et

sudo mkswap /dev/md2

Mettre à jour le fichier mdadm.conf

À présent, adaptez le fichier /etc/mdadm/mdadm.conf, qui ne contient encore aucune information concernant les grappes, à la nouvelle situation. Faites d'abord une copie du fichier existant (on ne sait jamais) :

sudo cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf-dist

puis faites un scan de la configuration RAID qui sera ajoutée au nouveau fichier :

sudo mdadm --examine --scan | sudo tee -a /etc/mdadm/mdadm.conf

Vérifiez que votre fichier /etc/mdadm/mdadm.conf ressemble à ça :

blueduck@serveur:~$ sudo cat /etc/mdadm/mdadm.conf
  # mdadm.conf
  #
  # Please refer to mdadm.conf(5) for information about this file.
  #
  
  # by default, scan all partitions (/proc/partitions) for MD superblocks.
  # alternatively, specify devices to scan, using wildcards if desired.
  DEVICE partitions
  
  # auto-create devices with Debian standard permissions
  CREATE owner=root group=disk mode=0660 auto=yes
  
  # automatically tag new arrays as belonging to the local system
  HOMEHOST <system>
  
  # instruct the monitoring daemon where to send mail alerts
  MAILADDR root
  
  ARRAY /dev/md0 level=raid1 num-devices=2 UUID=e5e23f0a:be11ad51:2b872d8f:382c1990
  ARRAY /dev/md1 level=raid1 num-devices=2 UUID=057ec4b9:88398a79:2b872d8f:382c1990
  ARRAY /dev/md2 level=raid1 num-devices=2 UUID=18366108:daee6e7a:2b872d8f:382c1990

Monter les grappes

Les grappes sont prêtes à être montées, afin de pouvoir y accéder. Créez deux points de montage, par exemple /mnt/md0 et /mnt/md1 :

sudo mkdir /mnt/md0
sudo mkdir /mnt/md1

puis montez les deux grappes formatées en ext4 :

sudo mount /dev/md0 /mnt/md0
sudo mount /dev/md1 /mnt/md1

La grappe d'échange (/dev/md2) n'a pas besoin d'être montée pour le moment. Vous devriez voir les deux grappes en tapant la commande :

blueduck@serveur:~$ sudo mount
/dev/sda1 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw)
none on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
none on /dev type devtmpfs (rw,mode=0755)
none on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
none on /dev/shm type tmpfs (rw,nosuid,nodev)
none on /var/run type tmpfs (rw,nosuid,mode=0755)
none on /var/lock type tmpfs (rw,noexec,nosuid,nodev)
none on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)
none on /var/lib/ureadahead/debugfs type debugfs (rw,relatime)
/dev/sda2 on /multimedia type ext4 (rw,acl)
rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)
nfsd on /proc/fs/nfsd type nfsd (rw)
/home/blueduck/.Private on /home/blueduck type ecryptfs (ecryptfs_sig=5cc2cd19b7f74f7e,ecryptfs_fnek_sig=37dc806e941db751,ecryptfs_cipher=aes,ecryptfs_key_bytes=16)
/dev/md0 on /mnt/md0 type ext4 (rw)
/dev/md1 on /mnt/md1 type ext4 (rw)

Mettre à jour les fichiers fstab et mtab

Je ne vais pas entrer ici dans le détail : les pages sur fstab et les UUID ne manquent pas. Soyez simplement extrêmement prudents avec ce fichier, dans lequel une erreur peut facilement empêcher votre système de démarrer.

Dupliquer les données

Maintenant que les grappes sont montées, on peut copier dessus le contenu du premier disque dur :

sudo cp -dpRx / /mnt/md0
sudo cp -dpRx /multimedia/ /mnt/md1
Le slash (/) à la fin de /multimedia/ a son importance :
  • s'il est présent, le contenu du dossier /multimedia sera copié dans /mnt/md1 ;
  • s'il est absent, c'est le dossier /multimedia qui sera copié dans /mnt/md1, c'est-à-dire qu'on obtiendra dans /mnt/md1 un dossier multimedia.

Comme ici /multimedia sera un point de montage vers /dev/md1, il faut que ce slash soit présent.

Rappel sur les options utilisées de la commande cp :

  • -d préserve les liens symboliques ;
  • -p préserve les propriétés des fichiers et dossiers (droits d'accès, propriétaires, heure de la dernière modification) ;
  • -R demande une copie récursive ;
  • -x demande de ne pas sortir du système de fichier contenant le dossier à copier, ainsi même si / contient /proc, le contenu de /proc ne sera pas copié car /proc est dans un système de fichier virtuel (nommé proc, cf. /etc/fstab) différent du système de fichier ext4 contenant / ;
  • l'option -u pourrait être rajoutée en cas de copie interrompue (ne copie les fichiers que s'ils sont plus récents, ou n'ont pas encore été copiés).
Pour ma part, j'ai préféré utiliser rsync :
sudo rsync -av --progress --stats --filter "- /mnt" / /mnt/md0
sudo rsync -av --progress --stats /multimedia /mnt/md1

Compte-tenu des quantités de données à déplacer (plus de 400 Go depuis /dev/sda2), cela me permettait en cas de besoin d'interrompre la synchronisation, et de la reprendre plus tard.

FIXME Il serait bien que quelqu'un précise si l'on peut sans risque substituer comme je l'ai fait rsync à cp. D'autre part, il doit être possible d'éviter la synchronisation de certains dossiers en ajoutant des filtres (je pense notamment à /proc, /tmp, …) : à confirmer.

Premier redémarrage

Configuration de GRUB (première partie)

FIXME

Après le premier redémarrage

Si tout s'est bien passé, vous devriez obtenir le résultat suivant avec la commande df :

blueduck@serveur:~$ df -h
Sys. de fich.        Tail.   Occ. Disp. %Occ. Monté sur

Et toujours :

blueduck@serveur:~$ sudo cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]

Ajouter le premier disque dur

Modifier le type des partitions (sda)

De même que pour /dev/sdb précédemment, nous utilisons fdisk pour changer le type des partitions de /dev/sda en Linux raid autodetect.

Intégrer le premier disque dur à la grappe

Le temps est venu d'intégrer les partitions de /dev/sda dans les grappes /dev/md0, /dev/md1 et /dev/md2.

Mettre à jour le fichier mdadm.conf

Une nouvelle fois, il faut scanner la configuration RAID pour mettre à jour le fichier /etc/mdadm/mdadm.conf.

Configuration de GRUB (deuxième partie)

FIXME

Après le deuxième redémarrage

FIXME

Test : simuler la panne d'un disque dur

FIXME

Liens


Contributeur principal : blueduck.