Ein paar Filesystem Basics

Wenn du gerade gar keine Lust auf theoretischere Hintergründe hast, scroll einfach runter und Probier die Befehle aus. Dort lernst du, wie du von deinem eigenen Home Verzeichnis in andere Verzeichnisse manövrierst und Verzeichnise und Dateien anlegst und löschst.

Hier wollen wir uns aber erst einmal noch kurz anschauen wie das Filesystem, in dem wir uns dann bewegen werden, unter Linux aufgebaut ist. Dazu werfen wir einen Blick auf den Filesystem Hierarchy Standard (kurz: FHS) zu dem es in der Wikipedia einen sehr guten Artikel gibt, für alle die es ganz genau wissen wollen: Wikpedia (DE): Filesystem Hierarchy Standard.

Bei Linux und Unix-Systemen gibt es, anders als beispielsweise bei Windows, nicht unterschiedliche Laufwerke auf die separat zugegriffen wird, sondern immer eine Dateisystemwurzel (auf englisch das root directory): /

Dieses ist nicht zu verwechseln mit dem /root directory, dem Home-Verzeichnis des root users. Im Grunde kann ich unter / beliebige Verzeichnisse und in diesen auch Unterverzeichnisse anlegen. Und wenn ich zum Beispiel eine zusätzliche Festplatte bzw. Partition hinzufügen möchte, dann wird diese an irgendeiner Stelle im Dateisystem eingehängt. Da es aber sehr unübersichtlich wäre, wenn alle einfach nach Lust und Laune da und dort Verzeichnisse anlegen und unterschiedlich bennenen, halten sich die meisten Linux-Distributionen möglichst nah an den FHS. Dieser ist also nur eine Empfehlung, und in der einen oder anderen Distribution wird das tatsächliche Filesystem mehr oder weniger davon abweichen. Aber der Grundgedanke ist bei allen ähnlich und die meisten großen Distributionen halten sich sehr gut an den FHS.

Wie schaut nun also so ein FHS-gerechtes Liunx-Dateisystem aus? In folgender Liste stellen wir die Verzeichnisse dar, die im FHS vorgesehen sind und erklären grob wozu diese gut sind. Verzeichnisse werden dabei immer durch ein / getrennt, und die oberste Ebene ist die Wurzel / selbst:

  • / : das Wurzelverzeichnis. Hier sollten an sich keine Files abgelegt und Directories angelegt werden, die nicht schon so von der Distribution vorgesehen sind. Im Grunde ist das nur der Behälter für alle Standardverzeichnise, die nun folgen.
  • /bin : Verzeichnis mit Binaries des Basissystems - also ausführbaren Programmen.
  • /boot : enthält alle Dateien, die zum Booten des Systems notwendig sind
  • /dev : enthält spezielle device files, also keine klassischen Dateien, die auf der Festplatte liegen, sondern abstrakte Dateien, mit denen auf einzelne Geräte im System zugegriffen werden kann
  • /etc : alle Dateien für die globale Konfiguration des Betriebssystems und aller Anwendungen
  • /home : Das home-Verzeichnis beinhaltet die einzelnen $HOME-Verzeichnisse der User*innen, in denen diese ihre Dateien ablegen und im Grunde tun und lassen können was sie wollen.
  • /lib : dynamische Programm-Bibliotheken (libraries) und Kernel-Module für das Basissystem
  • /media : hier können Wechseldatenträger eingehängt werden
  • /mnt : ähnlich wie /media zum einhängen von Dateisystemen, allerdings meist eher für permanentere "mounts" verwendet
  • /opt : für alle zusätzlichen Anwendungen, die nicht über Paketsysteme installiert werden oder sonst wie in das Standardschema einer Distribution passen
  • /root : das $HOME-Verzeichnis des users root
  • /run : hier werden Daten zu laufenden Prozessen abgebildet
  • /sbin : system binaries - also für das System essentielle Programme, die aber von normalen users in der Regel nicht so ausgeführt werden
  • /srv : hier sollten alle Daten für einzelne Dienste liegen (z.B. vom Webserver oder Mailserver)
  • /tmp : temporäre Dateien die während der Ausführung von Programmen anfallen und danach aber wieder gelöscht werden können, oder die aus anderen Gründen nur kurzzeitig aufbewahrt werden müssen
  • /usr : Unix System Resources - hier liegt alles was vom Basissystem nicht zwinged benötigt wird um zumindest mal rudimentär zu laufen. Das Verzeichnis könnte so auch von mehreren unterschiedlichen Sytemen gemeinsam genutzt werden, da auch erst eingebunden werden kann, nachdem das Basisystem schon gestartet hat.
    • /usr/bin : hier liegen binaries, die nicht im Basissystem benötigt werden - in einer klassischen Linux-Installation werden die meisten ausführbaren Dateien hier zu finden sein
    • /usr/local : hier kann nochmal eine eigene Distributions-unabhängige Hierarchie eingezogen werden um Dinge abzulegen die zwar systemweit verfügbar sein sollen, aber nur lokale Modifikationen oder lokale Programme darstellen, die auf anderen Systemen keinen Sinn machen
      • /usr/local/bin : hier werden in der Regel Programme und vor allem Shell-Skripte abgelegt, die zur lokalen Verwendung in genau diesem System vorgesehen sind
      • /usr/local/sbin : wie bei /usr/local/bin, nur dass es sich hier um Systembefehle handelt, die in der Regel nur von den Administrator*innen verwendet werden (sollen).
  • /var : hier finden sich alle variablen Dateien die im System anfallen, also veränderliche Inhalte, die nicht direkt einzelnen User*innen zuordenbar sind, aber sich durch die Programmausführung permanent ändern. Besonders nennenswert sind hier zum Beispiel die Log Files unter /var/log, die bei der Fehlerbehebung immer sehr hilfreich sind.

Das war jetzt zwar nur ein grober erster Einblick, für mehr Hintergründe empfiehlt sich der oben verlinkte Wikipedia-Artikel. Jetzt wollen wir uns aber selbst gleich mal in der Shell und im Dateisystem bewegen, um auch zu erkunden was in den genannten Verzeichnissen tatsächlich alles drin liegt.

Wie wir uns in der Shell bewegen

Mit dem Befehl "pwd" kann ich mir das Verzeichnis anzeigen lassen, in dem ich gerade bin (pwd steht für print working directory).

$ pwd  
/home/jackie

Mit dem Befehl "mkdir" (make directory) kann ich ein neues Verzeichnis anlegen.

$ mkdir workshop

Nun kann ich mit dem Befehl "cd" (change directory) in das neue Verzeichnis wechseln.

$ cd workshop
$ pwd
/home/jackie/workshop

Jetzt schauen wir uns den Inhalt des Verzeichnisses an:

$ ls -l  
0 total

Das Verzeichnis ist ja noch leer. Aber ist es wirklich ganz leer?

$ ls -l -a  
total 8  
drwxrwxr-x 2 jackie jackie 4096 Dez  3 14:37 .  
drwxrwxr-x 4 jackie jackie 4096 Dez  3 14:37 ..

Ja, es ist ganz leer. Allerdings gibt es zwei Platzhalter-Verzeichnisse. Nämlich "." und "..". Dabei steht "." immer für das Verzeichnis selbst und ".." steht für das übergeordnete Verzeichnis. Ich kann so also auch wieder in das übergeordnete Verzeichnis wechseln:

$ cd ..
$ pwd  
/home/jackie  
$ cd workshop

Aber jetzt legen wir doch mal eine neue (leere) Datei an:

$ touch erste-datei  
$ ls -l  
total 8  
-rw-rw-r-- 1 jackie jackie 0 Dez  3 14:39 erste-datei

Und wollen wir die Datei umbennen (indem wir sie eigentlich verschieben - mv steht für move):

$ mv erste-datei erste-datei.txt  
$ ls -l  
total 8  
-rw-rw-r-- 1 jackie jackie 0 Dez  3 14:39 erste-datei.txt

Die Datei ist jetzt aber noch leer. Drum wollen wir etwas hineinschreiben. Dafür können wir beliebige Editoren, üblicherweise Text-Editoren (da wir Text schreiben wollen). gedit ist zum Beispiel ein grafischer Texteditor, es gibt aber auch Texteditoren für die Text Shell:

nano

joe

vim

emacs

Ich kann die direkt zum Öffnen der Datei verwenden ("nano erste-datei.txt"). vim und emacs sind dabei sehr mächtige Editoren, die aber vor allem zu Beginn auch schwer zu verstehen sind. Wenn mensch regelmäßiger mit Texteditoren arbeitet, zahlt sich aber die Einarbeitung sehr aus. Für vim gibts hier viele hilfreiche Unterlagen (die man page kann freilich auch oft helfen): https://wiki.archlinux.org/index.php/Vim#Tutorials

Besonders zu empfehlen ist einerseits das Programm "vimtutor", und sonst auch dias interaktive Tutorial http://www.openvim.com/ und das Vim Adventure Game http://vim-adventures.com/

Wenn wir jetzt die Datei bearbeitet haben und erstmal mit einer Kopie weiterarbeiten wollen, legen wir mit dem Befehl cp (copy) eine Kopie an:

$ cp erste-datei.txt zweite-datei.txt  
$ ls -l  
total 24  
-rw-rw-r-- 1 jackie jackie 75 Dez  3 14:49 erste-datei.txt  
-rw-rw-r-- 1 jackie jackie 75 Dez  3 14:56 zweite-datei.txt

Die zweite Datei ist jetzt eine exakte Kopie der ersten, nur dass sie "neuer" ist. Die erste Datei wurde das letzte mal um 14:49 verändert, die Kopie habe ich aber gerade eben um 14:56 angelegt.

Nun kann ich mit dem Texteditor meiner Wahl nochmal die zweite Datei bearbeiten und danach auch einen Vergleich der beiden Dateien machen.

$ diff erste-datei.txt zweite-datei.txt
2,3c2,3
< Das ist die erste Datei.
< Die ist ganz toll.
---
> Das ist die zweite Datei.
> Die ist ganz toll und lustig.

Hier bekomme ich einen Zeile-für-Zeile-Vergleich zwischen den beiden Dateien und kann sehen, dass sich die Zeile 2 & 3 verändert haben. Ein noch besseres Tool zum Vergleichen ist vimdiff.

$ vimdiff erste-datei.txt zweite-datei.txt

In vim werden Fenster mit der Anweisung ":q" geschlossen.

Es gibt aber auch noch einen Haufen anderer spannender Tools zum Vergleichen von Dateien.

results matching ""

    No results matching ""