NetBSD : configuration RAID1 avec RAIDframe

Boris HUISGEN October 26, 2009

administration netbsd openbsd freebsd raid raidframe fdisk disklabel raidctl installboot

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é.

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

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

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

 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.

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

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.

See also

FreeBSD 7 : identificateurs d’objets SNMP
Read more
FreeBSD : mise à jour en 7.2-STABLE
Read more
FreeBSD : statistiques réseaux par SNMP
Read more