Defragmentierung

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:

Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.

Artikel für fortgeschrittene Anwender

Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

  1. Installation von Programmen

  2. Ein Terminal öffnen

  3. Archive entpacken

Inhaltsverzeichnis
  1. Werkzeuge
    1. ext2 / ext 3
    2. ext4
    3. xfs
    4. reiserfs
    5. Allgemein
  2. Links

Unter Fragmentierung versteht man im Allgemeinen die Verteilung von Datenblöcken einer eigentlich zusammengehörigen Datei auf einem Speichermedium (in der Regel einer Festplatte). Dadurch bedingt muss der Lesekopf des Speichermediums sich mehr bewegen, was zu erhöhten Zugriffszeiten führen kann und bei vielen oder großen fragmentierten Dateien zu einem (merklichen) Einbruch der IO-Leistung des Speichermediums führen kann. Genau genommen bezeichnet man diese Art der Fragmentierung als externe Fragmentierung. Der externen Fragmentierung kann grundsätzlich entgegengewirkt werden.

Auch Dateisysteme unter Linux weisen Fragmentierung auf, wenn auch nicht in einem solchen Maßstab (und mit solchen Auswirkungen), wie z.B. unter Windows mit FAT32 oder NTFS als Dateisystem.

Der geringe Grad der Fragmentierung ist primär dadurch bedingt, dass Dateisysteme wie z.B. ext3 und insbesondere ext4 ausgeklügelte Schreibstrategien und Datenträgeraufteilungen verwenden, um Fragmentierung zu vermeiden. Dazu gehören u.a. das Cachen von Schreibvorgängen und das Vorbelegen von Blöcken auf dem Datenträger. Trotzdem ist Fragmentierung nicht ausgeschlossen, besonders nicht auf Systemen mit sehr vielen Schreib- und Löschvorgängen wie auf manchen Serversystemen (Mail- oder News-Server). Sehr anfällig sind auch volle Dateisysteme, da unter Umständen gar keine zusammenhängende Lücke vorhanden ist, in den eine neue Datei vollständig hineinpasst.

Allerdings sei auch gesagt, dass ein Fragment-freies Dateisystem nicht zwingend die optimale Schreib-/Lesegeschwindigkeit bringt. Oft wird eine (große) Datei nicht komplett linear eingelesen, sondern der Vorgang wird unterbrochen, weil z.B. das Betriebssystem eine andere Datei "zwischendurch" anfordert. In solchen Fällen ist es (fast) egal, ob eine Datei in mehrere Teile geteilt ist, da durch die Unterbrechung der Schreib-/Lesekopf ohnehin neu positioniert werden muss.

Hinweis:

Es sei hier nochmal darauf hingewiesen, dass besonders auf Linux-Desktop-Systemen Fragmentierung kein wirkliches Problem ist und eine Defragmentierung hier in der Regel nicht notwendig ist. Ausnahmen sind kontinuierlich wachsende Dateien wie z.B. Mail-Archive oder Downloads.

Werkzeuge

Es gibt verschiedene spezielle und allgemeine Werkzeuge für die verschiedenen Dateisysteme, um den Fragmentierungsgrad festzustellen bzw. die Partition zu defragmentieren.

Achtung!

Bei der Defragmentierung kann es grundsätzlich immer zu Datenverlust kommen, da große Mengen Daten (Dateien) verschoben werden. Daher ist vorher immer eine Sicherung der Daten vorzunehmen!

ext2 / ext 3

Für ext2/ext3-Dateisysteme gibt es zwei Programme, mit denen man prüfen kann, ob bzw. wie stark das Dateisystem fragmentiert ist. Beide sind im Paket

Paketliste zum Kopieren:

sudo apt-get install e2fsprogs 

Oder mit apturl die Pakete installieren. Link: apt://e2fsprogs

enthalten, welches üblicherweise in der Standardinstallation enthalten ist. [1]

Eine allgemeine Aussage erhält man über "e2fsck", und zwar mit folgendem Befehl:

sudo e2fsck -fn DEVICE 

wobei DEVICE durch den Pfad zum entsprechenden Gerät ersetzt werden muss.

Die Ausgabe kann dann z.B. so aussehen:

e2fsck 1.40.2 (12-Jul-2007)
Durchgang 1: Prüfe Inodes, Blocks, und Größen
Durchgang 2: Prüfe Verzeichnis Struktur
Durchgang 3: Prüfe Verzeichnis Verknüpfungen
Durchgang 4: Überprüfe die Referenzzähler
Durchgang 5: Überprüfe Gruppe Zusammenfassung
/dev/sda8: 104320/577152 files (0.5% non-contiguous), 555698/1152892 blocks

Die Ausgabe in der letzten Zeile 0,5% non-contiguous gibt einen Anhaltspunkt über die Fragmentierung. Allerdings bezieht sich der Wert auf alle Dateien der Partition, also auch "leeren" Dateien wie symbolischen Links, Gerätedateien etc., welche natürlich Aufgrund der Größe 0 nicht fragmentieren können und deshalb die Statistik verfälschen.

Genauer ist das Programm dumpe2fs, welches mit folgendem Befehl aufgerufen wird [2]:

sudo dumpe2fs DEVICE 

Anschließend erhält man eine - je nach Größe der Partition - ziemlich lange und unübersichtliche Ausgabe, aus der man indirekt ablesen kann, ob die Platte fragmentiert ist.

Ein Teil der Ausgabe kann z.B. so aussehen:

...
Gruppe 2: (Blöcke 65536-98303)
  Block bitmap in 65536 (+0), Inode Bitmap in 65537 (+1)
  Inode-Tabelle in 65538-66038 (+2)
  32205 freie Blöcke, 16023 freie Inodes, 0 Verzeichnisse
  Freie Blöcke: 66039-67583, 67629-69631, 69647-98303
  Freie Inodes: 32074-48096
...

Die Fragmentierung kann man aus der Zeile Freie Blöcke ableiten. Im Idealfall steht hier nur ein Bereich, dann ist diese Gruppe komplett unfragmentiert. Im obigen Beispiel sieht man drei freie Bereiche, d.h. diese Gruppe ist (leicht) fragmentiert. Je mehr freie Gruppen, desto stärker ist die Fragmentierung bzw. die Gefahr, das zukünftig gespeicherte Dateien fragmentiert werden.

Interessiert man sich "nur" dafür, wie stark eine einzelne Dateien fragmentiert ist, so kann man dies mit Hilfe des Programms filefrag. Der Aufruf sieht so aus [2]:

filefrag /bin/* 

Die Ausgabe kann dann z.B. so aussehen:

filefrag  /bin/*|head 

/bin/bash: 57 extents found, perfection would be 1 extent
/bin/bunzip2: 4 extents found, perfection would be 1 extent
/bin/busybox: 18 extents found, perfection would be 1 extent
/bin/bzcat: 4 extents found, perfection would be 1 extent
/bin/bzcmp: 1 extent found
/bin/bzdiff: 1 extent found
/bin/bzegrep: 1 extent found

was bedeutet, dass die Datei, hier /bin/bzcmp, zusammenhängend auf dem Speichermedium liegt. Ist die Zahl 2 oder größer, so ist die Datei entsprechend stark fragmentiert. Der Wert gibt allerdings nicht an, ob und wie die Dateifragmente auf der Festplatte verteilt sind. Grundsätzlich kann es nämlich sein, dass die Fragmente quasi hintereinander liegen, aber nur durch ein paar leere Blöcke getrennt sind. In diesem Fall hätte die Fragmentierung einen sehr geringen Einfluss, da beim Lesen der Datei "nur" die leeren Blöcke übersprungen werden müssten. Anderseits könnte es (theoretisch) sein, dass ein Fragment am Anfang der Festplatte liegt und ein Fragment am Ende der Platte, was natürlich beim Lesen der Datei nachteilig ist.

Die genaue Fragmentierung einer einzelnen Datei zeigt der Parameter -v, z.B.

filefrag -v  /bin/bzcat 
Filesystem type is: ef53
Filesystem cylinder groups is approximately 38
File size of /bin/bzcat is 30200 (8 blocks, blocksize 4096)
 ext logical physical expected length flags
   0       0  1218575               1 merged
   1       1  1218579  1218575      1 merged
   2       2  1218581  1218579      1 merged
   3       3  1218667  1218581      5 merged,eof
/bin/bzcat: 4 extents found, perfection would be 1 extent

Für ext2/ext3 gab es in der Vergangenheit ein Programm zur Defragmentierung (e2defrag), welches aber schon lange nicht mehr weiterentwickelt wird und auch auf den aktuellen Versionen von ext2/ext3 nicht mehr funktioniert. Daher muss man hier, wenn überhaupt, zu den allgemeinen Werkzeugen greifen.

ext4

ext4 hat bessere Mechanismen als ext2 und ext3, um das Entstehen von Fragmentierten Dateien zu verhindern. Ein Upgrade ist relativ leicht möglich, siehe Upgrade auf ext4. In ext4 soll auch eine Schnittstelle zur Online-Defragmentierung integriert werden. Diese wird auch die Möglichkeit bieten die zum Systemstart nötigen Dateien in eine fortlaufende Reihenfolge zu sortieren, um den Bootvorgang zu beschleunigen.

Achtung!

Von einem Einsatz bei Solid State Disks und bei mit NTFS (Windows) formatierten Datenträgern wird abgeraten. Eine vorhandene Datensicherung minimiert das Risiko eines möglichen Datenverlustes.

Im Paket e2fsprogs gibt es noch ein Programm - e4defrag, das fragmentierte Dateien und ext4-Dateisysteme online (im laufenden Betrieb) analysieren und defragmentieren kann. Das Programm kann mit folgendem Befehl aufgerufen werden:

e4defrag [ -c ] [ -v ] TARGET ...

wobei TARGET eine reguläre Datei, ein Verzeichnis oder ein Gerät (Device), das als ein ext4-Filesystem eingebunden ist, sein kann.

Eine Notwendigkeit einer Defragmentierung kann man z.B. für ein ext4-Dateisystem so ermitteln:

sudo e4defrag -c /dev/sda3 
<Fragmented files>                             now/best       size/ext
1. /home/BENUTZER/.Skype/myname/callmember256.dbb
                                                17/1              4 KB
2. /home/BENUTZER/.Skype/myname/chat512.dbb
                                                14/1              4 KB
3. /var/log/mail.log                            12/1              4 KB
4. /var/log/preload.log                         12/1              4 KB
5. /home/BENUTZER/.Skype/myname/chatmsg2048.dbb
                                                12/1              4 KB

 Total/best extents                355174/351882
 Average size per extent            119 KB
 Fragmentation score                0
 [0-30 no problem: 31-55 a little bit fragmented: 56- needs defrag]
 This device (/dev/sda3) does not need defragmentation.
 Done.

Details enthält auch die Manpage e4defrag

xfs

Den Grad der Fragmentierung kann xfs_db mit dem Kommando "frag" anzeigen, z.B.:

xfs_db -c frag -r /dev/DEV 

Für xfs gibt es das Programm xfs_fsr (fsr steht für file system reorganize) und ist ein Werkzeug, welches das Dateisystem automatisch neu organisiert (=defragmentiert). Das Programm befindet sich im Paket

Paketliste zum Kopieren:

sudo apt-get install xfsprogs 

Oder mit apturl die Pakete installieren. Link: apt://xfsprogs

Eine Übersicht über die Funktionen findet man in den Manpages zu xfs_fsr.

reiserfs

Für reiserfs gibt es keine bekannten Programme zur Defragmentierung. Die allgemeinen Werkzeuge funktionieren aber auch unter reiserfs.

Allgemein

Die "allgemeinen" Werkzeuge arbeiten unabhängig vom Dateisystem, d.h. sie funktionieren prinzipiell auf allen von Linux unterstützen Dateisystemen. Das Grundprinzip aller Werkzeuge ist gleich bzw. ähnlich: die Dateien und Verzeichnisse werden gelesen, temporär gespeichert, im Original gelöscht und dann zurückgeschrieben. Beim Zurückschreiben sortiert und organisiert das Dateisystem die Dateien und Verzeichnisse dann in der optimalen Reihenfolge.

defrag

defrag 🇬🇧 ist ein einfaches Shellskript von Con Kolivas, welches einfach in einem Verzeichnis aufgerufen wird, anschließend alle Dateien (rekursiv) einliest, sortiert und von groß nach klein zurückschreibt. Weitere Hinweise zur Arbeitsweise findet man in den Kommentarzeilen des Skripts.

Hinweis:

defrag funktioniert ggf. erst richtig, nachdem das Dateisystem von ext3 auf ext4 umgestellt wurde (siehe Upgrade auf ext4).

shake

ShAkE 🇬🇧 ist ein Programm, welches Dateien ebenfalls durch Lesen und Neuschreiben defragmentiert. Eine Anleitung findet man auf der Homepage. Dort kann man das Programm herunterladen und es gibt auch eine Fremdquelle für Ubuntu: PPA 🇬🇧.

Hinweis!

Zusätzliche Fremdquellen können das System gefährden.

Kopieren und Zurückkopieren

Die einfachste Möglichkeit ist, alle Dateien einer Partition auf eine andere zu kopieren, alle Dateien auf der Original-Partition zu löschen (Formatieren ist nicht notwendig) und dann die Daten auf die geleerte Partition zurückzuschreiben.

tar

Hat man keine ausreichend große freie weitere Partition, so kann man den gesamten Inhalt einer Partition statt zu kopieren mit Hilfe von tar in ein Archiv packen, dieses auf einen externen Datenträger sichern, auf der Original-Partition alle Dateien löschen (Formatieren ist nicht notwendig) und dann das tar-Archiv auf die geleerte Partition zurückschreiben [3].