Ein Dateisystem ist Bestandteil des Betriebssystems eines Computers. Es speichert und verwaltet Daten in Form von Dateien. Historisch wurden Dateisysteme zur Organisation des Zugriffs auf Massenspeicher wie Festplattenlaufwerke entwickelt. Jede Datei belegt einen Teil des Massenspeichers. Ein Dateisystem bietet die Möglichkeit, per Namen auf eine Datei zu zugreifen. Das Konzept der Dateisysteme wurde dann soweit abstrahiert, dass auch Zugriffe auf Dateien im Netz und auf Geräten, die virtuell als Datei verwaltet werden, über Dateisysteme geregelt werden können.
Dateien haben in einem Dateisystem fast immer mindestens einen Dateinamen sowie Attribute, die nähere Informationen über die Datei geben. Die Dateinamen sind in speziellen Dateien, den Verzeichnissen, abgelegt. Über diese Verzeichnisse kann ein Dateiname und damit eine Datei vom System gefunden werden. Ein Dateisystem bildet somit einen Namensraum. Alle Dateien (oder dateiähnlichen Objekte) sind so über eine eindeutige Adresse (Dateiname inkl. Pfad oder URL) – innerhalb des Dateisystems – aufrufbar.
Für unterschiedliche Datenträger (wie Magnetband, Festplatte, optische Datenträger (CD, DVD, …), Flashspeicher, …) gibt es spezielle Dateisysteme, die deren Besonderheiten berücksichtigen.
Zugriffe auf Massenspeicher
Massenspeichergeräte wie Festplatten-, CD-ROM- und Diskettenlaufwerke haben normalerweise eine Blockstruktur, d.h. aus Betriebssystemsicht lassen sich Daten nur als ganze Blöcke lesen oder schreiben. Die Hardware der Speichergeräte präsentiert sich gegenüber dem Betriebssystem lediglich als große Fläche mit vielen nummerierten Blöcken.
Blockstruktur eines Massenspeichergeräts (jeder Block besteht beispielsweise aus 512 Bytes):
Block0 | Block1 | Block2 | Block3 | … |
Ein Block umfasst meistens 512 (29) Bytes. Moderne Betriebssysteme fassen aus Performance- und Verwaltungs-Gründen mehrere Blöcke zu einem Cluster fester Größe zusammen. Heute sind Cluster mit acht oder noch mehr Blöcken üblich, also 4096 Bytes pro Cluster. Die Clustergröße ist im allgemeinen eine Zweierpotenz (2048, 4096 usw.)
Ein Programm greift auf die Massenspeicher über das Dateisystem zu. Unter UNIX und ähnlichen Betriebssystemen werden dazu Systemaufrufe zur Verfügung gestellt. Die wichtigsten Systemaufrufe sind hier:
Verwaltung:
- mkdir – Erzeugen eines Verzeichnisses
- chdir - Wechseln in ein anderes Verzeichnis
- rmdir - Löschen eines Verzeichnisses
- opendir – Öffnen eines Verzeichnisses
- readdir – Lesen von Verzeichniseinträgen
- closedir – Schließen
- open, close – Öffnen und Schließen einer Datei
- read, write – Lesen und Schreiben
- creat, unlink – Erzeugen und Löschen einer Datei
- seek – Neupositionieren des Schreib/Lese-Zeigers
Außerdem bietet das Betriebssystem Verwaltungsfunktionen, z. B. für das Erzeugen eines Dateisystems auf einem neuen Datenträger, für Konsistenzprüfung, Komprimierung oder Sicherung (je nach Betriebssystem und Dateisystem verschieden).
Eine Datei ist eine Speicherfläche beliebiger Größe, die auf dem Gerät aus einem oder mehreren Clustern besteht. Jede Datei erhält außerdem eine Beschreibungsstruktur, die die tatsächliche Größe, Referenzen auf die verwendeten Cluster und evtl. weitere Informationen wie Dateityp, Eigentümer, Zugriffsrechte enthalten kann.
Verzeichnisse enthalten Dateinamen und Referenzen zu den jeweiligen Beschreibungsstrukturen. Da Verzeichnisse auch Speicherflächen sind, werden meist speziell gekennzeichnete Dateien als Verzeichnisse verwendet. Die erste Beschreibungsstruktur kann dabei das Ausgangsverzeichnis enthalten. Oft ist der erste Block für einen sogenannter Bootblock reserviert, der für das Hochfahren des Systems verwendet werden kann. Er ist nicht Teil des eigentlichen Dateisystems.
Ein Beispiel für die Aufteilung eines Massenspeichers für ein simples Dateisystem:
Boot | Beschreibungsstrukturen | Liste freier Cluster | Cluster mit Dateien und Verzeichnissen |
Die Umsetzung der Systemaufrufe eines Programms werden oft vom Kernel eines Betriebssystems implementiert und unterscheiden sich bei den verschiedenen Dateisystemen. Der Kernel übersetzt die Zugriffe dann in die Blockoperationen des jeweiligen Massenspeichers. (Anmerkung: Tatsächlich trifft dies nur auf sogenannte monolithische Kernel zu. Moderne Betriebssysteme hingegen sind auf einem Mikrokernel aufgebaut, so dass die Dateisystemoperationen nicht vom Kernel selbst ausgeführt werden.)
Wenn ein Programm eine Datei mittels open öffnet, wird der Dateiname im Verzeichnis gesucht. Die Blöcke auf dem Massenspeicher ermittelt das Betriebssystem aus den entsprechenden Beschreibungsstrukturen. Falls eine Datei im Verzeichnis gefunden wird, erhält man auch ihre Beschreibungsstruktur und damit Referenzen zu den Clustern und über diese zu Blöcken.
Mit read kann das Programm dann auf die Cluster der Datei (und damit auf Blöcke auf dem Massenspeicher) zugreifen. Falls mit write die Datei vergrößert wird, wird bei Bedarf ein neuer Cluster aus der Freiliste entnommen und in der Beschreibungsstruktur der Datei hinzugefügt. Auch die anderen Systemaufrufe lassen sich so in Cluster- bzw. Blockzugriffe übersetzen.
Für die Zuordnung von Clustern zu Dateien gibt es dabei mehrere Möglichkeiten.
- Die Referenz einer Datei besteht aus der Clusternummer des Anfangsclusters und der Anzahl der darauf (physikalisch sequenziell) folgenden Cluster. Nachteile: bei Vergrößerung muss ggf. die ganze Datei verschoben werden. Dies verkompliziert das eigentliche Dateihandling und führt zu unzureichender Performance bei vielen großen Dateien. So kann es vorkommen, dass eine Datei nicht gespeichert werden kann, obwohl noch genügend freier Speicher auf dem Datenträger vorhanden ist.
- Die Referenz einer Datei besteht aus der ersten Clusternummer. In jedem Cluster der Datei wird die Clusternummer des Folgeclusters gespeichert. Es ergibt sich eine verlinkte Liste. Nachteile: Will man die Datei nicht sequenziell lesen, sondern z. B. nur das Ende, muss das Betriebssystem dennoch die ganze Datei einlesen, um das Ende zu finden.
- Freie Zuordnung von Dateiclustern zu Folgeclustern durch einer Tabelle auf dem Massenspeicher (Bsp.: FAT). Nachteile: sehr große Beschreibungsstruktur, sequenzielles Lesen oder Schreiben etwas langsamer als ideal, da Zuordnungsinformationen weder gebündelt noch bei den Daten vorliegen.
- Speicherung eines Feldes von Tupeln (Extent-Anfangscluster, Extentlänge) in der Beschreibungsstruktur der Datei. Ein Extent ist dabei eine Folge von sequentiellen Clustern. Heute in vielen Dateisystemen so umgesetzt.
Arten von Dateisystemen
Hierarchische Dateisysteme
Frühe Dateisysteme hatten nur ein einzelnes Verzeichnis, das dann Verweise auf alle Dateien des Massenspeichers enthielt. In den meisten modernen Dateisystemen ist dieses Verzeichnis das Wurzelverzeichnis. Hier können Verzeichnisse neben normalen Dateien auch Verweise auf weitere Verzeichnisse, die Unterverzeichnisse, enthalten. Auch diese dürfen wieder Unterverzeichnisse haben.
Dadurch entsteht eine Verzeichnisstruktur, die oft als Verzeichnisbaum dargestellt wird. Das Festplattenlaufwerk C: unter Windows beinhaltet beispielsweise neben Dateien wie boot.ini und ntldr auch Verzeichnisse wie Programme, Dokumente und Einstellungen usw. Ein Verzeichnis wie z. B. Eigene Dateien kann dann wieder Unterverzeichnisse wie Eigene Bilder oder Texte enthalten. In Texte können dann beispielsweise die normalen Dateien Brief1.txt und Brief2.txt stehen.
Windows 2000/XP: Mac OS X: Unix / Linux: [Laufwerk C:] [Wurzelverzeichnis] [Wurzelverzeichnis] +- boot.ini +- [Libary] +- [boot] +- ntldr +- [System] +- [etc] +- [Dokumente und Einstellungen] +- [Users] +- [home] | +- [benutzername] | +- [benutzername] | +- [benutzername] | +- [Eigene Dateien] | +- [Bilder] | +- [Bilder] | +- [Eigene Bilder] | | +- Bild1.png | | +- Bild1.png | | +- Bild1.png | | | | | | | +- [Texte] | +- [Texte] | +- [Texte] | +- Brief1.txt | +- Brief1.txt | +- Brief1.txt | +- Brief2.txt | +- Brief2.txt | +- Brief2.txt | | | +- [Applications] +- [usr] +- [Programme] Verzeichnisse sind mit [eckigen Klammern] gekennzeichnet.
Die Verzeichnisse werden auch Ordner genannt und sind, je nach Betriebssystem, durch Backslash \ (DOS, Windows, TOS), Slash / (Unix, Linux, Mac OS X, AmigaOS) oder Doppelpunkt : (ältere Mac OS Versionen) getrennt. Da sich eine Hierarchie von Verzeichnissen und Dateien ergibt, spricht man hier von hierarchischen Dateisystemen. Den Weg durch das Dateisystem, angegeben durch Verzeichnisnamen, die mit den Trennzeichen voneinander getrennt werden, nennt man Pfad. Auf die Datei Brief1.txt kann man als
C:\Dokumente und Einstellungen\benutzername\Eigene Dateien\Texte\Brief1.txt (Windows 2000/XP) /Users/benutzername/Texte/Brief1.txt (Mac OS X) /home/benutzername/Texte/Brief1.txt (Unix / Linux)
zugreifen. Bei DOS/Windows gibt es Laufwerksbuchstaben gefolgt von einem Doppelpunkt, die den Pfaden innerhalb des Dateisystems vorangestellt werden. Jeder Datenträger bekommt seinen eigenen Buchstaben, z. B. meist C: für die erste Partition der ersten Festplatte. Bei Unix gibt es keine Laufwerksbuchstaben, sondern nur einen einzigen Verzeichnisbaum. Die einzelnen Datenträger werden dort an bestimmten Stellen im Baum eingehängt (Kommando mount), so dass alle Datenträger zusammen den Gesamtbaum ergeben. Windows-Varianten, die auf Windows NT basieren, arbeiten intern ebenfalls mit einem solchen Baum, dieser Baum wird aber gegenüber dem Anwender verborgen.
Häufig bezeichnet der Begriff Dateisystem nicht nur die Struktur und die Art, wie die Daten auf einem Datenträger organisiert werden, sondern allgemein den ganzen Baum mit mehreren verschiedenen Dateisystemen (Festplatte, CD-ROM, …). Korrekterweise müsste man hier von einem Namensraum sprechen, der von verschiedenen Teilnamensräumen (die eingebundenen Datenträgern mit deren Dateisystemen) gebildet wird, da aber dieser Namensraum sehr dateibezogen ist, wird häufig nur vom Dateisystem gesprochen.
Netzwerkdateisysteme
Die Systemaufrufe wie open, read, usw. können auch über ein Netzwerk an einen Server übertragen werden. Dieser führt dann die Zugriffe auf seine Massenspeicher durch und liefert die angeforderte Information an den Client zurück.
Da dieselben Systemaufrufe verwendet werden, unterscheiden sich die Zugriffe aus Programm- und Anwendersicht nicht von der auf die lokalen Geräte. Man spricht hier von transparenten Zugriffen, weil der Anwender die Umlenkung auf den anderen Rechner nicht sieht, sondern scheinbar unmittelbar auf die Platte des entfernten Rechners schaut – wie durch eine transparente Glasscheibe. Für Netzwerkdateisysteme stehen spezielle Netzwerkprotokolle zur Verfügung.
Spezielle virtuelle Dateisysteme
Das open-read-Modell lässt sich auch auf Geräte und Objekte anwenden, die normalerweise nicht über Dateisysteme angesprochen werden. Dadurch wird der Zugriff auf diese Objekte identisch mit dem Zugriff auf normale Dateien, was meist Vorteile bringt.
Unter den derzeitigen Linux-Kernels (u. a. Version 2.6) lassen sich System- und Prozessinformation über das virtuelle proc-Dateisystem abfragen und ändern. Die virtuelle Datei /proc/cpuinfo liefert z.B. Informationen über den Prozessor.
Solche Pseudo-Dateisysteme wie proc gibt es unter Linux einige: Dazu zählen sysfs, usbdevfs oder devpts; unter einigen BSDs gibt es ein kernfs. Nicht zuletzt devfs bzw. udev für Gerätedateien (siehe unten). All diese Dateisysteme enthalten nur rein virtuell vorhandene Dateien mit Informationen oder Geräten, die auf eine "Datei" abgebildet werden.
Der Kernel gaukelt hier quasi die Existenz einer Datei vor, wie sie auch auf einem Massenspeicher vorhanden sein könnte.
Dateien in ramfs oder tmpfs, aber auch initrd und ähnlichen Dateisystemen existieren jedoch tatsächlich, werden aber nur im Speicher gehalten. Sie werden aus Geschwindigkeitsgründen und aus logisch-technischen Gründen während der Boot-Phase eingesetzt.
Besonderheiten
Einige moderne Dateisysteme (wie HPFS/NTFS oder HFS) haben das Prinzip der Datei generalisiert, indem man in einer Datei nicht nur eine Folge von Bytes (Stream), sondern mehrere solcher Folgen (Alternate Data Streams) abspeichern kann. Prinzipiell ist das eine sehr gute Idee, denn man kann Teile einer Datei bearbeiten, ohne eventuell vorhandene andere Teile (die sehr groß sein können) verschieben zu müssen.
Problematisch ist nur die sehr schlechte Unterstützung von multiplen Streams. Das äußert sich zum einen darin, dass alternative Daten beim Wechsel auf andere Dateisysteme (ISO 9660, FAT, ext2) ohne Warnung verloren gehen, zum anderen darin, dass kaum ein Werkzeug diese unterstützt, so dass man die dort gespeicherten Daten nicht sehen kann oder Virenscanner dort abgespeicherte Viren übersehen.
Beispiel (funktioniert nur auf NTFS-Partitionen):
C:\>echo Die Kuh lief um den Teich. > Test.txt:Demo C:\>dir Test.txt Directory of C:\ 2005-10-26 14:19 0 Test.txt 1 File(s) 0 bytes 0 Dir(s) 771,020,218,368 bytes free C:\>more < Test.txt:Demo Die Kuh lief um den Teich. C:\>_
In diesem Beispiel wurde eine leere Datei erzeugt, deren Hauptdatenstrom leer ist. Das gleiche ist mit Dateien möglich, die schon existieren:
C:\>dir HDTVdemo.mpg Directory of C:\ 2005-10-21 17:56 6,767,899,414 HDTVdemo.mpg 1 File(s) 6,767,899,414 bytes 0 Dir(s) 771,020,214,272 bytes free C:\>echo Das ist ein HDTV Demo mit vom 21. Oktober 2005 > HDTVdemo.mpg:Quelle C:\>dir HDTVdemo.mpg Directory of C:\ 2005-10-21 17:56 6,767,899,414 HDTVdemo.mpg 1 File(s) 6,767,899,414 bytes 0 Dir(s) 771,020,210,176 bytes free C:\>more < HDTVdemo.mpg:Quelle Das ist ein HDTV Demo mit vom 21. Oktober 2005 C:\>_
Gegenüber gängigen Methoden wie Tags wird der Hauptdatenstrom nicht berührt, was etliche Vorteile betreffs Geschwindigkeit, Platzbedarf und Datensicherheit hat.
Unter Inode-basierten Dateisystemen sind Sparse-Dateien, Hardlinks und symbolische Links möglich. Auch technisch anders aufgebaute Dateisysteme kennen neuerdings zum Teil diese Eigenschaften.
Dateisysteme aus dem Unix-Bereich kennen besondere Gerätedateien. Deren Namen sind dabei oft per Übereinkommen festgelegt, sie können nach Belieben umbenannt werden; so haben z.B. auch die Tastatur, Maus und andere Schnittstellen spezielle Dateinamen, auf die mit open, read, write zugegriffen werden kann, sogar der Hauptspeicher hat einen Dateinamen (/dev/mem). (Die Unix-Philosophie dazu lautet: „Alles ist eine Datei, und wenn nicht, sollte es eine Datei sein.“)
In anderen Dateisystemen (wie unter MS-DOS die FAT-basierten Systeme, aber auch unter NTFS) gibt es fest einprogrammierte "magische" Dateinamen mit besonderen Bedeutungen, die dem System der Gerätedateien ähnlich sind. Diese besonderen Dateinamen waren in der Vergangenheit öfters Anlass von Sicherheitsproblemen, da die entsprechenden Namen zum Teil einigen Applikationen nicht bekannt waren und daher nicht herausgefiltert wurden, aber auch zum Teil weil der Zugriffsschutz auf die damit assoziierten Geräte unzureichend geregelt war.
Datenbank-Dateisysteme
Neue Konzepte für Dateiverwaltung sind Datenbank-basierende Dateisysteme. Statt in einer hierarchisch aufgebauten Verwaltung, werden Dateien anhand ihrer Eigenschaften, wie Dateityp, Thema, Autor oder ähnlichen Meta-Informationen identifiziert. Die Formulierung einer Dateisuche kann daher in SQL oder in natürlicher Sprache erfolgen.
Ansätze dafür sind GNOME Storage und WinFS.
Eine solche Form der Speicherung anhand von Meta-Informationen ist immer von der Kooperation der Nutzer abhängig, die das System mit geeigneten Meta-Informationen versorgen. Verschiedene Firmen haben bereits ähnliche Vorhaben auf anderer Ebene verkündet, so z.B. Google.
Ein bereits existierendes Datenbank-Dateisystem ist die Virtual File System (VFS) Technik der windream GmbH. Dieses System speichert die Informationen in einer Datenbank und stellt die Daten über ein virtuelles Laufwerk (neuer Laufwerksbuchstabe in Windows) zur Verfügung. Über eine erweiterte Suche kann nach allen verwendeten Attributen gesucht werden. Über eine Volltext-Komponente kann der Dokumenten-Volltext in der Datenbank (statt wie bei Windows üblich im Dokument) gesucht werden (bei wesentlich besseren Antwortzeiten). Die Versorgung mit den erweiterten Attributen ist konfigurierbar und erfolgt entweder automatisch (Extraktion aus dem Dokument) oder über eine eigene Anwendung. Das windream VFS ist patentgeschützt.
Beispiele für Dateisysteme
Viele frühe Betriebssysteme (z. B. CP/M, Apple DOS, Commodore DOS) hatten jeweils nur ein Dateisystem, welches keinen eigenen Namen trug. Diese kann man im Bedarfsfall einfach als CP/M-Dateisystem etc. bezeichnen.
Modernere Betriebssysteme:
- minix (vom gleichnamigen Betriebssystem)
- ext2 (second extended file system, lange Zeit das Linux-Standard-Dateisystem)
- ext3 (weiterentwickelte Variante von ext2 mit journaling)
- FFS Vorgänger von UFS unter BSD
- ReiserFS (Linux Journaling File System von Hans Reiser)
- JFS (Journaled File System von IBM)
- UFS (UNIX File System, verwendet unter Solaris und BSD)
- XFS (ein weiteres journaling Dateisystem von SGI)
- xFS Netzwerk-Dateisystem
- NFS Network File System (von Sun für Solaris entwickelt)
- SYSV (das klassische Dateisystem des System V-Unix von AT&T)
- ADFS (Acorn StrongARM)
- GNOME Storage (Datenbank-basierendes Dateisystem)
- ZFS 128-Bit-Dateisystem ab Solaris 10
- NILFS (Ein recht neues Dateisystem vom NTT mit journaling}
DOS:
- FAT bzw. FAT12 (File Allocation Table, für Disketten)
- FAT16 (Erweitertes FAT-System für Festplatten)
- FAT32 (Erweitertes FAT für große Festplatten)
MS-Windows (ab Windows 2000) unterstützt sämtliche MS-DOS-Dateisysteme, zusätzlich:
- VFAT (Virtual FAT, unterstützt längere Dateinamen, für alle FAT-Systeme – Unterstützung ab Windows 95)
- NTFS (Journaling-Dateisystem – Unterstützung ab Windows NT)
- WinFS (für die Zukunft angekündigtes Datenbank-basierendes Dateisystem – Unterstützung evtl. ab Windows Vista)
- VFS (virtuelles Dateisystem mit Dokumentenmanagement-Funktionalität der windream GmbH)
- Apple DOS (erstes Apple Dateisystem)
- Apple SOS
- Apple ProDOS (Dateisystem der späten Apple II-Modelle)
- MFS (Macintosh File System)
- HFS (Hierarchical File System)
- HFS+ (Erweiterung von HFS u. a. auf Dateinamen mit mehr als 32 Zeichen, mit journaling)
- HFSX Case-sensitive Variante von HFS+ Technote dazu
OS/2:
- ISO9660 (CDFS – Dateisystem für CD-ROMs, nach dem Motto „kleinster gemeinsamer Nenner“)
- Joliet (Erweiterung des ISO9660 von der Firma Microsoft)
- Rockridge (Erweiterung des ISO9660 für UNIX)
- UDF (Universal Disk Format, u. a. auf DVDs aller Typen gebräuchlich)
Netzwerk:
- NFS (Network File System; ein über Netzwerke angeschlossenes Dateisystem v. a. für Unix-artige Systeme)
- Coda (ein fortgeschrittenes Netzwerk-Dateisystem ähnlich zu NFS)
- SMB/CIFS (ein über Netzwerke angeschlossenes Dateisystem vor allem für Windows-Systeme)
- xFS (ein verteiltes und dezentrales Netzwerk-Dateisystem)
- AFS (Andrew File System)
- NCP (NetWare Core Protocol)
- DFS (distributed file system der Open Group, eine Weiterentwicklung des Andrew File System; dieselbe Abkürzung bezeichnet das gleichnamige System von Microsoft)
Bei einigen der oben genannten Dateisysteme handelt es sich um Journaling-Dateisysteme. Alle Dateisysteme haben gemeinsam, dass auf sie auch von Fremdsystemen zugegriffen werden kann, sofern das Betriebssystem dies direkt unterstützt oder es dem Betriebssystem über entsprechende Treibersoftware ermöglicht wird. Ausnahmen bilden Dateisysteme, die eine erweiterte Berechtigung unterstützen, die Möglichkeit der Verschlüsselung bieten, oder deren genaue Funktionsweise ein Betriebsgeheimnis ist (zum Beispiel NTFS).