# Dateisysteme ## Warum Dateisysteme - Neben Verwaltung des Hauptspeichers und Cache - Verwaltung des Massenspeichers (bspw. SSD, Festplatte) - Organisation der Ablage von Dateien - Dateisysteme verwalten die Namen und Attribute (Metadaten) der Dateien - Bilden einen Namensraum - Hierarchie von Verzeichnissen und Dateien ## Dateien - Datei dient der Abstraktion - Bietet Möglichkeit Informationen auf einer Platte zu speichern/lesen - Nutzer müssen Details der Speicherung verborgen bleiben - _Wo_ und _Wie_ - Wichtigstes Merkmal ist Art und Weise wie verwaltete Objekte benannt werden - Wenn Prozess Datei erzeugt, vergibt er ihr einen Namen - Bei einigen Systemen (bspw UNIX) - Dateiendungen lediglich Konventionen, die vom Betriebssystem nicht erzwungen - Datei _file.txt_ kann Textdatei sein, Name dient mehr dazu den User zu erinnern - Andererseits könnte ein C-Compiler darauf bestehen, dass Eingabedateien Endung ".c" haben - Für BS ist das egal - Dateien können in verschiedenster Art und Weise strukturiert sein - **Bytefolge** - **Datensätze** - **Baumstrukturen** - In den meisten Fällen werden Dateien als Bytefolgen angesehen - Maximum an Flexibilität - Interpretation der Inhalte erfolgt auf Anwendungsebene ## Sequenzieller Dateizugriff - Prozess kann alle Bytes oder Datensätze einer Datei nacheinander lesen - Überspringen oder Zugriffe außerhalb der Reihenfolge nicht möglich - Sequenzielle Dateien konnten zurückgespult werden - können so oft wie nötig gelesen werden ## Wahlfreier Dateizugriff - Mit Einführung der Platte als Speichermedium - Möglichkeit die Bytes oder Datensätze in beliebiger Reihenfolge auslesen - über Schlüssel statt Positionsangabe zugreifen - Dateien, bei denen das geht = Dateien mit _wahlfreiem Zugriff_ (random access file) - sind heute Voraussetzung für viele Anwendungen - bspw. für Datenbanksysteme ## Dateiattribute - Eigenschaften / Metadaten - Können von BS / Dateisystem verwaltet werden - enthalten Größe, Erstellungsdatum, Zugriffsrechte ... ## Dateioperationen ### Create - Datei wird ohne Datum erzeugt - Entstehung der Datei ankündigen und eigene Attribute festlegen ### Delete - Wird eine Datei nicht länger benötigt, muss sie gelöscht werden ### Open - Bevor eine Datei benutzt werden kann, muss ein Prozess sie öffnen - Open ermöglicht Laden in Arbeitsspeicher ### Close - Freigeben des internen Tabellenspeichers ### Read - Daten werden aus Datei gelesen - Bytes von der aktuellen Position - Aufrufer muss angeben wie viele Daten benötigt werden - Puffer für Daten zur Verfügung stellen ### Write - Wenn aktuelle Position an Ende der Datei - Dateigröße erhöht sich - Befindet sich Position in der Mitte der Datei - vorhandene Daten werden überschrieben ### Append - Eingeschränkte Form von [Write](#write) ### Seek - Bei Dateien mit wahlfreiem Zugriff - Von wo Daten holen? - Seek positioniert Dateizeiger an einer bestimmten Stelle in der Datei - Danach lesen/schreiben an Position ### Rename - Name der Datei ändern - nicht zwingend notwendig - normalerweise in eine neue Datei mit anderem Namen umkopieren - alte löschen ### Get attributes ### Set attributes ## Verzeichnisse - Verzeichnissystem mit nur einer Ebene ist angemessen für sehr einfache Anwendungen - ![image_338.png](image_338.png) - **absolute Pfadnamen** - Gesamter Pfad von Wurzel bis Datei - **relative Pfadnamen** - In Verbindung mit dem Konzept des Arbeitsverzeichnisses - ./ - aktuelles Verzeichnis - ../ - übergeordnetes Verzeichnis - ![image_339.png](image_339.png) ## Verzeichnisoperationen ### Create (Verzeichnis) ### Delete (Verzeichnis) - Es kann immer nur ein leeres Verzeichnis gelöscht werden - (., .. dürfen enthalten sein) ### Opendir - Um beispielsweise alle Dateien in einem Verzeichnis aufzulisten ### Closedir ### Readdir - Aufruf gibt nächsten Eintrag eines geöffneten Verzeichnisses zurück ### Rename (Verzeichnis) ### Link - Durch Technik des Verlinkens können Dateien in mehr als einem Verzeichnis vorkommen - Spezifiziert eine vorhandene Datei und erzeugt Verbindung von dieser Datei zu dem Namen ### Unlink - Verzeichniseintrag wird entfernt - Falls nur in einem Verzeichnis → [löschen](#delete) ## Implementierung - BIOS liest MBR ein, führt aus - MBR-Programm - lokalisiert aktive Partition - liest ersten Block (Boot-Block) - führt aus - lädt BS, das in Partition gespeichert ist - Dateisystem enthält häufig noch Superblock - enthält alle _Schlüsselparameter_ des Dateisystems - **Magische Zahl** - identifiziert Typ des DS - **Anzahl der Blöcke** - **Weitere administrative Schlüsselinformationen** - wird bei Start in den Speicher geladen - Danach - **Freie Blöcke** - Bitmap oder Liste von Zeigern - **I-Nodes** - Feld von Datenstrukturen - Jede beinhaltet Informationen über je eine Datei - **Wurzelverzeichnis** - Spitze des Dateibaums - ![image_340.png](image_340.png) ## Methoden zur Belegungsverkettung ### Zusammenhängende Belegung - Einfachstes Belegungsschema - Speicherung als zusammenhängende Menge von Plattenblöcken - Jede Datei beginnt mit neuem Block - ![image_351.png](image_351.png) - | Vorteile | Nachteile | |-----------------------------------------------------------------------------------------------------|-------------------------------------------------------------------------------| | Einfach zu implementieren
Lokalisierung der Dateiblöcke basiert auf zwei Zahlen | Im Laufe der Zeit wird die Platte fragmentiert | | hervorragende Leseleistung
Gesamte Datei kann mit einer Operation von der Platte gelesen werden | ![image_352.png](image_352.png) | - In manchen Situationen praktikabel - CD-ROM - alle Dateigrößen sind bekannt, werden sich niemals während Gebrauch ändern - DVD - Kann als eine Datei gespeichert werden - meistens ~4 1GB Dateien ### Verkettete Listen - Jede Datei ist verkettete Liste von Plattenblöcken - Erstes Wort = Zeiger auf den nächsten - Rest = Daten - ![image_353.png](image_353.png) - | Vorteile | Nachteile | |-------------------------------------------------------------------------|--------------------------------------------------------------------| | Kein verlorener Speicherplatz durch Fragmentierung | sequenzielles Lesen zwar schnell, wahlfreier Zugriff sehr langsam | | | Für Verzeichniseintrag ist Plattenadresse des ersten Blocks ausreichend | Um Auf Block n zuzugreifen müssen n-1 Blöcke vorher gelesen werden | ### File Allocation Table (FAT) - Zeiger jedes Plattenblocks in einer Tabelle im Arbeitsspeicher - | Vorteile | Nachteile | |------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------------| | Gesamter Block steht für Daten zur Verfügung | Gesamte Tabelle muss durchgehend im Speicher sein | | Obwohl Kette verfolgt werden muss, kann das im RAM ohne Zugriffe auf Platte geschehen | Bei einer !TB Festplatte mit einer Blockgröße von 1KB benötigt die Tabelle 1Mia*3Byte ~ 3GB des RAM | | Es reicht für Verzeichniseintrag einen einzigen ganzzahligen Wert des Startblocks zu speichern | | ### I-Nodes (Index Node) - Datenstruktur, die Informationen über eine Datei oder ein Verzeichnis auf einem Dateisystem enthält - Jede/s Datei/Verzeichnis ist durch einen eindeutigen I-Node identifiziert - | Vorteile | Nachteile | |--------------------------------------------------------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------| | I-Node muss nur im Speicher sein, solange Datei geöffnet ist | Jeder Node kann nur begrenzte Anzahl von Plattenadressen
Sobald das Limit erreicht ist, müsste man die letzte Adresse als Zeiger auf den nächsten Node nehmen | | Feld, das die I-Nodes enthält benötigt nur n*k Byte | | - ![image_354.png](image_354.png) ## Dateinamen - Keine festgelegte Länge - variable Dateinamenlängen verwalten? - ![image_355.png](image_355.png) - Nachteil: - Lücke variabler Länge - entsteht, wenn eine Datei entfernt wird und nächste Lücke nicht genau passt - Es ist möglich Verzeichniseinträge zu verschieben - ![image_356.png](image_356.png) - Für alle Dateinamen nur feste Längen zulassen - Gemeinsam auf einem Heap am Ende des Verzeichnisses speichern - Vorteil: - nach Entfernen einer Datei passt nächste immer rein - Heap muss mitverwaltet werden :/ - Lineare Suche → sehr langsam - Verwendung einer Hashtabelle in jedem Verzeichnis - Vorteil einer viel schnelleren Suche - Nachteil: komplizierte Verwaltung - Zwischenspeichern der Resultate vorangegangener Suchen ## Gemeinsam genutzte Dateien - ![image_357.png](image_357.png) - Probleme: - ![image_358.png](image_358.png) - Enthält Verzeichnis Plattenadressen, dann muss Kopie der Adressen im Verzeichnis B angelegt werden - Wenn B/C Daten an Datei anhängen - neue Blöcke werden nur im Verzeichnis, in dem Änderung stattfand, aufgelistet - Zweck gemeinsamer Verwendung verfehlt ### Symbolische Links - Enthält Pfadnamen zur gewünschten Datei - Wenn B Datei liest, sucht BS direkt im angegebenen Pfad - | Vorteil | Nachteile | |--------------------------------------------------------|--------------------------------------------------------------------------------------------| | Dateien auf entfernten, vernetzten Maschinen verlinken | zusätzlicher Aufwand
eigener Plattenblock für Pfad | | | Datei mit Pfadnamen muss gelesen werden, Pfad analysieren, Komponente bis I-Node verfolgen | | | Falls in Unterverzeichnissen wird Datei evtl. mehrfach gefunden | | | Bei Einspielung auf anderen Computer → Link wird zur Kopie der selben Datei | ## Log-basiertes Dateisystem (LFS) - Schreibzugriffe sind effizienter als Lesezugriffe - Schreibleistungs- und Fragmentierungsprobleme überwinden - Schreibvorgänge werden protokolliert - Mit schnelleren CPUs, größerem RAM wächst Platten-Cache schneller - Viele Lesezugriffe direkt aus Platten-Cache - Ohne Festplattenzugriffe - Meiste Plattenzugriffe = Schreibzugriffe :) - Probleme - Schreibzugriffe meist in Stückchen → ineffektiv - Abhängig von - Spurwechselzeit ([seek](#seek) time) - Latenzzeit (latency) - Kommando-Latenz (controller overhead) - Inkonsistenzen bei Systemabstürzen - Lösungsansatz - Alle noch ausstehenden im Speicher gepufferten Schreibaufträge regelmäßig sammeln - An Ende des Logs schreiben - Einzelnes Segment kann in beliebiger Reihenfolge I-Nodes, Verzeichnisblöcke und Datenblöcke enthalten - Am Anfang Zusammenfassung über Inhalt - Probleme Lösungsansatz - Log wird ohne Reorganisation immer größer - Bereinigungsvorgang wird benötigt - Über alle Vorgänge Protokoll zu führen erfordert logistischen Aufwand - LFS sind hochgradig inkompatibel zu bestehenden Dateisystemen - können Inkonsistenz bei Systemabstürzen nicht abfangen ## Journaling - mit Grundgedanken von [LFS](#log-basiertes-dateisystem-lfs) Robustheit DS erhöhen - Log ist Protokoll über geplante Aktionen - Bei Systemabsturz vor Beendigung einer geplanten Arbeit - Bei Neustart im Log nachschauen, was gerade vor sich ging - Vorgang sauber beenden - Beispiel: - _NTFS_, _ext3_, _macOS Extended_ - Für zusätzliche Zuverlässigkeit - Datenbankkonzept der atomaren Transaktion - Gruppe von Aktionen klammern - Anfangstransaktion (begin transaction) - Endtransaktion (end transaction) - Dateisystem weiß, das es alle eingeklammerten oder keine ausführen muss - ACID-Eigenschaften - **Atomarität (Atomicity)** - Transaktion wird als Ganzes behandelt - alle oder keine Operationen in Transaktion ausführen - Wenn eine fehlschlägt Rest rückgängig machen - **Konsistenz (Consistency)** - Transaktionen werden von einem in einen andern konsistenten Zustand überführt - Nach Abschluss einer erfolgreichen Transaktion - DB in Zusatnd, der Integritätsregeln entspricht - **Isolation (Isolation)** - mehrere gleichzeitige Transaktionen unabhängig, gleichzeitig ausführen - **Dauerhaftigkeit (Durability)** - einmal abgeschlossene Transaktion dauerhaft in DB gespeichert - Änderung auch nach Systemabsturz / Neustart erhalten ## Virtuelle Dateisysteme (VFS) - ![image_359.png](image_359.png) - Abstraktionsschicht im BS - dient zur Vereinheitlichung der Dateisysteme und deren Zugriffsmethoden - Anwendungen können auf Dateien zugreifen - ohne auf Details der zugrunde liegenden physischen Dateisysteme zu achten - erleichtert Portabilität, flexiblere Verwaltung der Dateisystemressourcen - Wenn System hochgefahren - Wurzeldateisystem beim VFS registrieren - Liste der Adressen von Funktionen dem VFS zur Verfügung stellen - Entweder lange Aufruftabelle oder eine Tabelle pro VFS-Objekt - VFS legt im RAM V-Nodes an - weitere Dateisysteme jetzt oder während Ausführung