Synology Diskstation Fesplatte vergrößern
Volle Festplatte = schlechte Performance
Als ich nun Platte 1 im System vergrößern wollte, wusste ich nicht was auf mich zukommmt. Vorallem viele Rückschläge, aber auch viel neues Wissen.
Rückschläge
Mein erster Gedanke ist, dd if=/dev/alt of=/dev/neu
, wird es schon richten. Ich halte das System an, baue die Festplatte aus und hänge sie und die neue an meinen Rechner, spiegle sie und baue die neue wieder ein. Warum genau das nicht ging, blieb mir ein Rätsel. Fakt war, ich konnte die gespiegelte Platte nicht einfach einsetzen und das System hochfahren. Er akzeptierte sie schlichtweg nicht. Ich probierte verschiedene Anläufe. Im zweiten Schritt versuchte ich die zu vergößernde Platte im laufenden Betrieb mit dd zu spiegeln, in dem ich die zweite Platte an den USB 3.0 Port hing. Auch das ging nicht. Ich versuchte noch andere Ansätze, in dem ich mit rsync alle Daten kopierte und so weiter. Es wäre genau so müßig weiter aufzuzählen, was ich alles versucht habe, insofern will ich zur Lösung kommen, die ich erfolgreich angewendet habe.
Dazu muss man wissen, dass, wenn die Platten nicht im RAID Verbund sind, trotzdem von der Diskstation als RAID formatiert werden. Beide Platten im System sind RAID 1 (gespiegelt), aber jeweils nur mit einer Platte im Verbund. Es ist also ein nichtgespiegeltes Array, weil es nur aus einer Platte besteht.
Der richtige Weg
Auf der Kommandozeile konfiguriert man sein RAID Array mit dem Befehl mdadm
(multiple devices admin).
Man kann ein Array damit anlegen, erweitern, Platten abkoppeln, synchronisieren und alles, was man mit einem Software Array so machen muss.
Grob formuliert geht der Weg so:
- Partitionstabelle der alten Platte auf die neue kopieren
- eindeutige UUID der neuen Platte zuweisen
- mdadm nutzen um die neue Platte in das Array einzugliedern
- das Array auf 2 Plattem vergrößern und synchronisieren lassen
- die alte Platte aus dem Array entfernen und das Array wieder auf eine Platte verkleiner
- die Partitionsgröße der neuen Festplatte auf das Maximum verrößern
Meine Diskstation hat auf der alten Platte 3 Partitionen. Jede Partition ist eigentlich ein RAID 1 Array, mit nur einer Platte.
Raid Arrays haben im System eine neue Bezeichnung.
Auf der Diskstation ist
md0 = Root = sda1 // die Systempartition
md1 = Swap = sda2 // die Auslagerungsdatei
md2 = Daten = sda3 // die kompletten Daten
Festplatten vorbereiten
Damit die neue Platte dem Array hinzugefügt werden kann, muss sie natürlich über die gleiche Partitionstabelle verfügen. Alle drei Partitionen sda1, sda2 und sda3 müssen auf beiden Platten identisch sein. Da ich die Partitionen mit dd
gespiegelt hatte, waren sie bereits identisch.
Wer diesen Schritt nicht machen will, kommt nicht umhin beide Platten an einem anderen Computer anzuschließen, am besten mit Linux Betriebssystem, um das Layout mit sgdisk
, zu kopieren. Der Befehl ist nicht auf der Diskstation installiert und darum muss er auf einem anderen Rechner ausgeführt werden. sgdisk erlaubt Partitionstabellen mit sgdisk -R=/dev/sdq /dev/sdb
zu kopieren. Es gibt auch eine Möglichkeit mit dd
auf dem Server nur die Layoutouts zu kopieren. Da ich beides nicht gemacht habe, kann ich keine verlässliche Aussage zu den Methoden machen, würde mich aber selber für sgdisk entscheiden, wenn die Möglichkeit besteht, die Festplatten an den Linuxrechner zu hängen.
Update November 2021: Ich habe eine Formel gefunden, mit der ich, als ich mal wieder die Festplatte verößern musste, die GPT-Partitionstabelle auch mit dd kopieren konnte.
(128 x ANZAHL_DER_PARTITIONEN) + 1024
Das sind bei 3 Partitionen: 1408 Bytes müssen kopiert werden
Dann lautet der Befehl: dd if=/dev/sda of=DATEI_ODER_LAUFWERK count=1408 bs=1
An dieser Stelle der Hinweis, dass man seine alte Platte vielleicht ein mal auf einer Platte sichert, die nicht die alte ersetzen soll. Ich hatte mir als Ersatz für die alte Platte zwei neue Platten gekauft. Die eine wird für die Diskstation vorbereitet, die andere habe ich, wie immer, als Backup mit allen alten Daten bespielt, ohne besonderen Wert auf Bootbarkeit zu legen.
Wenn die Partitionstabelle auf der neuen Platte ist, vergeben wir neue GUIDs mit sgdisk -G /dev/sdq
.
Jetzt können wir die alte Platte wieder in die Diskstation einbauen und das System starten. An einen freien USB Port hänge ich die neue vorbereitete Platte. Sie hat die Laufwerksbezeichnung /dev/sdq
Das Array mit Kommandozeile vergrößern
Doch zu erst die Basics. Wir loggen uns per ssh
als Administrator auf der Diskstation ein. Wir wechseln in mit sudo su
in einen Modus, der uns nicht ständig dazu zwingt sudo vor jedem Befehl einzugeben.
Als erstes verschaffen wir uns einen Überblick über die RAID Arrays mit cat /proc/mdstat
.
Anschließend können wir die neue Platte mit der alten partitionsweise synchronisieren. sdq ist in diesem Fall das USB Laufwerk.
// dem ersten RAID füge ich eine neue Partition hinzu
mdadm --add /dev/md0 /dev/sdq1
mdadm --grow /dev/md0 -n 2 (3 s. u.)
// danach muss ich das RAID auf 2 oder 3 Laufwerke ausdehnen
// md0 und md1 (Root und Swap) sind über alle Laufwerke (HDD 1 , HDD 2 und USB) verteilt sind deswegen:
mdadm --grow /dev/md0 -n 3
mdadm --grow /dev/md1 -n 3
// abhängig davon welche Platte ausgetauscht wird:
// md2 ist Platte in Schacht 1
// md3 ist Platte in Schacht 2
mdadm --grow /dev/md2 -n 2
mdadm --grow /dev/md3 -n 2
Die Synchronisation beginnt jetzt.
Man kann den Fortschritt mit cat /proc/mdstat
verfolgen, oder mdadm --detail /dev/md0
.
Die nächsten Partitionen im selben Verfahren synchronisieren:
mdadm --add /dev/md1 /dev/sdq2
mdadm --grow /dev/md1 -n 3
mdadm --add /dev/md2 /dev/sdq3
mdadm --grow /dev/md2 -n 2
// hier sind es tatsächlich nur zwei Partitionen. Wie oben gesagt verteilen sich Swap und Root über alle drei Laufwerke, ausser die Datenpartition
Update November 2021: Falls der Prozess viel zu lange dauert, kann man ihn beschleunigen. Entweder über das Webinterface: Speichermanager > Speicherpool > Konfiguration
Dort einfach höhere MB-Werte eintragen. Ich habe es über das Terminal gemacht, deswegen weiß ich nicht, wie zuverlässig das funktioniert.
sudo sysctl -w dev.raid.speed_limit_max=5000000
sudo sysctl -w dev.raid.speed_limit_min=500000
Wenn alles synochronisiert ist hat man ein funktionierendes RAID 1 mit zwei gespiegelten Platten, eine intern, die andere auf dem USB Port.
Ein RAID mit einem USB Laufwerk macht für mich keinen Sinn, ich nehme die USB Platte ja nur als Hilfsmittel. Also die interne, alte und kleine Platte auskoppeln.
mdadm --fail /dev/md0 /dev/sda1 --remove /dev/sda1
mdadm --grow --force /dev/md0 -n 2
mdadm --fail /dev/md1 /dev/sda2 --remove /dev/sda2
mdadm --grow --force /dev/md1 -n 2
mdadm --fail /dev/md2 /dev/sda3 --remove /dev/sda3
mdadm --grow --force /dev/md2 -n 1
Das piept zwischendurch unangenehm, da die Synology das Auskoppeln als Festplattenfehler mitteilt. Lässt sich aber in der Systemsteuerung ausschalten.
Jetzt muss die Partition noch vergrößert werden.
parted /dev/sda resizepart 3 6000GB
die neue Platte fasst 6TB. Parted versucht jetzt die GPT Tabelle zu fixen und hilft einem, egal wie groß ich die Größe angegeben habe.
mdadm --examine /dev/sda3
nachgucken ob die neue Größe zugeschrieben wurde
mdadm --grow /dev/md2 --size max
resize2fs /dev/md2
Jetzt das System herunterfahren und die Platten tauschen, hochfahren und im DSM schauen, ob die neue Plattengröße angezeigt wird.
Es ist dennoch zu betonen, dass der hier aufgezeigte Weg zwar bei mir funktioniert hat, mag aber bei anderen nicht funktionieren. Ich hatte meine Platte bspw. als ext4 formatiert und kein SHR verwendet.
-
- Inspiration:
- mdadm Partitionen vergrößern (en)
- Software RAID erweitern (en)
- GPT Partitionslayout kopieren (en)
- Festplattentausch im Software RAID
- RAID1 mit mdadm erweitern (en)
- mdadm Cheatsheet (en)
- Alternative Methode seine Platte ohne “mdadm”
Super, vielen Dank für die Anleitung, die einzige Lösung die ich zu dem Thema gefunden habe.
Ich glaube an einer Stelle hat sich ein Fehler eingeschlichen:
parted /dev/sda
Müsste das nicht /dev/sdq heißen? Wir wollen doch die größere (externe) Platte vergröern. Und bei “mdadm –grow –size max” fehlt noch das zu vergrößernde Device.
Die Partition ließ sich bei mir jedenfalls vergrößern und auch das examine zeigt die volle Größe an. Jedoch “mdadm –grow –size max /dev/md2” vergrößert leider nicht. Fehler kommt keiner, aber die Größe ist genauso wie vorher.
Woran könnte das liegen?
Danke Stefan!
Ich denke dass du Recht hast mit dem /dev/sdq. Habe versucht mich zu erinnern, ob ich die Platte möglicherweise schon ausgetauscht hatte, so dass sie schon sda wurde. Aber eher unwahrscheinlich.
Und ja, die Partitionsangabe fehlt wohl bei grow. ;)
Zu deinem zweiten Problem: Hast du
resize2fs /dev/md2
auch ausgeführt? Denn dasmdadm --grow --size max /dev/md2
sagt erst mal nur dem RAID was der beschreibbare Platz ist. Um das Dateisystem auf die neue physikalische Größe auszubreiten musst du den zweiten Befehl noch ausführen.In meinen Notizen habe ich am Ende der Prozedur noch einen Befehl aufgeschrieben. Ich weiß nicht mehr ob ich ihn verwendet hatte:
mdadm --grow /dev/md2 --size max --bitmap internal
Die volle Prozedur sähe so aus:
mdadm --grow /dev/mdX --bitmap none
mdadm --grow /dev/mdX --size max
mdadm --wait /dev/mdX
mdadm --grow /dev/mdX --bitmap internal
Vergleich: https://raid.wiki.kernel.org/index.php/Growing
Hallo Clemens,
danke für die Tipps. Ich hab’s inzwischen etwas anders gelöst:
– Neue und alte Platte eingebaut
– Bestehende Platte mit neuer Platte als RAID1 erweitert
– Alte platte aushängen
– Neue Platte erweitern
Im Detail hab ich’s hier zusammengefasst
http://steff517.blogspot.com/2018/08/replacing-drive-by-bigger-one-on-2-bay.html
Gruß,
Stefan