Tag Archive for Failover

Commandes pratiques pour gérer le RAID soft sous Linux

Introduction

Je vous propose ici un aide-mémoire aussi synthétique que possible pour découvrir ou retrouver les commandes les plus usuelles dans les cas de mise en place ou de maintenance d’un système de disque en RAID (0,1,4,5 …) logiciel.

Les outils de gestion du RAID logiciel (mdadm, etc.) sont supposés être installés au sein de votre système, ce qui est plutôt courant dans la majorité des distributions mises à disposition de nos jours (je parle de l’année 2010) ; ceci ne sera donc pas l’objet du présent article.

Il n’est pas non plus ici question d’expliquer ou de comparer les différents modes de RAID : 0, 1, 4, 5, 10, etc.

Voici donc les principales commandes (avec exemples) nécessaires à la gestion responsables de ses grappes RAID soft sous Linux.

Vérifier de l’état du RAID

Etat global

monlinux:~ #cat /proc/mdstat
Personalities : [raid0] [raid1] [raid10] [raid6] [raid5] [raid4] [linear]
md2 : active raid1 sdc3[1]
974656448 blocks super 1.0 [2/1] [_U]

md0 : active raid1 sdd1[4] sdc1[2]
1051636 blocks super 1.0 [2/2] [UU]
bitmap: 0/9 pages [0KB], 64KB chunk

md1 : active raid1 sdb3[0] sda3[1]
242093944 blocks super 1.0 [2/2] [UU]
bitmap: 8/462 pages [32KB], 256KB chunk

 

 

Autres commande pour avoir une identification des grappes avec des informations plus synthétiques :

monlinux:~ #mdadm --examine --scan

ARRAY /dev/md/0 metadata=1.0 UUID=e7d78e16:ac222ac5:4480ce5c:2fad9651 name=linux:0
ARRAY /dev/md/1 metadata=1.0 UUID=30967b39:e498bede:01964510:68b45134 name=linux:1
ARRAY /dev/md/2 metadata=1.0 UUID=017d152b:ad18a24b:5b3bfd84:ef1d8c26 name=linux:2

Ces informations doivent être conformes au contenu du fichier « /etc/mdadm/mdadm.conf » (ou « /etc/mdadm.conf » sous openSUSE par exemple). Dans le cas contraire, il est impératif de le mettre à jour comme suit :

( Sauvegarde datée de la version actuelle, en cas où !! )
monlinux:~ #cp /etc/mdadm/mdadm.conf /etc/mdadm/mdadm.conf_backup_AAAA-MM-JJ

( Mise à jour avec les info de la commande scan )
monlinux:~ #mdadm --examine --scan >> /etc/mdadm/mdadm.conf

monlinux:~ #cat /etc/mdadm/mdadm.conf

 

Penser à éditer ensuite le contenu de mdadm.conf afin de le nettoyer des lignes doublons éventuelles ou de l’enrichir d’options par défaut par exemple.

Pour vérifier le détail d’une grappe en particulier :

monlinux:~ #mdadm --detail /dev/md1
/dev/md1:
Version : 1.00
Creation Time : Tue Aug  3 02:21:56 2010
Raid Level : raid1
Array Size : 1460292296 (1392.64 GiB 1495.34 GB)
Used Dev Size : 1460292296 (1392.64 GiB 1495.34 GB)

Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

Intent Bitmap : Internal

Update Time : Tue Aug  3 17:42:31 2010
State : active
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Name : linux:1
UUID : 30967b39:e498bede:01964510:68b45134
Events : 16262

Number   Major   Minor   RaidDevice State
0       8       19        0      active sync   /dev/sdb3
1       8       35        1      active sync   /dev/sdc3

 

 

Vérification de l’état d’un disque (device) :

monlinux:~ #mdadm --examine /dev/sda1
/dev/sda1:
 Magic : a92b4efc
 Version : 1.0
 Feature Map : 0x1
 Array UUID : e7d78e16:ac222ac5:4480ce5c:2fad9651
 Name : linux:0
 Creation Time : Tue Aug  3 02:21:55 2010
Raid Level : raid1
Raid Devices : 3

 Avail Dev Size : 3148648 (1537.68 MiB 1612.11 MB)
 Array Size : 3148648 (1537.68 MiB 1612.11 MB)
 Super Offset : 3148656 sectors
 State : clean
 Device UUID : 1e039ddb:be30d627:b6e36dd2:688d42d7

Internal Bitmap : -8 sectors from superblock
 Update Time : Tue Aug  3 17:42:02 2010
 Checksum : ef4b7dc8 - correct
 Events : 52

 Device Role : Active device 0
 Array State : AAA ('A' == active, '.' == missing)

 

 

Créer une grappe RAID

( Création d'une grappe RAID1 avec deux disques )
monlinux:~ #mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 /dev/sdb1

( Création d'une grappe RAID1 de deux disque dont un est absent pour l'instant )
monlinux:~ #mdadm --create --verbose /dev/md0 --level=1 --raid-devices=2 /dev/sda1 missing

( Création d'une grappe RAID1 avec d'autres paramètres ... )
monlinux:~ #mdadm --create --verbose /dev/md0 --level=1 --name=xyz --metadata=1.0 (...)
            --raid-devices=2 /dev/sda1 /dev/sdb1
( nommage explicite de la grappe avec --name=xyz
  forçage du type de superblock  avec --metadata=1.0 )

J’attire spécialement l’attention sur le paramètre metadata=<version>. Il permet de préciser le mode de gestion du « superblock » RAID.

Version du superblock (métadonnée RAID)

Le « superblock » désigne l’ensemble des données stockées sur les disques et servant à fournir au système les informations lui permettant de gérer les grappes RAID. Le format et le mode de stockage de ces métadonnées sont indiqué par un numéro de version :

0.90 : valeur par défaut, sauf indication contraire dans mdadm.conf

1.0 : « superblock » stocké en fin de partition, cette valeur est utilisée automatiquement par le partitioneur de openSUSE pour une compatibilité avec l’amorçage du système avant montage des volumes en RAID (avec GRUB2 ou Lilo)

1.1 : « superblock » stocké en début de partition

1.2 : « superblock » stocké à 4K du début de la partition

Changer le nombre de disques dans une grappe

( Changement du nombre de disques de la grappe )
monlinux:~ #mdadm --grow --raid-devices=2 /dev/md0

( Ajout d'un disque (/dev/sdb1) à une grappe (/dev/md0) )
monlinux:~ #mdadm --add /dev/md0 /dev/sdb1


Changer la taille d’une grappe

( Changer l'espace disque utilisé par la grappe )
monlinux:~ #mdadm --grow /dev/md2 --size=max

Le paramètre –size=max indique qu’il faut passer à la capacité maximale possible en fonction des disques utilisés dans la grappe. Il est tout aussi possible de préciser une taille en Koctets.

Si la grappe à un « write-intent bitmap », il est fortement recommandé de supprimer le « bitmap » avant le changement de taille et de le reconstruire après. C’est en particulier nécessaire si la commande « grow » retourne le message d’erreur suivant : « Device or resource busy ».

monlinux:~ #mdadm --grow /dev/md2 --size=max

mdadm: Cannot set device size for /dev/md0: Device or resource busy

Cette précaution peut éviter la destruction de la grappe et de ses données, notamment si le bitmap existant n’est pas suffisamment grand et que l’augmentation de la taille de la grappe risque d’entrainer un changement de la taille des bloques (chunksize) du bitmap.

Augmentation de la taille avec régénération du bitmap :

( Suppresion du bitmap )
monlinux:~ #mdadm --grow /dev/md2 --bitmap none

( Changement de taille de la grappe à la valeur maximale )
monlinux:~ #mdadm --grow /dev/md2 --size=max

( Force à attendre la fin de l'action ci-dessus avant de lancer la suite )
monlinux:~ #mdadm --wait /dev/md2

( Reconstruction du bitmap (interne) )
monlinux:~ #mdadm --grow /dev/md2 --bitmap internal

 

Attention, il est nécessaire de redimensionner le système de fichier (Ext2, Ext3, Ext4, RaiserFS, etc.) ensuite pour finir la prise en compte du changement de taille.

Redimensionnement du système de fichier de type Ext2/3/4

( Vérifier ... )
monlinux:~ #e2fsck -f /dev/md2

( ... redimensionner ... )
monlinux:~ #resize2fs /dev/md2

( ... revérifier )
monlinux:~ #e2fsck -f /dev/md2


Retirer des disques d’un volume RAID

( Désactiver le disque )
monlinux:~ #mdadm /dev/md0 --fail /dev/sdb1

( Avant de le retirer de la grappe )
monlinux:~ #mdadm /dev/md0 --remove /dev/sdb1

( Si c'est un retrait définitif, il est nécessaire de supprimer le superblock du disque )
monlinux:~ #mdadm --zero-superblock /dev/sdb1

 

 

Arrêter et supprimer une grappe

( Arrêt de la grappe )
monlinux:~ #mdadm --stop /dev/md0

( Écrasement des superblocks pour finaliser la suppression de la grappe )
monlinux:~ #mdadm --zero-superblock /dev/sda1

( Pour tous les disques de la grappe )
monlinux:~ #mdadm --zero-superblock /dev/sdb1

( Un examine scan permet de férifier que la grappe a bien été définitivement supprimé )
monlinux:~ #mdadm --examine --scan

 

 

Actualiser la configuration

(Vu plus haut)

//Mise à jour du fichier mdadm.conf
monlinux:~ #mdadm --examine --scan >> /etc/mdadm.conf

 

 

Sources :

http://www.howtoforge.com/software-raid1-grub-boot-debian-etch
http://www.howtoforge.com/how-to-resize-raid-partitions-shrink-and-grow-software-raid
http://www.unixgarden.com/index.php/administration-systeme/la-souplesse-du-raid-logiciel-de-linux-2
https://raid.wiki.kernel.org/index.php/Growing

Grub et les démarrages un peu RAID !

Vous avez installé un serveur sous Linux, c’est bien !
Vous utilisez Grub pour le démarrage (boot loader), c’est très bien ! (laissons de côté la polémique Grub vs Lilo !).
Vous avez configuré vos disques en RAID1 logiciel, c’est très très bien ! (laissons de côté également la polémique RAID hard vs RAID soft !).
Vous avez configuré le RAID1, y compris pour les partitions de démarrage /boot, c’est une bonne idée … mais, il faut s’assurer que le second disque puisse démarrer (booter) sans encombres s’il arrive un problème au premier, et qu’il ne cherchera pas à accéder aux partitions du disque défaillant.

Pour cela, il est nécessaire de configurer Grub sur les deux disques indépendamment. Voila donc la démarche à suivre :

  1. Lancer Grub en mode « ligne de commande » avec les bons droits :
    monlinux:~ # grub
    
    GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
    
    [ Minimal BASH-like line editing is supported.  For the first word, TAB
      lists possible command completions.  Anywhere else TAB lists the possible
      completions of a device/filename. ]
    grub>

  2. Définir le premier disque hd0 qui correspond à /dev/sda (ou /dev/hda dans le cas de disque IDE) comme racine pour les commandes de configuration :
    grub> root (hd0,0)
    root (hd0,0)
     Filesystem type is ext2fs, partition type 0xfd
    grub>

    (hd0,0 : premier disque hd0, première partition 0)

  3. Demander l’installation des données de démarrage sur ce disque :
    grub> setup (hd0)
    setup (hd0)
     Checking if "/boot/grub/stage1" exists... yes
     Checking if "/boot/grub/stage2" exists... yes
     Checking if "/boot/grub/e2fs_stage1_5" exists... yes
     Running "embed /boot/grub/e2fs_stage1_5 (hd0)"...  17 sectors are embedded.
    succeeded
     Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (...)
                             (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
    Done.
    grub>

  4. Définir le deuxième disque (/dev/sdb ou /dev/hdb si IDE) comme racine mais en s’y référant comme premier disque pour grub (hd0) et installation des données de démarrage comme précédemment :
    grub> device (hd0) /dev/sdb
    device (hd0) /dev/sdb
    grub> root (hd0,0)
    root (hd1,0)
     Filesystem type is ext2fs, partition type 0xfd
    grub> setup (hd0)
    setup (hd0)
    Checking if "/boot/grub/stage1" exists... yes
    Checking if "/boot/grub/stage2" exists... yes
    Checking if "/boot/grub/e2fs_stage1_5" exists... yes
    Running "embed /boot/grub/e2fs_stage1_5 (hd1)"...  17 sectors are embedded.
    succeeded
    Running "install /boot/grub/stage1 (hd0) (hd0)1+17 p (...)
                             (hd0,0)/boot/grub/stage2 /boot/grub/menu.lst"... succeeded
    Done.
    grub>

  5. Et pour finir, on sort de la ligne de commande Grub avec un petit « quit » (logic ! ) :
    grub> quit
    quit
    monlinux:~ #

J’espère que ces quelques commandes vous ont été utiles comme elles l’ont été pour moi. N’hésitez pas à me laisser des commentaires, questions ou suggestions d’amélioration.