NetBSD : configuration RAID1 avec RAIDframe
- Lundi 26 octobre 2009
- Publié dans Administration . BSD . FreeBSD . NetBSD . OpenBSD . Système
- Par Boris HUISGEN
- Ecrire
Je vais vous guider dans la configuration d’un RAID1 logiciel avec RAIDFrame sous NetBSD. Cette procédure fonctionne également sous OpenBSD (votre noyau devant intégrer le support RAIDframe) ou encore FreeBSD 4/5. Le RAID peut être créé à chaud sans LiveCD et à distance, mais il est recommandé d’avoir un accès au BIOS setup. Si vous ne faites pas d’erreur de calcul ou de frappe, tout se passera bien sinon pensez d’emblée à faire une backup !
La procédure consiste à créer le RAID1 initialement sur le second disque, à y recopier le système et les données « live » du premier disque. Suite à cela, un redémarrage activera le RAID du second disque, auquel le premier disque sera ajouté.
Etape 1 : installation du système
Je débute par l’installation d’un système NetBSD 5.0.1/amd64. Le système est installé sur le premier disque dur SCSI (/dev/sd0) d’une capacité de 8 Go (l’exemple est ici réalisé sous VMware), dont l’ensemble est affecté au slice de NetBSD (partition DOS 0). Au niveau des partitions BSD, je crée le strict minimum par souci de simplification du présent guide : /, swap et /home.
netbsd# grep sd0 dmesg.boot sd0 at scsibus0 target 0 lun 0: <VMware,, VMware Virtual S, 1.0> disk fixed sd0: 8192 MB, 1044 cyl, 255 head, 63 sec, 512 bytes/sect x 16777216 sectors netbsd# grep sd1 dmesg.boot sd1 at scsibus0 target 1 lun 0: <VMware,, VMware Virtual S, 1.0> disk fixed sd1: 8192 MB, 1044 cyl, 255 head, 63 sec, 512 bytes/sect x 16777216 sectors netbsd# fdisk /dev/sd0 Partition table: 0: NetBSD (sysid 169) start 63, size 16777153 (8192 MB, Cyls 0-1044/85/1), Active netbsd# disklabel -r sd0 # /dev/rsd0d: total sectors: 16777216 16 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 8401995 63 4.2BSD 2048 16384 0 b: 273105 8402058 swap c: 16777153 63 unused 0 0 d: 16777216 0 unused 0 0 e: 8102053 8675163 4.2BSD 2048 16384 0
La partition d est reservée et correspond au disque dur (la taille de 16777153 correspond bien à la taille du slice NetBSD). La partition c est aussi réservée et correspond au slice NetBSD, englobant toutes les partitions définies par l’utilisateur : a (point de montage /), b (swap) et e (/home). Comme j’utilise tout l’espace disque, la taille de c correspond à celle du disque moins les 63 blocs réservés par l’ID de slice. Ceci se matérialise au niveau de l’offset de c par rapport à d et également de a, qui débute fatalement au 63ème bloc.
A retenir :
- total sectors = size d
- size c = size d – 63
- offset c = offset a = 63
Etape 2 : partitionnement du 2ème disque dur (/dev/sd1)
Le slice NetBSD doit être reproduit à l’identique sur le second disque. Si les disques ont des tailles différentes, il faut jouer avec fdisk pour créer un slice de la taille de celui du premier disque. Parfois, il est utile d’effacer la table des slices, si le disque a déjà été partitionné :
netbsd# dd if=/dev/zero of=/dev/rsd1d bs=8k count=1 netbsd# fdisk -0ua /dev/rsd1d Partition table: 0: NetBSD (sysid 169) start 63, size 16777153 (8192 MB, Cyls 0-1044/85/1), Active PBR is not bootable: All bytes are identical (0x00)
Au niveau des partitions, c’est différent : une unique partition dédiée au RAID est créée. Cette partition va devenir le pseudo-périphérique disque RAID. C’est sur celui-ci que nos partitions /, swap et /home seront créées. RAIDframe impose cette limitation de ne fonctionner que sur une seule partition par disque.
Sur /dev/sd1, on édite la table des partitions et on créé la partition a avec comme type RAID, de taille égale à l’espace disque total moins les 63 blocs d’identification. Pour faire simple, il suffit de dupliquer la ligne de la partition c pour le slice a et y changer le type.
netbsd# disklabel -r -e -I sd1 total sectors: 16777216 4 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 16777153 63 RAID c: 16777153 63 unused 0 0 d: 16777216 0 unused 0 0
Etape 3 : initialisation du RAID
Pour le moment, seul le second disque est intégrable au RAID. Il faut donc ruser et créer un faux disque /dev/sd9 qui sera retiré une fois /dev/sd0 intégré.
On établit le fichier de configuration du RAID entre /dev/sd9 et /dev/sd1 :
netbsd# more /root/raid0.conf START array 1 2 0 START disk /dev/sd9a /dev/sd1a START layout 128 1 1 1 START queue fifo 100
Le faux disque est créé :
netbsd# cd /dev/ netbsd# sh MAKEDEV sd9
L’initialisation du pseudo-périphérique RAID peut commencer. Il sera accessible par /dev/raid0. En retour, RAIDframe signale un élément manquant : ceci est normal. L’identifiant RAID est fixé à la date actuelle et le calcul de parité est lancé. La dernière commande affiche le statut du RAID :
netbsd# raidctl -C /root/raid0.conf raid0 netbsd# raidctl -I 200910 raid0 netbsd# raidctl -i raid0 netbsd# raidctl -s raid0
Les partitions /, swap et /home peuvent être créées :
netbsd# disklabel raid0 > /root/disklabel.raid0 netbsd# more /root/disklabel.raid0 netbsd# /dev/rraid0d: total sectors: 16777088 4 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 16777088 0 4.2BSD 0 0 0 d: 16777088 0 unused 0 0
Comme avant, il faut se baser sur la taille du disque /dev/raid0 (16777088) pour calculer les tailles des partitions :
- size a = 4 * 1024 * 1024 * 2 = 8388608 blocs
- offset a = 0
- size b = 1 * 1024 * 1024 * 2 = 2097152
- offset a = size a = 2097152
- size e = size d – size a – size b = 16777088 – 8388608 – 2097152 = 6291328
- offset e = size a + size b = 10485760
Soit :
a: 8388608 0 4.2BSD 0 0 0 b: 2097152 8388608 swap d: 16777088 0 unused 0 0 0 e: 6291328 10485760 4.2BSD 0 0 0
La table de partitions peut être écrite et les systèmes de fichiers FFSv2 / et /home créés :
netbsd# disklabel -R -r raid0 disklabel.raid0 netbsd# newfs -O 2 /dev/rraid0a netbsd# newfs -O 2 /dev/rraid0e
Une nouvelle limite doit être contourner : sur une version de NetBSD antérieure à la 5, les crash dumps du noyau ne peuvent être stockés que sur un périphérique disque réel. Ici, ce n’est pas nécessaire, mais la manipulation est à connaître. Si la swap /dev/raid0b ne peut être utilisée, rien ne nous interdit d’utiliser la swap « réelle » sur /dev/sd1 (et par la suite /dev/sd0). Il faut corriger la table de partitions du second disque :
netbsd# disklabel sd1 > /root/disklabel.sd1 netbsd# more /root/ disklabel.sd1 a: 16777153 63 RAID c: 16777153 63 unused 0 0 d: 16777216 0 unused 0 0
La taille de la swap réelle est identique à celle créé sur /dev/raid0. Il faut juste prendre en compte dans l’offset la taille réservée au bloc du RAID (64 blocs). Soit :
- size /dev/sd1b = size /dev/raid0b
- offset /dev/sd1b = 63 + 64 + offset /dev/raid0b
Soit :
a: 16777153 63 RAID b: 273105 8402122 swap c: 16777153 63 unused 0 0 d: 16777216 0 unused 0 0
Attention, un mauvais calcul de l’offset peut se manifester par un écrasement de vos données !
netbsd# disklabel -R -r /dev/sd1 disklabel.sd1
disklabel signale que la partition a écrase la partition b : ceci est tout à fait normal car b est située dans a.
Etape 4 : copie du système
Les partitions RAID sont montables et le dump des données depuis le premier disque est réalisable :
netbsd# mount /dev/raid0a /mnt netbsd# dump -0 -f - / | (cd /mnt && restore -x -f -) netbsd# mount /dev/raid0e /mnt/home netbsd# dump -0 -f - /home | (cd /mnt/home && restore -x -f -)
Le fichier fstab du RAID doit à présent pointer sur les partitions RAID :
netbsd# vi /mnt/etc/fstab /dev/raid0a / ffs rw,log,noatime 1 1 /dev/raid0b none swap sw 0 0 /dev/raid0e /home ffs rw,log,noatime 1 2 kernfs /kern kernfs rw ptyfs /dev/pts ptyfs rw procfs /proc procfs rw /dev/cd0a /cdrom cd9660 ro,noauto
Avant de redémarrer, quelques modifications sont à effectuer. La swap doit être désactivée pour le prochain démarrage afin d’empêcher l’erreur de parité du RAID :
netbsd# cat >> /mnt/etc/rc.conf << EOF swap_off=YES EOF
Le MBR doit être écrit sur sd1, ce qui permettra de démarrer le système lorsque sd0 ne fonctionne plus :
netbsd# /usr/sbin/installboot -v /dev/rsd1a /usr/mdec/bootxx_ffsv2
Reste à activer le flag d’autoconfiguration du RAID pour son activation au prochain démarrage :
netbsd# raidctl -A -root raid0
A présent, le système peut être redémarré sur le RAID. Mais il ne faut plus utiliser la commande reboot qui démonte mal la swap, ce qui entrainerait une reconstruction du RAID au boot suivant. Il faut utiliser à la place shutdown :
netbsd# shutdown -r now
Etape 5 : premier démarrage en RAID
Les partitions RAID doivent être utilisées :
netbsd# df -h Filesystem Size Used Avail %Cap Mounted on /dev/raid0a 3.9G 175M 3.5G 4% / /dev/raid0e 2.9G 2.9M 2.8G 0% /home kernfs 1.0K 1.0K 0B 100% /kern ptyfs 1.0K 1.0K 0B 100% /dev/pts procfs 4.0K 4.0K 0B 100% /proc netbsd# swapctl -l Device 512-blocks Used Avail Capacity Priority /dev/raid0b 2097152 0 2097152 0% 0 netbsd# raidctl -s raid0 Components: component0: failed /dev/sd1a: optimal No spares. component0 status is: failed. Skipping label. Component label for /dev/sd1a: Row: 0, Column: 1, Num Rows: 1, Num Columns: 2 Version: 2, Serial Number: 200910, Mod Counter: 60 Clean: No, Status: 0 sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1 Queue size: 100, blocksize: 512, numBlocks: 16777088 RAID Level: 1 Autoconfig: Yes Root partition: Yes Last configured as: raid0 Parity status: DIRTY Reconstruction is 100% complete. Parity Re-write is 100% complete. Copyback is 100% complete.
Le RAID est dégradé et le premier disque peut enfin être intégré. Il faut en premier lieu lui écrire sa table de partition RAID, identique à celle du second disque :
netbsd# disklabel -R -r /dev/sd0 /root/disklabel.sd1
L’ajout du disque au RAID s’effectue de cette façon :
netbsd# raidctl -a /dev/sd0a raid0 netbsd# raidctl -F component0 raid0
L’état de la reconstruction peut être affichée en temps réel :
netbsd# raidctl -S raid0 Reconstruction is 21% complete. Parity Re-write is 100% complete. Copyback is 100% complete. Reconstruction status: 91% |************************************ | ETA: 00:01 netbsd# raidctl -s raid0 Components: component0: spared /dev/sd1a: optimal Spares: /dev/sd0a: used_spare component0 status is: spared. Skipping label. Component label for /dev/sd1a: Row: 0, Column: 1, Num Rows: 1, Num Columns: 2 Version: 2, Serial Number: 200910, Mod Counter: 61 Clean: No, Status: 0 sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1 Queue size: 100, blocksize: 512, numBlocks: 16777088 RAID Level: 1 Autoconfig: Yes Root partition: Yes Last configured as: raid0 Component label for /dev/sd0a: Row: 0, Column: 0, Num Rows: 1, Num Columns: 2 Version: 2, Serial Number: 200910, Mod Counter: 61 Clean: No, Status: 0 sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1 Queue size: 100, blocksize: 512, numBlocks: 16777088 RAID Level: 1 Autoconfig: Yes Root partition: Yes Last configured as: raid0 Parity status: clean Reconstruction is 100% complete. Parity Re-write is 100% complete. Copyback is 100% complete.
Une fois la reconstruction complète, le MBR est à regénérer sur le premier disque :
netbsd# /usr/sbin/installboot -v /dev/rsd0a /usr/mdec/bootxx_ffsv2
Le RAID1 est opérationnel.

Pas encore de commentaires.