Einführung
Ich nutze einen dedizierten Root-Server von hetzner.com, der über zwei 512 GB NVMe SSDs verfügt. Jede enthält die gleichen drei Partitionen für SWAP, /boot und / (alles andere). Alle drei Partitionen befinden sich in einem Software-RAID 1 Verbund mittels mdadm. Dadurch sind insgesamt drei Partitionen nutzbar:
- SWAP oder /dev/md0
- /boot oder /dev/md1
- / oder /dev/md2
Da die SWAP-Partition 32 GiB groß ist und mein Speicherplatz knapp wird, möchte ich SWAP deaktivieren, die zugehörige Partition entfernen und den gewonnenen Speicherplatz zur Partition /dev/md2 hinzufügen. Der schwierige Teil kommt dadurch zustande, dass mein System bereits in Benutzung ist und ich die Daten darauf nicht verlieren will. Die Änderungen sollen also ohne Datenverlust und ohne Einbeziehen eines zweiten Systems vonstattengehen. Dieses Tutorial zeigt, wie genau dies umgesetzt werden kann.
Info: Dieses Tutorial wurde auf Alma Linux (ähnlich zu dem bekannteren CentOS) getestet, sollte aber auch für viele andere Distributionen funktionieren, da es zum Großteil Standard Linux Programme verwendet.
Übersicht
Vorher:
RAID 1 md0 für SWAP |
RAID 1 md1 für /boot |
RAID 1 md2 für / |
|
---|---|---|---|
Disk 1nvme0n1 |
Disk 1 Partition 1nvme0n1p1 |
Disk 1 Partition 2nvme0n1p2 |
Disk 1 Partition 3nvme0n1p3 |
Disk 2nvme1n1 |
Disk 2 Partition 1nvme1n1p1 |
Disk 2 Partition 2nvme1n1p2 |
Disk 2 Partition 3nvme1n1p3 |
In Schritt 1 und 2 wird SWAP deaktiviert und die zugehörige Partition entfernt:
RAID 1 md1 für /boot |
RAID 1 md2 für / |
||
---|---|---|---|
Disk 1nvme0n1 |
ungenutzter Speicherplatz | Disk 1 Partition 2nvme0n1p2 |
Disk 1 Partition 3nvme0n1p3 |
Disk 2nvme1n1 |
ungenutzter Speicherplatz | Disk 2 Partition 2nvme1n1p2 |
Disk 2 Partition 3nvme1n1p3 |
Schritt 3 erklärt, wie die übrigen Partitionen nach links verschoben werden können, sodass der freie Speicherplatz rechts aller Partitionen ist:
RAID 1 md1 für /boot |
RAID 1 md2 für / |
||
---|---|---|---|
Disk 1nvme0n1 |
Disk 1 Partition 2nvme0n1p2 |
Disk 1 Partition 3nvme0n1p3 |
ungenutzter Speicherplatz |
Disk 2nvme1n1 |
Disk 2 Partition 2nvme1n1p2 |
Disk 2 Partition 3nvme1n1p3 |
ungenutzter Speicherplatz |
In Schritt 4 wird dann die Partition md2
so vergrößert, dass der gewonnene freie Speicherplatz ausgenutzt wird:
RAID 1 md1 für /boot |
RAID 1 md2 (vergrößert)für / |
|
---|---|---|
Disk 1nvme0n1 |
Disk 1 Partition 2nvme0n1p2 |
Disk 1 Partition 3 (vergrößert)nvme0n1p3 |
Disk 2nvme1n1 |
Disk 2 Partition 2nvme1n1p2 |
Disk 2 Partition 3 (vergrößert)nvme1n1p3 |
Begrifflichkeiten
- Festplatte wird als Begriff sowohl für SSDs als auch HDDs genutzt
- Festplattenpartition wird für gewöhnliche Partitionen auf einer einzelnen Festplatte als Abgrenzung zu RAID-Partitionen genutzt
Vorbereitung: Informationen über Festplatten und Partitionen sammeln
Im Allgemeinen hat sich gezeigt, dass die folgenden Befehle hilfreiche Informationen ausgeben, um den Stand der Dinge zu zeigen. Dazu gehören Angaben zu Name, Größe, UUID, Startsektor, Endsektor usw. der einzelnen Partitionen und Festplatten.
fdisk -l
zeigt die Größe in Bytes und Sektoren sowie die Positionen von jeder Partition (RAID- und Festplattenpartitionen)blkid
listet Partitionen und Festplatten zusammen mit den zugehörigen UUIDs auflsblk
zeigt die hierarchische Ansicht der Festplatten und RAID-Partitionen mit Größe, Typ und Einhängepunktdf -h
Perspektive des Betriebssystems auf die Partitionen mit Größe, freiem und belegtem Speicherplatz
Damit kann etwa der Zwischenstand visuell geprüft werden, um den Erfolg einer Aktion zu bestätigen.
Schritt 1 - SWAP deaktivieren
SWAP Speicher ist Speicherplatz auf der Festplatte, der genutzt wird, um den Arbeitsspeicher zu erweitern. In meinem Fall habe ich jedoch ausreichend Arbeitsspeicher, aber zu wenig Speicherplatz. Es wird häufig diskutiert, ob SWAP überhaupt noch sinnvoll ist angesichts moderner SSDs. Darauf wird hier jedoch nicht näher eingegangen.
Um SWAP vorübergehend (bis zum Neustart des Systems) zu deaktivieren, kann der folgende Befehl ausgeführt werden:
swapoff -a
Mit dem Programm htop (falls installiert) kann die aktuelle Größe des SWAP-Speichers gezeigt werden (oben links, direkt unter dem Arbeitsspeicher).
Um SWAP dauerhaft zu deaktivieren, muss die Zeile in /etc/fstab auskommentiert werden, die "swap" enthält, wie im Beispiel zu sehen:
proc /proc proc defaults 0 0
# /dev/md/0
#UUID=38c56f99-6dd4-43e2-801c-xxxxxxxxxxxx none swap sw 0 0
# /dev/md/1
UUID=8a084a81-e20b-4239-a8ef-xxxxxxxxxxxx /boot ext3 defaults 0 0
# /dev/md/2
UUID=85f9f200-0ade-42de-9eac-xxxxxxxxxxxx / ext4 defaults 0 0
Dadurch wird die SWAP-Partition bei den folgenden Systemstarts nicht erneut eingebunden. Die auskommentierte Zeile kann auch gelöscht werden, allerdings ist es grundsätzlich eine gute Idee den Weg zurück offen zu halten, falls etwas schief geht.
Nun sollte das System neu gestartet werden, um zu testen, ob der Schritt funktioniert hat und um den nächsten Schritt vorzubereiten.
Schritt 2 - SWAP-Partition entfernen
Vorbereitend muss einmal der Inhalt der Datei /proc/mdstat ausgelesen werden, da er später benötigt wird und im nächsten Schritt verändert wird.
cat /proc/mdstat
Zunächst sollte das RAID-Array der Partition entfernt werden (falls die SWAP-Partition kein RAID nutzt, sollte dieser Schritt übersprungen werden):
umount /dev/md0
mdadm --stop /dev/md0
mdadm --remove /dev/md0
Info: Der letzte Befehl kann fehlschlagen, das ist ok. Er dient nur zur Abwärtskompatibilität.
Anschließend müssen die sogenannten Superblocks der Festplattenpartitionen auf beiden Datenträgern einzeln entfernt werden. Um die betroffenen Festplattenpartitionen des RAID-Verbunds aufzulisten, wird der Inhalt der Datei /proc/mdstat herangezogen, der zuvor ausgelesen wurde.
Bei mir lauteten die Bezeichnungen bei /dev/md0 /dev/nvme0n1p1 und /dev/nvme1n1p1.
Der folgende Befehl bekommt all diese Partitionsbezeichnungen als Parameter (mit Leertaste getrennt) übergeben:
mdadm --zero-superblock /dev/nvme0n1p1 /dev/nvme1n1p1
Dann werden die Festplattenpartitionen mit fdisk
und der Festplattenbezeichnung gelöscht:
fdisk /dev/nvme0n1
Info: Es handelt sich nicht um die Partitionsbezeichnung, sondern um die Bezeichnung der jeweils zugehörigen Festplatten.
Anschließend wird d
eingegeben, um die Partition zu löschen. Daraufhin wird nach der Partitionsnummer gefragt, die in meinem Fall 1 ist. Durch Angabe dieser Nummer, wird die Partition gelöscht. Anschließend werden alle Änderungen mit w
bestätigt.
Dieser Schritt muss für alle Festplattenpartitionen bzw. Festplatten des RAID-Verbunds wiederholt werden.
Info: Ich musste zusätzlich zum Deaktivieren des RAID-Arrays die Zeile in /etc/mdadm.conf, die /dev/md0 betrifft auskommentieren, um das RAID-Array tatsächlich zu deaktivieren. Warum ist mir schleierhaft.
Der Bereich, der auf der Festplatte für die SWAP-Partition genutzt wurde ist jetzt frei. Im nächsten Schritt können die übrigen Partitionen nach links verschoben werden.
md0 für SWAP |
RAID 1 md1 für /boot |
RAID 1 md2 für / |
|
---|---|---|---|
Disk 1nvme0n1 |
verfügbarnvme0n1p1 |
Disk 1 Partition 2nvme0n1p2 |
Disk 1 Partition 3nvme0n1p3 |
Disk 2nvme1n1 |
verfügbarnvme1n1p1 |
Disk 2 Partition 2nvme1n1p2 |
Disk 2 Partition 3nvme1n1p3 |
Schritt 3 - Andere RAID-Partitionen verschieben
Nun kommen wir zum kritischen Teil. Hierzu muss ein separates Betriebssystem verwendet werden, das die Partitionen nicht benutzt, die verschoben werden sollen. Dazu habe ich das Rescue System von Hetzner verwendet, das über das Netzwerk gestartet wird und über die Administrationsoberfläche aktiviert werden kann.
Um eine Partition nach links (zum Anfang der Festplatte) zu verschieben, ist folgendes auszuführen:
echo '-32G,' | sfdisk --move-data /dev/nvme0n1 -N 2
dabei bedeutet 32G
, dass die Partition um 32 GiB nach links verschoben werden soll (Minus meint links, Plus wäre rechts). Das -N 2
steht für Partitionsnummer 2.
Um in Schritt 4 eine RAID-Partition zu vergrößern, müssen alle Festplattenpartitionen (auf allen Festplatten des RAID-Verbunds) so verschoben werden, dass der freie Speicherplatz unmittelbar rechts von der zu vergrößernden Partition ist. Dazu kann dieser Schritt 3 für all diese Festplattenpartitionen wiederholt werden.
Die übrigen Festplattenpartitionen sind dann links auf der Festplatte. Als nächstes kann der "End Point" der Partitionen neben einem freien Festplatten-Bereich wie in Schritt 4 beschrieben nach rechts verschoben werden. In meinem Fall sind das die Festplattenpartitionen nvme0n1p3
und nvme1n1p3
. Zusätzlich kann auch die RAID-Partition md2
vergrößert werden.
RAID 1 md1 für /boot |
RAID 1 md2 für / |
||
---|---|---|---|
Disk 1nvme0n1 |
Disk 1 Partition 2nvme0n1p2 |
Disk 1 Partition 3nvme0n1p3 |
verfügbar |
Disk 2nvme1n1 |
Disk 2 Partition 2nvme1n1p2 |
Disk 2 Partition 3nvme1n1p3 |
verfügbar |
Schritt 4 - RAID-Partition vergrößern
Um die RAID-Partition zu vergrößern, sind die folgenden drei Schritte notwendig. Ein Neustart zwischen den einzelnen Schritten wird empfohlen, kann sogar notwendig sein.
Schritt 4.1 - Vergrößern der Festplattenpartitionen
Mit parted
wird eine interaktive Umgebung für die Vergrößerung gestartet. Dort muss zunächst die richtige Festplatte mit dem Befehl select /dev/nvme0n1
ausgewählt werden.
Dann wird für diese Festplatte eine Liste aller Partitionen und partitionsfreier Bereiche mit print free
ausgegeben.
resizepart
wird nach der Partitionsnummer und nach der Zielgröße der Partition fragen.
Dieser Schritt muss für alle Festplattenpartitionen der RAID-Partition wiederholt werden.
Schritt 4.2 - RAID-Partition vergrößern
Dies ist kein alternativer Schritt zu Schritt 4.1, sondern ein zusätzlicher!
Nun muss mdadm
noch mitgeteilt werden, dass es mehr Speicherplatz der Festplattenpartitionen für die RAID-Partition nutzen soll. In meinem Fall will ich /dev/md2 auf 485210 MiB vergrößern.
mdadm --grow --size=485210M /dev/md2
Schritt 4.3 - Dateisystem erweitern
Wie durch einen Aufruf von df -h
möglicherweise bereits aufgefallen ist, wird dort noch immer die alte Größe der Partition angezeigt. Um dies zu ändern, fehlt ein letzter Schritt:
Zu guter Letzt wird resize2fs -p /dev/md2
genutzt, um das Dateisystem auf die neue Größe von /dev/md2 zu erweitern.
Zusammenfassung
Wenn df -h
(erneut) ausgeführt wird, sollte ersichtlich sein, dass die Partition, die es zu vergrößern galt (/dev/md2 in meinem Fall), tatsächlich größer geworden ist. Mission abgeschlossen!