|
Das Dateisystem
Struktur und ZugriffsrechteDas Dateisystem ist hierarchisch strukturiert in Form eines (umgedrehten)Baumes.
Da Unix ein Multiuser-System ist, muß der Zugriff auf einzelne Dateien undVerzeichnisse vom System schon so geregelt werden, daß kein Benutzer dieDaten der anderen Benutzer manipulieren oder vertrauliche Daten unbefugterweise
einsehen kann. Das wird dadurch gewährleistet, daß jede Datei und
jedes Verzeichnis einen Besitzer (Owner) hat, und dieser Besitzer kann
mit Hilfe bestimmter Befehle festlegen, welcher der anderen Benutzer auf welche
Weise auf seine Dateien zugreifen darf. Die meisten Dateien und Verzeichnisse
in einem Unix-System gehören natuergemäß dem Systemverwalter
(der den Usernamen "root" trägt) und jeder Benutzer kann auf diese Dateien
lesend zugreifen, sie aber nicht verändern (zu dieser Art von Dateien
gehören zum Beispiel alle Anwendungsprogramme, die das System zur
Verfügung stellt).
Man unterscheidet grob drei Dateitypen (weitere Typen weiter unten):
- Normale Dateien (normal files)
- Dateien im üblichen Sinn: Text- oder Binärdateien
- Das System unterstützt keine Dateistruktur (keine Datei-Header)
- Dateien sind Bytefolgen (Strukturierung nur durch das Programm)
- Zugriffsarten:
- sequentiell
- random access (Bytepositionierung)
- Verzeichnisse (directories)
- Strukturierung des Dateisystems
- Zugriff auf normale Dateien auch über mehrere Namen
- Verzeichnisse werden auf der Platte wie Dateien gespeichert
- Spezialdateien (special files)
- E/A-Geräte werden als Spezialdatei eingetragen
- Zugriff auf Gerät <--> Zugriff auf eine Datei
- gleicher Schutzmechanismus wie für normale Dateien
- es gibt blockorientierte und zeichenorientierte Geräte
- Platte /dev/hda1
- Drucker /dev/lp
- Speicher /dev/mem
- Terminal /dev/tty
Unix arbeitet mit einem Filesystem, das auf den ersten Blick dem von DOS sehr
ähnlich ist (nur auf den ersten). Also gibt es eine Baumstruktur von
verschiedenen Verzeichnissen (Directories), in der sich jede Datei irgendwo
befindet. Beachten Sie aber, daß ein Directory beim Anzeigen zunächst
genauso aussieht, wie eine Datei!. Die einzelnen Verzeichnisnamen werden
durch normale Schrägstriche ('/') getrennt, NICHT durch Backslashes
('\') wie bei DOS/Windows!
Nach dem Einloggen landen Sie in Ihrem sogenannten Homedirectory (Meist '/home/username').
Es gehört Ihnen ganz alleine, damit können Sie machen, was Sie wollen.
Zum Beispiel können Sie dort Dateien oder weitere Verzeichnisse anlegen. An
dieser Stelle gleich einige wichtige Punkte:
- Dateinamen
- Dateinamen können bei Unix aus Groß und Kleinbuchstaben
bestehen, wobei die unterschiedliche Schreibweise auch unterschiedliche
Dateinamen bezeichnet. Die Datei 'test' ist also eine andere als 'Test' oder
gar 'TEST'.
- Dateilisten
- Wo Dateieingaben erwartet werden, können in der Regel beliebig
viele Dateinamen stehen.
- Sonderzeichen
- Dateinamen können ausser dem '/' so ziemlich alle Zeichen
enthalten. Auch Leerzeichen oder Steuerzeichen.
Pfadnamen
Dateien werden über ihren Pfad spezifiziert: Angabe von Verzeichnissen
und zum Schluß des Namens, getrennt durch Schrägstrich.
Das aktuelle Verzeichnis ist immer jenes, dessen Inhalt wir
gerade bearbeiten. Das aktuelle Verzeichnis
läßt sich jederzeit wechseln, aber ein Verzeichnis ist zu einem
bestimmten Zeitpunkt immer das aktuelle und alle unsere Kommandos beziehen
sich dann auf dieses eine, aktuelle, Verzeichnis.
Eine besondere Erwähnung verdienen die beiden Verzeichnis-Einträge
"." und "..". Das sind Stellvertreter für Verzeichnisnamen, die man statt der
realen Namen (abkürzend) benutzen kann. Und zwar bezeichnet "." das
jeweils aktuelle Verzeichnis, und ".." das dem aktuellen Verzeichnis
übergeordnete Verzeichnis.
Schutzmechanismen
- Jeder UNIX-Benutzer hat eine Benutzerkennung (user id, kurz: uid)
mit der er sich gegenüber dem BS identifizieren kann.
- Jeder UNIX-Benutzer gehört einer Gruppe an und besitzt damit
eine Gruppen-ID, kurz:gid)
- Jede Datei hat einen Eigentümer und eine Gruppe, die bei der
Erzeugung der Datei eingetragen werden
- Jeder Benutzer kann seine Dateien explizit einem anderen Benutzer
(bzw. einer anderen Gruppe) "schenken".
- Jede Datei besitzt 12 voneinander unabhängige Schutzbits
Bedeutung der drei Schutzbits SUID, SGID und STICKY
Wenn das SUID-Bit (Set User ID) gesetzt ist, behält das Programm
für die Dauer der Ausführung die Rechte des Programmeigentümers
und nicht jene dessen, der die Programme aufruft. Setzen durch das Kommando:
"chmod u+s datei". Anzeige: "s" statt "x" bei den User-Rechten. Dazu ein Beispiel:
Alle Benutzer sind in einer speziellen Datei gespeichert,
die nur der Superuser ändern darf - sonst könnte ja jeder einen neuen
Benutzer eintragen.
Jeder Benutzer kann aber sein Passwort ändern, das auch in dieser
Datei steht. Dazu muß er schreibend auf die Datei zugreifen - obwohl
er dazu keine Berechtigung besitzt. Das Programm "passwd" gehört dem
Superuser, hat das SUID-Bit gesetzt und kann so auf die User-Datei schreibend
zugreifen.
Wenn das SGID-Bit (Set Group ID) gesetzt ist, hat das Programm die Rechte
der Gruppe, zu der es gehört. Dieses Feature wird z. B. beim Drucker-Spooling
verwendet. Bei Dateien ohne Ausführungsrecht sorgt dieses Bit
dafür, daß die Datei nur von einem Prozeß geöffnet werden
kann (Vermeiden von Verklemmungen).
Bei Verzeichnissen hat das SGID-Bit eine andere Aufgabe. Dateien, die in ein
SGID-Verzeichnis kopiert werden, erhalten automatisch die Gruppe des Verzeichnisses
(man muß also nicht mehr explizit die Gruppe setzen, um den Mitgliedern einer
Gruppe Zugriff zu ermöglichen). Setzen durch das Kommando: "chmod g+s datei".
Anzeige: "s" statt "x" bei den Gruppen-Rechten ("l" bei Daten-Dateien).
Das STICKY-Bit sollte früher den Systemdurchsatz verbessern. Programme, bei denen
dieses Bit gesetzt ist, verbleiben nach dem ersten Aufruf im Speicher und
starten bei den folgenden Aufrufen schneller. Heute ist das nicht mehr nötig.
Bei Verzeichnissen dient dieses Bit der Systemsicherheit.
Auch wenn im Verzeichnis für alle User Schreibrecht existiert (= Löschen
und Anlegen von Dateien), können bei gesetztem Sticky-Bit nur Dateien
gelöscht werden, die einer folgenden Bedingungen genügen:
- die Datei gehört dem Benutzer, der sie löschen will
- das Verzeichnis, in dem die Datei liegt, gehört dem Benutzer
- der Benutzer hat Schreibrecht für die Datei
- der Superuser will die Datei löschen
Setzen durch das Kommando : "chmod +t datei".
Anzeige: "t" statt "x" bei den "Others"-Rechten.
Die Implementierung des Dateisystems
Ein physisches Dateisystem ist eine dateiorientierte Struktur auf einem
logischen Datenträger (Partition, Slice). UNIX bietet die Möglichkeit, mehrere
dieser logischen Datenträger auf einem physischen Datenträger (Festplattenlaufwerk)
zu verwalten. Desweiteren können neben den permanent vorhandenen physischen
Dateisystemen (Dateisysteme auf dem Systemlaufwerk) auch weitere Dateisysteme auf
montierbaren Datenträgern (Festplattenlaufwerke anderer Rechnersysteme,
Wechselplatten, Disketten, usw. ) in den Dateibaum eingehängt
bzw. entfernt werden.
Schaut man sich ein physisches Dateisystem genauer an, so erkennt man den
Betriebssytemblock als kleinste Einheit (im Bereich von 512 Byte bis 16
kByte). Das physische Dateisystem wird in in vier Bereiche aufgespalten:
- Boot-Block:
Er enthielt im root-Dateisystem ein Urlader-Programm, welches das eigentliche
UNIX-System (Betriebssystemkern) in den Arbeitsspeicher lädt.
Dieser Bereich ist bei heutigen Systemen leer.
- Super-Block:
Er enthält alle relevanten Verwaltungsinformationen
zu einem physischen Dateisystem:
- Name und Größe des physischen Dateisystems
- Größe der nachfolgenden Bereiche des physischen Dateisystems
(Inodeliste, Nutzdatenbereich)
- Verweise auf die Liste der freien Datenblöcke und die Liste der freien Inodes
- Datum der letzten Sicherung und Modifikation
- und weitere Angaben
- Inodeliste:
Sie stellt ein Inhaltsverzeichnis aller in dem
Dateisystem existierenden Dateien dar. Sie besteht
aus einer Folge von Inodes (Dateiköpfen),
die die Verwaltungsdaten zu jeder Datei enthalten.
- Nutzdatenbereich:
Hier befinden sich die freien Blöcke, Datenblöcke
(Inhalte von Dateien und Verzeichnissen) und
Referenzblöcke, die zur Adressierung der
Datenblöcke eingesetzt werden.
Die Größe der einzelnen Bereiche wird bei der Initialisierung eines physischen
Dateisystems festgelegt und kann im nachhinein nicht mehr dynamisch verändert werden
(außer im UNIX-System AIX von IBM). Das dazu notwendige Kommando ist 'mkfs' (make file
system). Die Bereiche eines physischen Dateisystems sind auf die Kapazität eines
logisch Datenträgers und damit maximal auf die Gesamtkapazität eines
Festplattenlaufwerks beschränkt, d. h. festplattenübergreifende
physische Dateisysteme sind nicht möglich.
Die Verwaltungsinformation über Dateien steht also nicht wie bei
DOS oder Windows in den Dateien
selbst, sondern in den Inodes. Jede Datei besitzt einen eigenen Inode (eine
eigene Datei-Nummer). Der Zugriff erfolgt entweder sequentiell (Datei ist
ein Strom von Bytes ohne weitere Strukturierung) oder wahlfrei (random
access) durch Positionierung auf ein bestimmtes Byte in der Datei. Das
BS hat einen Cache-Mechanismus implementiert, der einen Teil der Datei
im Speicher hält. Ziel: Reduzierung der Plattenzugriffe.
Problem:
Dateien müssen regelmäßig aktualisiert werden (Cache-Inhalt
auf die Platte schreiben), Gefahr der Inkonsistenz von Daten bei Prozeß-Abbruch
oder Stromausfall.
Inodes (I-Knoten)
Da alle Inodes die identische Länge von 128 Byte haben, erübrigt sich die
Abspeicherung der Knotennummer innerhalb des Inodes.
Ein Inode enthält die relevanten Verwaltungsattribute einer Datei:
- Dateityp und Zugriffsrechte
- Eigentümer, Gruppe
- Link-Zähler (siehe später)
- Zeitstempel
- Datum der letzten Änderung am i-Node
- Datum der letzten Modifikation
- Datum des letzten Zugriffs
- Dateigröße in Byte
- 10 Verweise auf Plattenblöcke
- Einfach indirekter Verweis
- Zweifach indirekter Verweis
- Dreifach indirekter Verweis
Zu beachten ist, daß der Name der Datei nicht aufgeführt wird.
Diese Systemarchitektur ermöglicht es, unter mehreren (verschiedenen) Namen als
Einträge von Verzeichnissen die gleiche Datei (genauer gesagt
Inode und Dateiinhalt) anzusprechen. Der Inode fungiert somit als
Bindeglied zwischen dem Namen und dem Inhalt einer Datei. Für
die Adressierung der Inhalte einer Datei ergibt sich eine
bestimmte Verweisstruktur.
Eine Datei mit bis zu 10 Plattenblöcken (Blockgröße 512
oder 1024 Bytes) kann also direkt angesprochen werden. Größere
Dateien haben zusätzlich einen Verweis (einfach indirekt) auf einen
Datenblock, der seinerseits 128 Verweisfelder
enthält. Reicht das noch nicht, wird zweimal (128 Blöcke
mit je 128 Verweisen) oder dreimal indiziert (Dateigröße bis
2 GByte bei 512-Byte-Blöcken, bis 16 GByte bei 1KByte-Blöcken).
Links
Dies sind Verweise auf Dateien, d. h. über ein Link kann eine
Datei unter einem zweiten Namen angesprochen werden. Eine Datei mit mehreren
Links hat also mehrere Namen, ist jedoch nur einmal vorhanden. Beim Löschen
eines Links - das für den Benutzer wie eine "normale" Datei wirkt
- wird nur der Link und nicht die Datei gelöscht. erst beim Löschen
des letzten Links verschwindet auch die Datei. Links sind nicht an
den Eigentümer der Datei gebunden, d. h. Benutzer A kann ein Link
auf die Datei von Benutzer B haben. Die Dateizugriffsrechte bleiben davon aber
unberührt. Problem: Benutzer A löscht eine Datei, auf die
Benutzer B ein Link hat. Dann bleibt die Datei zwar wegen des zweiten Links
erhalten, wenn nun aber Benutzer A gelöscht wird, dann gibt es eine Datei
ohne Eigentümer.
Das System der Links wird generell verwendet. So gibt es unter UNIX
keinen Systemaufruf zum Löschen einer Datei, sondern lediglich einen
Unlink-Call. Wenn der Link-Zähler einer Datei auf Null gesunken ist
(durch entsprechend viele Unlink-Aufrufe), wird deren Inode und der durch
die Datei belegte Plattenplatz freigegeben.
Der Superblock
Der Superblock bildet die Verwaltungseinheit für eine Platte oder
Plattenpartition (= Dateisystem). Er enthält folgende Felder:
- Größe des Dateisystems
- Anzahl und Liste der freien Blöcke
- Index auf den nächsten freien Block der Liste
- Größe der Inode-Liste - Anzahl und Liste der freien Inodes
- Index auf den nächsten freien Inode der Liste
- ....
Geräte
Alle Peripheriegeräte des UNIX-Rechners (Platte, Floppy-Disk,
Magnetband, Terminals, Drucker, usw.) werden über das Dateisystem,
also prinzipiell wie Dateien angesprochen. Dazu sind (normalerweise im
Verzeichnis /dev) spezielle Programme, sogenannte Geräte-Treiber (device
drivers), vorhanden, die über spezielle Dateien (special files) angesprochen
werden können. Diese Gerätedateien sorgen für den Anschluß
der Geräte an das UNIX-Dateisystem. Für die Namen der Dateien
sind von AT&T Namenskonventionen vereinbahrt worden, an die sich jedoch
nicht alle Systeme halten.
Gerätedateien dienen zur Abwicklung des Datenverkehrs zwischen den Programmen und der
Peripherie. Da sie, wie die abstrakten Komponenten (normale Dateien, Verzeichnisse,
usw.) einheitlich in den Systembaum integriert werden, sind auch für sie die
Zugriffsschutzmechanismen und Ein- /Ausgabeumleitung gültig.
Die Geräte werden durch logische Namen angesprochen, die die Gerätetreiber der
Peripheriegeräte bezeichnen. Intern wird jedes Gerät durch eine Treiber-Nummer
(major device number) und eine Geräte-Nummer (minor device number) markiert.
Diese Nummern sind im ls -l Eintrag in dem Feld enthalten, das die Dateigröße
angibt.
- major device number:Angabe des Gerätetyps (Platte,Terminal,
Drucker, etc.)
- minor device number: Angabe über die E/A-Schnittstelle
oder nähere Umstände der Ansteuerung (z.B. Band zurückspulen/nicht
zurückspulen)
Ein Gerät kann durchaus über verschiedene Treiber angesprochen
werden. Normalerweise werden die Geräte vom Benutzer nicht direkt,
sondern über Dienstprogramme angesprochen. Wenn jemand z. B. den Drucker
direkt anspricht, während ein anderer Benutzer über den Spooler
ausdruckt, gibt es "Datenmüll" auf dem Papier. Zwei interessante
Geräte können jedoch alle Benutzer ansprechen:
- /dev/null
Daten, die an dieses Gerät geschickt werden, landen in einem "schwarzen Loch"
- ideal für Ausgaben eines Programms. Wenn von diesem Gerät gelesen
wird, liefert es immer "End Of File".
- /dev/zero ist das zweite "Spezialgerät". Beim Lesen von diesem
Gerät werden beliebig viele Nullbytes geliefert. Man verwendet es z. B. zum
Füllen von Dateien oder wenn man eine "Dummy-Engabe" benötigt.
Es gibt bei UNIX prinzipiell zwei Typen von Treibern:
- Zeichentreiber Für zeichenorientierte Geräte (Terminal,
Drucker, etc.). Eingehende Daten werden in der Regel gepuffert und dann vom Programm
aus dem Puffer gelesen, beim Schreiben erfolgt analog die Pufferung in
Ausgangsrichtung.
- Blocktreiber für blockorientierte Geräte (z. B. Platte).
Hier ist meist noch ein Software-Cache (Schreib-Lesepuffer
mit entsprechenden Zugriffsroutinen) zur Beschleunigung der E/A-Operationen
implementiert. Zur Einrichtung von Treibern und Zuweisung der "device numbers"
existiert ein passendes Kommando (mknode), das nur vom Superuser aufgerufen
werden kann. Die Gerätedateien enthalten selbst keine Treiber, sondern
legen nur fest, welcher Treiber im Kernel über die Gerätedatei
angesprochen werden soll.
|
|
|