Filesystem
Arbeiten mit Files
- Filesystemstruktur
- Zugriffsrechte
- Dienste der Shell in Bezug auf Filearbeit
- Kommandos zur Filearbeit
- Ändern von Filestatusinformationen
- Einrichten zusätzlicher Verzeichniseinträge
Interna eines Filesystems
- Überblick über ein Filesystem
- Aufbau eines Filesystems
- Files und Inodes
- Montieren eines Filesystems
- Konsistenzprüfung
- Superuser
Arbeiten mit Files
- Filesystemstruktur
-
- Arten von Files
-
Es werden 3 Arten von Files unterschieden:
- normale Files (gewöhnliche Files, ordinary files)
-
- z.B. Quellprogramme, ausführbare Programme, Bibliotheken
- vom System wird keine Strukturierung der Files gefordert. Begriffe wie indexsequentielle Datei, logische Satzlänge usw. sind im UNIX fremd.
- File = sequentielle Folge von Bytes
- Die Interpretation der Bytes des Files ist rein programmabhängig. Files enthalten keine Bytes die vom Nutzerprogramm nicht ins File geschrieben wurden (andere Systeme speichern z.B. Satzlängen bzw. Trennzeichen, EOF usw.)
- Beispielsweise braucht sich kein Programm um diese Dinge kümmern; alle Standardkommandos funktionieren mit beliebigen Files; der Editor muß z.B. nicht zwischen einem C-Quellprogramm und einem Text für ein Textverarbeitungswerkzeug unterscheiden usw.
- Der Anwender muß aber genau wissen was er mit einem File tut!
- die Größe der Files wird vom System nicht begrenzt
- Verzeichnisse (directories, Kataloge, Ordner)
-
- enthalten Verweise auf Files (link, Verzeichniseintrag)
- auch Verweise auf Verzeichnis-Files sind möglich (Grundlage für die Baumstruktur des Filesystems)
- zu einem normalen File oder Spezial-File können mehrere Verweise (auch aus verschiedenen Verzeichnissen) bestehen
- ein Verweis besteht aus:
-
- Namen des Files (max. 255 Byte lang)
- Zeiger auf den Kopfsatz des Files (i-node-number)
- UNIX begrenzt die Anzahl der Einträge pro Verzeichnis nicht
- Verzeichnisse werden mit dem Kommando mkdir angelegt und mit rmdir gelöscht
- das Wurzelverzeichnis entsteht beim Erzeugen des Filesystems
- nur das System selbst kann in Verzeichnisse schreiben
- das Lesen von Verzeichnissen ist normal möglich
- Spezial-Files (special files, Gerätedateien)
-
- repräsentieren Geräte
- Durch die Behandlung der Geräte als File besteht für den Nutzer kein Unterschied zwischen der E/A auf ein normales File und der E/A auf ein Gerät.
- Spezial-Files stehen üblicherweise im Verzeichnis /dev
- übliche Spezial-Files für reale Geräte sind z.B.:
-
/dev/lp, /dev/lp0, /dev/lp1 Drucker /dev/fd, /dev/fd0, /dev/fd2 Diskette /dev/hda, /dev/hda1,/dev/hda4 /dev/hdb1, /dev/hdb2
/dev/sda, /dev/sdb
/dev/dsk/...
Platten bzw. Partitionen /dev/st0, /dev/nst1 /dev/ftape
/dev/rmt/...
Bandgeräte /dev/modem Modem /dev/mouse Maus /dev/cdrom CD-Laufwerk /dev/audio Soundkarte /dev/cua0, /dev/cua1 /dev/ttyS0
serielle Schnittstellen /dev/mem Hauptspeicher /dev/tty1, /dev/tty02 Terminals - Die Laufwerks- oder Gerätenummer wird nach dem Namen angegeben, z.B. /dev/tty4
- Bei Magnetbandgeräten und Floppy-Laufwerken wird diese Nummer erweitert, um das Aufzeichnungsformat festzulegen zu können, z.B.
-
- /dev/fd048ds9
- /dev/fd096ds16
- /dev/fd096ss9
- steht bei einem Spezial-File ein r vor dem Namen, dann handelt es sich um ein sogenanntes raw-Device. Diese werden für blockorientierte Geräte (z.B. Plattenspeicher, Floppy, Hard-Disk) eingerichtet, und erlauben den Zugriff auf die physische Gerätestruktur. Die raw-Devices verbergen dem Benutzer die gerätespezifischen Eigenschaften nicht.
- Spezial-Files für Pseudogeräte sind z.B.:
-
/dev/console Systemkonsole /dev/tty aktuelles Terminal /dev/pts Pseudoterminals /dev/null "Mülleimer" bzw. EOF (leeres File)
/dev/zero 0-Byte-Quelle (0x´00´)
- Filenamenbildung
-
Filename
- Der Filename benennt die im File zusammengefassten Informationen.
- Er kann aus max. 255 Zeichen bestehen
- Im Prinzip sind alle Zeichen erlaubt, aber aufgrund der Sonderbedeutung vieler Zeichen (für die Shell) sollte man sich beschränken auf:
-
- Buchstaben (möglichst keine Umlaute)
- Ziffern
- .
- _
- Einige Konventionen erlauben es, anhand der Namensendung auf den Fileinhalt zu schließen. Üblich sind z.B.:
-
.c C-Quelltexte .o Objekt-Files .s Assemblerquelle .tex LATEX .html .... - Filenamen die mit dem Zeichen . beginnen, haben eine Sonderbedeutung für die Filenamengenerierung und für das Kommando ls
- UNIX-Filestruktur ist hierarchisch in Form eines Baumes aufgebaut
- Der Ausgangspunkt des Baumes ist die Wurzel (root). Sie wird durch das Zeichen / dargestellt.
- Die Wurzel selbst ist ein Verzeichnis-File.
- In der Wurzel sind Verweise auf Files (meist wieder Verzeichnisse) enthalten.
- Der Zugriffspfad gibt an, wie ein File - ausgehend von der Wurzel - erreicht wird.
- Die Namen der dabei durchlaufenen Verzeichnisse werden durch das Zeichen / getrennt.
- Ein Filename kann mehrfach auftreten, jedoch müssen diese Files in verschiedenen Verzeichnissen stehen. Durch den Zugriffpfad wird die Eindeutigkeit hergestellt (siehe /etc/passwd). (Achtung bei Filenamen, die es auch als Kommandoname gibt!)
- Ein vollständiger Pfadname (Zugriffspfad + Filename) darf überall dort stehen, wo auch ein Filename vorkommen kann.
- jeder Pfadname, den man angibt und der nicht mit / beginnt, wird relativer Pfadname genannt und bezieht sich auf das aktuelle Verzeichnis (er ist also relativ zum aktuellen Verzeichnis)
- während der Arbeit mit dem System gibt es immer ein aktuelles Verzeichnis (man sagt auch, daß man sich im aktuellen Verzeichnis befindet)
- Das aktuelle Verzeichnis kann mit dem Kommando cd verändert werden.
- Jeder Nutzer hat ein eigenes (privates) Verzeichnis, das als HOME-Verzeichnis bezeichnet wird. Nach dem Anmelden wird der Nutzer auf dieses Verzeichnis plaziert. Wichtig dabei: aktuelles Verzeichnis = Heimatverzeichnis
- Kommando pwd (print working direcctory)
Anzeigen des aktuellen Verzeichnisses
(noch einmal: der hier angezeigte Pfadname wird automatisch allen vom Nutzer eingegebenen Pfadnamen vorangestellt, die nicht mit / beginnen)- Kommando cd [ pfadname ]
-
- Einstellen des aktuellen Verzeichnisses
Probieren:
cd /bin
pwd
cd /usr/tmp
pwd- gibt man keinen Pfadnamen an, so wird das HOME-Verzeichnis als aktuelles Verzeichnis eingestellt
Probieren:
cd
pwd- es ist möglich, sich im Filesystembaum rückwärts zu bewegen, die Angabe von . . im Pfadnamen bedeutet eine Stufe zurück im Filesystembaum
Probieren:
cd /var/tmp
cd ../lib
Frage: Was wird jetzt durch pwd angezeigt?
- Der Filebaum ist nicht auf ein Gerät begrenzt (wie z.B. im MS-DOS).
- Der Nutzer bewegt sich in dem abstrakten Gebilde "Filebaum", das sich über mehrere Geräte (Platten, Plattenpartition, ...) erstreckt.
- Beim NFS-Einsatz überschreitet der Filebaum auch Rechnergrenzen (für den Nutzer transparent)
- Der Nutzer spürt nicht auf welchem Speichermedium (Rechner) sich die Files befinden.
- Zugriffsrechte
-
- Der Besitzer eines Files kann dafür Zugriffsrechte festlegen.
- Der Besitzer (Eigentümer, Owner) ist derjenige Nutzer, der das File erzeugt hat. Wem dabei das Verzeichnis, in das das File eingetragen wurde, gehört, ist gleichgültig. (Natürlich muß der Erzeuger für das Verzeichnis Schreiberlaubnis besitzen).
- Es werden folgende Zugriffsmöglichkeiten unterschieden:
-
- Lesen (r = read)
- Schreiben (w = write)
- Ausführen (x = execute)
- Das Recht Ausführen (x) bedeutet bei übersetzten und gebundenen Programmen bzw. Kommandoprozeduren die Erlaubnis dieses Programm zu starten. Bei Verzeichnissen zeigt das Recht x an, daß ein Zugriff (Durchsuchen) auf dieses Verzeichnis möglich ist.
- Die genannten Zugriffsrechte können für jedes File für drei Benutzerklassen getrennt festgelegt werden:
-
- Eigentümer (u = login user)
- Benutzer der gleichen Gruppe (g = group)
- alle anderen Benutzer (o = other users)
- Nutzer, die gemeinsam ein Sachgebiet, eine Aufgabe o.ä. bearbeiten, können als Mitglieder einer gemeinsamen Gruppe registriert werden.
- Der Superuser (Hauptnutzer, Systemverwalter) verfügt grundsätzlich über alle Rechte !!! (Nutzerkennzeichen root)
- Nur der Besitzer eines Files oder der Superuser darf den Modus (d.h. die Zugriffsrechte) eines Files verändern!
- Dazu wird das Kommando chmod benutzt.
- Dienste der Shell in Bezug auf Filearbeit
-
- Filenamengenerierung
-
Die Angabe von Pfad- und Filenamen kann vereinfacht werden: Metazeichen * und ?
Das Zeichen * in einem Pfad/Filenamen bedeutet: 0 oder mehrere beliebige Zeichen.
Das Zeichen ? in einem Pfad/Filenamen bedeutet: genau ein beliebiges Zeichen.
Angabe von Zeichenklassen: [c1c2c3]Bedeutung: eines der Zeichen c1, c2 oder c3Angabe von Zeichenbereichen: [c1-c2]Bedeutung: ein Zeichen aus dem Bereich c1 bis c2Die Ersetzung der Metazeichen wird bereits vom Kommandointerpreter (bash, tcsh, ...) vorgenommen.
Dabei werden die beschriebenen Muster durch Filenamen ersetzt, die sich im angegebenen Pfad befinden --> die Shell generiert Namen bereits existierender Files (im Unterschied zu MS-DOS !!). Die Filenamen werden in lexikografischer Reihenfolge erzeugt.
Zur Demonstation der Filenamengenerierung kann folgendes C-Programm benutzt werden (einfachste Version von echo; jeder erkennt, daß im Programm keine Filenamengenerierung erfolgt --> die Shell muß diesen Dienst leisten) :main(argc,argv) int argc; char *argv[]; { int i; i=1; while(--argc) printf("%s\n",argv[i++]); }
Beispiele:
1%a.out abc def g 123
abc
def
g
123
2%a.out *
liefert die Namen aller Files des akt. Verzeichnisses
3%a.out a*
liefert die Namen aller Files des akt. Verzeichnisses, die mit a beginnen
4%a.out *.c
liefert die Namen aller C-Programme, die sich im akt. Verzeichniss befinden
5%a.out ??
liefert die Namen aller Files des akt. Verzeichnisses, die genau zwei Zeichen lang sindDieses Programm kann später nochmals zur Demonstration der Wirkungsweise von Fluchtsymbolen benutzt werden
weitere Beispiele (anhand von vorh. Systemfiles):
6%ls -l /bin/gr*
-rwxr-xr-x 1 bin bin 8260 Aug 18 1989 /bin/grep
7%ls -l /bin/e*o
-rwxr-xr-x 1 bin bin 2888 Aug 17 1989 /bin/echo
8%ls -l /bin/e?o
No match.
9%ls -l /bin/e??o
-rwxr-xr-x 1 bin bin 2888 Aug 17 1989 /bin/echo
10%ls -ld /bin/[ab]*
-rwxr-xr-x 1 bin bin 68890 Aug 18 1989 /bin/acctcom
-rwxr-xr-x 1 bin bin 55996 Aug 16 1989 /bin/adb
-rwxr-xr-x 1 bin bin 31496 May 31 1990 /bin/ar
-r-xr-xr-x 1 bin bin 856 Aug 17 1989 /bin/basename
11%echo /bin/[a-e]*
/bin/acctcom /bin/adb /bin/ar /bin/basename /bin/cat
/bin/cb /bin/cc /bin/chgrp /bin/chmod /bin/chown
/bin/cmp /bin/col /bin/cp /bin/cpio /bin/crypt
/bin/csh /bin/date /bin/dd /bin/df /bin/diff
/bin/dircmp /bin/dirname /bin/du /bin/dump /bin/echo
/bin/ed /bin/expr
12%ls -ld .??*
-rw-r----- 1 thm BX 867 May 3 12:19 .cshrc
-rw-r----- 1 thm BX 163 May 3 16:58 .history
-rw-r----- 1 thm BX 713 May 3 12:26 .login
- Standardfiles und Fileumlenkung
-
Jedes Programm hat zur Ausführungszeit standardmäßig drei Files geöffnetStandardeingabe stdin Standardausgabe stdout Standardfehlerausgabe
(Diagnoseausgabe)stderr Dabei bestehen folgende Zuordnungen:
- stdin ist der Tastatur zugeordnet
- stdout ist dem Bildschirm zugeordnet
- stderr ist dem Bildschirm zugeordnet
- Umlenken von stdin
kommando < pfadname (muß bereits existieren)- Umlenken von stdout
-
kommando > pfadname (wird angelegt, ggf. überschrieben)
kommando >> pfadname (wird fortgeschrieben)In der C-Shell kann durch Setzen der Variable noclobber ein Überschreiben vorhandener Files verboten werden. Soll bei gesetzter noclobber-Variable ein File überschrieben werden --> kommando >! pfadname
- Umlenken von stderr (in der C-Shell)
-
stderr --> stdout
kommando >&pfadnamestdout --> file1
stderr --> file2
(kommando >file1) >&file2
Beispiele:
1%cat > dat1
Das ist ein Text, der mit dem Kommando cat eingetippt
und im File dat1 abgelegt wird
<ctrl-d>
2%cat >> dat1
Diese Zeile wird angefügt
<ctrl-d>
3%cat <dat1 > dat2 dat1 wird kopiert nach dat2
4%cat > dat2
dat2 wird ueberschrieben
<ctrl-d>
- Kommandos zur Filearbeit
-
- Filestatusinformationen und Zugriffsrechte anzeigen
-
Kommando ls
ls [optionen] [pfadname .. ]
- Anzeigen von Filestatusinformationen und Verzeichnisinhalten
-
Filestatus:- Zugriffsrechte (Filemodus)
- Eigentümerangaben (Eigentümer, Gruppe)
- Anzahl der Verzeichniseinträge
- Filegröße (in Bytes)
- Zeiten (letzer Zugriff, letzte Modifikation, letzte Modifikation des Filestatus)
- Filename
- Probieren:
cd
ls
ohne Angabe von Optionen und Parametern wird der Inhalt des aktuellen Verzeichnisses angezeigt
- Probieren:
-
ls -l
zeigt Filestatusinformationen aller Files im aktuellen Verzeichnis an
total 37
-rw-r----- 1 thm urz 14312 May 3 16:57 article.tex
drwxr-xr-x 2 thm urz 512 Apr 12 13:31 binMerke: wird kein pfadname angegeben, so bezieht sich ls immer auf das aktuelle Verzeichnis
- Probieren:
ls /bin
ls -l /bin- Probieren:
ls -R
zeigt ausgehend vom aktuellen Verzeichnis rekursiv den Inhalt aller Unterverzeichnisse an
ls -F
kennzeichnet Filenamen: / Verzeichnis, * ausführbar
ls -x
mehrspaltige Ausgabe, zeilenweise alphabetisch sortiert
ls -a
zeigt unsichtbare Filenamen mit an. Unsichtbare Filenamen beginnen mit einem Punkt und werden im Normalfall nicht angezeigt.- Optionen können kombiniert werden
ls -la
ls -laR
- Ausgeben, Anlegen und Verketten von Files
-
Kommando catkopiert stdin nach stdout
- Ausgeben
cat </etc/passwd
oder
cat /etc/passwd
kopiert die angegebenen Files oder (falls keine Files angegeben wurden) die Standardeingabe stdin in die Standardausgabe stdout- Anlegen
cat >file1
Es war einmal und ist nicht mehr
<ctrl-d>
cat >file2
ein ausgestopfter Teddybär.
<ctrl-d>- Verketten
cat file1 file2
cat file1 file2 >file3
cat file3
- Anzeigen von Fileinhalten
-
Es existieren eine Reihe von Kommandos, die dem Anzeigen von Fileinhalten dienen. Bereits bekannt: cat. Darüberhinaus gibt es in verschiedenen UNIX-Systemen eine Reihe von Kommandos, die dem Anzeigen von Files dienen (more, less, pg, head, tail, ...). Obwohl diese Kommandos einige funktionelle Unterschiede aufweisen, dienen sie letztlich alle dem Ziel, Files (oder allgemeiner Texte) in irgendeiner Weise komfortabler anzuzeigen als mit cat. Hier soll nur auf less eingegangen werden. Im Zusammenhang mit less ist ein weiterer wesentlicher Mechanismus des Kommandointerpreters (bash, tcsh, ...) bedeutungsvoll: Pipes
(Pipes und Filter werden später ausführlich behandelt)
Kommando less
less [optionen] [file ...]- seitenweises Anzeigen der Files file ... bzw. von stdin am Bildschirm.
- sehr komfortabel
- nach dem Aufruf zeigt less die ersten n Zeilen (n=Anzahl der Zeilen auf dem Bildschirm-1) an und schreibt auf die letzte Bildschirmzeile das Zeichen :
- less erwartet dann die Eingabe von eigenen Kommandos (Liste ist unvollständig)
-
- blättern:
vorwärts: Leertaste
rückwärts: b
letzte Seite: G
erste Seite: g
zeilenweise: <return>- Textsuche:
vorwärts: /text sucht nächstes Auftreten von text
rückwärts: ?text (analog)- weitere Kommandos
nächstes File bearbeiten: :n
vorheriges File bearbeiten: :p
Hilfe anfordern: h
Arbeit beenden: q oder Q
- Der Pipe-Mechanismus als spezielle Form der Fileumlenkung ermöglicht die Umlenkung der Standardausgabe eines Kommandos in die Standardeingabe eines anderen Kommandos:
cmd1 | cmd1
Die von cmd1 in die Standardausgabe geschriebenen Daten werden durch eine sog. Pipe der Standardeingabe von cmd2 zugeführt.
Probieren:
ls -l /bin | less
less liest (da kein File angegeben ist) seine Standardeingabe. Diese wiederum ist so umgelenkt, daß sie die von ls -l /bin erzeugten Ausgaben erhält. Dabei werden die Kommandos ls und less tatsächlich gleichzeitig abgearbeitet.
- Kopieren von Files
-
- eine Möglichkeit ist bereits bekannt, welche?
cat file1 >file1.kopie- Kommando cp
-
- cp source dest
source ist der (Pfad-)Name eines bereits existierenden Files und dest ist der (Pfad-)Name eines neuen Files
Voraussetzungen sind Schreibrecht im Verzeichnis des neu anzulegenden Files dest und Suchrecht für alle Verzeichnisse, die in dest angegeben wurden, weiterhin Suchrecht für alle Verzeichnisse, die in source angegeben wurden sowie Leserecht für das zu kopierende File source
Achtung: dest wird ggf. überschrieben, ausschlaggebend sind dafür nicht die Rechte für ein evtl. existierendes File dest sondern Schreibrecht im Verzeichnis von dest- cp source destdir
source ist der (Pfad-)Name eines bereits existierenden Files und destdir ist der (Pfad-)Name eines bereits existierenden Verzeichnisses. Das File source wird unter gleichem Namen in das Verzeichnis destdir kopiert.
Voraussetzungen: vgl. oben- cp source1 [source2 ... ] destdir
sourcei sind die (Pfad-)Namen bereits existierender Files und destdir ist der (Pfad-)Name eines bereits existierenden Verzeichnisses. Die Files sourcei werden unter gleichem Namen in das Verzeichnis destdir kopiert.
Voraussetzungen: vgl. oben
- Umbenennen und Verschieben von Files
-
Kommando mv- mv [-f] source dest
source ist der (Pfad-)Name eines bereits existierenden Files und dest ist der neue (Pfad-)Name dieses Files
Voraussetzungen sind Schreibrecht im Verzeichnis des neu anzulegenden Files dest und Suchrecht für alle Verzeichnisse, die in dest angegeben wurden, weiterhin Schreibrecht im Verzeichnis des umzubenennenden Files source, Suchrecht für alle Verzeichnisse, die in source angegeben wurden sowie Leserecht für das umzubennende File source
Achtung: Existiert bereits ein File mit dem Namen dest, so wird es stillschweigend überschrieben, wenn Schreibrecht für dieses File besteht. Ist das Schreibrecht für dieses File nicht gewährt, so gibt mv einen entsprechenden Hinweis und fragt, ob das File überschrieben werden soll. In diesem Fall bestätigt jede mit y beginnende Anwort das Überschreiben. Die Option -f (force) beeinflußt diese Arbeitsweise: Bei Angabe der Option unterbleibt der Hinweis und die entsprechende Frage und das File wird ungefragt überschrieben.- mv [-f] source destdir
source ist der (Pfad-)Name eines bereits existierenden Files und destdir ist der (Pfad-)Name eines bereits existierenden Verzeichnisses. Das File source wird unter gleichem Namen in das Verzeichnis destdir gebracht.
Voraussetzungen: vgl. oben- mv [-f] source1 [source2 ... ] destdir
sourcei sind die (Pfad-)Namen bereits existierender Files und destdir ist der (Pfad-)Name eines bereits existierenden Verzeichnisses. Die Files sourcei werden unter gleichem Namen in das Verzeichnis destdir gebracht.
Voraussetzungen: vgl. oben
- Löschen von Files
-
Kommando rmrm [optionen] file ...
löscht die angegebenen File(s) mit den (Pfad-)Namen file ..., es gibt KEINE Möglichkeit, einmal gelöschte Files wieder herzustellen! (rm ist ein typisches UNIX-Kommando, es fragt nichts sondern handelt!)
Achtung: rm erfordert Schreibrecht im Verzeichnis des zu löschenden Files file aber nicht für das File selbst! D.h. es ist auch völlig egal, wer Eigentümer des Files ist, Schreibrecht zum Verzeichnis reicht aus!
Weiterhin ist Suchrecht für alle in file angegebenen Verzeichnisse erfolderlich.
Optionen:- -i
- interactive mode
vor dem Löschen fragt rm, ob das jeweilige File tatsächlich gelöscht werden soll. Jede mit y beginnende Eingabe wird als Bestätigung aufgefaßt.- -r
- löscht rekursiv alle Unterverzeichnisse und deren Inhalt
- -f
- vgl. mv, weiterhin werden Fehlermeldungen bzgl. nicht existierender Files unterdrückt.
cd
rm -fr .??* # Bitte nicht probieren!
- Einrichten von Verzeichnissen
-
Kommando mkdir
mkdir dir ...
dir ist der (Pfad-)Name eines anzulegenden Verzeichnisses. In jedem anzulegenden Verzeichnis richtet mkdir die Einträge . und . . ein.
Voraussetzung: Schreibrecht im Verzeichnis des anzulegenden Verzeichnisses dir und Suchrecht in allen in dir angegebenen Verzeichnissen.
- Entfernen von Verzeichnissen
-
Kommando rmdirrmdir dir ...
dir ist der (Pfad-)Name eines zu entfernenden Verzeichnisses.
Voraussetzung: Schreibrecht im Verzeichnis des zu entfernenden Verzeichnisses dir und Suchrecht in allen in dir angegebenen Verzeichnissen. Das Verzeichnis dir muß leer sein.
- Ändern von Filestatusinformationen
-
- Filemodus ändern
-
Kommando chmodchmod mode file ...
- mode: absolut oder symbolisch
- absolute mode-Angabe:
-
4000 set user-id on execution 2000 set group-id on execution 1000 sticky-Bit 0400 Lesen für Eigentümer 0200 Schreiben für Eigentümer 0100 Ausführen bzw. Durchsuchen für Eigentümer 0040 Lesen für alle Gruppenmitglieder 0020 Schreiben für alle Gruppenmitglieder 0010 Ausführen bzw. Durchsuchen für alle Gruppenmitglieder 0004 Lesen für alle anderen Nutzer 0002 Schreiben für alle anderen Nutzer 0001 Ausführen bzw. Durchsuchen für alle anderen Nutzer Addition dieser Werte in den einzelnen Positionen kombiniert die Rechte
Beispiel: 0600 --> Lesen und Schreiben für Eigentümer - symbolische mode-Angabe:
-
[who] op perm [op perm] ... , ...- who:
- wessen Rechte sollen modifiziert werden
u - Eigentümer (user)
g - Gruppe (group)
o - Andere (other)
a - alle (all) Abkürzumg für ugo
fehlt die Angabe von who, wird a angenommen- op:
- wie sollen die Rechte modifiziert werden
+ - hinzufügen
- - entfernen
= - setzen/überschreiben- perm:
- welche Rechte sollen modifiziert werden
r - Lesen
w - Schreiben
x - Ausführen/Durchsuchen
s - set uid / set gid (u=s / g=s)
u - neue Zugriffsrechte so wie die des Eigentümers (Bsp.: g=u)
g - neue Zugriffsrechte so wie die der Gruppe (Bsp.: o=g)
o - neue Zugriffsrechte so wie die der anderen Nutzer (Bsp.: u=o)
- Beispiele:
chmod o-w file
entfernt Schreibberechtigung für andere Nutzer für das File file
chmod +x file
fügt für alle Nutzer das Ausführungs-/Durchsuchungsrecht hinzu
chmod u+r,g+r-w,o-rwx file
gibt Eigentümer Leserecht, gibt Gruppe Leserecht und entfernt Schreibrecht, löscht alle Rechte der anderen Nutzer- Nur der Eigentümer oder der Superuser darf Zugriffsrecht ändern!
- mode: absolut oder symbolisch
- Automatische Vergabe von Zugriffsrechten
-
Jedes Programm, welches ein File anlegt, vergibt dabei Zugriffsrechte für dieses File (Bsp. vi, cc, ...). Mit Hilfe des Kommandos umask kann man die automatische Vergabe von Zugriffsrechten beeinflussen:umask ooo
ooo - Oktalziffern, deren Wert wird beim Erzeugen eines Files von den Standardzugriffsrechten subtrahiert
Beispiele:
0777 (umask 022) --> 0755
0666 (umask 026) --> 0640
umask ohne Argumente zeigt die gerade eingestellte Maske an
- Ändern des Fileeigentümers
-
Kommando chown
chown owner file ...
setzt für alle angegebenen Files file ... den Nutzer owner als Eigentümer ein.
owner: Nutzerkennzeichen (login-Name, /etc/passwd) oder dezimale Nutzer-ID (uid)
chown löscht das set-uid-Bit, außer wenn Superuser chown ruft
Nur der Eigentümer und der Superuser können den Eigentümer ändern! (System V)
Nach chown ist man nicht mehr Besitzer des Files und kann demzufolge auch nicht mehr chmod, chown, chgrp für dieses File aufrufen.
- Nutzergruppe ändern
-
Kommando chgrp
chgrp group file ...
setzt für alle angegebenen Files file ... die Gruppe group als priviligierte Nutzergruppe ein.
group: Gruppenkennzeichen (/etc/group) oder dezimale Gruppen-ID (gid)
chgrp löscht das set-gid-Bit, außer wenn Superuser chgrp ruft
Nur der Eigentümer und der Superuser können die Nutzergruppe ändern!
- Einrichten zusätzlicher Verzeichniseinträge
-
- Alle Files werden über (Pfad-)Namen angesprochen. In der Regel gibt es für ein File auch nur einen (Pfad-)Namen. Es ist möglich, für ein File mehrere (Pfad-)Namen anzugeben. Jeder (Pfad-)Name entspricht einem Verzeichniseintrag.
- Kommando ln
-
- ln [-f] [-s] file newfile
-
richtet für das bestehende File file den neuen Verzeichniseintrag newfile ein
beide Namen sind gleichberechtigt (überprüfen mit ls -l file newfile)
Voraussetzungen sind Schreibrecht im Verzeichnis des neu anzulegenden Verzeichniseintrags newfile und Suchrecht für alle Verzeichnisse, die in newfile angegeben wurden, weiterhin Suchrecht für alle Verzeichnisse, die in file angegeben wurden.
Achtung: Existiert bereits ein File mit dem Namen newfile, so wird es stillschweigend gelöscht (genauer: es wird sein Verzeichniseintrag entfernt), wenn Schreibrecht für dieses File besteht. Ist das Schreibrecht für dieses File nicht gewährt, so gibt ln einen entsprechenden Hinweis und fragt, ob das File gelöscht werden soll. In diesem Fall bestätigt jede mit y beginnende Antwort das Löschen. Die Option -f beeinflußt diese Arbeitsweise: Bei Angabe der Option unterbleibt der Hinweis und das File wird ungefragt gelöscht.Man unterscheidet sog. hard links und symbolische links. Standardmäßig richtet ln hard links ein. Die Option -s bewirkt das Einrichten eines symbolischen links. Wesentlichster Unterschied: hard links funktionieren nur innerhalb eines Filesystems während symbolische links auch über Filesystemgrenzen hinweg funktionieren. Symbolische Links sind auch zu erkennen (ls -l).
- ln [-f] [-s] file1 [file2 ... ] destdir
für die existierenden Files filei werden weitere Verzeichniseinträge im Verzeichnis destdir mit den gleichen Namen eingerichtet
Voraussetzungen und Optionen vgl. oben
Interna eines Filesystems
- Überblick über ein Filesystem
-
- UNIX verwaltet seine Daten auf sogenannten Block-E/A-Geräten (block devices). Wir sprechen hier der Einfachheit halber von Platten, obwohl die konkrete Geräteauswahl für unsere Betrachtungen unwesentlich ist - wichtig ist nur Blockorientierung (uninteressant ist, ob wir physikalische Platten, Teile davon, Teile mehrerer Platten als Einheit, lokal oder remote betrachten).
- Der Systemkern arbeitet auf logischer Ebene mit dem Filesystem (FS) anstelle direkt mit der Platte (die Zuordnung realisiert der spezielle Gerätetreiber der Platte). Jedes Filesystem wird dabei als logisches Gerät betrachtet und über eine logische Gerätenummer (block device number) identifiziert. Mit Gerät ist im weiteren ein logisches Gerät gemeint. (Ein physisches Gerät kann somit über mehrere log. Gerätenummern adressiert werden.)
- Ein Filesystem besteht immer aus einer Folge gleichgroßer Datenblöcke (i.allg. der Längen 512B, 1KB, ..., 8KB), in verschiedenen Filesystemen kann die Blockgröße unterschiedlich sein.
- Große Blöcke verbessern die Übertragungsgeschwindigkeit zwischen Platte und Rechner, verschwenden aber in der Regel mehr Platz - im BSD-Filesystem sind daher sogenannte Fragmente eingeführt worden ...
Der Einfachheit halber werden wir bei den weiteren Betrachtungen Blöcke der Größe 1 Kilobyte verwenden, bei einer konkreten Implementation ist die verwendete Blockgröße i.allg. bekannt.- Ein Filesystem in UNIX hat folgenden grundsätzlichen Aufbau:
-
Bootblock - Superblock - Inodeliste - Datenblöcke- Bootblock: er ist in der Regel der 1.Block eines Filesystems und enthält den Code für das Bootstrapping (s. Kap. Start-Stop)
- Superblock: er beschreibt den Aufbau des Filesystems: seine Größe, wieviel Daten aufgenommen werden können, wieviel Platz noch frei ist und weitere Informationen
- Inodeliste: sie folgt dem Superblock, ihre Größe kann beim Anlegen eines Filesystems konfiguriert werden (i.allg. Standardannahmen); Inodes beschreiben die Daten dieses Filesystems, die Inode-Nummer ist ein Index in die Inodeliste, der erste Inode wird als Wurzel-Inode bezeichnet - über ihn erfolgt der Zugriff auf die Hierarchie des Filesystems (mount)
- Datenblöcke: sie beginnen am Ende der Inodeliste und enthalten sowohl gewöhnliche Daten als auch spezielle Informationen zur FS-Organisation (Verzeichnisse, Indirektblöcke)
- Aufbau eines Filesystems
-
Die folgenden Ausführungen sollen einen groben Überblick über die Funktionsweise von Filesystemen geben. Genauere Informationen sind in der Literatur nachzulesen (Empfehlung: M.J.Bach, ``The Design of the UNIX Operating System``, Prentice Hall, 1986) Ein Filesystems stellt eine logische Abbildung eines physikalischen Gerätes dar. Im weiteren wird der Begriff Platte immer als Synonym für ein Filesystem auf einem externen Medium benutzt. Die zentrale Rolle für den Zugriff spielen die Inodes, die die Speicherung der Daten auf Platte beschreiben. Der Superblock beschreibt die Struktur des Filesystems in Form seiner Inodes und Freiblöcke
- Inodes:
-
Inodes dienen sowohl der Beschreibung von Files auf Platten, als auch der Files im Speicher, die geöffnet wurden. Beide Inodes sind in ihrer Form unterschiedlich. Ein Platten-Inode enthält zunächst nur die Informationen, die für ein zu speicherndes File notwendig sind:Typ: normales File, Verzeichnis, Gerät (mode)
Größe: in Bytes (vom Typ "signed int" --> max. Filegröße <= 2GB)
Eigentümer: (uid)
Gruppe: (gid)
Anzahl der Inodeverweise (nlink)
Datum des letzten Zugriffs (atime)
Datum der letzten Modifikation (mtime)
Datum der Fileerzeugung (ctime)
13 Zeiger auf Datenblöcke: (Größen unter Annahme 1K Blöcke)
10 Zeiger Direktadressen: 10 KB
1 Zeiger auf einfache Indirektadr. block: 256 KB
1 Zeiger auf zweifach indirektadr. block: 64 MB
1 Zeiger auf dreifach Indirektadressen block: 16 GB
--> max. Filegröße: 17 247 250 432 BytesDie Struktur ist in Headerfiles der Kerns beschrieben (siehe /usr/include)
Im Speicher sind darüberhinaus weitere Informationen notwendig zur Kettung der Inodes, der Verwendung durch verschiedene Prozesse usw.
Der Zugriff uf Inodes erfolgt ähnlich wie auf Datenblöcke über die Angabe einer Inode-Nr. (vgl. ls -i). In einen Plattenblock passen mehrere Inodes, d.h. beim Einlesen eines Inode-Blocks werden immer mehrere Platten-Inodes gelesen. Aus dem eingelesenen Inode-Block werden die benötigten Daten des Platten-Inodes zur Erstellung des Speicher-Inodes extrahiert.
Während des Zugriffs auf Speicher-Inodes werden diese gesperrt, sodaß unerwünschte Parallelzugriffe vermieden werden. Zusätzlich wird bei jedem open auf das betreffende File der Referenzzähler (i_count) um 1 erhöht.
Handelt es sich nicht um Inodes für gewöhnliche Files, dann besitzen diese andere Inhalte (z.B. bei Gerätefiles).
- gewöhnliche Files:
-
Nach der Inode-Liste wird der Rest des Filesystems für die eigentlichen Datenblöcke verwendet. Dabei können Datenblöcke für spezielle Zwecke (Indirektblöcke) oder spezielle Files (Pipes) verwendet werden. Die gewöhnlichen Files werden über die Plattenadressen im Inode gefunden. Dabei werden die Blöcke des Filesystems völlig willkürlich vergeben.Der Zugriff zu Files erfolgt über den Offset eines Files: daraus wird durch Division durch die Blockgröße die Blocknummer ermittelt und der Block in den Puffer des Kerns gelesen (bzw. umgekehrt). Die realen Plattenadressen ergeben sich aus den Adressen im Inode bzw. den zugeordneten Indirektblöcken.
Wichtig ist, daß Files Lücken besitzen können (lseek); in diesem Fall ist als Blockadresse im Inode eine 0 eingetragen (Block 0 = Bootblock).
Der Zugriff auf sehr große Files über die 3-fach-Indizierung ist aufwendig.
In BSD-Implementationen wurden verschiedene Erweiterungen dieser beschriebenen Grundprinzipien vorgenommen. So unter anderem größere Blöcke bis zu 8K. Wegen des größeren Platzverlustes wurden diese unterteilt in Fragmente (je 1K). In einem Inode-Block können bereits die ersten Daten des zugehörigen Files gespeichert werden.
- Verzeichnisse:
-
Verzeichnisse sind zunächst gewöhnliche Files mit einer Inode-Nummer, die aber eine bestimmte Struktur besitzen. Sie bestehen aus Einträgen, die jeweils eine Inode-Nummer und einen Filenamen beinhalten.Pfadnamen bestehen aus einer Folge von Verzeichnisnamen, z.B. /usr/fs1/filename1, mit denen die UNIX-Verzeichnis-Hierarchie aufgebaut wird. Jede Komponente außer der letzten zeigt dabei auf einen Verzeichnisblock. Jeder Verzeichnisblock beinhaltet (ähnlich wie bei Inode-Blöcken) mehrere Verzeichniseinträge.
In klassischen UNIX-Systemen waren Filenamen auf 14 Zeichen beschränkt und die Inode-Nummer auf eine 16-Bit-Größe. Damit war jeder Eintrag 16 Byte lang.
Um ein File im Filesystem zu finden, müssen nacheinander alle Komponenten des Pfadnamen durchsucht werden (Blöcke sind häufig im Puffer-Cache), auf Gültigkeit überprüft werden und schließlich die Inode-Nummer des gesuchten Files ermittelt werden, die zum Eröffnen des Files notwendig ist.
Jedes Filesystem besitzt einen ``Wurzel-Inode``, der i.allg. die Nummer 2 hat und das Wurzelverzeichnis dieser Platte beinhaltet (s.u. mount).
Jeder Verzeichniseintrag enthält zwei Einträge ``.`` und ``..``. Diese verweisen auf die Inodes aktueller und übergeordneter Verzeichnisse und sind immer die beiden ersten Einträge eines Verzeichnisblockes.
Werden Files gelöscht, bleiben die Verzeichniseinträge erhalten. Als Inode-Nummer wird 0 eingetragen (Block 0 gibt es nicht - Bootblock). Erst wenn das Verzeichnis gelöscht wird, verschwinden die Datenblöcke. Freie Einträge werden aber beim Anlegen neuer Files wieder vergeben (möglich, da gleiche Länge).
Das Schreiben von Verzeichnisblöcken ist in der Regel nur dem Kern erlaubt, damit wird die korrekte Struktur des Filesystems gesichert. Die Zugriffsrechte von Verzeichnissen besitzen andere Bedeutung als bei gewöhnlichen Files.
Im BSD wird mit längeren Filenamen gearbeitet. Dazu ist eine andere Struktur der Verzeichniseinträge notwendig. Die Inode-Nummer wird in modernen Systemen als 32-Bit-Zahl dargestellt und der Filename über einen Verweis dargestellt ...
(Literaturempfehlung: Leffler, S.J./McKusick M.K.: ``The Design and Implementation of the 4.3BSD Unix System``, Addison-Wesley, 1991)
- der Superblock:
-
Zum Zuordnen von Inodes und Datenblöcken müssen die Struktur und Verteilung des Filesystems beschrieben sein. Dazu dient der Superblock, der folgende Informationen enthält:- Größe des Filesystems in Blöcken (fsize)
- Anzahl der freien Blöcke
- Liste freier Datenblöcke
- Anzahl von Inodeblöcken (isize)
- Liste freier Inodes
- ...(s. struct filsys)
- Änderungsdatum
- Name des Filesystems (fname)
- Zugriffsbit für KonsistenzprüfungDer Superblock ist in einem Headerfile des Systems beschrieben. Der Kern nutzt verschiedene Algorithmen zum Zuordnen von Inode- bzw. Datenblöcken, die in der Literatur ausführlich beschrieben sind.
Der Superblock ist das Bindeglied für den Zugriff auf Filesysteme, er identifiziert das FS und beschreibt seinen Zustand.
- sonstige Filetypen:
-
In Inodes können andere Filetypen als bisher spezifiziert sein. Je nach dem Typ können sich dabei die Angaben der Inodes ändern.Bei sogenannten Gerätefiles (special files) enthält die Inode keine Blockadressen, sondern an deren Stelle die Gerätenummer (major und minor Nummer)
- Files und Inodes
-
- Wie organisiert UNIX den Zugriff auf ein File, wenn wir ein beliebiges Kommando aufrufen ?
- Die interne Darstellung eines Files erfolgt über eine sogenannte Inode (index node), die die physikalische Position der Daten auf der Platte (Speicherplatz), Benutzerinformationen, Zugriffsrechte, Zeitangaben usw. für das betreffende File beschreibt.
- Jedes File besitzt genau eine Inode, kann aber mehrere Namen haben, sogenannte Link's (Verweise), die alle auf ein und dieselbe Inode zeigen.
- der Zugriff auf ein File erfolgt immer über seine Inode;
mit dem Kommandos ls -i werden die Inode-Nummern der Files angezeigt, d.h. sie sind gemeinsam mit dem Filenamen im Verzeichnis abgelegt;
soll auf ein File zugegriffen werden, so muß dieses File zunächst geöffnet werden:
fd = open(``/home/urz/fs2/meier/myfile``,1);
Der Systemkern überprüft den Pfadnamen Stück für Stück auf Zugriffsrechte und ermittelt schließlich die Inode-Nr. für myfile. Soll das File neu angelegt werden, so wird eine neue Inode erzeugt. Die Inodes der Files werden auch im Filesystem (auf Platte) gespeichert.- Beim Zugriff auf ein File wird zunächst die Inode eingelesen und in einer internen Inodetabelle gespeichert, die der Systemkern verwaltet.
- Der Kern verwaltet noch zwei weitere Tabellen:
-
- Filetabelle: eine globale Struktur des Kerns, die Einträge für alle geöffneten Files des Systems enthält
- Filedeskriptorentabelle: diese Tabelle wird jedem Prozeß zugeordnet; sie enthält einen Eintrag für jedes geöffnete File des Prozesses
- Wird mit open oder creat auf ein File zugegriffen, so erzeugt der Systemkern einen Eintrag in allen 3 Tabellen; der Eintrag in der Filedeskriptorentabelle verweist auf die Filetabelle, der Eintrag in der Filetabelle beschreibt den Zustand des Files (Offset, Zugriffsberechtigung), der Eintrag in der Inodetabelle beschreibt schließlich den Zustand des Files im Filesystem:
- Der Filedeskriptor ist ein einfacher Index in die Filedeskriptorentabelle und wird als Ergebnis von open und creat zurückgeliefert. Bei Zugriffen auf das File mittels read und write wird über diesen Deskriptor die Verbindung zu den Daten den Files (über den Inode) hergestellt.
- diese Art der Organisation bietet viele Möglichkeiten eines gemeinsamen Zugriffs auf ein File.
- Montieren eines Filesystems
-
mount, umount- Mounten eines FS
-
- mount-Systemruf ist im Gegensatz zu vielen anderen Systemrufen nicht standardisiert
- mount ist Einfügen eines Filesystems in bestehende Verzeichnisstruktur an einer beliebiebigen Stelle (außer /)
- man erkennt an einem Verzeichnis nicht, in welchem FS es liegt
- mount geschieht durch Modifikation der Informationen des Verzeichnis-Inodes im Speicher; daraus ergeben sich auch die Zugriffsrechte für das Verzeichnis nach mount.
- Verzeichnis sollte leer sein; Daten werden nicht gelöscht, sind aber trotzdem nicht verfügbar, solange Platte gemountet; d.h. bei nichtleeren Verz. Platzverschwendung
- mount-Kommando
-
/etc/mount zeigt bereits gemountete FS an (kann jeder)/etc/mount /dev/diskx /home/dir [-r]
weist Partition diskx unter Verzeichnis /home/dir zu (darf nur root). Danach wird auf die Daten der Platte durch alle Files zugegriffen, deren Pfadnamen mit /home/dir/... beginnen.
/dev/diskx muß ein Blockdevice sein (FS !), sonst kann mount keine Zuordnung ausführen.
Es wird ein Eintrag im File /etc/mnttab realisiert, der zur Anzeige gemounteter FS benötigt wird.
- mount über FS-Tabelle
-
Die wachsende Anzahl von Filesystemen in einem UNIX-System machte einzelnes mounten aller FS aufwendig --> es wurde eine Tabelle der zu mountenden FS angelegt: /etc/fstab bzw. /etc/vfstab - umount
-
umount directory
umount special
- Konsistenzprüfung
-
von Filesystemen- Konsistenz eines Filesystems
-
Verschiedene Fehlersituationen können bewirken, daß die Informationen eines Filesystems nicht mehr stimmen. Folgende typische Fehlersituationen können dabei auftreten:- a)
- ein Datenblock ist mehreren Files zugeordnet
- b)
- Blöcke sind als frei markiert, aber zugewiesen und umgekehrt
- c)
- falsche Linkverweise in Inodes
- d)
- Unterschiede zwischen Größenangaben in Inodes und Datenblöcken
- e)
- falsche Blocknummern zu Files zugeordnet
- f)
- falsche Daten in Datenblöcken
- g)
- Inodes ohne Verzeichniseintrag (lost files: lost+found)
- h)
- falsche oder nicht zugewiesene Inode-Nummern in Verzeichnissen
- bei diesen Situationen spricht man von einem inkonsistenten FS; sie treten vor allem auf bei:
-
- Hardware-Fehlern
- undefinierten Systemabstürzen (Hauptproblem !)
- das Kommando fsck [options] fs-special-name prüft solche Fehlersituationen; als options können angegeben werden:
-
- -y Antwort ``yes`` auf alle Anfragen
- -p automatische Reparatur aller unkritischen Fehler (BSD; V.4)
- -b nn verwende alternativen Superblock (BSD; V.4)
- usw. vgl. manual (V.3)
- Bei der Prüfung der FS dürfen diese nicht gemountet sein !
- Während Systeminitialisierung wird Konsistenz aller FS überprüft; jedoch nicht, wenn durch ein clean-Flag im Superblock das ordnungsgemäße entmounten festgehalten wurde
-
Die Überprüfung der Konsistenz erfolgt in den rc-Files vor dem mounten der FS, in BSD-Systemen wird ggf. über /etc/fstab die Reihenfolge der zu prüfenden FS festgelegt (vgl. Abschnitt ,mount-fstab)Eine besondere Rolle spielt root-FS; es kann nicht entmountet werden für fsck. Wenn es korrupt ist, dann muß entweder ein spezielles reboot -n (BSD) erfolgen oder neu gemountet werden (System V) (erfolgt bei init automatisch)
- es gibt weitere Kommandos, mit denen man Zustände von FS prüfen bzw. modifizieren kann, z.B.:
-
- icheck: prüft Inode/Blockkonsistenz, kann für konkrete Blöcke zugehörige Inodes suchen:
icheck -b 1234 /dev/sd0a # sucht Inode für Block 1234- ncheck: sucht Filename zu Inode-Nummern (nach icheck)
ncheck -i 468 /dev/sd0a # sucht File zu Inode 468- fsdb: FS Debugger, kompliziert, VORSICHT
- Superuser
-
- Superuser: privilegierter Nutzer (root mit unbeschränktem Zugriff auf alle Files und Kommandos
- viele (nicht alle) Administrationsaufgaben erfordern den Superuser-Status
Wie wird man Superuser?- login als root oder Kommando su
- Eingabe des Superuser-Passwortes: Promptzeichen #
- BSD: nur Nutzer, die Mitglied der Gruppe wheel (GID 0) sind, können mittels su zu root wechseln
- SunOS: falls wheel in /etc/group eine leere Nutzerliste besitzt, kann jeder Nutzer mittels su zu root wechseln
- Hinweise:
-
- nur wenige ausgewählte, erfahrene Nutzer sollten die Erlaubnis haben, als root zu arbeiten
- Superuser-Status nur dann benutzen, wenn unbedingt benötigt
- root-Account muß Passwort besitzen, es sollte periodisch geändert werden
- Passwort-Änderung auch dann, wenn
-
- Verdacht besteht, daß ein unberechtigter Nutzer das Passwort kennt
- einem (sonst nicht authorisierten) Nutzer aus triftigen Gründen das Passwort mitgeteilt werden mußte
- Passwort-änderung mittels Kommando passwd
![]() |
Zur Homepage des URZ D.Grunewald, Christoph Ziegler, letzte Überarbeitung 19.Februar 1999 |