6 Alles ist Datei

Ein zentraler Grundsatz

Linux folgt einem einfachen, aber mächtigen Grundsatz: Alles ist eine Datei. Diese Philosophie ist tief in der Architektur und Funktionsweise des Betriebssystems verankert und beeinflusst, wie Ressourcen und Prozesse behandelt werden. Im Folgenden wird der Grundsatz “Alles ist eine Datei” aus der obersten Perspektive auf Linux beleuchtet, ohne auf spezifische Details einzugehen. Stattdessen wird das Konzept als grundlegende Idee vorgestellt, die die Interaktion mit dem System prägt.

6.1 Die Bedeutung des Grundsatzes

In Linux wird eine breite Palette von Einheiten, einschließlich Hardwaregeräten, Informationen und Prozessen, als Dateien dargestellt. Diese Abstraktion ermöglicht eine einheitliche und flexible Handhabung verschiedener Systemressourcen. Anstatt für jede Ressourcenart unterschiedliche Schnittstellen oder Kommunikationswege zu benötigen, bietet Linux eine konsistente Methode zur Interaktion – den Umgang mit Dateien.

6.2 Konsequenzen für die Systemarchitektur

Durch die Anwendung dieses Grundsatzes vereinfacht Linux die Komplexität seines Systems. Entwickler und Benutzer können auf vielfältige Systemressourcen zugreifen, indem sie diese wie gewöhnliche Dateien lesen, schreiben und manipulieren. Dies führt zu einer intuitiven und zugänglichen Art der Systemverwaltung und Programmierung.

6.3 Implikationen für die Praxis

Der Grundsatz “Alles ist eine Datei” hat weitreichende Implikationen für die praktische Arbeit mit Linux. Er erleichtert unter anderem das Scripting und die Automatisierung von Aufgaben, da die Manipulation von Systemressourcen über bekannte Dateioperationen erfolgt. Dieser Ansatz fördert eine transparente und modulare Systemgestaltung und trägt zur Effizienz und Flexibilität bei der Entwicklung von Software und beim Betrieb von Linux-Systemen bei.

6.4 Die Struktur und Funktion von inodes im Linux-Dateisystem

Inodes spielen eine zentrale Rolle im Linux-Dateisystem, indem sie als fundamentale Datenstrukturen dienen, die detaillierte Informationen über Dateien und Verzeichnisse speichern. Jede Datei oder jedes Verzeichnis innerhalb eines Linux-Dateisystems ist mit einem eindeutigen inode verknüpft, der eine Vielzahl von Metadaten über das Objekt enthält, aber nicht den eigentlichen Dateinamen oder den Dateiinhalt.

6.4.1 Aufbau und Attribute eines inodes

Ein inode enthält spezifische Metadaten zu einer Datei oder einem Verzeichnis, einschließlich:

6.4.2 Referenzierung der Datenblöcke durch inodes

Die Struktur eines inodes ermöglicht es, die Speicherorte der Datenblöcke einer Datei zu verwalten. Die Referenzierung erfolgt über direkte und indirekte Zeiger:

6.5 Inode Attibute

In Linux können Inodes verschiedene Attribute enthalten, die zusätzliche Informationen über eine Datei oder ein Verzeichnis bereitstellen.

6.5.1 Attribute eines Inodes:

  1. Dateigröße: Gibt die Größe der Datei in Bytes an.

  2. Berechtigungen: Bestimmen, wer auf die Datei zugreifen, sie lesen, schreiben oder ausführen kann.

  3. Besitzer und Gruppe: Zeigen an, welcher Benutzer die Datei besitzt und welcher Gruppe sie zugeordnet ist.

  4. Zeitstempel: Enthält Informationen über die Erstellungszeit, die letzte Änderungszeit und die letzte Zugriffszeit der Datei.

  5. Typ und Modus: Bestimmen den Typ der Datei (z. B. reguläre Datei, Verzeichnis, Symbolischer Link) und den Zugriffsmodus.

  6. Verweisanzahl: Gibt an, wie viele Verzeichniseinträge auf diesen Inode verweisen.

  7. Speicherort: Zeigt den physischen Speicherort der Datei auf der Festplatte an.

  8. Dateisystemspezifische Attribute: Können je nach Dateisystem zusätzliche Informationen enthalten, wie z. B. Blockgröße, Attributflags usw.

Diese Attribute werden vom Betriebssystem verwendet, um den Zugriff auf Dateien und Verzeichnisse zu steuern und um Dateisystemoperationen durchzuführen. Sie können mit verschiedenen Befehlen wie ls -l, stat angezeigt werden.

6.5.1.1 Dateitypen

Zum Inode Attribut “type” gibt es sechs Ausprägungen. Diese Dateitypen werden von vielen Unix- und Linux-basierten Betriebssystemen verwendet und werden in der Regel mit Befehlen wie ls aufgelistet. Die Dateitypen geben an, wie die Datei auf dem System verwendet und behandelt wird.

  1. Verzeichnis (Directory) (d): Ein Verzeichnis ist ein Speicherbereich, der andere Dateien und Verzeichnisse enthält. In Linux- und Unix-basierten Betriebssystemen wird der Typ von Verzeichnissen durch das Zeichen d angezeigt.

  2. Normale Datei (-): Normale Dateien enthalten verschiedene Datentypen wie Textdateien, Bilddateien, ausführbare Dateien usw. Wenn sie mit dem ls -l Befehl aufgelistet werden, werden normale Dateien durch das - Zeichen angezeigt.

  3. Symbolischer Link (Symbolic Link) (l): Symbolische Links sind Verweise auf eine Datei oder ein Verzeichnis. Änderungen an der ursprünglichen Datei oder dem Verzeichnis wirken sich nicht auf den symbolischen Link aus. Beim Auflisten mit dem ls -l Befehl werden symbolische Links durch das l Zeichen angezeigt.

  4. Gerätedatei (Device File): Gerätedateien repräsentieren Hardwaregeräte in Linux- und Unix-basierten Betriebssystemen. Sie befinden sich normalerweise im /dev Verzeichnis. Gerätedateien können in Zeichen- (c Zeichen) oder Blockgeräte (b Zeichen) unterteilt werden.

  5. Socket (Socket) (s): Socket-Dateien bieten einen Kommunikationsmechanismus zwischen verschiedenen Prozessen. Beim Listen mit dem ls -l Befehl werden Socket-Dateien durch das s Zeichen angezeigt.

  6. FIFO (Pipe) (p): FIFO steht für “First In, First Out” und sind spezielle Dateien, die für die Datenübertragung zwischen Prozessen verwendet werden. FIFO-Dateien werden durch das p Zeichen angezeigt, wenn sie mit dem ls -l Befehl aufgelistet werden.

6.5.2 Die Befehle stat und ls in Linux

Im Linux-Dateisystem sind die Befehle stat und ls wesentliche Werkzeuge für Benutzer und Administratoren, um Informationen über Dateien und Verzeichnisse zu sammeln und zu analysieren. Diese Befehle bieten Einblicke in die Eigenschaften von Dateisystemobjekten, einschließlich ihrer inodes, Berechtigungen und anderer Metadaten.

6.5.2.1 Der stat Befehl

Der stat Befehl liefert detaillierte Informationen über das Dateisystemobjekt (Datei, Verzeichnis, Link etc.), auf das er angewendet wird. Er gibt umfassende Metadaten aus, die im inode des Objekts gespeichert sind, einschließlich:

Der Befehl wird wie folgt verwendet:

stat Dateiname

Er ist besonders nützlich, um tiefgreifende Informationen über Dateien und Verzeichnisse zu erhalten, wie z.B. den genauen Zeitpunkt der letzten Modifikation oder die inode-Nummer des Objekts.

6.5.2.2 Der ls Befehl

Der ls Befehl ist eines der am häufigsten verwendeten Werkzeuge in Linux, um den Inhalt von Verzeichnissen aufzulisten. Er bietet zahlreiche Optionen, um die ausgegebenen Informationen anzupassen. Zwei besonders nützliche Optionen sind -i und -a.

6.5.2.2.1 Die Option -i

Die Option -i zeigt die inode-Nummer jedes Datei- oder Verzeichniseintrags an. Diese Nummern sind einzigartig für jede Datei im Dateisystem und dienen als Referenzpunkte innerhalb des Dateisystems für die Dateiverwaltung. Der Befehl sieht wie folgt aus:

ls -i

Diese Option ist hilfreich, um die inodes von Dateien zu identifizieren, was bei der Diagnose von Dateisystemproblemen oder bei fortgeschrittener Dateiverwaltung nützlich sein kann.

6.5.2.2.2 Die Option -a

Die Option -a zeigt alle Einträge in einem Verzeichnis an, einschließlich der versteckten Dateien, die mit einem Punkt (.) beginnen. Diese Dateien sind normalerweise nicht sichtbar und enthalten wichtige Konfigurationsdaten oder dienen zur Verzeichnisnavigation (z.B. . für das aktuelle Verzeichnis und .. für das übergeordnete Verzeichnis). Der Befehl sieht wie folgt aus:

ls -a

Diese Option ist essentiell, um ein vollständiges Bild aller Dateien in einem Verzeichnis zu erhalten, einschließlich solcher, die normalerweise vor dem Benutzer verborgen sind.

Hardlinks sind mehrere Namen für dieselbe Datei, die an verschiedenen Orten gespeichert sind. Wenn ein Hardlink erstellt wird, gibt es keinen Unterschied zwischen der ursprünglichen Datei und dem Hardlink; beide verweisen auf dieselben Daten.

Hardlinks sind mit dem Inode der Datei verknüpft, daher bleibt ein Hardlink gültig, auch wenn die ursprüngliche Datei gelöscht wird. Hardlinks funktionieren nur innerhalb desselben Dateisystems.

Softlinks sind spezielle Dateien, die auf eine andere Datei oder Verzeichnis verweisen. Das bedeutet, dass eine Datei oder ein Verzeichnis nur eine Referenz hat. Softlinks werden als kleine Dateien erstellt, die den Dateinamen und den Pfad speichern, auf den sie verweisen.

Daher kann ein Softlink ungültig werden, wenn die ursprüngliche Datei gelöscht oder verschoben wird. Softlinks können zwischen verschiedenen Dateisystemen funktionieren und existieren auch ohne die Zieldatei

  1. Mit Stat Dateiname oder ls -l Dateiname nach inode Nummer suchen
  2. Mit dem Befehl find / -inum *****

**** = inode Nummer aus Schritt 1

Falls nötig “2>/dev/null” nutzen um Error messages zu entfernen

  1. Alle gefundenen Verzeichnisse aus Schritt 2 mit rm VerzeichnissnamenHierEinfügen entfernen

6.7 Dateikommandos

6.7.1 Dateien “bewegen”

Das Entfernen und Verschieben von Dateien und Verzeichnissen sind grundlegende Operationen in jedem Betriebssystem, einschließlich Linux. Die Befehle “rm” und “mv” sind die Werkzeuge, die in der Linux-Umgebung für diese Aufgaben verwendet werden.

6.7.2 Der “rm”-Befehl:

um Dateien oder Verzeichnisse zu entfernen. Seine grundlegende Syntax lautet:

rm [Optionen] Datei/Verzeichnis

Ein einfaches Beispiel wäre:

rm datei.txt

Dieser Befehl löscht die Datei “datei.txt” im aktuellen Verzeichnis. Es gibt jedoch einige Optionen, die mit dem “rm”-Befehl verwendet werden können, um das Löschen anzupassen. Eine häufig verwendete Option ist “-r”, die für “rekursiv” steht. Diese Option wird verwendet, um Verzeichnisse und deren gesamten Inhalt zu entfernen.

rm -r verzeichnis/

Dieser Befehl würde das Verzeichnis “verzeichnis/” sowie alle Dateien und Unterverzeichnisse darin löschen. Eine weitere nützliche Option ist “-f”, die für “force” steht. Wenn diese Option verwendet wird, werden Sie nicht nach Bestätigung gefragt, wenn Sie Dateien löschen möchten.

rm -f datei.txt

Dieser Befehl würde die Datei “datei.txt” ohne Bestätigung löschen. Es ist jedoch wichtig zu beachten, dass die Verwendung von “-f” gefährlich sein kann, da sie das Löschen von Dateien ohne weitere Warnungen ermöglicht. Daher sollte sie mit Vorsicht verwendet werden.

6.7.2.1 Der Befehl “mv” (Verschieben):

Der “mv”-Befehl wird verwendet, um Dateien und Verzeichnisse von einem Ort zum anderen zu verschieben oder umzubenennen. Seine Syntax ist ebenfalls ziemlich einfach:

mv [Optionen] Quelle Ziel

Ein einfaches Beispiel wäre:

mv datei.txt /pfad/zum/zielverzeichnis/

Dieser Befehl verschiebt die Datei “datei.txt” in das angegebene Zielverzeichnis. Wenn das Zielverzeichnis nicht vorhanden ist, wird die Datei einfach umbenannt.

Eine weitere häufig verwendete Option für den “mv”-Befehl ist “-i”, die für “interaktiv” steht. Wenn diese Option verwendet wird, wird der Benutzer benachrichtigt, wenn eine Datei überschrieben werden soll, und um Bestätigung gebeten.

mv -i datei.txt /pfad/zum/zielverzeichnis/

Mit diesem Befehl würde der Benutzer eine Bestätigung erhalten, bevor die Datei “datei.txt” in das Zielverzeichnis verschoben wird, falls bereits eine Datei mit demselben Namen vorhanden ist.

Eine andere nützliche Option ist “-f”, die für “force” steht. Diese Option erzwingt das Überschreiben von Dateien ohne Benutzerinteraktion.

mv -f datei.txt /pfad/zum/zielverzeichnis/

Dieser Befehl würde die Datei “datei.txt” ohne vorherige Warnung oder Bestätigung in das Zielverzeichnis verschieben und dabei eine bereits vorhandene Datei mit demselben Namen überschreiben.

6.7.3 Der Unterschied zwischen ln & cp

Dateien und Verzeichnisse werden in dieser Struktur, die als Dateisystem bezeichnet wird, organisiert und verwaltet. Jede Datei und jedes Verzeichnis haben eine eindeutige Identifikationsnummer, die als Inode bezeichnet wird. Diese Inodes enthalten Metadaten wie Benutzer- und Gruppenzugehörigkeit, Berechtigungen, Zeitstempel und den physischen Speicherort der Dateidaten auf der Festplatte.

Sowohl der ln- als auch der cp-Befehl dienen dazu, vorhandene Dateien oder Verzeichnisse an einem anderen Speicherort verfügbar zu machen, allerdings auf unterschiedliche Weise.

  1. ln (link)

Der ln-Befehl erstellt einen Link, also eine Verknüpfung, zu einer bestehenden Datei oder einem Verzeichnis. Es gibt zwei Arten von Links: Hardlinks und symbolische Links (Symlinks).

Hardlinks

Ein Hardlink ist ein direkter Zeiger auf die Dateidaten auf der Festplatte. Wenn ein Hardlink zu einer Datei erstellt wird, teilen sich die ursprüngliche Datei und der Hardlink denselben Inode und damit die gleichen Dateidaten. Aus technischer Sicht gibt es keinen Unterschied zwischen der ursprünglichen Datei und dem Hardlink – sie sind völlig gleichberechtigt. Änderungen an einer der beiden Dateien wirken sich auf die andere aus, da sie auf dieselben Dateidaten zeigen.

Hardlinks haben einige Einschränkungen:

Um einen Hardlink zu erstellen, verwendet man den Befehl ln mit dem Ursprungspfad und dem gewünschten Linkpfad:

ln /pfad/zur/ursprünglichen/datei /pfad/zum/neuen/hardlink

Symbolische Links (Symlinks)

Ein symbolischer Link, oft auch als “soft link” oder einfach “symlink” bezeichnet, ist eine spezielle Datei, die den Pfad zur eigentlichen Datei oder dem Verzeichnis enthält. Im Gegensatz zu Hardlinks haben symbolische Links ihre eigenen Inodes und zeigen nicht direkt auf die Dateidaten, sondern auf den Pfad der verlinkten Datei oder des verlinkten Verzeichnisses.

Symbolische Links haben einige Vorteile gegenüber Hardlinks:

Um einen symbolischen Link zu erstellen, verwendet man den Befehl ln mit der Option -s (symbolic), gefolgt vom Ursprungspfad und dem gewünschten Linkpfad:

ln -s /pfad/zur/ursprünglichen/datei /pfad/zum/neuen/symlink

2. cp (copy)

Der cp-Befehl erstellt eine Kopie einer Datei oder eines Verzeichnisses. Im Gegensatz zu Links wird hier eine separate, eigenständige Kopie der Daten angelegt. Die kopierte Datei oder das kopierte Verzeichnis ist unabhängig vom Original und hat eine eigene Inode-Nummer.

Beim Kopieren einer Datei wird der vollständige Dateiinhalt an den neuen Speicherort kopiert. Bei Verzeichnissen werden sowohl das Verzeichnis selbst als auch alle darin enthaltenen Dateien und Unterverzeichnisse rekursiv kopiert.

Um eine Datei zu kopieren, verwendet man den Befehl cp mit dem Ursprungspfad und dem gewünschten Zielpfad:

cp /pfad/zur/ursprünglichen/datei /pfad/zum/ziel

Für das Kopieren von Verzeichnissen muss die Option -r (recursive) hinzugefügt werden, um alle Inhalte rekursiv zu kopieren:

cp -r /pfad/zum/ursprünglichen/verzeichnis /pfad/zum/ziel

Es ist wichtig zu beachten, dass beim Kopieren einer Datei oder eines Verzeichnisses eine vollständig neue Instanz erstellt wird, die unabhängig vom Original ist. Änderungen an der Kopie haben keine Auswirkungen auf das Original und umgekehrt. Außerdem belegt eine Kopie den vollen Speicherplatz der kopierten Daten, während Links nur wenig zusätzlichen Speicherplatz für die Verknüpfungsinformationen benötigen.

Anwendungsszenarien

Sowohl Links als auch Kopien haben ihre spezifischen Anwendungsszenarien:

Links:

Kopien:

Zusammenfassend bieten Links und Kopien unterschiedliche Möglichkeiten, um Dateien und Verzeichnisse in Linux zu verwalten und zu organisieren. Links ermöglichen eine effiziente Verwaltung von Verknüpfungen, während Kopien unabhängige Instanzen erstellen. Die Wahl zwischen ln und cp hängt von den spezifischen Anforderungen und Zielen ab, die man in einer bestimmten Situation verfolgt.

6.7.4 Berechtigungen für Dateien

Berechtigungen für Dateien werden in der inode festgelegt. Die Ausgabe von stat zeigt uns den Inhalt der inode und somit auch die Berechtigungen und den Besitzer einer Datei:

user@debian:~$ stat datei 
Datei: datei
Größe: 6            Blöcke: 8          EA Block: 4096   reguläre Datei
Gerät: 801h/2049d   Inode: 797921      Verknüpfungen: 2
Zugriff: (0646/-rw-r--rw-)  Uid: ( 1000/    user)   Gid: ( 1000/    user)
Zugriff: 2024-03-13 13:25:02.346951953 +0100
Modifiziert: 2024-03-13 13:25:11.663607836 +0100
Geändert: 2024-03-13 15:39:39.799558556 +0100
Geburt: 2024-03-13 13:25:02.346951953 +0100

Im Feld “Zugriff” sehen wir folgende Zeichenfolge für die die Zugriffsrechte auf die Datei:

-rw-r-- rw-

Jedes Zeichen repräsentiert eine bestimmte Berechtigung:

Zum Beispiel bedeutet -rw-r--r--, dass der Besitzer die Datei lesen und schreiben kann, die Gruppe nur lesen kann und alle anderen Benutzer sie ebenfalls nur lesen können.

6.7.4.1 Besitzer (Owner) von Dateien

Jede Datei hat einen Besitzer und eine Gruppe. Gruppen können mehrere Benutzer enthalten und ein Benutzer kann Mitglied mehrerer Gruppen sein.

Benutzer werden mit einer Uid (User id) angegeben und Gruppen mit einer Gid (Group id).

Die Benutzer IDs und die Gruppenzugehörigkeiten der Benutzer werden in einer gesonderten Datei verwaltet. Diese Datei liegt unter:

/etc/passwd

6.7.4.2 Root User

Berechtigungen können grundsätzlich nur durch den Owner geändert werden. Eine Außnahme stellt der Root User (Uid: 0) dar. Der Root User hat vollen Schreibzugriff auf alle inodes und ist somit in der Lage, sämtliche Dateiberechtigungen auf dem System zu ändern.

6.7.4.3 chmod

Der Befehl chmod steht für “change mode” und wird in UNIX/Linux-basierten Betriebssystemen verwendet, um die Zugriffsrechte für Dateien zu ändern.

Hier sind einige Beispiele, wie der chmod-Befehl verwendet werden kann:
chmod u+r datei.txt: Dieser Befehl gibt dem Benutzer (u) Leseberechtigung für die Datei datei.txt.
chmod g-w datei.txt: Dieser Befehl entzieht der Gruppe (g) die Schreibberechtigung (w) für die Datei datei.txt.
chmod go-w datei.txt: Dieser Befehl entzieht der Gruppe(g) und allen Anderen(o) die Schreibberechtigung(w).