Wie ich letzte Woche bereits angedeutet habe, hatte ich nach dem Erhalt meiner dritten 1 TB Platte vor, aus meinem RAID1 ein RAID5 zu machen. Das geht zwar derzeit leider nicht online, weil mdadm nicht die gleichzeitige Verwendung von –grow und –level zuläßt, wie man in der man page bei “-l, –level” nachlesen kann:
-l, –level=
Set raid level. When used with –create, options are: linear, raid0, 0, stripe, raid1, 1, mirror, raid4,
4, raid5, 5, raid6, 6, raid10, 10, multipath, mp, faulty. Obviously some of these are synonymous.When used with –build, only linear, stripe, raid0, 0, raid1, multipath, mp, and faulty are valid.
Not yet supported with –grow.
Aber es gibt durchaus einen Weg, das gewünschte Ziel zu erreichen, indem man ein wenig im Internet sucht und ein bißchen wagemutig ist. Ok, ich war nicht ganz so wagemutig, das ganze ohne Backup durchzuführen, aber sowas sollte man ja grundsätzlich nicht ohne Backup machen. Das ist dann auch der Grund, warum die Durchführung dann bis nach dem Wochenende warten mußte.
Bevor ich zur Vorgehensweise komme, noch einmal eine gründliche Warnung: Ich übernehme keine Gewähr für die Richtigkeit der Angaben, noch für das fehlerfrei Funktionieren der einzelnen Schritte. Und wer das ganze ohne Backup macht, ist sowieso selber schuld, wenn er seine Daten komplett verliert!
Ich führe das mal an einem Beispiel vor… gegeben sind drei Logical Volumes (LVs) zu je 1 GB Größe. Das reicht völlig zum Testen und demonstriert dennoch die Vorgehensweise. Alternative kann man natürlich auch irgendwelche anderen Partitionen (Swap o.ä.) nehmen. Die LVs heissen bei mir r1, r2, r3 und befinden sich in der Volume Group (VG) /dev/vg:
r1 vg -wi-a- 1.00G
r2 vg -wi-a- 1.00G
r3 vg -wi-a- 1.00G
Zwei dieser LVs fasse ich nun erst einmal zu einem RAID1 (/dev/md5)zusammen:
[code]
muaddib:/home/ij# mdadm –create /dev/md5 -l 1 -n 2 /dev/vg/r[12]
mdadm: /dev/vg/r1 appears to be part of a raid array:
level=raid1 devices=2 ctime=Thu Feb 26 16:16:59 2009
mdadm: /dev/vg/r2 appears to be part of a raid array:
level=raid1 devices=2 ctime=Thu Feb 26 16:16:59 2009
Continue creating array? yes
mdadm: array /dev/md5 started.
[/code]
Die Warnung, daß die LVs bereits zu einem RAID gehören ignoriere ich einfach mal… Das Resultat sieht dann in etwa so aus:
md5 : active raid1 dm-12[1] dm-11[0]
1048512 blocks [2/2] [UU]
[========>…………] resync = 40.2% (422900/1048512) finish=0.7min speed=14096K/sec
Nun kann man noch ein Filesystem auf dem RAID1 erstellen und mit ein paar Testdaten füllen:
[code]
muaddib:/home/ij# mkfs.xfs -f /dev/md5
meta-data=/dev/md5 isize=256 agcount=4, agsize=65532 blks
= sectsz=512 attr=2
data = bsize=4096 blocks=262128, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal log bsize=4096 blocks=1200, version=2
= sectsz=512 sunit=0 blks, lazy-count=0
realtime =none extsz=4096 blocks=0, rtextents=0
muaddib:/home/ij# mount /dev/md5 /mnt
muaddib:/home/ij# cp pics/backdrops/*.jpg /mnt/
muaddib:/home/ij# dir /mnt/
amigager_back1.jpg Dansk-Dunes14.jpg Dansk-Nature-2.jpg
CapeCod_085.jpg Dansk-Dunes15.jpg Dansk-Priel.jpg
ct-1-p1600.jpg Dansk-Dunes16.jpg Dansk-Woods-1.jpg
ct-2-p1600.jpg Dansk-Dunes17.jpg earth_lights_lrg.jpg
Dansk-Beach1.jpg Dansk-Dunes18.jpg HanseSail-AlterStrom2.jpg
Dansk-Beach2.jpg Dansk-Dunes2.jpg HanseSail-AlterStrom.jpg
Dansk-Beach3.jpg Dansk-Dunes3.jpg HanseSail-Mast.jpg
Dansk-Beach4.jpg Dansk-Dunes4.jpg HanseSail-Warnemuende.jpg
Dansk-Beach5.jpg Dansk-Dunes5.jpg LinuxInside_p1600.jpg
Dansk-Beachstones.jpg Dansk-Dunes6.jpg prerow.jpg
Dansk-Cliffs.jpg Dansk-Dunes7.jpg sgi-1440.jpg
Dansk-Dunes10.jpg Dansk-Dunes8.jpg sgi.jpg
Dansk-Dunes11.jpg Dansk-Dunes9.jpg Sonnenuntergang-2.jpg
Dansk-Dunes12.jpg Dansk-Dunes.jpg Sonnenuntergang.jpg
Dansk-Dunes13.jpg Dansk-Nature-1.jpg
muaddib:/home/ij# umount /mnt
[/code]
Nach dem umount kommt nun die eigentliche Herausforderung: das Erstellen eines RAID5 Labels! Im Prinzip kein Ding, aber so ohne weiteres mag man sowas natuerlich auch nicht machen. Aber egal, wir haben ja ein Backup, also los geht’s!
[code]
muaddib:/home/ij# mdadm –create /dev/md5 –level=5 –raid-devices=2 /dev/vg/r[12]
mdadm: /dev/vg/r1 appears to be part of a raid array:
level=raid1 devices=2 ctime=Mon Mar 2 18:18:09 2009
mdadm: /dev/vg/r2 appears to be part of a raid array:
level=raid1 devices=2 ctime=Mon Mar 2 18:18:09 2009
Continue creating array? yes
mdadm: array /dev/md5 started.
muaddib:/home/ij# cat /proc/mdstat
md5 : active (auto-read-only) raid5 dm-12[2](S) dm-11[0]
1048512 blocks level 5, 64k chunk, algorithm 2 [2/1] [U_]
muaddib:/home/ij# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md5 : active raid5 dm-12[2] dm-11[0]
1048512 blocks level 5, 64k chunk, algorithm 2 [2/1] [U_]
[>………………..] recovery = 3.1% (33152/1048512) finish=0.5min speed=33152K/sec
[/code]
Nachdem man /dev/md5 erst gestoppt hat, kann man ein RAID5 Label draufschreiben. Die Daten bleiben aufgrund der Besonderheit des RAID5 Algorithmus’ mit 2 Platten erhalten. Zur Überprüfung dieser gewagten These kann man /dev/md5 wieder mounten. Der Rest geht wieder online im Betrieb, aber schauen wir erstmal nach:
muaddib:/home/ij# mount /dev/md5 /mnt
muaddib:/home/ij# dir /mnt/
amigager_back1.jpg Dansk-Dunes14.jpg Dansk-Nature-2.jpg
CapeCod_085.jpg Dansk-Dunes15.jpg Dansk-Priel.jpg
ct-1-p1600.jpg Dansk-Dunes16.jpg Dansk-Woods-1.jpg
ct-2-p1600.jpg Dansk-Dunes17.jpg earth_lights_lrg.jpg
Dansk-Beach1.jpg Dansk-Dunes18.jpg HanseSail-AlterStrom2.jpg
Dansk-Beach2.jpg Dansk-Dunes2.jpg HanseSail-AlterStrom.jpg
Dansk-Beach3.jpg Dansk-Dunes3.jpg HanseSail-Mast.jpg
Dansk-Beach4.jpg Dansk-Dunes4.jpg HanseSail-Warnemuende.jpg
Dansk-Beach5.jpg Dansk-Dunes5.jpg LinuxInside_p1600.jpg
Dansk-Beachstones.jpg Dansk-Dunes6.jpg prerow.jpg
Dansk-Cliffs.jpg Dansk-Dunes7.jpg sgi-1440.jpg
Dansk-Dunes10.jpg Dansk-Dunes8.jpg sgi.jpg
Dansk-Dunes11.jpg Dansk-Dunes9.jpg Sonnenuntergang-2.jpg
Dansk-Dunes12.jpg Dansk-Dunes.jpg Sonnenuntergang.jpg
Dansk-Dunes13.jpg Dansk-Nature-1.jpg
Als nächstes muss man dann die dritte “Platte” hinzufügen:
[code]
muaddib:/home/ij# mdadm –add /dev/md5 /dev/vg/r3
mdadm: added /dev/vg/r3
muaddib:/home/ij# cat /proc/mdstat
md5 : active raid5 dm-13[2](S) dm-12[1] dm-11[0]
1048512 blocks level 5, 64k chunk, algorithm 2 [2/2] [UU]
[/code]
Das war der erste Schritt. Wie man sieht, ist die dritte “Platte” als Spare Device eingetragen. Da wir aber kein Spare haben wollen, sondern ein RAID5, erweitern wir zum Schluß die Anzahl der aktiven Platten auf 3 und teilen dem RAID mit, daß es wachsen soll:
[code]
muaddib:/home/ij# mdadm –grow /dev/md5 –raid-devices=3
mdadm: Need to backup 128K of critical section..
mdadm: … critical section passed.
muaddib:/home/ij# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md5 : active raid5 dm-13[2] dm-12[1] dm-11[0]
1048512 blocks super 0.91 level 5, 64k chunk, algorithm 2 [3/3] [UUU]
[>………………..] reshape = 3.1% (33472/1048512) finish=3.0min speed=5578K/sec
[/code]
Die letzten beiden Aktionen fanden mit einem gemounteten Filesystem statt, das nun nur noch vergrößert werden muss. Bei XFS geht das einfach online mittels xfs_growfs:
[code]
muaddib:/home/ij# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/md5 1020M 21M 1000M 2% /mnt
muaddib:/home/ij# xfs_growfs /mnt
meta-data=/dev/md5 isize=256 agcount=4, agsize=65532 blks
= sectsz=512 attr=2
data = bsize=4096 blocks=262128, imaxpct=25
= sunit=0 swidth=0 blks
naming =version 2 bsize=4096 ascii-ci=0
log =internal bsize=4096 blocks=1200, version=2
= sectsz=512 sunit=0 blks, lazy-count=0
realtime =none extsz=4096 blocks=0, rtextents=0
data blocks changed from 262128 to 524256
muaddib:/home/ij# df -h /mnt
Filesystem Size Used Avail Use% Mounted on
/dev/md5 2.0G 21M 2.0G 1% /mnt
[/code]
Fertig!
Wer noch ein LVM auf dem RAID hat, muss dann noch die entsprechenden LVM Tools bedienen, um PV und VG zu vergrößern. Aber im Prinzip ist die schwierigste Arbeit bereits erledigt. Das Reshapen kann aber durchaus seine Zeit in Anspruch nehmen, wie man meinem RAID5 entnehmen kann:
md4 : active raid5 sda6[0] sdc6[2] sdb6[1]
969161152 blocks super 0.91 level 5, 64k chunk, algorithm 2 [3/3] [UUU]
[>………………..] reshape = 2.8% (27990592/969161152) finish=1485.0min speed=10562K/sec
Bei dem ganzen gibt es allerdings auch den einen oder anderen Fallstrick, wenn man von einem 2-disk RAID1 auf ein 3-disk RAID1 wechselt. Unter anderem müssen natürlich noch die Konfigurationsdateien angepaßt werden, z.B. /etc/mdadm/mdadm.conf. Das hat nun weniger was mit dem Reshapen von RAID1 auf RAID5 zu tun, aber ich wollte es nur der Vollständigkeit halber erwähnen. Ein eigener Blog-Artikel hierzu folgt dann auch gleich noch.
Vielen Dank übrigens an Goswin Brederlow für die Tipps und das Schreiben eines Wishlist Bugreports: #517731
In den nächsten Tagen stelle ich eventuell nochmal eine englischsprachige Version hiervon ins Blog. Mal schauen…