Installer OPENBSD 3.7 en miroir - RAID1



NOTES


Pour lire et comprendre ce document, vous devez maîtriser les bases du RAID et du système d'exploitation OPENBSD.
Ayant travaillé sur différentes technologies de sauvegarde et de configuration RAID et former des professionnels, je me suis permis d'écrire ce document pendant mon temps libre.

Pour toutes questions, contacter François « pello » Ropert :

IRC : #openbsd.fr sur IRC.FREENODE.NET
MAIL : francois[DOT]ropert[AROBASE]wanadoo[DOT]fr


INTRODUCTION


Je me suis acheté deux disques SATA de 400go ainsi que le contrôleur SATA RAID de Connectland pour agrandir la capacité de stockage de mes données et en assurer la sécurité.
Les deux disques sont configurés en miroir - RAID1 sur une machine OPENBSD 3.7.
Ils sont branché sur le même contrôleur de disques.

L'intérêt principal du mirroir est que si l'un des disque est défaillant ... les données seront saines sur l'autre disque. Le RAID1 sert à enlever un SPOF du système installé.
Attention, le RAID n'est pas une alternative à la sauvegarde.

Note: Quand vous achetez des disques à RAIDiser, vérifiez que les numéros de série des disques ne se suivent pas. Cela réduit la possibilité que les disques tombent en panne dans une même période de temps.

Spécificité propre à l'OS : OPENBSD

Le contrôleur SATA « pas cher à 50 euros » contient un pseudo-contrôleur RAID matériel.
OPENBSD ne reconnaît pas la configuration RAID appliquée dans la configuration du contrôleur.
Le contrôleur est reconnu en tant que contrôleur SATA sans ses fonctionnalités RAID.
Ce petit problème implique que les disques sont reconnus comme deux périphériques distincts (wd0 et wd1).
Consultez la liste du matériel compatible [0] pour savoir si votre contrôleur sera reconnu ou pas.

La solution matérielle « pas cher à 50 euros » n'est donc pas exploitable directement sous OPENBSD.

Il faut utiliser une solution logicielle propre à OPENBSD.

Le RAID est implémentable de deux manières sous OPENBSD.
Les deux technologies ont été importées depuis NETBSD.

Tout d'abord avec le driver CCD, inclus dans le noyau GENERIC mais avec lequel nous sommes vite limités. Il n'y a pas de restauration from crash possible. Cela signifie simplement que votre mirroir fonctionnera tant qu'un des disques ne crashera pas. Néanmoins, si vous vous voulez faire du CCD, par exemple dans une machine virtuelle, renseignez-vous sur le flag CCDF_MIRROR du fichier /etc/ccd.conf. Le mirroir s'appellera /dev/ccd0.

Seconde possibilité et la plus conseillée, le framework RAIDFRAME [1] écrit par le CMU (Carnegie Mellon University).

Il est capable de travailler en RAID 0,1,4, 5 et 6 pour les cas les plus standards.
Mais supporte aussi des fonctionnalités de even-odd parity, rotated sparing, chained declustering, hot spare.

RAIDFRAME se configure en user-land avec la commande raidctl.
Au niveau kernel-land, RAIDFRAME requiert au minimum le pseudo-device RAID. Ce dernier n'étant pas présent dans le noyau GENERIC, il vous faudra donc l'inclure en recompilant le noyau.
L'option noyau RAID_AUTOCONFIG est utile pour accéder au / du système depuis une partition RAID.
Si vous souhaitez mirrorer des données applicatives, cette option n'est pas nécessaire.

Indépendamment de la couche RAID, le contrôleur SATA est géré par le driver pciide.
Les disques se nomment wd0, wd1, ... et sont gérés par le driver wd.
Les disques sont accessibles par ce nommage avant d'être encapsulés dans RAIDFRAME.

Les étapes pour rendre un système mirroré sont les suivantes :


- 1 – Pré-requis à l'installation pour être RAID1-COMPLIANT
- 2 – Installation du pseudo-device RAID dans le noyau GENERIC
- 3 – Copie du contenu et de la table de partitions du premier disque vers le second
- 4 – Configuration de RAIDFRAME
- 5 – Initialisation du device RAID0
- 6 – Copier le système sur le device RAID
- 7 – Root ( / ) sur le device RAID
- 8 – Ce qui se passe au reboot
- 9 – Maintenance: Remplacer un disque défectueux
- 10 – Maintenance: Que faire en cas du crash du noyau
- 11 - Références



En gras, les commandes à taper.
<RC> correspond à la touche entrée.










1 – Pré-requis à l'installation pour être RAID1-COMPLIANT


La procédure d'installation du système OPENBSD est disponible dans la FAQ OPENBSD[2] traduite en français.
Néanmoins, la partie « disk setup » diffère d'une installation sans RAID.

L'installation d'un système RAID a les particularités suivantes :

L'espace disque créé pour l'installation sur wd0a (/) et wd0b (swap) est perdu pour le RAID mais est indispensable pour le chargement du noyau OPENBSD.
En conséquence, on minimise l'espace disque utilisé par ces partitions.
Une installation sans X utilise 94% de 256Mo dans /.
64Mo suffisent pour la partition SWAP.

Voici les étapes à respecter pour installer OPENBSD et le rendre RAID1-COMPLIANT :

Bootez sur le média d'installation OpenBSD 3.7 (CD,DISQUETTE, PXE, PXEGRUB, ...)

(I)nstall, (U)pgrade or (S)hell? I
Specify terminal type: [vt220] (entrée)
Do you wish to select a keyboard encoding table? [no] yes
Select your keyboard type: (P):C-AT-XT, (U)SB or 'done' [P] (entrée)
Table name? (or 'done') [us] fr
Proceed with install? [yes] y


fdisk :

Available disks are: wd0 wd1.
Which one is the root disk? (or 'done') [done] wd0 <-- wd0 est le premier disque trouvé par le contrôleur
Do you want to use *all* of wd0 for OpenBSD? [no] (entrée)

fdisk: 1>e 3
Partition id ('0' to disable) [0 - FF]: [A6] (? for help) A6 (OPENBSD)
Do you wish to edit in CHS mode? [n] y
BIOS Starting cylinder [0 - 779]: [0] (entrée)
BIOS Starting head [0 - 127]: [1] (entrée)
BIOS Starting sector [1 - 63]: [1] (entrée)
BIOS Ending cylinder [0 - 779]: [779] (entrée)
BIOS Ending head [0 - 127]: [127] (entrée)
BIOS Ending sector [1 - 63]: [63] (entrée)
fdisk: 1> q


disklabel :

Initial label editor (enter '?' for help at any prompt)
> z <- Reset la structure de la table de partitions (il ne doit rester que le whole disque c)

> a a <- Création d'une partition de 256Mo pour y mettre / (contient le bootblock et le noyau entre autres)
offset: [63] (entrée)
size: [6289857] 256m
FS type: [4.2BSD] (entrée)
mount point: [none] /
> a b <- Création de la swap
offset: [524160] (entrée)
size: [5765760] 64m
FS type: [swap] (entrée)
> a d <-- Le reste du disque est assigné à une partition de type RAID ( afin de pouvoir utiliser l'option RAID_AUTOCONFIG sur le / encapsulé dans cette partition)
offset: [786240] (entrée)
size: [5503680] (entrée)
FS type: [4.2BSD] RAID
mount point: [none] (entrée) <- Aucun point de montage ne doit être défini !
> q
Write new label?: [y] (entrée)



Available disks are: wd1.
Which one do you wish to initialize? (or 'done') [done] (entrée)

OpenBSD filesystems:
wd0a /

The next step *DESTROYS* all existing data on these partitions!
Are you really sure that you're ready to proceed? [no] yes

La suite de l'installation n'a aucun rapport avec le RAID.
Continuez l'installation à l'aide de la FAQ OPENBSD [3]
Quand le système a redémarré, connectez-vous en root.


2 – Installation du pseudo-device RAID dans le noyau GENERIC


Pour que le noyau gère le RAID avec le framework RAIDFRAME, il faut recompiler le noyau GENERIC.
Nous choisissons de mettre les outils nécessaires à la recompilation sur le second disque qui n'est pas encore utilisé.
Nous l'initialisons avec la commande disklabel pour ensuite monter un système de fichiers FFS sur /mnt.
Les opérations de recompilation s'effectueront donc dans /mnt.

Il faut initialiser le second disque pour y déposer les fichiers sources du noyau.

foo# disklabel -E wd1
Initial label editor (enter '?' for help at any prompt)
> a a
offset: [0] (entrée)
size: [6291456] (entrée)
FS type: [4.2BSD] (entrée)
> q
Write new label? [y] (entrée)
foo#


foo# newfs -q /dev/wd1a

Si le newfs échoue, exécutez cette commande avant de relancer le newfs :
foo# fsck_ffs -b 32 /dev/wd1a
UPDATE STANDARD SUPERBLOCK? [yn] y

foo# mount /dev/wd1a /mnt
foo# cd /mnt



Télécharger les sources du noyau :

foo# ftp ftp://anonymous:mail%40isp.com@ftp.ac-creteil.fr:21/OpenBSD/3.7/sys.tar.gz

%40 est un arobase. Il sert à éviter l'ambiguïté entre l'adresse mail et l'adresse DNS ou IP du FTP.

Une fois le fichier récupéré, extraire avec « tar » l'archive :

foo# tar xzpvf sys.tar.gz
./sys ....
foo#

Il faut à présent compiler le noyau. Veuillez-vous référer à la documentation de Philippe Thierry [4].

Dans le fichier de configuration du noyau GENERIC, décommentez la ligne :

pseudo-device raid 4 # RAIDFRAME disk driver

Insérez cette ligne juste en-dessous :

option RAID_AUTOCONFIG

L'option RAID_AUTOCONFIG sert à démarrer sur une partition / 4.2BSD encapsulée dans une partition RAID.

On démonte /mnt puis on reboote :


foo# cd /
foo# umount /mnt
foo# reboot


Effacer les fichiers de configuration n'est pas utile car après le disque sera refait.
D'autant plus que si votre compilation s'est mal passée, il ne sera pas la peine de re-télécharger sys.tar.gz.

la partie kernel-land est prête.
Attendez que le système remonte.
Connectez-vous en root sur la console.


3 – Copie du contenu et de la table de partitions du premier disque vers le second


A présent, OPENBSD est RAID1-COMPLIANT, le disque wd0 est partitionné.

Avant de mettre en place un RAID, les tables de partitions et le contenu des deux disques doivent être identiques.
Cette opération est obligatoire pour pouvoir booter le noyau depuis n'importe lequel des deux disques dans le cas où la machine tourne temporairement avec un seul disque.

Copie de la table de partitions du disque wd0 vers wd1 :


foo# disklabel wd0 > disklabel.wd1
foo# disklabel -R -r wd1 disklabel.wd1
foo# fdisk -i wd1
Do you wish to write new MBR and partition table? [n] y


Ensuite, il faut formater /dev/wd1a pour y déposer le mini-système contenant le noyau et le bootblock.
Le newfs crée un système de fichier FFS sur /dev/wd1a.


foo# newfs /dev/wd1a
foo# mount /dev/wd1a /mnt
foo# cd /mnt
foo# dump -0f - / | restore -rf


Le dump copie le système de fichiers / en mode caractère (/dev/rwd0a => wd0a) sur /dev/rwd1a (wd1a).
Le dump se réfère au système de fichier / (root) trouvé dans /etc/fstab alors il ne dumpera aucun autre système de fichiers monté sous /.
Il n'y aura donc pas de recouvrement de /mnt.
Le fichier restoresymtable contient une structure informative des modifications réalisées au niveau du système de fichier entre les différentes sauvegardes incrémentales.

Ce fichier ne nous est pas utile. On peut le supprimer.
foo# rm restoresymtable

Les tables de partitions ainsi que les données sont identiques.
Nous pouvous démonter le second disque.

foo# cd /
foo# umount /mnt


4 – Configuration de RAIDFRAME


les deux disques sont identiques mais le miroir n'est pas encore configuré.
La configuration d'un array RAIDFRAME de type RAID1 s'effectue dans le ficher /etc/raid0.conf
Le nom du fichier « raid0 » n'a rien à voir avec une configuration de type RAID0.
Le 0 indique la première configuration RAID à mettre en place.
Pour mieux comprendre le processus d'initialisation de la configuration RAID au boot, consultez le fichier /etc/rc.
On mirrore les deux partitions /dev/wd0d et /dev/wd1d.
Je vous rappelle que l'on a perdu l'espace disque créé dans wd0a et wd0b pour l'installation du minis-ystème.

Voici un fichier type de configuration RAID1. Ecrivez chaque ligne dans /etc/raid0.conf jusqu'à fifo 100 :
Nous n'avons que deux disques, on ne peut donc pas sparer notre RAID1.


foo# cat <<EOF >> /etc/raid0.conf
START array
1 2 0
( matrice d'une ligne et de deux colonnes )
START disks
/dev/wd0d
( Composant 1 du RAID1 – Remarque : ne jamais inverser l'ordre des disques dans ce fichier. Celà pourrait être la cause d'une perte d'intégrité des données. Pensez aussi à bien repérer physiquement quel disque est wd0 et wd1)
/dev/wd1d
( Composant 2 du RAID1)
START layout
128 1 1 1
( Le dernier chiffre indique le type de RAID utilisé. Ici RAID1. )
START queue
fifo 100
( Buffer de 100 I/O maximum sur chaque disque )
EOF
foo#


Le fichier de configuration est prêt.
Il faut maintenant activer le RAID.

L'option -C crée est à utiliser lors de la création d'un set RAID.
L'option -I initialise les labels afin d'identifier les disques d'un même set.
L'option -i crée une parité des disques du set RAID. La parité sert à identifier une panne de disque.

Activation de la configuration RAID :


foo# raidctl -C /etc/raid0.conf raid0
foo# raidctl -I 100 raid0
foo# raidctl -iv raid0


Ne vous préoccupez pas des messages d'erreurs.

Ces étapes successives ont permis de créer /dev/rraid0c.
Ce fichier correspond au whole disque du set RAID.


5 – Initialisation du device RAID0


Notre whole disque est initialisé.
Il faut créer les partitions composant le système et les formater en 4.2BSD.
La partition SWAP ne doit pas subir de formatage.


Création de la table de partitions :


foo# disklabel -E raid0

> a a
offset: [0] (entrée)
size: [5503616] 300m
FS type: [4.2BSD] (entrée)
> a b <= (swap)
offset: [614400] (entrée)
size: [4889216] 256m
FS type: [swap] (entrée)
> a d <= (/tmp)
offset: [1138688] (entrée)
size: [4364928] 500m
FS type: [4.2BSD] (entrée)
> a e <= (/var)
offset: [########] (entrée)
size: [#########] 3g
FS type: [4.2BSD] (entrée)
> a f <= (/usr)
offset: [########] (entrée)
size: [#########] 4g
FS type: [4.2BSD] (entrée)
> a g <= (/home)
offset: [########] (entrée)
size: [#########] (entrée)
FS type: [4.2BSD] (entrée)
> q
Write new label? [y] (entrée)


Les partitions sont créées.
Il faut créer un système de fichiers FFS sur chaque partition de type 4.2BSD :


foo# newfs /dev/rraid0a
foo# newfs /dev/rraid0d
foo# newfs /dev/rraid0e
foo# newfs /dev/rraid0f
foo# newfs /dev/rraid0g



Avant de continuer à l'étape suivant, faisons un point.
Les données du système, le noyau et le bootblock se trouvent sur /dev/wd0a et /dev/wd1a.
Notre set RAID1 a été créé avec /dev/wd0d et /dev/wd1d pour s'appeler /dev/rraid0c.
La suite de la documentation explique comment copier le système depuis /dev/wd0a vers /dev/raid0a.
Et comment rendre bootable /dev/rraid0a.


6 – Copier le système sur le device RAID


Le but de cet étape est de copier les données de /dev/wd0a vers /dev/raid0a.

Nous devons monter au préalable chaque point de montage (/tmp, /var, /usr, /home) sur leur partition respective configurée précédemment par la commande disklabel -E raid0.
Ensuite on dump et restore pour copier le système.


foo# mount /dev/raid0a /mnt <- Montage du nouveau /
foo# cd /mnt
foo# mkdir tmp <- Création du nouveau répertoire /tmp
foo# mkdir var ) <- Création du nouveau répertoire /var
foo# mkdir usr <- Création du nouveau répertoire /usr
foo# mkdir home <- Création du nouvea répertoire /home
foo# mount /dev/raid0d /mnt/tmp <- Montage sur le nouveau périphérique raid0d
foo# mount /dev/raid0e /mnt/var <- Montage sur le nouveau périphérique raid0e
foo# mount /dev/raid0f /mnt/usr <- Montage sur le nouveau périphérique raid0f
foo# mount /dev/raid0g /mnt/home <- Montage sur le nouveau périphérique raid0g
foo# dump -0f - / | restore -rf – <- Copie du système



7 - Root ( / ) sur le device RAID


Les données du système sont à présents copiées sur le device RAID.

Pour accéder au / de la partition RAID, il faut activer l'autoconfiguration par l'option -A de la commande raidctl (nécessite l'option RAID_AUTOCONFIG dans le noyau).

foo# raidctl -A root raid0

Ensuite, il faut modifier le fichier /mnt/etc/fstab pour indiquer les nouvelles correspondances de devices et points de montage. Si vous modifiez le fichier avec une autre méthode, n'ajoutez pas la ligne contenant le mot EOF.


foo# cat <<EOF >/mnt/etc/fstab
/dev/raid0a / ffs rw 1 1
/dev/raid0b none swap sw 0 0
/dev/raid0d /tmp ffs rw,nodev,nosuid,softdep 1 2
/dev/raid0e /var ffs rw,nodev,nosuid,softdep 1 2
/dev/raid0f /usr ffs rw,nodev,softdep 1 2
/dev/raid0g /home ffs rw,nodev,nosuid,softdep 1 2
EOF


La configuration du RAID est terminée.

On démonte les partitions :

foo# umount /mnt/home
foo# umount /mnt/usr
foo# umount /mnt/var
foo# umount /mnt/tmp
foo# umount /mnt

Puis on redémarre la machine :

foo# reboot


8 – Ce qui se passe au reboot


Analyse de la sortie de la commande DMESG :

- Le système trouve le noyau sur hd0a (le mini-système installé sur wd0)
- Détection des disques présents sur le contrôleur SATA et sur chaque channel par le driver pciide
- RAIDFRAME est activé. En témoigne le message « Kernelized RAIDframe activated ».
- Configuration des périphériques RAID avec la commande raidctl -c
- Vérification de l'intégrité du RAID avec la commande raidctl -P all
- Les systèmes de fichiers sont marqués « clean » par fsck
- Montage du / encapsulé dans la partition RAID


A la bannière de connexion, connectez-vous en root.

Vous pouvez afficher l'état du mirroir :

foo# raidctl -s raid0

raid0 Components:
/dev/wd0d: optimal
/dev/wd1d: optimal
No spares.
Parity status: clean
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.

Si un des disques est enlevé de la machine ou déféctueux, il sera marqué «ComponentX: failed ».


9 – Maintenance: Remplacer un disque défectueux


Si votre matériel est hot-plug, tirez le disque HS de son tiroir et insérez-y le nouveau.
Sinon, éteignez la machine. Débranchez le disque. Démarrez la machine.

Si le disque wd1 est remplacé, voici les commandes à taper :


foo# disklabel wd0 > disklabel.wd1
foo# fdisk -i wd1
foo# disklabel -R -r wd1 disklabel.wd1
foo# newfs /dev/wd1a
foo# mount /dev/wd1a /mnt
foo# cd /mnt
foo# dump -0f - / | restore -rf -
foo# cd /
foo# umount /mnt
foo# raidctl -R /dev/wd1d raid0


Nous recréeons à l'identique le premier disque sur le second d'abord en fesant abstraction de la couche RAID. Ensuite la dernière commande raidctl permet de resynchroniser les disques.


10 -Maintenance: Que faire en cas de crash du noyau OPENBSD


Il n'y a aucune commande manuelles à faire.
Le script de démarrage /etc/rc vérifie et répare l'intégrité du set RAID si le crash a eu des conséquences sur les données du disques.
Précaution à prendre: Ne jamais utiliser le fastboot (désactivé par défaut) sur une configuration RAID.


OUTRO

Ce document s'achève ici. Si vous souhaitez aller plus loin, consultez les documents de références ou les pages de manuels suivantes :
raidctl(8) et raid(4).


11 - Références


[0] - http://www.openbsd.org/fr/i386.html#hardware
[1] - http://www.pdl.cmu.edu/RAIDframe/
[2] - http://www.openbsd.org/faq/fr/faq4.html
[3] - http://www.openbsd.org/faq/fr/faq4.html#Hostname
[4] - http://www.openbsd-france.org/documentations/OpenBSD-kernel.html