Browse Source

Ajout de la page HowtoRAIDLogiciel (migré depuis le Trac)

master
Romain Dessort 4 years ago
parent
commit
0fd29b336e
1 changed files with 289 additions and 0 deletions
  1. +289
    -0
      HowtoRAIDLogiciel.md

+ 289
- 0
HowtoRAIDLogiciel.md View File

@@ -0,0 +1,289 @@
---
title: Howto RAID logiciel
categories: RAID
...

Sous Linux, le RAID logiciel se gère avec *mdadm* :

## Installation

~~~
# aptitude install mdadm
~~~

## Création d'un volume RAID

On doit ensuite créer des partitions de type *Linux raid autodetect* (code *'FD*') :

Par exemple avec `parted` :

~~~
# parted /dev/sda
(parted) mkpart logical 51,5GB 200GB
(parted) align-check optimal 8
8 aligned
(parted) set 8 raid on
(parted) p
[...]
8 51,5GB 200GB 148GB logical raid
~~~

Par exemple 2 partitions */dev/sda1* et */dev/sdb1* de tailles identiques pour créer un volume RAID1.
On initialise le ainsi le RAID :

~~~
# mdadm --create /dev/md0 --chunk=64 --metadata=default --level=raid1 --raid-devices=2 /dev/sda1 /dev/sdb1
# mdadm --query /dev/md0
/dev/md0: 1332.53GiB raid1 2 devices, 0 spares. Use mdadm --detail for more detail.
# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Nov 19 17:22:46 2010
Raid Level : raid1
Array Size : 1397260542 (1332.53 GiB 1430.79 GB)
Used Dev Size : 1397260542 (1332.53 GiB 1430.79 GB)
Raid Devices : 2
Total Devices : 2
Persistence : Superblock is persistent

Update Time : Sat Nov 20 01:05:41 2010
State : active
Active Devices : 2
Working Devices : 2
Failed Devices : 0
Spare Devices : 0

Name : cap:0 (local to host cap)
UUID : 02549957:1e2c95c8:306391ad:c979ee50
Events : 35

Number Major Minor RaidDevice State
0 8 33 0 active sync /dev/sda1
1 8 49 1 active sync /dev/sdb1
~~~

Vous avez donc */dev/md0* : un périphérique de stockage utilisable.
Vous pouvez maintenant le formater :

~~~
# mkfs.ext4 /dev/md0
~~~

Vous devez répéter cette opération pour avoir plusieurs volumes RAID, notamment
pour avoir plusieurs partitions (/var, /usr/, /home, etc.), vous aurez donc de
multiples partitions *Linux raid autodetect* sur vos disques.

## Opération sur les disques et volumes RAID

### Remplacer un disque

Cas classique : vous avez un disque défectueux (prenons */dev/sdd*) et plusieurs volumes RAID,
par exemple *md1*, *md2*, etc. Voici précisément comment le remettre en place :

En table de partitions MS-DOS :

~~~
# sfdisk -d /dev/sda > /tmp/part.out
# sfdisk -f /dev/sdd < /tmp/part.out
# partprobe /dev/sdd
~~~

En table de partitions GPT (valable à partir de Debian 7) :

~~~
# aptitude install gdisk
# sgdisk -R=/dev/sdd /dev/sda
# sgdisk -G /dev/sdd
~~~

~~~
# mdadm /dev/md1 --add /dev/sdd1
mdadm: added /dev/sdd1
# mdadm /dev/md2 --add /dev/sdd2
mdadm: added /dev/sdd2
# mdadm /dev/md3 --add /dev/sdd3
mdadm: added /dev/sdd3
# mdadm /dev/md5 --add /dev/sdd5
mdadm: added /dev/sdd5
# mdadm /dev/md6 --add /dev/sdd7
mdadm: added /dev/sdd7
~~~

Note : `sfdisk` peut nécessiter d'avoir un disque déjà partitionné, le
contournement est donc de créer une partition quelconque avant de l'utiliser
avec un disque vierge.

### Sortir une partition d'un volume RAID

Si vous devez sortir un disque d'un volume RAID pour une raison ou une autre :

~~~
# mdadm /dev/md1 --fail /dev/sdd1
mdadm: set /dev/sdd1 faulty in /dev/md1
# mdadm /dev/md1 --remove /dev/sdd1
mdadm: re-added /dev/sdd1
~~~

### Désactiver un volume RAID

~~~
# mdadm --stop /dev/md123
mdadm: stopped /dev/md123
~~~


### Créer un volume RAID sans disposer de tous les disques

On peut vouloir (re-)créer un volume RAID sans pour autant disposer de tous les disques au moment de l'opération (récupération des données d'un ancien disque lorsqu'on ne dispose que de deux emplacements par exemple) :

~~~
# mdadm --create /dev/md1 --level=1 --force --raid-devices=1 /dev/sdc3
~~~

On peut alors formater */dev/md1*, et copier les fichiers dessus, avant d'ajouter le disque manquant à la grappe (remplacement du disque original dans cet exemple) :

~~~
# mdadm --manage /dev/md1 --add /dev/sdb3
# mdadm --grow /dev/md1 --raid-devices=2
# cat /proc/mdstat
Personalities : [raid1]
md1 : active raid1 sdb3[1] sdc3[0]
1893933820 blocks super 1.2 [2/1] [U_]
[>....................] recovery = 4.0% (75859776/1893933820) finish=493.5min speed=61391K/sec
~~~

## Monitorer un RAID logiciel

Pour voir les volumes RAID en activité :

~~~
# mdadm --detail --scan
~~~

### Le fichier /proc/mdstat

Ce pseudo fichier contient la liste des grappes de disques (généralement dénommées *mdX*), avec pour chaque grappe le type de raid, l'état, les disques qui le compose et leur état.

~~~
# cat /proc/mdstat
md1 : active raid1 sdb1[1] sda1[0]
512896 blocks [2/2] [UU]
md2 : active raid1 sdb2[1] sda2[0]
1023936 blocks [2/2] [UU]
md3 : active raid1 sdb3[1] sda3[0]
10239936 blocks [2/2] [UU]
~~~

Le *[UU]* indique que les disques sont opérationnels. Si un des disques est en erreur, le *U* sera remplacé par un *_*.

### Le démon mdadm

Un démon `mdadm` est lancé par défaut pour détecter la panne d'un disque dur (entre autre), et envoyer un email le cas échéant.
~~~
# ps -ef |grep mdadm
root 3858 1 0 Apr15 ? 00:00:19 /sbin/mdadm --monitor --pid-file /var/run/mdadm/monitor.pid --daemonise --scan --syslog
~~~

On s'assurera que le fichier ~~~/etc/default/mdadm~~~ contient les informations :
~~~
INITRDSTART='all'
AUTOSTART=true
AUTOCHECK=true
START_DAEMON=true
~~~

Dès qu'une panne disque est détectée, mdadm inscrit l'information dans syslog :
~~~
May 10 14:28:44 serveur mdadm[3858]: Fail event detected on md device /dev/md8, component device /dev/sda8
~~~

Un mail est également envoyé à root (par défaut) pour l'informer de la situation. Le destinataire du mail peut se changer dans le fichier de configuration `/etc/mdadm/mdadm.conf` grâce à la directive *MAILADDR* :

~~~
MAILADDR jdoe@example.com
~~~

## Interprétation des erreurs

### does not have a valid v0.90 superblock

Si vous obtenez des erreurs du type :

~~~
kernel: md: invalid raid superblock magic on sda1
kernel: md: sda1 does not have a valid v0.90 superblock, not importing!
~~~

...c'est que l'auto-détection du noyau Linux n'a pas fonctionné (il paraît que c'est [obsolète](http://bugs.debian.org/627281)).

Il faut donc manuellement ajouter les lignes correspondant au volume RAID dans le fichier
*/etc/mdadm/mdadm.conf* grâce à l'outil */usr/share/mdadm/mkconf*

### does not appear to be active

Si un volume est inactif (par exemple après le changement d'un disque) :

~~~
# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md9 : inactive sda10[0](S) sdc10[2](S) sdb10[5](S)
5568856791 blocks super 1.2
~~~

Vous avez beau tout faire pour le réactiver :

~~~
# mdadm /dev/md9 --remove /dev/sdd10
# mdadm --stop /dev/md9
# mdadm --assemble /dev/md9
# mdadm --detail /dev/md9
mdadm: md device /dev/md9 does not appear to be active.
# mdadm --stop /dev/md9
# mdadm --assemble --force /dev/md9
mdadm: device 4 in /dev/md9 has wrong state in superblock, but /dev/sdd10 seems ok
mdadm: /dev/md9 assembled from 3 drives and 1 spare - not enough to start the array while not clean - consider --force.
~~~

Mais rien à faire, votre volume reste inactif... même avec 4 disques :

~~~
# cat /proc/mdstat
Personalities : [raid1] [raid6] [raid5] [raid4]
md9 : inactive sda10[0](S) sdd10[4](S) sdc10[2](S) sdb10[5](S)
7425142388 blocks super 1.2
~~~

La solution est d'invoquer une prière vaudou et de lancer `--assemble --force --scan` :

~~~
# mdadm --stop /dev/md9
mdadm: stopped /dev/md9
# mdadm --assemble --force --scan /dev/md9
mdadm: clearing FAULTY flag for device 3 in /dev/md9 for /dev/sdd10
mdadm: Marking array /dev/md9 as 'clean'
mdadm: failed to add /dev/sdd10 to /dev/md9: Device or resource busy
mdadm: /dev/md9 has been started with 3 drives (out of 4).
~~~

Votre volume est désormais actif, il vous reste qu'à ajouter le nouveau disque pour lancer la reconstruction.

## Trucs & astuces

### Changer la taille du cache

Permet de synchroniser plus rapidement le RAID. Attention, influence sur l'utilisation RAM et CPU. Valeur par défaut de 4096K.

~~~
# echo 32768 > /sys/block/mdX/md/stripe_cache_size
~~~

### Activer le bitmap

Cela permet d'identifier les blocs modifiés et gagner énormément de temps en cas de resynchronisation.

~~~
# mdadm --grow --bitmap=internal /dev/mdX
~~~


Loading…
Cancel
Save