Die Festplatte läuft voll. Wie gut, dass sie noch nicht komplett verwendet wird oder, da virtuell, sie sehr einfach vergrößert werden kann. Nur wie vergrößert man ein UFS Dateisystem? Vor allem dann, wenn wie bei OPNsense oftmals der Fall hinter der UFS-Partition die swap Partition liegt?

OPNsense oder FreeBSD?

Da OPNsense auf FreeBSD basiert, funktioniert diese Anleitung logischerweise für beide Systeme.

Sämtliche Schritte können online, also ohne Betriebsunterbrechung, durchgeführt werden. Diese Anleitung zeigt, wie man eine mit Festplatte mit GPT (https://de.wikipedia.org/wiki/GUID_Partition_Table) und UFS (https://de.wikipedia.org/wiki/Unix_File_System) vergrößert. Ebenso wird die swap Partition berücksichtigt, welche oftmals an eine andere Stelle umziehen muss. Selbstverständlich kann diese auf diesem Weg ihre Größe ändern oder, falls noch gar nicht vorhanden, erstmalig angelegt werden.

Wie immer bei irgendwelchen Änderungen von kritischen Daten: Prüfe im ersten Schritt die Aktualität des Backups ab.

Ablauf

Im ersten Schritt geht es darum die „richtige“ Platte zu ermitteln. Unter FreeBSD, und somit auch unter OPNsense, ist dies meist ada0.

Um dies zu können muss man sich zuerst auf die Konsole des Systems verbinden – hierbei ist egal, ob dies über die Konsole mit einem Bildschirm, via ssh oder über einen seriellen Port geschieht.

Durch den Befehl geom disk list werden die vorhandenen Datenträger aufgelistet. Da für unser Vorhaben nur Festplatten interessant sind kann man zusätzlich noch die Ausgabe filtern lassen: geom disk list | grep „Name: ad“

FreeBSD geom disk list
FreeBSD gpart show ada0

Im obigen Beispiel ist die gesuchte Platte die ada0. Im nächsten Schritt geht es darum, die UFS Partiton zu ermitteln, zu prüfen ob es eine swap Partition gibt und ob der hinzugefügte Platz bereits erkannt wurde.

Im obigen Beispiel kann man 4 Partitionen erkennen: Den efi Bootloader, der boot Bereich von FreeBSD, die zu vergrößernde UFS Partition sowie eine swap Partition. Ebenfalls erkennbar: die 110 GB freien Festplattenplatz welcher dem UFS zugewiesen werden soll.

Falls die Platte größer sein sollte, aber noch kein oder nicht ausreichend freier Platz angezeigt wird: Boote das System neu. Danach sollte der korrekte Platz angezeigt werden.

Corrupt

Beim Vergrößern von Platten, vor allem in virtuellen Umgebungen, oder beim Klonen des Systems von anderen Systemen, kann es vorkommen, dass die Partitionstabelle als CORRUPT betrachtet wird. Geprüft werden kann dies via gpart status ada0. Im Screenshot sind alle Partitionen als OK markiert.

Sollte die Partitionstabelle als CORRUPT markiert sein, sollte dies im ersten Schritt repariert werden. Hierfür ist einfach folgender Befehl auszuführen: geom recover ada0

FreeBSD gpart status

swap Partition – 1. Teil

Sofern es, wie oben gezeigt, eine swap Partiton nach der UFS Partition geben muss diese im ersten Schritt gelöscht werden. Um die Partition löschen zu können, muss allerdings davor noch die swap Partition geleert werden. Dafür wird ihr Inhalt zurück in den physikalischen RAM kopiert. Sollte nicht genügend RAM frei sein sind ggf. Dienste anzuhalten oder der Speicher entsprechend anderweitig zu bereinigen. Die vermutlich einfachste Variante hierfür ist, das System einfach neu zu starten.

FreeBSD swapinfo und swapoff

Mit swapinfo kann man sich den aktuellen Füllstand der swap Partition anzeigen lassen. Um sie zu leeren und auszuhängen, ist der Befehl swapoff -a zu verwenden. Anstatt -a für „alle“ kann gezielt die Partition angegeben werden.

Da die swap Partition nicht mehr verwendet wird ist die entsprechende Zeile in der /etc/fstab zu löschen. Die richtige Zeile ist die mit FStype swap. Im Screenshot ist als Device /dev/ada0p4 angegeben, ebenfalls eine häufige Variante ist /dev/gpt/swap.

FreeBSD fstab
FreeBSD gpart delete

Da die swap Partiton nun frei ist kann diese gelöscht werden. Wie oben bereits ermittelt ist es auf diesem System die Partition mit der Nummer 4: gpart delete -i 4

Berechnungen

Im nächsten Schritt müssen einige Werte ermittelt und berechnet werden. Die notwendigen Befehle sind: diskinfo -v ada0, geom disk list ada0 sowie gpart show ada0. Der Screenshot vom gpart Aufruf ist der gleiche wie bereits oben gezeigt. Die jetzt fehlende swap Partition tut bei der Informationssuche nichts zur Sache.

FreeBSD diskinfo
FreeBSD gpart show ada0
FreeBSD geom disk list

Im Folgenden werden Werte berechnet bzw. ermittelt. Diese Werte sind im folgenden Kasten, entsprechend der hier im Text verwendeten Reihenfolge, dargestellt.

Das Beispiel erzeugt eine swap Partition. Falls dies nicht gewünscht ist, kann dieser Schritt entsprechend übersprungen und nur die UFS Partition auf das Maximum vergrößert werden.

  • Im ersten Schritt wird die stripsize fürs alignment ermittelt. Dies kann 0 sein und ist somit uninteressant. Falls der Wert ungleich 0 ist, muss dieser beim Anlegen von Partitionen in der Form -a <stripsize> angegeben werden. Weitere Infos zur Festplattenausrichtung finden sich zum Beispiel hier: https://en.wikipedia.org/wiki/Partition_alignment
  • Nun wird die sectorsize benötigt. Diese findet sich sowohl bei diskinfo als auch beim geom Befehl.
  • Die Anzahl der insgesamt vorhandenen Sektoren befindet sich in der ersten Zeile von der Ausgabe von gpart show ada0. Die zweite Spalte beinhaltet den gesuchten Wert.
  • In der gleichen Tabelle finden sich in der -free- Zeile die derzeit freien Sektoren.
  • Die Zahl der freien Bytes bzw. der freien Gigabytes wird nicht zwangsläufig benötigt, sondern dient lediglich der eigenen Information. Oder als Plausibilitätskontrolle, ob die errechneten Werte überhaupt stimmen. Die freien Bytes berechnen sich hierbei aus der Größe der Sektoren multipliziert mit der Anzahl der freien Sektoren: 231682743 Sektoren * 512 Bytes je Sektor = 118621564416 Bytes. Dieser Wert geteilt durch 1024 hoch 3 ergibt die Anzahl der freien Gigabytes: 110,4 GigaByte. Wen man berechnen will wie groß die Festplatte ist: Gleiches Spiel, allerdings ist die Anzahl der insgesamt vorhanden Sektoren nehmen. Logisch, oder?
  • Ich hätte gerne eine swap Parition mit 8 GigaByte Größe. Diesen Wert nehme ich mal 1024 hoch 3 um die Größe in Byte zu erhalten. Das teile ich nun durch die Sektorgröße und erhalte die Anzahl der Sektoren in der künftigen swap Partiton: 8 * 1024³ / 512 = 16777216
  • Meine swap Partition soll an das Ende der Platte. Der Start wird also wie folgt berechnet: Insgesamt verfügbare Sektoren auf der Platte minus Größe der swap Partition in Sektoren: 500118119 – 16777216 = 483340903 Das geht allerdings nur, wenn die Anzahl der freien GigaBytes auf der Platte auch tatsächlich größer ist als die künftige swap Partition.
  • Wer will, kann jetzt noch berechnen, um wie viel die UFS Partition vergrößert wird: Die Anzahl der freien Sektoren abzüglich der zu verwendeten Sektoren für die swap Partiton mal der Sektorgröße. Geteilt durch 1024³ und man erhält die Vergrößerung für die UFS Partition.

stripsize=0
sectorsize=512
sectors=500118119
freesectors=231682743

freebytes=118621564416
freegigabytes=110 (gerundet)

swapsize=8 (in GigaByte)
swapsectors=16777216
swapstart=483340903

ufsextend=103 (in GigaBytes, gerundet)

Prüfung

Um Fehler zur vermeiden lohnt es sich immer die Anzahl der verwendeten Sektoren zu kontrollieren. Wenn man sich mit diesem Wert gedanklich schwertut: Umrechnen in zum Beispiel GigaBytes und immer ein wachsames Auge darauf haben, ob die ermittelten Werte in Summe nie größer als die Festplatte werden.

FreeBSD gpart add swap
FreeBSD new swap activate
FreeBSD new swap activate

swap Partition – 2. Teil

Wenn man eine swap Partiton haben möchte, wird diese wie folgt angelegt: Es wird eine Partition vom Typ freebsd-swap angelegt und beginnt an der vorher berechneten Stelle. Eine Angabe der Größe ist nicht notwendig, da diese durch das „Ende“ der Platte vorgegeben ist. Der dazugehörige Befehl lautet: gpart add -t freebsd-swap -b 483340903 ada0

Die vorher gelöschte oder auskommentierte Zeile in der /etc/fstab für die swap Partition muss wieder entsprechend aufgenommen werden.

Mit swapon -a und swapinfo wird die neue swap Partiton aktiviert sowie Infos über deren Verwendung angezeigt. Hat hier alles fehlerfrei geklappt, ist der swap ans Ende der Platte umgezogen, wurde in seiner Größe geändert oder erstmalig neu angelegt.

UFS Partition

Der letzte Teil ist nun rasch erledigt. Ein Blick in die aktuelle Festplattenpartitionierung zeigt den freien Platz, welcher nach der UFS Partition frei ist. Dieser geht entweder bis zum Ende der Festplatte oder bis zum Beginn der swap Partition welche in den vorherigen Schritten bereits an das Ende der Platte gelegt wurde.

Analog zur swap Partition muss keine neue Größe angegeben werden, da das Ende durch das Ende der Festplatte oder durch den Beginn der swap Partition vorgegeben ist. Das Gleiche gilt für den Beginn der ufs Partition. Diese existiert bereits und soll lediglich am Ende vergrößert werden.

Somit sind zwei Dinge zu tun: Vergrößerung der Partition und im Anschluss daran Vergrößerung des UFS Dateisystems auf die nun neue, größere Partition.

Im Screenshot ist, zur Kontrolle, ein vorheriger und anschließender Aufruf des df Befehls gezeigt, welcher die erfolgreiche Aktion bestätigt.

Die beiden Befehle lautet wie folgt: gpart resize -i 3 ada0 wobei die 3 die Nummer der ufs Partition ist. Das Dateisystem wird mit growfs -y / vergrößert.

FreeBSD grow ufs

Fazit

Ohne swap Partition ist die Aufgabe rasch erledigt. Mit swap ist etwas Rechenarbeit notwendig. Ob man, wie hier gezeigt, dabei zuerst die Größe und Position der swap Partition berechnet oder berechnet, wie groß die UFS Partition werden darf, damit der Rest dem swap zugewiesen werden kann, ist letztendlich zweitrangig. Dem Verständnis für Festplatten und Partitionen ist die gelegentliche Rechnerei auf jeden Fall zweckdienlich 😉

Quellen zu Bildern von Dritten