logoOL.gif
user_gelb_schwarz_or.gif
logoUL.gif
logoUR.gif claim.gif
LinuxUser LinuxCommunity EasyLinux Linux-Magazin International
      Anzeige
TFT Monitor bei Mercateo kaufen.
Neues Netbook? Ein Preisvergleich lohnt sich.
Bei uns finden sie Notebooks, PDAs und Drucker mit Testberichten und Tipps.
Diamant Buchhaltungssoftware – transparent und detailliert auch für die Konzernbuchhaltung.
Günstige Shareware Programme als direkte Downloads im Software Portal.
Bis zu 70% sparen durch Preisvergleich.
      Anzeige

Erschienen in LinuxUser 12/2003   »   Ausgabe bestellen

resize_reiserfs

Den Kuchen neu verteilen

von Olaf Tonnätt


Nach der Installation stellen Sie oft fest, dass das Installationsprogramm die gesamte Distribution auf eine einzige Root-Partition installiert hat. Diese Anleitung beschreibt, wie Sie eine ReiserFS-Partition verkleinern, um Platz für neue zu gewinnen.

Einige Distributionen wie Knoppix [1] oder kmLinux [2] verwenden in der Standardinstallation den gesamten freien Festplattenplatz für eine große Root-Partition und eine Swap-Partition, oder man hat es beim Installieren unbedacht selbst so gewählt. Nicht immer ist dies erwünscht: Wenn Sie /etc/ als unbeschreibbar mounten, pfuscht niemand an Ihren Systemeinstellungen herum, und /home/ ist auf einer eigenen Partition vor Schäden am restlichen Dateisystem sicher. Also alle Einstellungen und privaten Daten sichern, alles löschen und bei einer Neuinstallation versuchen, den Distributions-Installer auszutricksen?

Schneller zum Ziel führt resize_reiserfs aus dem Paket reiserfs (SuSE) oder reiserfsprogs. Ein vorheriges Backup ist aber bei allen Festplattenoperationen -- auch mit resize_reiserfs -- zu empfehlen.

Das Root-Dateisystem ist im laufenden Betrieb nicht auszuhängen. Falls Sie dieses verändern, booten Sie deshalb ein unabhängiges System wie Knoppix von CD oder die SuSE-Rettungs-CD [3] (Kasten 1).

Kasten 1: Szenario

Im Beispiel verkleinerten wir mit einem von CD laufenden Knoppix [1] (Version 3.2-2003-05-03-DE) eine 70 GB-Partition mit einem installierten kmLinux [2] (Version 3.2). Auch bei einer Festplatteninstallation von Knoppix auf einem ReiserFS war das Verkleinern bei uns kein Problem.

Alternativ zu Knoppix verwenden Sie ein CD-Image einer SuSE-Rettungs-CD von [3] (ca.13 MB), das Sie mit dem Befehl

cdrecord -v dev=0,0,0 speed=4 /pfad/zum/image
brennen. Die Parameter passen Sie an Ihr System an.

Überblick verschaffen

Einen Überblick über die Partitionen von hda verschafft der Befehl

fdisk -l /dev/hda
Arbeitet Ihr Linux nicht auf der ersten Festplatte, ersetzen Sie hda beispielsweise durch hdb.
df -t reiserfs
zeigt den freien Platz auf den eingehängten ReiserFS-Dateisystem in 1-kB-Blöcken (Listing 1). Bevor Sie eine Partition (im Beispiel /dev/hda8) verändern, hängen Sie sie mit
umount /dev/hda8
aus.


hda: "Harddisk A" ist die Master-Festplatte am primären IDE-Kanal (IDE0), es folgen hdb für den Slave am ersten Kanal sowie hdc und hdd für Master und Slave am zweiten Kanal (IDE1).


ReiserFS: Hans Reiser entwickelte dieses Dateisystem, das durch Protokollieren der geöffneten Dateien nach einem Absturz schnelles Wiederherstellen ermöglicht ("Journaling Filesystem"). Zudem speichert es kleine Dateifragmente kompakt und verschwendet damit weniger Platz als andere Dateisysteme.

Listing 1: Platteninformation vor dem Eingriff
root@linuxspider:/ # fdisk -l /dev/hda

Festplatte /dev/hda: 255 Köpfe, 63 Sektoren, 9964 Zylinder
Einheiten: Zylinder mit 16065 * 512 Bytes

    Gerät boot.  Anfang      Ende    Blöcke   Id  Dateisystemtyp
[...]
/dev/hda8   *       937      9964  72517378+  83  Linux

root@linuxspider:/ # df -t reiserfs
Dateisystem          1k-Blöcke    Benutzt  Verfügbar Ben% montiert auf
/dev/hda8             72515156  12750512   59764644  18% /mnt/hda8

Im Beispiel sind auf /dev/hda8 von 70 GB noch 57 GB frei. 7 GB freier Speicher reichen uns, also schrumpfen wir das Dateisystem um 50 GB:

resize_reiserfs /dev/hda8 -s -50G
Neben G für Gigabyte sind auch die Einheiten M für Megabyte und K für Kilobyte möglich. Der Vorgang braucht seine Zeit, in unserem Test blieb der Zähler zwei Minuten lang auf 0% stehen, wodurch der falsche Eindruck entstand, der Prozess hänge fest (Listing 2).

Listing 2: Verkleinern
root@linuxspider:/ # resize_reiserfs /dev/hda8 -s -50G
Are you ready (y/n) y 
Resizing /dev/hda8
shrinking: 0%            # Zwei Minuten Kaffeepause
syncing ... done

Hängen Sie anschließend die veränderte Partition mit

mount -t reiserfs /dev/hda8 /mnt/hda8
in ein beliebiges Verzeichnis ein, hier /mnt/hda8. fdisk -l /dev/hda zeigt nun an, dass sich die Partitionsgröße nicht verändert hat. df -t reiserfs gibt allerdings ein wesentlich kleineres Dateisystem auf dieser Partition an (Listing 3). Diese Differenz von 52,4 Millionen Kilobytes hätte vor 20 Jahren umgerechnet einen Wert von schätzungsweise 25 Millionen Euro gehabt; auch wir wollen auf die rund 50 GB nicht verzichten.

Listing 3: Platteninformation nach dem Verkleinern
root@linuxspider:/ # fdisk -l /dev/hda

Festplatte /dev/hda: 255 Köpfe, 63 Sektoren, 9964 Zylinder
Einheiten: Zylinder mit 16065 * 512 Bytes

    Gerät boot.  Anfang      Ende    Blöcke   Id  Dateisystemtyp
[...]
/dev/hda8   *       937      9964  72517378+  83  Linux

root@linuxspider:/ # df -t reiserfs
Dateisystem          1k-Blöcke    Benutzt Verfügbar Ben% montiert auf
/dev/hda8             20087956  12750512   7337444  64% /mnt/hda8

Kopfrechnen

In Listing 1 zeigte fdisk für /dev/hda8 eine Größe von 72517378 Blöcken von je 1 kB. df gab jedoch nur 72515156 Blöcke im Dateisystem an, eine Differenz von 2222 Blöcken: Das Dateisystem benötigt diesen Platz für Verwaltungsinformationen.

Da im Beispiel das Dateisystem geschrumpft ist, reichen diese 2222 Blöcke auch künftig für die Verwaltungsdaten. 2222 addiert zu den 20087956 Blöcken des neuen Dateisystems ergibt die benötigte Partitionsgröße in 1-kB-Blöcken.

Für die Partitionierung brauchen Sie die Größenangabe jedoch in Zylindern. Auskunft zur Umrechnung gibt in der Ausgabe von fdisk -l /dev/hda die Zeile

Einheiten: Zylinder mit 16065 * 512 Bytes
Ein Zylinder enthält demnach 16065 * 512 Bytes = 8225280 Bytes. Das entspricht genau 8032,5 kB (1 kB = 1024 Bytes). Teilen Sie nun die benötigte Partitionsgröße (20087956 kB + 2222 kB = 20090178 kB) durch diese Zahl, und Sie kommen auf die Anzahl der benötigten Zylinder; im Beispiel 2502: Da Sie nur ganze Zylinder verwenden können, runden Sie das Ergebnis auf (Listing 4).

Wollen Sie den Platzbedarf der Verwaltungsinformationen genauer errechnen, teilen Sie die Größe des Dateisystems durch 32000. Um Platz zu sparen, teilen Sie vorsichtig durch etwas höhere Zahlen als 32000. Die Erfahrung zeigt jedoch, dass schon ein 32768tel (1 / 215) der Dateisystemgröße zu wenig Platz für die Verwaltung bietet. Zuviel Geiz kann zu einem zerstörten Dateisystem führen!

Listing 4: Berechnung der Mindestgröße der wiederanzulegenden Partition
   Größe alt (Partition)   72517378 Blöcke
 - Größe alt (Dateisystem) 72515156 Blöcke
 -----------------------------------------
 = Verwaltungsplatz            2222 Blöcke

   Größe neu (Dateisystem) 20087956 Blöcke
 + Verwaltungsplatz            2222 Blöcke
 -----------------------------------------
 = Größe neu (Partition)   20090178 Blöcke

 8032,5 Blöcke = 1 Zylinder
    
     20090178 Blöcke 
 ---------------------- = 2501,11 Zylinder
 8032,5 Blöcke/Zylinder 

Ran an den Speck!

Beim Verkleinern der Partition, die das geschrumpfte Dateisystem enthält, beachten Sie den Hinweis aus der Manpage von resize_reiserfs (man resize_reiserfs, Kasten 2)! Wenn Ihre Partition vorher mit dem 937. Zylinder begann so soll sie auch nachher mit dem 937. beginnen; fdisk -l /dev/hda zeigt in der Spalte Anfang die Startzylinder.

Kasten 2: Aus der Manpage von resize_reiserfs

Make sure you re-create [the partition] with the same starting disk cylinder as before! Otherwise, the resize operation will certainly not work, and you may lose your entire filesystem.

(Lassen Sie die neue Partition unbedingt mit dem gleichen Zylinder beginnen wie die alte! Andernfalls wird die Operation auf keinen Fall funktionieren und Sie verlieren unter Umständen Ihr gesamtes Dateisystem.)

Mit

fdisk /dev/hda
machen Sie sich über /dev/hda her, es erscheint zunächst die Aufforderung
Befehl (m für Hilfe): 
m zeigt alle möglichen Kommandos an. Mit d für delete löschen Sie eine Partition. Nach der Eingabe fragt fdisk, auf welche Partition Sie es abgesehen haben; im Beispiel geben wir 8 für /dev/hda8 an. Dann legen Sie an derselben Stelle eine neue Partition an mit n für new. Im Beispiel erstellen wir mit l eine logische Partition, da die Partitionsnummer über 4 liegt. Der Startzylinder der neuen Partition muss nun derselbe sein wie vorher, bei uns 937. Um den Endzylinder zu errechnen, addieren Sie die oben errechnete Partitionsgröße in Zylindern zum Startzylinder, im Beispiel erhalten wir 937 + 2502 = 3439 (Listing 5).

p gibt die neue Partitionstabelle aus. Entspricht sie nicht Ihren Plänen, verlassen Sie fdisk jederzeit mit q und alle Änderungen gehen verloren. Wenn alles wie gewünscht funktioniert hat, speichern Sie die neuen Partitionierungsdaten mit w für write.

Den freigewordenen Platz verteilen Sie nach Bedarf auf neue Partitionen.

Ob /dev/hda8 dabei ein- oder ausgehängt ist spielt keine Rolle, denn der Kernel benutzt die alte Partitionstabelle weiter, solange das System die Festplatte noch verwendet. Das ist beispielsweise dann der Fall, wenn sich die Swap-Partition auf derselben Platte befindet. Um mit der neuen Partitionstabelle zu arbeiten, starten Sie ihr System neu.

Listing 5: Editieren der Partitionstabelle mit fdisk
root@linuxspider:/ # fdisk /dev/hda

Befehl (m für Hilfe): d                           # delete, löschen einer Partition
Partitionsnummer (1-8): 8                         # hda8 soll weg

Befehl (m für Hilfe): n                           # new, neue Partition erstellen
Befehl  Aktion
   l      Logische Partition (5 oder größer)
   p      Primäre Partition (1-4)
l                                                 # eine logische Partition soll es werden
Erster Zylinder (937-9964) [Standardwert: 937]:          # der Standardwert entspricht hier dem Startzylinder
                                                         # der gelöschten Partition, so genügt ein [Enter]
Benutze den Standardwert 937
Letzter Zylinder oder +Größe, +GrößeK oder +GrößeM (937-9964) [Standardwert: 9964]: 3439 
Befehl (m für Hilfe): p                           # print 

Festplatte /dev/hda: 255 Köpfe, 63 Sektoren, 9964 Zylinder
Einheiten: Zylinder mit 16065 * 512 Bytes

    Gerät boot.  Anfang      Ende    Blöcke   Id  Dateisystemtyp
...
...
/dev/hda8           937      3439  20105316   83  Linux

Befehl (m für Hilfe): w                            # write, die Partitionstabelle wird geschrieben
Die Partitionstabelle wurde verändert!                    # Das war beabsichtigt!

Calling ioctl() to re-read partition table.

WARNING: Re-reading the partition table failed with error 16: Das Gerät oder
die Ressource ist belegt.                                 # die Swap-Partition wird noch benutzt
The kernel still uses the old table.                      # der Kernel wird weiterhin die alte Tabelle benutzen
The new table will be used at the next reboot.            # und beim nächsten Reboot die Neue einlesen
Syncing disks.

Anschließend sorgt

resize_reiserfs /dev/hda8
ohne weitere Parameter dafür, dass sich das Dateisystem genau an die Größe der Partition anpasst. Dadurch führen auch Rechenfehler bei den Größenberechnungen nicht zu größeren Kapazitätsverlusten.

Abschlussarbeit

Haben Sie neue Partitionen im freigewordenen Festplattenplatz angelegt, z.B. hda9 und hda10, formatieren Sie sie mit dem gewünschten Dateisystem:

mkreiserfs /dev/hda9
für ReiserFS oder
mke2fs /dev/hda10
für ext2. Wollen Sie ext3 als Alternative zu ReiserFS verwenden, erzeugt
tune2fs -j /dev/hda10
ein Journal (-j). hda10 können Sie dann als ext3 oder ext2 mounten. Anschließend passen Sie /etc/fstab an, um das Einhängen zu automatisieren. (csc)

Infos
[1] http://www.knopper.net/knoppix/
[2] http://www.lernnetz-sh.de/kmLinux/
[3] ftp://ftp.gwdg.de/pub/linux/suse/ftp.suse.com/suse/i386/8.2/boot/rescue
[4] Patricia Jung: "Datenrettung in letzter Not", LinuxUser 07/2003

Der Autor
Nach seiner Ausbildung zum Informationselektroniker an der TU Berlin gewann Olaf Tonnätt in einem Preisausschreiben statt eines C64 den Hauptpreis: einen P2000C. Das Betriebssystem CP/M überzeugte ihn so sehr, dass er die Epoche der QDOS-basierten Systeme ausliess und über AIX zu Linux kam. Zu finden ist er über http://www.linuxspider.de/.

Dieser Online-Artikel kann Links enthalten, die auf nicht mehr vorhandene Seiten verweisen. Wir ändern solche "broken links" nur in wenigen Ausnahmefällen. Der Online-Artikel soll möglichst unverändert der gedruckten Fassung entsprechen.




Druckerfreundliche Version | Feedback zu dieser Seite | Datenschutz | © 2010 Linux New Media AG | Last modified: 2008-04-22 13:56

[Linux-Magazin] [LinuxUser] [EasyLinux] [Linux-Community] [Ubuntu User] [Linux Technical Review] [Linux Magazine] [Linux Pro Magazine] [Ubuntu User]
[EasyLinux Poland] [Linux Magazine Poland] [Linux Magazine Brasil] [EasyLinux Brasil] [Linux Magazine Spain]