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.