Synology Diskstation Fesplatte vergrößern

Volle Festplatte = schlechte Performance

Meine Synology Diskstation war voll. Ich musste die Festplatten vergrößern. Ich betreibe sie aber nicht wie die meisten im RAID 0, 1 oder 5, sondern zwei Platten laufen separat. Platte 1 beinhaltet das System und einen Teil der Daten. Platte 2 beinhaltet den zweiten Teil der Daten. Ich mache Backups regelmäßig mit rsync über das Netzwerk auf Journaled formatierte Platten, die im OSX hängen. So bleiben meine Backupplatten meistens aus und werden nur zum Backup hochgefahren. Nach meiner Überlegung schont das die Backup-Platten und damit Ressourcen.

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.

Bildschirmfoto 2017-05-10 um 18.52.35
dd läuft im Hintergrund

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

Bildschirmfoto 2017-05-20 um 18.13.58
Fortschritt im Blick behalten

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.

Bildschirmfoto 2017-05-30 um 20.45.06

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:

3 responses to “Synology Diskstation Fesplatte vergrößern”

  1. Stefan says:

    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?

  2. Clemens says:

    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 das mdadm --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

  3. Stefan says:

    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

Leave a Reply

Your email address will not be published. Required fields are marked *