NetBSD : configuration RAID1 avec RAIDframe

Boris HUISGEN
Boris HUISGEN
|

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.

Boris HUISGEN
Boris HUISGEN
Blog owner
  • #netbsd
  • #raid
  • #raidframe