NetBSD : configuration RAID1 avec RAIDframe

Cet article présente la migration d’un système NetBSD en installation RAID1 logiciel. Les systèmes OpenBSD et FreeBSD version 4 et 5 sont également supportés pour peu que le module RAIDframe soit intégré au noyau.
Méthode
La migration va consister à initialiser le RAID1 sur le second disque en premier lieu, à y recopier le système et les données live du premier disque. Suite à un redémarrage sur le second disque, le RAID sera activé et le premier disque pourra être ajouté.
Le RAID sera créé à chaud sans LiveCD et à distance, pour peu qu’un accès au BIOS soit possible afin de sélectionner le disque de démarrage. En cas d’échec au démarrage sous RAID, le premier disque pourra être réutilisé.
Analyse du système initial
Il convient en premier lieu d’analyser le système actuel avant sa migration RAID, en particulier son disque de démarrage et son partitionnement :
netbsd# grep sd0 /var/run/dmesg.boot
sd0 at scsibus0 target 0 lun 0: <VBOX, HARDDISK, 1.0> disk fixed
sd0: fabricating a geometry
sd0: 8192 MB, 8192 cyl, 64 head, 32 sec, 512 bytes/sect x 16777216 sectors
sd0: fabricating a geometry
boot device: sd0
root on sd0a dumps on sd0b
netbsd# grep sd1 /var/run/dmesg.boot
sd1 at scsibus0 target 1 lun 0: <VBOX, HARDDISK, 1.0> disk fixed
sd1: fabricating a geometry
sd1: 8192 MB, 8192 cyl, 64 head, 32 sec, 512 bytes/sect x 16777216 sectors
sd1: fabricating a geometry
netbsd# fdisk /dev/sd0
Disk: /dev/sd0
NetBSD disklabel disk geometry:
cylinders: 8192, heads: 64, sectors/track: 32 (2048 sectors/cylinder)
total sectors: 16777216, bytes/sector: 512
BIOS disk geometry:
cylinders: 1024, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
total sectors: 16777216
Partitions aligned to 2048 sector boundaries, offset 64
Partition table:
0: NetBSD (sysid 169)
bootmenu: NetBSD
start 64, size 16777152 (8192 MB, Cyls 0-1044/85/1), Active
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
Bootselector disabled.
First active partition: 0
Drive serial number: 0 (0x00000000)
netbsd# /sbin/disklabel -r sd0
# /dev/rsd0:
type: unknown
disk: sd
label: fictious
flags:
bytes/sector: 512
sectors/track: 32
tracks/cylinder: 64
sectors/cylinder: 2048
cylinders: 8192
total sectors: 16777216
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # microseconds
track-to-track seek: 0 # microseconds
drivedata: 0
4 partitions:
# size offset fstype [fsize bsize cpg/sgs]
a: 14680000 64 4.2BSD 0 0 0 # (Cyl. 0*- 7167)
b: 2097152 14680064 swap # (Cyl. 7168 - 8191)
c: 16777152 64 unused 0 0 # (Cyl. 0*- 8191)
d: 16777216 0 unused 0 0 # (Cyl. 0 - 8191)
Le système est ici installé sur le premier disque dur SCSI (/dev/sd0) d’une capacité de 8 Go - c’est une machine virtuelle de test - dont l’ensemble est affecté au slice de NetBSD (partition DOS 0). Au niveau des partitions BSD, le strict minimum a été créé par souci de simplification à savoir / et swap.
La partition réservée d correspond au slice NetBSB : la taille de 16777153 est bien celle du slice NetBSD. La partition c, elle aussi réservée, correspond au contenu du slice NetBSD, qui englobe donc toutes les partitions BSD définies par l’utilisateur : ici a (rootfs) et b (swap).
La taille de c correspond ainsi à 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 inévitablement au 63ème bloc.
En résumé :
Formule | Calcul | Résultat | |
---|---|---|---|
size d | taille totale du slice | 16777216 blocs | |
size c | size d – offset c | 16777216-64 | 16777152 blocs |
offset a | offset c | 64 blocs |
Partitionnement du second disque
Le slice NetBSD est reproduit à l’identique sur le second disque /dev/sd1. Si les disques sont de tailles différentes, un slice sera à créer en conséquence avec fdisk.
On débute par l’effacement de la table des slices table des slices :
netbsd# dd if=/dev/zero of=/dev/rsd1d bs=8k count=1
netbsd# fdisk -0ua /dev/rsd1d
fdisk: primary partition table invalid, no magic in sector 0
Disk: /dev/rsd1d
NetBSD disklabel disk geometry:
cylinders: 8192, heads: 64, sectors/track: 32 (2048 sectors/cylinder)
total sectors: 16777216, bytes/sector: 512
BIOS disk geometry:
cylinders: 1024, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
total sectors: 16777216
Partitions aligned to 16065 sector boundaries, offset 63
Do you want to change our idea of what BIOS thinks? [n] y
Geometries of known disks:
Disk 0: cylinders 1024, heads 255, sectors 63 (16777216 sectors, 8192MB)
Disk 1: cylinders 1024, heads 255, sectors 63 (16777216 sectors, 8192MB)
BIOS's idea of #cylinders: [0..1024 default: 1024]
BIOS's idea of #heads: [0..256 default: 255]
BIOS's idea of #sectors: [1..63 default: 63]
Disk: /dev/rsd1d
NetBSD disklabel disk geometry:
cylinders: 8192, heads: 64, sectors/track: 32 (2048 sectors/cylinder)
total sectors: 16777216, bytes/sector: 512
BIOS disk geometry:
cylinders: 1024, heads: 255, sectors/track: 63 (16065 sectors/cylinder)
total sectors: 16777216
Partitions aligned to 16065 sector boundaries, offset 63
Are you happy with this choice? [n] y
Partition 0:
<UNUSED>
The data for partition 0 is:
<UNUSED>
sysid: [0..255 default: 169]
start: [0..1044cyl default: 63, 0cyl, 0MB]
size: [0..1044cyl default: 16777153, 1044cyl, 8192MB]
bootmenu: [] (space to clear)
Do you want to change the active partition? [n]
We haven't written the MBR back to disk yet. This is your last chance.
Partition table:
0: NetBSD (sysid 169)
start 63, size 16777153 (8192 MB, Cyls 0-1044/85/1)
PBR is not bootable: All bytes are identical (0x00)
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
Bootselector disabled.
No active partition.
Drive serial number: 0 (0x00000000)
Should we write new partition table? [n] y
Au niveau des partitions BSD, une unique partition est nécessaire étant donné que RAIDframe n’autorise qu’une partition par disque. Cette partition va donc devenir le pseudo-périphérique disque RAID dans lequel de nouvelles partitions seront créées pour / et swap.
Sur /dev/sd1, une partition est ajouter avec comme type RAID et une taille égale à l’espace disque total moins les 63 blocs d’identification. Par simplicité, la ligne de la partition c est dupliquée et la prémière éditée pour la partition a :
netbsd# /sbin/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
A cet instant, seul le second disque est intégrable au RAID 1. Il est nécessaire d’ajouter et marquer le premier membre du RAID comme absent dans le fichier de configuration :
netbsd# vi /root/raid0.conf
1START array
21 2 0
3
4START disks
5absent
6/dev/sd1a
7
8START layout
9128 1 1 1
10
11START queue
12fifo 100
L’initialisation du pseudo-périphérique RAID peut commencer :
netbsd# /sbin/raidctl -C /root/raid0.conf raid0
netbsd# /sbin/raidctl -I 202101 raid0
netbsd# /sbin/raidctl -i raid0
Initiating re-write of parity
En retour, RAIDframe va créer le disque /dev/raid0 tout en signalant un élément manquant ce qui est normal à cet instant. L’identifiant du RAID est fixé à la date actuelle et le calcul de parité est lancé.
Pour afficher le statut du RAID :
netbsd# /sbin/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: 202101, Mod Counter: 10
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 16777088
RAID Level: 1
Autoconfig: No
Root partition: No
Last configured as: raid0
Parity status: DIRTY
Reconstruction is 100% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
Les partitions / et swap vont pouvoir être recréées sur le disque RAID. On en profite pour y ajouter une partition dédiée à /home.
La table de partitions actuelle est à exporter dans un fichier :
netbsd# /sbin/disklabel raid0 > /root/disklabel.raid0
disklabel: boot block size 0
disklabel: super block size 0
netbsd# cat /root/disklabel.raid0
# /dev/rraid0:
type: RAID
disk: raid0
label: fictitious
flags:
bytes/sector: 512
sectors/track: 128
tracks/cylinder: 8
sectors/cylinder: 1024
cylinders: 16383
total sectors: 16777088
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0 # microseconds
track-to-track seek: 0 # microseconds
drivedata: 0
4 partitions:
# size offset fstype [fsize bsize cpg/sgs]
a: 16777088 0 4.2BSD 0 0 0 # (Cyl. 0 - 16383*)
d: 16777088 0 unused 0 0 # (Cyl. 0 - 16383*)
Pour y ajouter les nouvelles partitions, il faut prendre pour référence la taille du disque /dev/raid0 afin de calculer la taille de la dernière partition. Au niveau de la taille en bloc, il ne faut pas oublier de multiplier par deux étant donné qu’un bloc fait 512 octets. L’offset de la partition root est obligatoirement 0 afin de satisfaire le boot loader primaire.
Formule | Calcul | Résultat | |
---|---|---|---|
size a | 4 Go | 4 _ 1024 _ 1024 * 2 | 8388608 blocs |
offset a | 0 | 0 bloc | |
size b | 1 Go | 1 _ 1024 _ 1024 * 2 | 2097152 blocs |
offset b | size a | 2097152 blocs | |
size e | size d – size a – size b | 16777088 – 8388608 – 2097152 | 6291328 blocs |
offset e | size a + size b | 8388608 + 2097152 | 10485760 |
La table des partitions finale est donc :
15 partitions:
2
3# size offset fstype [fsize bsize cpg/sgs]
4
5a: 8388608 0 4.2BSD 0 0 0
6b: 2097152 8388608 swap
7d: 16777088 0 unused 0 0 0
8e: 6291328 10485760 4.2BSD 0 0 0
La table est écrite, puis les systèmes de fichiers FFSv2 / et /home sont créés :
netbsd# /sbin/disklabel -R -r raid0 /root/disklabel.raid0
netbsd# newfs -O 2 /dev/rraid0a
/dev/rraid0a: 4096.0MB (8388608 sectors) block size 16384, fragment size 2048
using 23 cylinder groups of 178.09MB, 11398 blks, 22144 inodes.
super-block backups (for fsck_ffs -b #) at:
160, 364896, 729632, 1094368, 1459104, 1823840, 2188576, 2553312, 2918048, 3282784, 3647520, 4012256, 4376992, 4741728, 5106464, 5471200,
...............................................................................................................................................
netbsd# newfs -O 2 /dev/rraid0e
/dev/rraid0e: 3071.9MB (6291328 sectors) block size 16384, fragment size 2048
using 17 cylinder groups of 180.70MB, 11565 blks, 22464 inodes.
super-block backups (for fsck_ffs -b #) at:
160, 370240, 740320, 1110400, 1480480, 1850560, 2220640, 2590720, 2960800, 3330880, 3700960, 4071040, 4441120, 4811200, 5181280, 5551360,
...............................................................................................................................................
Copie du système
Les partitions RAID étant prêtes et montables, 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 -)
DUMP: Found /dev/rsd0a on / in /etc/fstab
DUMP: Date of this level 0 dump: Tue Jan 19 19:33:10 2021
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping /dev/rsd0a (/) to standard output
DUMP: Label: none
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 908606 tape blocks.
DUMP: Volume 1 started at: Tue Jan 19 19:33:10 2021
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: 909477 tape blocks
DUMP: Volume 1 completed at: Tue Jan 19 19:34:41 2021
DUMP: Volume 1 took 0:01:31
DUMP: Volume 1 transfer rate: 9994 KB/s
DUMP: Date of this level 0 dump: Tue Jan 19 19:33:10 2021
DUMP: Date this dump completed: Tue Jan 19 19:34:41 2021
DUMP: Average transfer rate: 9994 KB/s
DUMP: DUMP IS DONE
netbsd# mount /dev/raid0e /mnt/home
netbsd# dump -0 -f - /home | (cd /mnt/home && restore -x -f -)
DUMP: Dumping sub files/directories from /
DUMP: Dumping file/directory /home
DUMP: Found /dev/rsd0a on / in /etc/fstab
DUMP: Date of this level 0 dump: Tue Jan 19 19:36:10 2021
DUMP: Date of last level 0 dump: the epoch
DUMP: Dumping a subset of /dev/rsd0a (a subset of /) to standard output
DUMP: Label: none
DUMP: mapping (Pass I) [regular files]
DUMP: mapping (Pass II) [directories]
DUMP: estimated 364 tape blocks.
DUMP: Volume 1 started at: Tue Jan 19 19:36:10 2021
DUMP: dumping (Pass III) [directories]
DUMP: dumping (Pass IV) [regular files]
DUMP: 255 tape blocks
DUMP: Volume 1 completed at: Tue Jan 19 19:36:10 2021
DUMP: Date of this level 0 dump: Tue Jan 19 19:36:10 2021
DUMP: Date this dump completed: Tue Jan 19 19:36:10 2021
DUMP: Average transfer rate: 0 KB/s
DUMP: DUMP IS DONE
Le fichier fstab du disque RAID doit à présent pointer sur ces propres partitions :
netbsd# vi /mnt/etc/fstab
# NetBSD /etc/fstab
# See /usr/share/examples/fstab/ for more examples.
/dev/raid0a / ffs rw 1 1
/dev/raid0b none swap sw,dp 0 0
/dev/raid0e /home ffs rw 1 2
tmpfs /tmp tmpfs rw,-m=1777,-s=ram%25
kernfs /kern kernfs rw
ptyfs /dev/pts ptyfs rw
procfs /proc procfs rw
/dev/cd0a /cdrom cd9660 ro,noauto
tmpfs /var/shm tmpfs rw,-m1777,-sram%25
Avant de redémarrer, la swap doit être désactivée afin d’empêcher l’erreur de parité du RAID :
netbsd# cat >> /mnt/etc/rc.conf << EOF
swapoff=YES
EOF
Le MBR peut enfin être écrit sur sd1, ce qui permettra de démarrer le système le jour où sd0 sera retiré :
netbsd# /usr/sbin/installboot -v /dev/rsd1a /usr/mdec/bootxx_ffsv2
File system: /dev/rsd1a
Primary bootstrap: /usr/mdec/bootxx_ffsv2
Ignoring PBR with invalid magic in sector 0 of `/dev/rsd1a'
Boot options: timeout 5, flags 0, speed 9600, ioaddr 0, console pc
Le flag d’autoconfiguration du RAID est à activer pour le prochain démarrage qui activera le montage des partitions depuis les périphériques RAID :
/sbin/raidctl -v -A root raid0
raid0: Autoconfigure: Yes
raid0: Root: Force
Le système peut à présent être redémarré sur le RAID par le biais de la commande shutdown (la commande reboot ne démonterait pas la partition swap) :
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 872M 2.8G 23% /
/dev/raid0e 2.9G 16K 2.8G 0% /home
tmpfs 256M 0B 256M 0% /tmp
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
tmpfs 256M 0B 256M 0% /var/shm
netbsd# /sbin/swapctl -l
Device 512-blocks Used Avail Capacity Priority
/dev/raid0b 2097152 0 2097152 0% 0
netbsd# /sbin/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é avec un seul disque présent. Pour pouvoir ajouter le premier disque, sa table de partitions doit être recrée à l’identique à celle du second disque :
netbsd# /sbin/disklabel -r /dev/sd1 > /root/disklabel.sd1
netbsd# /sbin/disklabel -R -r /dev/sd0 /root/disklabel.sd1
L’ajout du disque est désormais possible, ce qui lancera la phase de reconstruction :
netbsd# /sbin/raidctl -a /dev/sd0a raid0
netbsd# /sbin/raidctl -F component0 raid0
netbsd# /sbin/raidctl -S raid0
Reconstruction is 21% complete.
Parity Re-write is 100% complete.
Copyback is 100% complete.
Reconstruction status:
91% |**\*\***\*\*\*\***\*\***\*\*\*\***\*\***\*\*\*\***\*\*** | ETA: 00:01
netbsd# /sbin/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: 202101, Mod Counter: 46
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 16777088
RAID Level: 1
Autoconfig: Yes
Root partition: Force
Last configured as: raid0
Component label for /dev/sd0a:
Row: 0, Column: 0, Num Rows: 1, Num Columns: 2
Version: 2, Serial Number: 202101, Mod Counter: 46
Clean: No, Status: 0
sectPerSU: 128, SUsPerPU: 1, SUsPerRU: 1
Queue size: 100, blocksize: 512, numBlocks: 16777088
RAID Level: 1
Autoconfig: Yes
Root partition: Force
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 finalisée, le MBR est à regénérer sur le premier disque :
netbsd# /usr/sbin/installboot -v /dev/rsd0a /usr/mdec/bootxx_ffsv2
Le système est opérationnel.