Table des matières
Introduc
Là, on va voir comment transferer un disk (et en particulier un RAID 1) sur une autre bécanne. En passant, les disks sont plus grand et change d'interface: hda et hdb deviennent respectivement sda et sdb.
Copier un RAID 1
Arreter temporairement le superflu
Comme on va arreter le RAID 1 en plein vol, on va limiter la casse en stoppant temporairement quelques services non-vitaux, surtout s'ils travaillent sur les disks.
La coupure devrait avoir lieu quelques minutes… donc, pas de panique.
Exemples:
# /etc/init.d/gdm stop # /etc/init.d/postfix stop # /etc/init.d/bind9 stop
Sortir un disk du RAID
# mdadm /dev/md0 --fail /dev/hdb1 # mdadm /dev/md0 --remove /dev/hdb1
Et voila, pour la première partition.
# mdadm /dev/md1 --fail /dev/hdb2 # mdadm /dev/md1 --remove /dev/hdb2
Et voila pour la partition du swap.
Maintenant, tout le disk hdb
est sortie du RAID, on va pouvoir jouer avec.
On a un etat du RAID à l'instant t
sur le disk hdb
. Le disk hda
continue de travailler normalement.
Remettre les services en route
Exemples:
# /etc/init.d/gdm start # /etc/init.d/postfix start # /etc/init.d/bind9 start
Transfert via le NET
Si on ne veut rien démonter, et qu'on utilise des equipements rapides ou qu'on a beaucoup de temps, on va faire une copie du disk hdb
via le réseau local !
Un petit install peut etre necessaire:
# apt-get install netcat gzip
Sur la (nouvelle) bécanne qui va recevoir la copie, faire ceci:
(On suppose qu'on veut copier sur le disk sdb
)
# nc -lp 32767 | gunzip | dd of=/dev/sdb
Sur la bécanne qui detient la copie du RAID en hdb
:
# dd if=/dev/hdb | gzip | nc 192.168.0.250 32767
Le pipe vers gzip
et gunzip
peut être jugé superflu et inutile dans certains cas… dépend du contenu du disk.
Le transfert démarre immediatement… et peut durer des heures… Une bonne nuit de sommeil pour moi.
Note : dd if=/dev/hdb bs=4k …
devrait etre beaucoup plus rapide…
Sans oublier: bs=4k de l'autre côté dd of=…
de hd à sd
Nous voila sur la nouvelle machine, avec un disk en sdb
qui est la copie de hdb
de l'autre machine.
Simples manipulations
Vous voila sur un Live CD (ou avec un systeme rapidement installé sur sda
, ce qui etait mon cas) et vous aimeriez verifier l'etat de la copie:
# fdisk /dev/sdb -l
Verifier que le disk est bien une partition RAID:
# mdadm --examine /dev/sdb1
En passant, cela nous retourne UUID.
Monter le disk avec son RAID:
(J'utilise /dev/md2
comme ça…)
# mdadm --assemble /dev/md2 /dev/sdb1
Et comme j'ai un avertissement:
# mdadm --run /dev/md2
Et voila, le RAID est reviendu a la vie, sur 1 seul disk bien sur.
Mounter le contenu du disk (par exemple):
# mkdir /mnt/mymd # mount /dev/md2 /mnt/mymd
Et voila, on peut jouer avec le contenu du disk. On peut se risquer à faire un:
# e2fsk /mnt/mymd
Parce que rappellez-vous: nous avons arreter le RAID en plein vol, et il y a peut être des erreurs qui sont apparus.
Préparer le Boot
On suppose que le contenu de la copie fraiche est disponible dans /mnt/mymd
.
menu.lst
Dejà, editer /boot/grub/menu.lst
et s'assurer qu'il n'y a pas de référence à hd?
, mais bien md?
.
device.map
Editer /boot/grub/device.map
et transformer les hd?
en sd?
…
fstab
Si necessaire, corriger /etc/fstab
, qui peut faire des references (maintenant) erronées: méfiez-vous des UUID.
mdadm.conf
Corriger /etc/mdadm/mdadm.conf
afin qu'il fasse reference aux disks sd?
, et non plus hd?
.
Reboot
Rebooter sur le disk sdb
.
Preparer le swap
L'objectif initial est non seulement de changer de bécanne, mais aussi d'agrandir le RAID.
Pour cela, j'ai besoin de detruire la partition RAID du swap
et la recreer a la fin du disk.
Pour cela, j'utilise cfdisk
car il place correctement la nouvelle partition à la fin. (j'ai d'abord essayé avec fdisk
, mais je n'ai pas reussi sans avertissement etrange).
Donc: (en supposant que le RAID est unmounter)
# cfdisk /dev/sdb
- Supprimer la partition RAID du swap (c'est
/dev/sdb2
chez moi) - Recreer la partition RAID a la fin du disk. On peut en profiter pour modifier la taille aussi…
- Forcer le TYPE
fd
pourRAID autodetect
. - WRITE et QUIT
Il faut bien veuiller que l'ordre de la partition reste la même: sdb2
reste sdb2
.
Retour sous Shell, on créé le (nouveau) RAID pour le swap:
# mdadm -Cv /dev/md3 -l1 -n2 missing /dev/sdb2
Regarder le nouveau RAID:
# cat /proc/mdstat
Creer le swap
:
# mkswap /dev/md3
En deplacant le swap, je crois qu'on change son UUID
donc bien apporter la modification dans le fstab
et mdadm.conf
du futur disk de BOOT.
Connaitre le UUID:
# mdadm --examine /dev/sdb2
Apporter les modifications dans (mount sdb1)/etc/fstab
et (mount sdb1)/etc/mdadm/mdadm.conf
.
Booter dessus
(D'aprés mes tests, j'ai pu booter sur ce disk)
Booter sur le disk sdb
. Si ca ne fonctionne pas pour vous, vous allez devoir improviser avec un live CD par exemple.
initrd ?
Je crois qu'un petit update-grub
est le bienvenu quelque part…?
Agrandir le RAID
Voila, on donc un disk en sdb
sur lequel on a booté.
On a un disk en sda
qui est identique à sdb
par sa taille physique (au moins).
Mais sda
ne sert plus a rien: eventuellement l'unmounter.
Ajouter sda au RAID
Ecrasons sda
!
Copier les partitions: (c'est pour etre certains de partir sur les mêmes bases)
# sfdisk -d /dev/sdb | sfdisk /dev/sda
Voila, sda
a les même partitions que sdb
… mais rien de coohérent encore dans les partitions.
Agrandir la partition principale (accessoirement celle sur laquelle on boot aussi):
# cfdisk /dev/sda - virer sda1 - recreer sda1 en prenant la place souhaité. (toute ?) - BOOT activé - TYPE 0xfd (RAID autodetect) - WRITE & QUIT
Ajouter sda
au RAID:
La partition de swap (la + rapide a mounter):
# mdadm /dev/md1 --add /dev/sda2
La partition de BOOT etc…:
# mdadm /dev/md0 --add /dev/sda1
Où en est-on ?
# cat /proc/mdstat
Aprés quelques minutes, voir quelques heures: /dev/sda1
est totalement restauré.
Assurez-vous que la configuration est toujours en phase…
# mdadm --examine /dev/sda1
et
# mdadm --examine /dev/sda2
sont bien en phase avec mdadm.conf
?
Si non:
# mdadm --detail --scan
Et faire coincider avec mdadm.conf
.
Rebooter sur sda
Il faut rebooter sur sda
: ca marche! on a presque fini :)
Recreer sdb
On va recreer sdb
avec les mêmes partitions que sda
.
D'abord, sortir sdb
du RAID:
(le swap)
# mdadm /dev/md1 --fail /dev/sdb2 # mdadm /dev/md1 --remove /dev/sdb2
(le reste du disk)
# mdadm /dev/md0 --fail /dev/sdb1 # mdadm /dev/md0 --remove /dev/sdb1
Recreer les mêmes partitions:
# sfdisk -d /dev/sda | sfdisk /dev/sdb
Remettre les partitions dans le RAID:
(le swap)
# mdadm /dev/md1 --add /dev/sdb2
(le reste du disk)
# mdadm /dev/md0 --add /dev/sdb1
Où en est-on ?
# cat /proc/mdstat
Attendre la reconstruction pendant quelques heures…
Agrandir le RAID (enfin)
Aprés plusieurs heures:
Les partitions sont plus grandes… et alors ?
# mdadm --detail /dev/md0 ... Array Size : 188708608 (179.97 GiB 193.22 GB) Device Size : 388708608 (370.70 GiB 398.04 GB) ...
Agrandir !
# mdadm --grow /dev/md0 -z max
C'est fait pour la couche RAID.
Et pour finir, la couche ext2/3
:
# resize2fs /dev/md0 # mdadm --detail /dev/md0 ... Array Size : 388708608 (370.70 GiB 398.04 GB) Device Size : 388708608 (370.70 GiB 398.04 GB) ...
C'est fini !
RAID incomplet
On a installer Debian, en RAID 1, avec 1 seul disk. Maintenant, on aimerait bien le completer avec un 2ieme disk…
Etat des lieux
Etat du RAID:
# cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sda2[0] 292969280 blocks [1/1] [U] md0 : active raid1 sda1[0] 248896 blocks [1/1] [U]
1 seul disk, et c'est clean:
# mdadm --detail /dev/md0 /dev/md0: Version : 00.90.03 Creation Time : Thu Jul 31 00:49:36 2008 Raid Level : raid1 Array Size : 248896 (243.10 MiB 254.87 MB) Device Size : 248896 (243.10 MiB 254.87 MB) Raid Devices : 1 Total Devices : 1 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Tue Aug 26 06:26:09 2008 State : clean Active Devices : 1 Working Devices : 1 Failed Devices : 0 Spare Devices : 0
UUID : 32d9f08e:22d09170:1b5fc4cb:76531e6b Events : 0.10
Number Major Minor RaidDevice State 0 8 1 0 active sync /dev/sda1
Soit, donc:
- “/dev/sda” qui est le disk deja en place et qui va bien.
- “/dev/sdb” qui est le disk qu'on rajoute.
copier structure des partitions
Voyons l'etat des partitions de /dev/sda
:
# sfdisk -d /dev/sda # partition table of /dev/sda unit: sectors /dev/sda1 : start= 63, size= 497952, Id=fd, bootable /dev/sda2 : start= 498015, size=585938745, Id=fd /dev/sda3 : start=586436760, size=194980905, Id=8e /dev/sda4 : start= 0, size= 0, Id= 0
Les 2 disks etant identiques, donc, on va faire simple…
On copie a la structure des partitions:
# sfdisk -d /dev/sda | sfdisk /dev/sdb Checking that no-one is using this disk right now ... OK ... <snip> ... Successfully wrote the new partition table Re-reading the partition table ...
ajouter partition
mauvaise piste
Ajouter une partition dans le RAID…
# mdadm /dev/md0 --add /dev/sdb1 mdadm: added /dev/sdb1
Etat du RAID ?
# cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sda2[0] 292969280 blocks [1/1] [U] md0 : active raid1 sdb1[1](S) sda1[0] 248896 blocks [1/1] [U] unused devices: <none>
Hu ? c'est quoi ce (S)
?
# mdadm --detail /dev/md0 /dev/md0: Version : 00.90.03 Creation Time : Thu Jul 31 00:49:36 2008 Raid Level : raid1 Array Size : 248896 (243.10 MiB 254.87 MB) Device Size : 248896 (243.10 MiB 254.87 MB) Raid Devices : 1 Total Devices : 2 Preferred Minor : 0 Persistence : Superblock is persistent Update Time : Tue Aug 26 06:26:09 2008 State : clean Active Devices : 1 Working Devices : 2 Failed Devices : 0 Spare Devices : 1 UUID : 32d9f08e:22d09170:1b5fc4cb:76531e6b Events : 0.10 Number Major Minor RaidDevice State 0 8 1 0 active sync /dev/sda1 1 8 17 - spare /dev/sdb1
Ah ouai, le disk est dans le spare
: en secours, en attente d'etre assembler au RAID…
Donc, je retire:
# mdadm /dev/md0 --remove /dev/sdb1
"agrandir" le raid
En fait, augmenter le nombre de device actif ! actuellement il n'y a qu'un disk, et il en faut 2 (pour le RAID1) !
Augmentons le nombre de “active device”:
# mdadm --grow /dev/md0 -n 2
Verifions:
# cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sda2[0] 292969280 blocks [1/1] [U] md0 : active raid1 sda1[0] 248896 blocks [2/1] [U_] unused devices: <none>
Ah, ca ressemble a quelque chose que je connais
Faisons la meme chose pour /dev/md1
# mdadm --grow /dev/md1 -n 2
Parfait.
Ajoutons partitions !
# mdadm /dev/md0 --add /dev/sdb1 mdadm: re-added /dev/sdb1
Verifions:
# cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sda2[0] 292969280 blocks [2/1] [U_] md0 : active raid1 sdb1[1] sda1[0] 248896 blocks [2/2] [UU] unused devices: <none>
Yes!
L'autre maintenant:
# mdadm /dev/md1 --add /dev/sdb2 mdadm: added /dev/sdb2
# cat /proc/mdstat Personalities : [raid1] md1 : active raid1 sdb2[2] sda2[0] 292969280 blocks [2/1] [U_] [>....................] recovery = 0.0% (83264/292969280) finish=117.2min speed=41632K/sec md0 : active raid1 sdb1[1] sda1[0] 248896 blocks [2/2] [UU] unused devices: <none>
En cours de remontage… super.
Configurer
Maintenant, il faut completer la configuration, sinon, le prochain reboot risque d'être curieux.
Editer le fichier /etc/mdadm/mdadm.conf
afin que le nombre de device soit 2
. Exemple:
ARRAY /dev/md0 level=raid1 num-devices=2 UUID=32d9f08e:22d09170:1b5fc4cb:76531e6b ARRAY /dev/md1 level=raid1 num-devices=2 UUID=1f25f923:59abea04:4ea8b7e2:21f680e2
En fait, ca doit ressembler a ce que la commande suivante produit comme sortie:
# mdadm --detail --scan ARRAY /dev/md0 level=raid1 num-devices=2 UUID=32d9f08e:22d09170:1b5fc4cb:76531e6b ARRAY /dev/md1 level=raid1 num-devices=2 UUID=1f25f923:59abea04:4ea8b7e2:21f680e2
(Il y a peut etre un “spares=1” en trop, vu que le RAID est en train de remonter….)
Boot
Il faut rendre “bootable” ce disk, on pourra ainsi booter sur l'un ou l'autre disque, en cas de panne.
Il faut bien annoncer a “Grub” qu'un nouveau disk bootable…
Editer le fichier /boot/grub/device.map
, afin d'avoir (par exemple):
(hd0) /dev/sda (hd1) /dev/sdb
On peut alors suivre cette procedure pour rendre le disk bootable.
| Attendre que le RAID soit remonté pour jouer avec grub (sinon, ca deconne un peu) |