[HOWTO] Créer un RAID1 à partir d'une installation existante avec un partitionnement LVM sous linux

On ne prend jamais assez de précaution avec nos données personnelles. Qui n'a jamais redouté la perte de données lorsque l'on entend son disque faire des claquements bizarres? Il existe des protections.

Ici j'ai opté pour la mise en place d'un RAID miroir logiciel.

Mettre en place ce type de tolérance est pour moi une méthode simple et peu onéreuse pour tolérer la panne matériel d'un disque. Le système étant basé sur des fonctionnalités du noyau, l'on peut sans encombre remonter le RAID sur un autre système basé sous Linux sans être tributaire du matériel comme le cas de raid semi logiciel ou matériel.

Dans ce billet j'ai étudié une méthode de placement d'un système de redondance à partir d'un système existant. Il va s'en dire qu'il est nécessaire de posséder un deuxième disque de taille identique (ou plus grand?) que celui d'origine.

Pour illustrer la méthode, je suis parti d'une Debian 7 vierge, installée avec le partitionnement LVM par défaut.

Analyse du système à dupliquer

Analysons d'abord la structure de partitionnement de la machine:

root@debian7:~# parted /dev/sda print
Model: VMware, VMware Virtual S (scsi)
Disk /dev/sda: 21,5GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type      File system  Flags
 1      1049kB  256MB   255MB   primary   ext2         boot
 2      257MB   21,5GB  21,2GB  extended
 5      257MB   21,5GB  21,2GB  logical                lvm

On observe la présence d'une partition LVM. Affichons son contenu:

root@debian7:~# pvs
  PV         VG      Fmt  Attr PSize  PFree
  /dev/sda5  debian7 lvm2 a--  19,76g    0
root@debian7:~# vgs
  VG      #PV #LV #SN Attr   VSize  VFree
  debian7   1   2   0 wz--n- 19,76g    0
root@debian7:~# lvs
  LV     VG      Attr     LSize   Pool Origin Data%  Move Log Copy%  Convert
  root   debian7 -wi-ao--  18,91g
  swap_1 debian7 -wi-ao-- 872,00m

Préparation du nouveau disque

Éteignons et plaçons le second disque qui servira de miroir si ce n'est pas déjà fait et démarrons notre système sur un livecd. Pour ma part, j'utilise le livecd de Xubuntu (http://xubuntu.org/). Notez que vous devez utiliser un livecd correspondant à l'architecture de votre Debian. En effet, plus tard nous utiliserons un environnement chroot pour effectuer quelques réglages et il est donc nécessaire d’exécuter les binaires de votre debian depuis le livecd.

Installons les outils nécessaires pour la création du RAID:

root@ubuntu:~# apt-get install -y mdadm lvm2
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
Les paquets supplémentaires suivants seront installés :
  libdevmapper-event1.02.1 postfix watershed
Paquets suggérés :
  procmail postfix-mysql postfix-pgsql postfix-ldap postfix-pcre sasl2-bin resolvconf postfix-cdb
Les NOUVEAUX paquets suivants seront installés :
  libdevmapper-event1.02.1 lvm2 mdadm postfix watershed
0 mis à jour, 5 nouvellement installés, 0 à enlever et 514 non mis à jour.
Il est nécessaire de prendre 2 005ko dans les archives.
Après cette opération, 5 231ko d'espace disque supplémentaires seront utilisés.
Réception de : 1 http://archive.ubuntu.com/ubuntu/ lucid/main watershed 5 [10,7kB]
Réception de : 2 http://security.ubuntu.com/ubuntu/ lucid-security/main libdevmapper-event1.02.1 2:1.02.39-1ubuntu4.1 [27,5kB]
...
Traitement des actions différées (« triggers ») pour « libc-bin »...
ldconfig deferred processing now taking place

La première étape consiste à créer un RAID1 avec un seul disque. Le deuxième sera signalé comme "absent" (missing).

Commençons par le partitionnement du nouveau disque. N'oubliez pas d'identifier correctement ce nouveau disque! (l'utilitaire parted ou fdisk vous permettra de le retrouver aisément.)


root@ubuntu:~# fdisk /dev/sdb

WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
         switch off the mode (command 'c') and change display units to
         sectors (command 'u').

Commande (m pour l'aide): n
Commande d'action
   e   étendue
   p   partition primaire (1-4)
p
Numéro de partition (1-4): 1
Premier cylindre (1-3916, par défaut 1):
Utilisation de la valeur par défaut 1
Dernier cylindre, +cylindres or +taille{K,M,G} (1-3916, par défaut 3916): +100M

Commande (m pour l'aide): t
Partition sélectionnée 1
Code Hexa (taper L pour lister les codes): fd
Type système de partition modifié de 1 à fd (Linux raid autodetect)

Commande (m pour l'aide): n
Commande d'action
   e   étendue
   p   partition primaire (1-4)
e
Numéro de partition (1-4): 2
Premier cylindre (15-3916, par défaut 15):
Utilisation de la valeur par défaut 15
Dernier cylindre, +cylindres or +taille{K,M,G} (15-3916, par défaut 3916):
Utilisation de la valeur par défaut 3916

Commande (m pour l'aide): n
Commande d'action
   l   logique (5 ou plus)
   p   partition primaire (1-4)
l
Premier cylindre (15-3916, par défaut 15):
Utilisation de la valeur par défaut 15
Dernier cylindre, +cylindres or +taille{K,M,G} (15-3916, par défaut 3916):
Utilisation de la valeur par défaut 3916

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

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.


Nous nous retrouvons avec le partitionnement suivant:

root@ubuntu:~# fdisk -l /dev/sdb

Disque /dev/sdb: 32.2 Go, 32212254720 octets
255 têtes, 63 secteurs/piste, 3916 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 : 0x27f49ba3

Périphérique Amorce  Début        Fin      Blocs     Id  Système
/dev/sdb1               1          14      112423+  fd  Linux raid autodetect
/dev/sdb2              15        3916    31342815    5  Etendue
/dev/sdb5              15        3916    31342783+  fd  Linux raid autodetect

Chaque partition "linux raid autodetect" sera synchronisée sur l'autre disque. Notez qu'une autre méthode existe et consiste à copier le partitionnement du disque originale vers le disque dédié au RAID1.

Il suffit pour se faire de taper la commande:

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

Ensuite, utilisez l'utilitaire fdisk pour changer le type de partition en "Linux raid autodetect".

Création du RAID Logiciel avec un seul disque

Maintenant, nous allons créer les périphériques "md" qui contiendra les partitions du système de RAID1:

root@ubuntu:~# mdadm --create /dev/md0 --level=1 --raid-disks=2 missing /dev/sdb1
mdadm: array /dev/md0 started.
root@ubuntu:~# mdadm --create /dev/md1 --level=1 --raid-disks=2 missing /dev/sdb5
mdadm: array /dev/md1 started.

Nous pouvons à l'aide de la commande suivante connaître les détails sur les périphériques créés:

root@ubuntu:~# mdadm --detail /dev/md0
/dev/md0:
        Version : 00.90
  Creation Time : Tue Aug 13 22:05:09 2013
     Raid Level : raid1
     Array Size : 112320 (109.71 MiB 115.02 MB)
  Used Dev Size : 112320 (109.71 MiB 115.02 MB)
   Raid Devices : 2
  Total Devices : 1
Preferred Minor : 0
    Persistence : Superblock is persistent

    Update Time : Tue Aug 13 22:05:09 2013
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           UUID : fb44ae98:699fb1b7:e368bf24:bd0fce41 (local to host ubuntu)
         Events : 0.1

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       17        1      active sync   /dev/sdb1
root@ubuntu:~# mdadm --detail /dev/md1
/dev/md1:
        Version : 00.90
  Creation Time : Tue Aug 13 22:05:15 2013
     Raid Level : raid1
     Array Size : 31342656 (29.89 GiB 32.09 GB)
  Used Dev Size : 31342656 (29.89 GiB 32.09 GB)
   Raid Devices : 2
  Total Devices : 1
Preferred Minor : 1
    Persistence : Superblock is persistent

    Update Time : Tue Aug 13 22:05:15 2013
          State : clean, degraded
 Active Devices : 1
Working Devices : 1
 Failed Devices : 0
  Spare Devices : 0

           UUID : b9389532:0c182a29:e368bf24:bd0fce41 (local to host ubuntu)
         Events : 0.1

    Number   Major   Minor   RaidDevice State
       0       0        0        0      removed
       1       8       21        1      active sync   /dev/sdb5

On voit bien qu'un seul disque est présent et que le statut général est en "dégradé" (degraded).

Préparation des nouvelles partitions

La partition de boot

Le périphérique md0 contiendra le système de boot. Il faut donc le formater en conséquence:

root@ubuntu:~# mkfs.ext2 /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=1024 (log=0)
Taille de fragment=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
28112 i-noeuds, 112320 blocs
5616 blocs (5.00%) réservés pour le super utilisateur
Premier bloc de données=1
Nombre maximum de blocs du système de fichiers=67371008
14 groupes de blocs
8192 blocs par groupe, 8192 fragments par groupe
2008 i-noeuds par groupe
Superblocs de secours stockés sur les blocs :
        8193, 24577, 40961, 57345, 73729

Écriture des tables d'i-noeuds : 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.

La partition LVM

Attaquons-nous maintenant au lvm.

Tout d'abord, initialisons la partition lvm:

root@ubuntu:~# pvcreate /dev/md1
  Physical volume "/dev/md1" successfully created

Ensuite, l'on crée un nouveau volume groupe:

root@ubuntu:~# vgcreate RAIDdebian7 /dev/md1
  Volume group "RAIDdebian7" successfully created

Et enfin les volumes logiques:

root@ubuntu:~# lvcreate -L 18G -n root RAIDdebian7
  Logical volume "root" created
root@ubuntu:~# lvcreate -L 1G -n swap RAIDdebian7
  Logical volume "swap" created

Un petit listing des volumes logiques:

root@ubuntu:~# lvs
  LV     VG          Attr   LSize   Origin Snap%  Move Log Copy%  Convert
  root   RAIDdebian7 -wi-a-  18,00g
  swap   RAIDdebian7 -wi-a-   1,00g
  root   debian7     -wi-a-  18,91g
  swap_1 debian7     -wi-a- 872,00m

Tout semble au poil!

Pour continuer, nous devons activer les partitions fraîchement installées afin de peupler le répertoire /dev.

root@ubuntu:~# vgchange -ay
  2 logical volume(s) in volume group "debian7" now active
  2 logical volume(s) in volume group "RAIDdebian7" now active

Procédons au formatage de celle-ci:

root@ubuntu:~# mkfs.ext4 /dev/RAIDdebian7/root
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
1179648 i-noeuds, 4718592 blocs
235929 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
144 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

É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 33 montages ou
après 180 jours, selon la première éventualité. Utiliser tune2fs -c ou -i
pour écraser la valeur.

root@ubuntu:~# mkswap /dev/RAIDdebian7/swap
mkswap : /dev/RAIDdebian7/swap : attention, ne pas effacer les secteurs de démarrage
        tout le disque. Use -f to force.
Configure l'espace d'échange (swap) en version 1, taille = 1048572 Ko
pas d'étiquette, UUID=7ce8ac94-4068-43eb-bb54-b78774b3973c


Duplication du système vers notre nouveau RAID

Créons quelques répertoires afin de lancer la copie des données:

root@ubuntu:~# mkdir /mnt/sda1 /mnt/sda5 /mnt/tmp/root -p

Montons les partitions et lançons la copie :

root@ubuntu:~# mount /dev/sda1 /mnt/sda1/
root@ubuntu:~# mount /dev/debian7/root /mnt/sda5/
root@ubuntu:~# mount /dev/RAIDdebian7/root /mnt/tmp/root/
root@ubuntu:~# mkdir /mnt/tmp/root/boot
root@ubuntu:~# mount /dev/md0 /mnt/tmp/root/boot/
root@ubuntu:~# rsync -av /mnt/sda1/ /mnt/tmp/root/boot/
sending incremental file list
./
System.map-3.2.0-4-amd64
config-3.2.0-4-amd64
...

root@ubuntu:~# rsync -av /mnt/sda5/ /mnt/tmp/root/
sending incremental file list
usr/share/dict/
usr/share/dict/american-english
usr/share/dict/french

Configuration de l'installation répliquée

Les données sont répliquées. Il nous reste plus qu'a réinstaller sur ce nouveau disque le loader GRUB et les modules nécessaires au démarrage du RAID. Montons les liens important au bon fonctionnement du chroot:

root@ubuntu:/mnt/tmp# mount -t proc none /mnt/tmp/root/proc
root@ubuntu:/mnt/tmp# mount -o bind /dev /mnt/tmp/root/dev
root@ubuntu:/mnt/tmp# mount -t sysfs sys /mnt/tmp/root/sys

Rentrons dans ce chroot:

root@ubuntu:/mnt# chroot /mnt/tmp/root/ /bin/bash
root@ubuntu:/#

Dans ce nouvel environnement, il nous faut le nécessaire pour que le RAID logiciel soit correctement vu et monté au démarrage. (Dont la regénération de l'initrd avec support de l'automontage des partitions linux RAID.)

root@ubuntu:/# apt-get install -y mdadm
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following NEW packages will be installed:
  mdadm
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
...
[ ok ] Starting MD monitoring service: mdadm --monitor.
Processing triggers for initramfs-tools ...
update-initramfs: Generating /boot/initrd.img-3.2.0-4-amd64

Modification du fstab

D'abord on repère les UUID des partitions et ensuite on les insères au bon endroit dans son fstab:

 
root@ubuntu:~# blkid
/dev/mapper/debian7-swap_1: UUID="1892188e-aa78-4a00-9bd9-dbb00c3f69ea" TYPE="swap"
/dev/sda5: UUID="Ibp2gb-HwD6-6La0-0K9D-w0Kb-J5Pz-viT3Tg" TYPE="LVM2_member"
/dev/loop0: TYPE="squashfs"
/dev/sr0: LABEL="Ubuntu precise 20120425-15:29" TYPE="iso9660"
/dev/zram0: UUID="13d5b06d-4f1f-45bb-a4c8-beef74557a77" TYPE="swap"
/dev/sda1: UUID="0420a472-61a7-4b9f-b964-128003e21074" TYPE="ext2"
/dev/sdb1: UUID="fb44ae98-699f-b1b7-e368-bf24bd0fce41" TYPE="linux_raid_member"
/dev/sdb5: UUID="b9389532-0c18-2a29-e368-bf24bd0fce41" TYPE="linux_raid_member"
/dev/md0: UUID="2380ce70-ff02-4bfa-92e5-26cf07d91b1e" TYPE="ext2"
/dev/md1: UUID="skE2Mz-9LzT-XNxq-U4yW-McE1-7Uoe-sqhnYR" TYPE="LVM2_member"
/dev/mapper/debian7-root: UUID="55dce786-ec24-4fc6-91b1-7e4384372c6c" TYPE="ext4"
/dev/mapper/RAIDdebian7-root: UUID="0b934905-1a0b-4d96-bb70-ff0d9e610f10" TYPE="ext4"
/dev/mapper/RAIDdebian7-swap: UUID="7ce8ac94-4068-43eb-bb54-b78774b3973c" TYPE="swap"
root@ubuntu:~# nano /etc/fstab
# /etc/fstab: static file system information.
#
# Use 'blkid' to print the universally unique identifier for a
# device; this may be used with UUID= as a more robust way to name devices
# that works even if disks are added and removed. See fstab(5).
#
# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/RAIDdebian7-root /               ext4    errors=remount-ro 0       1

UUID=2380ce70-ff02-4bfa-92e5-26cf07d91b1e /boot           ext2    defaults        0       2
/dev/mapper/RAIDdebian7-swap none            swap    sw              0       0
/dev/sr0        /media/cdrom0   udf,iso9660 user,noauto     0       0
/dev/fd0        /media/floppy0  auto    rw,user,noauto  0       0

On installe le loader grub:

root@ubuntu:/# grub-install --recheck /dev/sdb
Installation finished. No error reported.

On regénère le fichier de configuration grub:

root@ubuntu:~# grub-mkconfig > /boot/grub/grub.cfg
Generating grub.cfg ...
Found linux image: /boot/vmlinuz-3.2.0-4-amd64
Found initrd image: /boot/initrd.img-3.2.0-4-amd64
done

Nous pouvons maintenant tout démonter et redémarrer sur ce nouveau disque!

Ajout du deuxième membre du RAID.

Ce n'est pas encore fini. Quel serait l'intérêt de créer un RAID1 avec un seul disque?

Maintenant que vous avez testé sur votre système en démarrant sur ce nouveau disque, vous pouvez brancher votre deuxième disque et enlever le disque original. Si vous vous servez du disque original comme nouveau membre, vérifiez bien que tout est en ordre avant de procéder aux modifications suivantes.

Nous devons configurer ce nouveau disque et enfin activer la réplication entre les disques en l'ajoutant dans le même groupe RAID.

Partitionnement

Sachant que sda est le nouveau disque, je copie le partitionnement comme ceci:

root@debian7:~# sfdisk -d /dev/sdb | sfdisk /dev/sda
Vérification qu'aucun autre n'utilise le disque en ce moment
OK

Disque /dev/sda : 3916 cylindres, 255 têtes, 63 secteurs/piste

sfdisk: Erreur : le secteur 0 n'a pas une signature MS-DOS
 /dev/sda : type non reconnu de table de partition
Précédente situation :
Aucune partition repérée
Nouvelle situation :
Unités = secteurs de 512 octets, décompte à partir de 0

   Périph Amorce  Début       Fin   #secteurs Id  Système
/dev/sda1            63    224909     224847  fd  RAID Linux autodétecté
/dev/sda2        224910  62910539   62685630   5  Étendue
/dev/sda3             0         -          0   0  Vide
/dev/sda4             0         -          0   0  Vide
/dev/sda5        224973  62910539   62685567  fd  RAID Linux autodétecté
Avertissement : aucune partition primaire marquée amorçable (active)
Peu important pour LILO, mais DOS MBR n'amorcera pas ce disque.
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 utilisez dd(1) pour mettre à zéro les 512 premiers octets :
dd if=/dev/zero of=/dev/foo7 bs=512 count=1
(consultez fdisk(8)).

Installation GRUB loader

Installons grub sur ce nouveau disque

root@debian7:~# grub-install --recheck /dev/sda
Installation finished. No error reported.

Ajoutons ce nouveau disque dans le RAID:

root@debian7:~# mdadm --manage /dev/md0 --add /dev/sda
sda   sda1  sda2  sda5
root@debian7:~# mdadm --manage /dev/md0 --add /dev/sda1
mdadm: added /dev/sda1
root@debian7:~# mdadm --manage /dev/md1 --add /dev/sda5
mdadm: added /dev/sda5

Vérification du RAID

Vérifions l'état du raid:


root@debian7:~# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sda5[2] sdb5[1]
      31342656 blocks [2/1] [_U]
      [===>.................]  recovery = 19.7% (6200064/31342656) finish=2.0min speed=200002K/sec

md0 : active raid1 sda1[0] sdb1[1]
      112320 blocks [2/2] [UU]

unused devices: <none>
root@debian7:~# mdadm --detail /dev/md1
/dev/md1:
        Version : 0.90
  Creation Time : Wed Aug 14 00:05:15 2013
     Raid Level : raid1
     Array Size : 31342656 (29.89 GiB 32.09 GB)
  Used Dev Size : 31342656 (29.89 GiB 32.09 GB)
   Raid Devices : 2
  Total Devices : 2
Preferred Minor : 1
    Persistence : Superblock is persistent

    Update Time : Sun Aug 18 20:25:56 2013
          State : clean, degraded, recovering
 Active Devices : 1
Working Devices : 2
 Failed Devices : 0
  Spare Devices : 1

 Rebuild Status : 34% complete

           UUID : b9389532:0c182a29:e368bf24:bd0fce41
         Events : 0.512

    Number   Major   Minor   RaidDevice State
       2       8        5        0      spare rebuilding   /dev/sda5
       1       8       21        1      active sync   /dev/sdb5

Voilà. Notre RAID1 est en place! :)

Annexe

Voici quelques commandes utiles lors de vos manipulations.

Si pour une raison quelconque, vous devez redémarrer votre RAID sur un système Linux indépendant de celui-ci, utilisez la commande suivante pour recréer les périphériques md0 et md1 rapidement:

mdadm --assemble --scan

Si vous souhaitez plus d'informations sur les partitions présentes sur vos disques:

mdadm --detail --scan

Si vous avez effectuez une mauvaise manipulation et que vous souhaitez enlever les informations concernant le RAID sur la partition, tapez:

mdadm --zero-superblock /dev/sdx1

En cas de panne ou défaillance imminente d'un disque, vous pouvez enlever un membre avec les commandes suivantes.

D'abord le définir en "défaut" si ce n'est pas déjà le cas:

root@debian7:~# mdadm --manage /dev/md0 --fail /dev/sda1
mdadm: set /dev/sda1 faulty in /dev/md0

Ensuite, on peut le supprimer proprement du système RAID à l'aide de la commande suivante:

root@debian7:~# mdadm --manage /dev/md0 --remove /dev/sda1
mdadm: hot removed /dev/sda1 from /dev/md0

Enfin, pour le lvm, voici quelques commandes utiles.

Scanner les partitions physique contenant du LVM:

 pvscan 

Scanner les volumes groupes (important lorsque vous installez le lvm sur un livecd par exemple:

 vgscan 

Une fois vos partitions LVM scannées, vous devez les activer pour que les périphériques mapper apparaissent dans votre /dev. Utilisez la commande suivante qui active littéralement tous les volumes groupes détectes sur le système:

 vgchange -ay 

La discussion continue ailleurs

URL de rétrolien : http://blog.oxidnation.be/index.php?trackback/14

Fil des commentaires de ce billet