Dieser Artikel ist größtenteils für alle Ubuntu-Versionen gültig.
Dieser Artikel erfordert mehr Erfahrung im Umgang mit Linux und ist daher nur für fortgeschrittene Benutzer gedacht.
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.
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.
Es gibt verschiedene spezielle und allgemeine Werkzeuge für die verschiedenen Dateisysteme, um den Fragmentierungsgrad festzustellen bzw. die Partition zu defragmentieren.
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!
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
e2fsprogs
mit apturl
Paketliste zum Kopieren:
sudo apt-get install e2fsprogs
sudo aptitude install 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 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.
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.
Ab Ubuntu 12.04 gibt es im Paket e2fsprogs 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
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
xfsdump
mit apturl
Paketliste zum Kopieren:
sudo apt-get install xfsdump
sudo aptitude install xfsdump
Eine Übersicht über die Funktionen findet man in den Manpages zu xfs_fsr.
Für reiserfs gibt es keine bekannten Programme zur Defragmentierung. Die allgemeinen Werkzeuge funktionieren aber auch unter reiserfs.
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 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.
defrag
funktioniert ggf. erst richtig, nachdem das Dateisystem von ext3 auf ext4 umgestellt wurde (siehe Upgrade auf ext4).
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 .
Zusätzliche Fremdquellen können das System gefährden.
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.
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].
http://www.kdedevelopers.org/node/2270 KDE Developers Eintrag zum Thema Fragmentierung
Weitere Hilfsprogramme für ext2/3 aus der c't 5/08
Fragmente und Verzeichnisse - Das Linux-Dateisystem Ext3 tunen von Dr. Oliver Diedrich
Why doesn't Linux need defragmenting - verständliche und größtenteils nicht-technische Erklärung, warum ext2/ext3 wenig fragmentieren (deren Ergebnis aber nicht stimmt, weil Defragmentieren trotzdem auftreten kann)
Disk Allocation Viewer - Visualisierung der Fragmentierung von ext2/3
Diese Revision wurde am 14. Oktober 2014 12:31 von aasche erstellt.