# 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<br/>Lokalisierung der Dateiblöcke basiert auf zwei Zahlen                 | Im Laufe der Zeit wird die Platte fragmentiert                                |
  | hervorragende Leseleistung<br/>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<br/>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<br/>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

