\documentclass[a4paper]{article} \usepackage[latin1]{inputenc} \usepackage{german} \usepackage[pdftex]{color,graphicx} % % Einrueckung des ersten Satzes eines Absatzes \parindent 0pt % % Abstand zwischen Absaetzen \parskip 1.5ex plus 0.5ex minus 0.5ex \begin{document} \title{Das ext2-Dateisystem} % \author{Moritz Orbach} %\renewcommand{\labelitemi}{$\star$} \maketitle % xt2 besteht aus Blockgruppen (block groups), die konzeptuell den % Zylindergruppen von FFS entsprechen. % % Der von einem Kopf (head) in einer Umdrehung überstrichene Bereich der % Festplatte heißt Spur (track). % Die im Plattenstapel übereinander angeordneten % Spuren bilden einen Zylinder (cylinder). Abbildung 2.1 illustriert dies: Der % Kamm der Schreib-/Leseköpfe erzeugt konzentrische Kreise auf der Oberfläche des % Mediums. Denkt man sich den Rest der Platte weg, erscheinen diese Kreise als % ein Zylinder im Raum. % % Festplatten können Daten nicht beliebig fein aufgelöst lesen oder schreiben. % Statt dessen ist eine Spur in Sektoren (sectors) fester Größe unterteilt, die % die kleinste adressierbare Einheit darstellen. Gebräuchlich ist dabei eine % Größe von 512 Byte. Gelegentlich findet man auch Festplatten mit Sektorgrößen % von 1024 oder gar 2048 Byte. % % Ein Sektor auf einer Festplatte ist durch die drei Koordinaten % Zylindernummer, Kopfnummer und Sektornummer (nach den englischen % Bezeichnungen CHS-Modell genannt) bestimmt. % % Während bei typischen Festplatten für den PC-Markt Ende der 80er Jahre 17 % oder 26 Sektoren zu 512 Byte pro Spur die Regel waren, hatten Festplatten für % dasselbe Marktsegement um 1993 37 Sektoren pro Spur. % % Die Adressierung von Sektoren durch den Gerätetreiber erfolgt jedoch bei % allen SCSI-Festplatten und zunehmend auch bei IDE/EIDE-Festplatten über % lineare Blockadressen (linear block addresses, LBA). Dabei handelt es sich um % Blocknummern zwischen Null und einer Maximalzahl, die von der Kapazität der % Platte abhängig ist. Die Übersetzung von linearen Blockadressen in % CHS-Koordinaten erfolgte früher im Gerätetreiber. Im Jargon der Hersteller % wird die Abbildung von linearen Blockadressen auf CHS-Koordinaten als mapping % der Platte bezeichnet. Dabei ist es aufgrund der zunehmenden % Komponentenintegration inzwischen üblich, daß diese Umrechnung von der % Festplatte selbst vorgenommen wird und sie vorzugsweise mit LBA angesteuert % werden sollte. % % Die Daten können dabei auf verschiedene Weise angeordnet sein. % Traditionell sind sie übereinander auf den Spuren eines Zylinders angeordnet. % dimplom s.10 % % fragmentierung (dipl. 32) % Weil Festplattenplatz nur in Einheiten zu jeweils einem Sektor oder % ganzzahligen Vielfachen davon zur Verfügung steht, verwalten praktisch alle % Dateisysteme Platz in diesen Einheiten. Dabei geht Platz verloren: Eine Datei, % die nur ein einzelnes Byte umfaßt, belegt trotzdem die Mindestgröße von einem % Plattensektor und verschwendet damit bei einer Sektorgröße von 512 Byte 511 % Bytes. % % Auf der anderen Seite ist es wünschenswert, für einen schnellen Zugriff auf % die Daten möglichst große Blöcke zu verwenden. % Platzausnutzung und Transfergeschwindigkeit stehen also grundsätzlich % miteinander in Konflikt: Während eine kleine Blockgröße für eine optimale % Ausnutzung des Plattenplatzes gut ist, sind nur mit großen Blöcken hohe % Datentransferraten möglich. % % Schon durch eine Vergrößerung der Blockgröße auf ein Kilobyte konnte die % Transfergeschwindigkeit mehr als verdoppelt werden: Zum einen konnten jetzt % größere Blöcke von der Festplatte in den Speicher bewegt werden, wodurch der % Verwaltungsaufwand des Betriebssystems geringer wurde. Zum anderen waren % durch die größeren Blöcke bei gleichbleibender mittlerer Dateigröße im % Schnitt weniger Zugriffe auf indirekte Blöcke notwendig. % % Für eine zügige Übertragung von Daten ist es außerdem von Vorteil, wenn die % Daten einer Datei auf der Platte zusammenhängend abgelegt sind. % Dateioperationen, die eine Datei von vorne nach hinten durchlesen, sind % relativ häufig [Ou85]. In diesem Fall ist es von Vorteil, wenn die Datei % zusammenhängend auf der Platte abgelegt ist und ohne zusätzliche % Kopfbewegungen eingelesen werden kann. % To add this new file system to the kernel, a new layer had to be added. This % is called the Virtual File System (VFS). With this layer, the file system % was no longer actually a part of the kernel. They were no longer one unit. % Instead, there was a well defined interface between the kernel and the file % system. This allowed the kernel to support many file systems instead of just % one. All file systems now actually look the same to the kernel and to the % programs we run. The VFS layer handles the translation for the kernel. % % This diagram shows how the VFS layer works. This is called a schema. % % % % |--------| |--------| |-------| |----| |-----| % | | | |<->|Minix |<->| | |Inode| % | | | | |_______| | |<->|Cache| % |Device | |Buffer | |VFS | | | % |Drivers | |Cache | |-------| | | |_____| % | | | |<->|Vfat |<->| | % | |<->| | |_______| | | |---------| % | | | | | |<->| | % | | | | |-------| | | |Directory| % | | | |<->|Ext2 |<->| | |cache | % | | | | |_______| |____| |_________| % |________| |________| % % history \section*{Geschichte} Linux wurde unter Minix entwickelt. Dieses Betriebssystem hatte ein einfaches Dateisystem, das zudem noch sehr gut getestet war. So war das erste Dateisystem, das Linux benutzen konnte, das Dateisystem von Minix. Dieses enthielt jedoch einige empfindliche Einschränkungen, wie zum Beispiel eine maximale größe von 64MB und eine Beschränkung der Dateinamenlänge auf 14 Zeichen. Um diese zu umgehen, wurde 1992 das ext FS (extended filesystem) entwickelt, und in den Kernel 0.96c aufgenommen. Daraus entwickelte sich das heutige ext2 und ext3. \section*{Der Aufbau von ext2} % blöcke Aus der Sicht des Dateisystems ist das Speichermedium eine aneinandergereihte Kette von Blöcken. Wie und wo die Dateien auf dem Medium organisiert sind, ist Sache des Gerätetreibers. Die Blockgröße von ext2 kann 1, 2, 4 oder 8 kb (nur auf Alpha-architektur) groß sein. Sie wird beim erstellen des Dateisystems festgelegt und kann im nachhinein nicht verändert werden. Größere Blöcke ergeben eine bessere performance, da mehr Daten in einem Zug eingelesen werden können. Allerdings kann kein Block von 2 Dateien gleichzeitig belegt werden. Nicht voll ausgenutzte Blöcke sind daher verlorener Speicherplatz. Wird auf einem Dateisystem mit einer Blockgröße von 1024 byte eine Datei mit 1025 byte abgespeichert, so belegt diese 2 Blöcke und 2048 byte Speicherplatz. % block groups \subsection*{Block groups} Das ext2-Dateisystem unterteilt die logische Partition die es benutzt in \emph{Block Groups} auf. Jede Block Group enthält sowohl für das Dateisystem benötigte Informationen, als auch Daten. \begin{itemize} \item Da die Verwaltungsstrukturen nahe bei den zugehörigen Datenblöcken liegen, werden Bewegungen des Festplattenkopfes vermieden. \item Da alle wichtigen Verwaltungsstrukturen redundant abgelegt sind, können diese Daten bei Beschädigung der ersten, normalerweise benutzten Block group, einfach aus einer der anderen Block groups gelesen werden. \end{itemize} Jede Blockgruppe besteht aus \begin{itemize} \item Superblock \item Group Descriptors \item Block Bitmap \item Inode Bitmap \item Inode Table \item Datenblöcke \end{itemize} % argh! viel zu GROß! \includegraphics{blockgroups} % |Superblock | Group Descriptors |Block Bitmap|INode Bitmap|INode Table|Data blocks| % |-------------------------------|-------------------------------------------------| % |This is the same for all groups| this is specific to each group % | \subsection*{Der Superblock} Der Superblock behinhaltet Informationen über Art, Zustand und Eigenschaften des Dateisystems. Die Hauptkopie liegt am Anfang des Dateisystems, und wird benötigt, um das Dateisystem mounten zu können. Da er so wichtig ist, sind Kopien des Superblocks auf das gesamte Dateisystem verteilt. Vom Dateisystem genutzt wird aber nur der Superblock in Blockguppe 0. Ursprünglich enthielt jede Blockgruppe eine Kopie des Superblocks. Als die Festplatten jedoch größer wurden und damit die Anzahl (und somit der Speicherplatz) der Block Groups anstieg, wurde diese übertriebene Redundanz vermindert. In modernen Versionen des ext-Dateisystems kann festgelegt werden, daß nur noch in den Block Groups 0, 1, und in den durch 3, 5 und 7 teilbaren Block Groups Kopien abgelegt werden sollen. Der Supberblock beinhaltet: \begin{itemize} \item Magic Number\newline Anhand der Magic Number können Programme erkennen, daß es sich um ein ext2-Dateisystem handelt. \item Revision Level und Kompatibilitätsfelder\newline Das Revision Level ist wie eine Versionsnummer. So kann beim mounten festgestellt werden, welche Features das Dateisystem unterstützt. % There are also feature compatibility fields which help the mounting % code to determine which new features can safely be used on this file % system, \item Mount Count, Maximum Mount Count und Datum des letzten Dateisystemchecks\newline Diese Felder ermöglichen es den Bootscripten, nach Erreichen von den in \emph{Maximum Mount Count} festgelegten Bootvorgängen, oder nachdem eine bestimmte Zeit zwischen zwei Dateisystemchecks überschritten wurde, das Dateisystem auf Fehler zu überprüfen. \item Blockgröße\newline Die Größe der Blocks auf diesem Dateisystem in byte. Diese Zahl kann nach dem Erstellen des Dateisystems nicht mehr verändert werden. \item Anzahl der Blocks pro Blockgruppe\newline Die Anzahl der Blocks pro Blockgruppe. Diese Zahl kann nach dem Erstellen des Dateisystems nicht mehr verändert werden \item Freie Blöcke\newline Anzahl der freien Blöcke im Dateisystem \item Freie Inodes\newline Anzahl der noch freien Inodes im Dateisystem \item Erste Inode\newline Die Inode-nummer der ersten Inode des Dateisystems. In einem root-dateisystem wäre das die Inode für das root-Verzeichnis (,,/'') \subsection*{Die Group Descriptor - Tabelle} Ein Group Descriptor beschreibt alle Block Groups. Er ist redundant in allen Block Groups vorhanden. Er enthält folgende Informationen: \begin{itemize} \item Adresse des Blocks Bitmaps\newline \item Adresse der Inode Bitmaps\newline \item Adresse der Inode Tabellen\newline \item Anzahl der freien Blöcke und Inodes\newline %Free blocks count, Free Inodes count, Used directory count \end{itemize} Der Vorteil dieser Einteilung ist, daß die die Metadaten einer Datei nahe bei ihren Daten befinden. So ist ein schneller Zugriff ohne große Kopfbewegungen der Festplatte möglich. \end{itemize} \subsection*{Block- und Inode Bitmaps} % Two blocks near the start of each group are reserved for the block usage % bitmap and the inode usage bitmap which show which blocks and inodes % are in use. Since each bitmap is limited to a single block, this means % that the maximum size of a block group is 8 times the size of a block. Ein Bitmap ist ein ,,Abbild'' der freien und belegten Blöcke in der Block Group. Jeds bit in einem Bitmap repräsentiert einen Block (oder im Falle der Inode Bitmap eine Inode). Daran ob das bit gesetzt ist oder nicht kann man erkennen, ob der Block belegt ist oder nicht. \subsubsection*{Block Bitmap} Aus dem Block Bitmap ist ersichtlich, welche Blocks im Dateisystem belegt sind \subsubsection*{Inode Bitmap} Aus Inode Bitmap ist ersichtlich, welche Inodes im Dateisystem belegt sind %%%%%%%%%%%%%%%%%%%%% % Aufbau der Inodes % %%%%%%%%%%%%%%%%%%%%% % struct ext2_inode in /usr/src/linux/include/linux/ext2_fs.h \subsection*{Inodes (index nodes)} Jede Datei im EXT2-Dateisystem hat eine zugehörige Inode. Diese beinhaltet Metadaten \footnote{Metadaten sind Informationen (Daten) über andere Daten} über die Datei. In den Inodes sind folgende Informationen gespeichert: \begin{itemize} \item Art der Datei \item Dateizugriffsrechte \item Anzahl der links zu der Datei \item UID (user-ID) \item GID (group-ID) \item Dateigröße \item Zeiger auf Datenblöcke der Datei \item Datum des letzten Zugriffs \item Datum der letzten Veränderung \item Erstellungsdatum \end{itemize} Inodes sind in einer Tabelle abgespeichert. Welche Inodes belegt sind, wird in einem Bitmap gespeichert. %mehr: dipl s.23 \paragraph*{Art der Datei} \begin{itemize} \item Verzeichnis \item Link \item Block device \item Charakter device \item FIFO \end{itemize} \paragraph*{Dateizugriffsrechte} Für jede Datei unter UNIX können folgende Berechtigungen gesetzt sein: \begin{itemize} \item Lesen \item Schreiben \item Ausführen \end{itemize} Diese Berechtigungen sind für jeweils 3 Gruppen abgespeichert: \begin{itemize} \item Benutzer \item Gruppe \item rest der Welt \end{itemize} \paragraph*{Anzahl der links zu der Datei} Dazu später mehr. \paragraph*{UID} Unter UNIX hat jeder benutzer eine \emph{User-ID} (UID). Hier wird gespeichert, wem die Datei gehört. \paragraph*{GID (group-ID)} Hier wird anhand der \emph{Group-ID} (GID) gespeichert, zu welcher Gruppe die Datei gehört. \paragraph*{Dateigröße} Größe der Datei % Außerdem gibt es einen Zeiger auf einen indirekten Block (der wiederum Zeiger % auf den nächsten Satz von Blöcken der Datei enthält), % % einen Zeiger auf einen doppelt indirekten Block (der Zeiger auf weitere % indirekte Blöcke enthält) % und einen Zeiger auf einen dreifach indirekten Block (der Zeiger auf doppelt % indirekte Blöcke enthält). \paragraph*{Zeiger auf Datenblöcke der Datei} Die ersten 12 Zeiger in der Inode zeigen direkt auf die ersten 12 Datenblöcke, in der die zur Inode gehörige Datei gespeichert ist. % There is a pointer to an indirect block (which contains % pointers to the next set of blocks), % a pointer to a doubly-indirect % block (which contains pointers to indirect blocks) % and a pointer to a % trebly-indirect block (which contains pointers to doubly-indirect blocks). Der nächste Zeiger zeigt auf einen indirekten Datenblock, also einem Datenblock, in dem Wiederum Zeiger gespeichert sind, die auf die Daten der Datei zeigen. Der darauf folgende Zeiger zeigt auf einen doppelt indirekten Datenblock, der auf einen indirekten Datenblock zeigt. Der letzte Zeiger zeigt auf einen dreifach-indirekten Datenblock, der auf einen doppelt indirekten Datenblock zeigt. %\includegraphics{datenbloecke} \includegraphics{inode} % So far as each file system is concerned, block devices are just a series of % blocks which can be read and written. A file system does not need to concern % itself with where on the physical media a block should be put, that is the job % of the device's driver. \subsection*{Verzeichnisse} Unter ext2 sind Verzeichnisse Dateien des Typs ,,Directory'', in denen eine Zuordnung von in dem Verzeichnis enthaltenen Dateien mit ihren Inodes abgespeichert ist. Sie enthält für jede Datei jeweils die Inode-nummer, die Länge des Dateinamens und den eigentlichen Dateinamen. In jedem Verzeichnis gibt es mindesten die Dateien ,,.'' (eigene Inode-nummer) und ,,..'' (die Inode-nummer des übergeordneten Verzeichnisses). % \subsection*{Umwandlung von Dateinamen zu Inodes} % http://www.science.unitn.it/~fiorella/guidelinux/tlk/node100.html \subsection*{Links} \paragraph{Hard links} Ein Link ist ein zweiter Verzeichniseintrag für eine schon vorhandene Datei. % Ein Link ist eine Datei, die sich eine Inode mit einer anderen Datei teilt. Dazu wird einfach ein Verzeichniseintrag erstellt, der auf eine schon anderswo eingetragene Inode zeigt. Das Link-count-Feld in der Inode wird danach um eins erhöht. Wird eine der beiden Dateien gelöscht, wird der Link-count wieder vermindert. Ist er nach dem löschen einer Datei auf ,,0'', sind keiner weiteren Links vorhanden und der von der Datei belegte Speicherplatz kann freigegeben werden. Es können keine Links auf Dateien in einem anderen Dateisystem erstellt werden, da die Inode auf die verwiesen wird ja nur im aktuellem Dateisystem vorhanden ist. % keine Links für dirs. % http://www.linuxgazette.com/issue93/tag/2.html Hard links sind außer den schon erwähnten, automatisch angelegten Dateien ,,.'' und ,,..'' nicht erlaubt. Zum einen könnte man Endlosschleifen produzieren, schlimmer allerdinge wäre, daß beim rekursivem \footnote{Beim \emph{rekursivem} löschen werden Unterverzeichnisse mit einbezogen} löschen aus versehen Dateien gelöscht werden könnten, die nicht offensichtlich sind, zum Beispiel wenn sich ein link auf das root-Verzeichnis in dem zu löschenden Verzeichnis befindet. Ein Hard Link ist eine ganz normale Datei. Legt man einen Hard Link zu einer Datei an, so sind beide Dateien vollkommen gleichberechtigt. Die ursprüngliche Datei ist nicht ,,Originaler'' als die Datei die als zweites angelegt wurde. \paragraph{Symbolische Links} Die beiden beschränkungen der Hard links kann man mit Symbolischen links umgehen. Symbolische links sind Dateien des Typs ,,link'', die einen Pfadnamen enthalten. %Trifft der Kernel beim umwandeln eines Pfadnamens auf einen symbolischen link, %wird die Umwandlung mit dem Inhalt dieser Datei, also dem Pfadnamen auf den der %Link verweist, neu gestartet. Wird eine Symbolischer link geöffnet, wird dessen Inhalt automatisch eingelesen und der Pfadname der darin enthaltenen Datei geöffnet. Dies geschieht vollkommen transparent, Anwendungen bemerken also keinen Unterschied zwischen normalen Dateien und symbolischen Links. Das ist bei links (Verknüpfungen) unter Windows anders, da die Umsetzung der links hier nicht auf Dateisystemebene sondern durch die Applikation geschieht. Versteht ein Programm das Format des links nicht (z.B. Notepad), öffnet es nicht die Datei auf den die Verknüpfung verweist, sondern den link an sich. Ist der name des links kleiner als 60 bytes, wird er innerhalb der inode in den Feldern gespeichert, die normalerweise die Pointer auf die Datenblöcke der Datei beinhalten würden. Durch diese Optimierung wird vermieden, daß die Datei einen ganzen Datenblock, also im günstigsten Fall immerhin noch 1024 byte, belegt. \subsection*{Reservierte Blöcke} Eine beliebige Zahl von Blöcken (meist 2\% der partition) können für einen bestimmten User (sinnvollerweise root) reserviert werden. Dadurch wird gewähleistet, daß das System auch dann funktionsfähig bleibt, wenn ein User den gesamten Platz der Partition aufgebraucht hat. \subsection*{Erweiterbarkeit} Durch den \emph{Feature compatibility}-Mechanismus können Erweiterungen am Dateisystemcode vorgenommen werden, ohne die Abwärtskompatibilät aufgeben zu müssen. Dazu gibt es im Superblock drei, jeweils 32 bit große Felder in denen abgespeichert ist, wie sich ein Kernel ohne unterstützung bestimmter Features zu verhalten hat. \begin{itemize} \item Kompatible Features\newline Die hier verzeichneten Features sind 100\% kompatibel mit älteren Versionen. Auch ein Kernel, der nichts von diesen Features weiß, kann das Dateisystem sicher mounten und beschreiben. Das Journaling in ext3 ist so ein Feature, da das Journal einfach in einer Datei des Hauptverzeichnisses gespeichert wird. \item read-only kompatible Features\newline Diese Features können von einem älteren Kernel nur lesend benutzt werden. Ein schreibender Zugriff auf das Dateisystem würde dessen Struktur zerstören. Ein Beispiel für ein solches Feature ist die schon erwähnte, weniger redundante Verteilung der Superblocks auf die Blockgroups. Da in Versionen, die dieses Feature unterstützen Datenblöcke an Stellen vorkommen können, an denen in früheren Versionen nur der Superblock erlaubt war, würde ein schreibender Zugriff zu inkonsistenzen in der Belegungstabelle (Bitmaps) führen. \item Inkompatible Features\newline Durch veränderte Datenstrukturen ist es dem älteren Kernel nicht möglich, auf das Dateisystem zuzugreifen. Dieses Feld wird auch von ext3 benutzt um nach einem absturz zu verhindern, daß ein älterer Kernel ein Dateisystem mountet, ohne vorher das Journal zurück zu spielen. \end{itemize} \section*{Fragmentierung} Eine Datei ist framentiert, wenn Sie nicht in zusammenhängenden Blöcken auf dem Datenträger gespeichert ist. Wird die Datei gelesen, muss der Festplattenkopf größere Wege zurücklegen um die einzelnen Teile der Datei zusammenzusuchen, was die Zugriffszeit vergrößert. % Beim schreiben einer Datei wird nicht nur der Platz reserviert, den die Datei % eigentlich benötigt, sondern bis zu 7 Blöcke mehr. Wächst die Datei, ist Sie % trotzdem an einem Stück gespeichert. Wird eine Datei zum Schreiben geöffnet so steht noch nicht fest, welche Größe Sie am Ende annehmen wird. Daher reserviert ext2 nicht nur den Speicherplatz den die Datei gerade benötigt, sondern bis zu 7 Blöcke im vorraus \emph{(Preallocation)}. Wird die Bearbeitung einer neuen Datei beendet, gibt ext2 die nicht benötigten Blöcke wieder frei, verbraucht die Datei alle Blöcke, liegen diese nun in einem Stück auf der Platte. So bleibt der Grad der Fragmentierung einer Datei in akzeptablen Grenzen. Durch den Aufbau von ext2 (Metadaten werden nahe bei den Daten abgelegt, Preallocation bei schreibzugriffen) entsteht unter ext2 weder eine große Fragmentierung, noch hat diese große Auswirkungen. %\begin{verbatim} %\end{verbatim} % % The ext2 file system writes files with a kind of writeahead, too, i.e. with % preallocation. When you write a block in an ext2 file system, the file system % occupies immediately up to 7 further successive blocks for that file. Two % competitive write accesses to a directory would not produce blocks like: % % 121212121212 % % but rather a block sequence similar to: % % 1ppppppp2qqqqqqq % % whereby 1 and 2 represent written blocks for the files 1 and 2, respectively, % and p and q are blocks booked in advance for the files 1 and 2. The result of 1 % and 2 being simultaneously extended is: % % 11111111222222221ppppppp2qqqqqqqq Außerdem muss man beachten, daß GNU/Linux ein Multiuser und Multitasking Betriebssystem ist. Es greift also nicht immer nur exklusiv ein Programm, sondern viele verschiedene Programme gleichzeitig auf unterschiedliche Bereiche der Festplatte zu, der Festplattenkopf wird also sowieso mehr bewegt. \section*{Die Grenzen von ext2} \paragraph*{Verzeichnisse} Ein Verzeichnis kann nicht mehr als 32.768 Unterverzeichnisse enthalten Die maximale Anzahl Dateien in einem Verzeichnis beträgt über 130 Trillionen Dateien. Praktisch wird diese Zahl in den aktuellen Versionen jedoch dadurch begrenzt, daß es ab 10000 Dateien zu Performanceproblemen bei Dateioperationen kommen würde. \paragraph*{Dateien} % grad auf lkml <402D1C68.5030600@redhat.com> Im Dateinamen sind alle Zeichen außer ,,\verb=\=0'' und dem slash ,,/'', der unter Unix den Verzeichnistrenner darstellt, erlaubt. Möchte man solche Dateien allerdings unter der Kommandozeile ansprechen, muss man bestimmte Zeichen \emph{Escapen}, also dem Befehlsinterpreter mitteilen, daß es sich bei dem Zeichen nicht um einen Shellefehl, sondern um einen Dateinamen handelt. % touch "$(/bin/ls / -1|head)" Die maximale länge eines Dateinamens beträgt 255 Zeichen \paragraph*{Partitions- und Dateigrößen} % deutscher punkt (trennzeichen) \begin{verbatim} Blockgröße : 1kB 2kB 4kB max. Dateigröße : ~16 GB 256 GB 2 TB max. Dateisystemgr.: 2 TB 8 TB 16 TB siehe http://www.suse.de/~aj/linux_lfs.html \end{verbatim} \section*{Journaling} Journaling ist eine Technik, die hilft die Integrität (also den korrekten Zustand) von Dateisystem zu bewahren. Bei Dateisystemen ohne Journaling, muss nach einem nicht ordnungsgemäßen herunterfahren des Betriebssystems das gesamte Dateisystem auf Fehler überprüft werden. Dieser Vorgang ist bei den heutigen Plattengrößen sehr zeitwaufwendig (mehrere Stunden) und für ein Produktivsystem nicht akzeptabel. Journaling speichert alle Änderunge am Dateisystem (z. B. die Umbenennung einer Datei), als Transaktion im Journal. Die Änderung kann dann im Fall eines Absturzes entweder abgeschlossen oder noch nicht abgeschlossen sein. Wenn eine Transaktion zum Absturzzeitpunkt (oder im Normalfall, wenn das System nicht abstürzt) abgeschlossen war, ist garantiert, dass alle an dieser Transaktion beteiligten Blöcke einen gültigen Dateisystemstatus repräsentieren. Diese Blöcke werden dann ins Dateisystem kopiert. Wenn eine Transaktion zum Absturzzeitpunkt nicht abgeschlossen war, kann nicht garantiert werden, dass die beteiligten Blöcke konsistent sind, daher wird eine solche Transaktion verworfen (das bedeutet, dass die Dateisystemänderung, die diese Transaktion repräsentierte, verloren geht). Ext3 beherrscht als einziges unter den modernen Linux-Dateisystem auch Data-Journaling. Es kann nicht nur die Integrität des Dateisystems an sich, sondern auch die Integrität der Daten garantieren. Dieser Modues ist allerdings nicht standardmäßig aktiviert. Er hat den Nachteil, daß er relativ langsam ist. Ext3 ist zu ext2 voll abwärtskompatibel. Ein ext3-Dateisystem kann auch als ext2 gemountet werden. Das Journal wird dann natürlich nicht benutzt. Es erscheint als normale Datei im Hauptverzeichnis. Der Befehl zum hinzufügen eines Journals lautet \begin{verbatim} tune2fs -j /dev/hdXX \end{verbatim} und dauert nur wenige sekunden. \section*{Zusammenfassung} Es wird versucht, die Inodes zusammen mit den dazugehörigen Datenblocken in derselben Blockgruppe unterzubringen. Dadurch werden Kopfbewegungen der Festplatte vermieden. Obwohl ext2 relativ alt ist, kann es sich auch gegen moderne Dateisystem recht gut behaupten. Dies hat es vor allem seiner Erweiterbarkeit zu verdanken durch die es möglich war, aus ext2 ein Journaling Filesystem zu machen. Performancemäßig ist ext2 ziemlich ausgeglichen und tut sich weder besonders positiv noch besonders negativ hervor, wenn man es mit jüngeren Dateisystem wie XFS, Reiserfs, und JFS vergleicht. %\subsection*{Group Descriptors} %Jede Blockgruppe hat einen Group Descriptor. Darin sind folgende Informationen %enthalten: % %\begin{itemize} % \item Blocks Bitmap % The block number of the block allocation bitmap for this Block Group. This % is used during block allocation and deallocation, % % \item Inode Bitmap % The block number of the inode allocation bitmap for this Block Group. % This is used during inode allocation and deallocation, % \item Inode Table % The block number of the starting block for the inode table for this % Block Group. Each inode is represented by the EXT2 inode data % structure described below. % \item Free blocks count, Free Inodes count, Used directory count %\end{izemize} % TODO: wo ist die inode-tabelle? % warum mounten % http://123.koehntopp.de/kris/artikel/diplom/node13.html#SECTION00530000000000000000 % (diplom) % http://portal.suse.de/sdb/en/2002/06/ext2frag.html % http://de.wikipedia.org/wiki/Ext2 (OK) % http://web.mit.edu/tytso/www/linux/ext2intro.html (OK) % http://www.science.unitn.it/~fiorella/guidelinux/tlk/node95.html OK % http://www.win.tue.nl/~aeb/linux/lk/lk-8.html sergut. % http://tldp.org/LDP/tlk/fs/filesystem.html#tthFrefAAB (TODO, blockgrps) % /usr/src/linux/Documentation/filesystems/ext[23].txt % google ext2 inode "direct blocks" % keine erweiterung % attribute % cluster % pre-allocation beim dateien anlegen % % inodes % - inodes alle -> keine dateien mehr % % journaling % begrenzungen (maxgröße usf.) % % dateivorbelegung % % erweiterbarkeit: An extensible file % system just means it can be modified by changing or adding features. % % TODO: wie werden die redundanten daten allen blockgroups aktualisiert? % % latex: http://www.astro.ku.dk/help/LaTeX/ltx-43.html % nicht zulässige zeichen % leicht erweiterbar % utf-8: wurscht % % http://uranus.it.swin.edu.au/~jn/explore2fs/es2fs.htm % http://web.mit.edu/tytso/www/linux/ext2intro.html % http://www.linux-ag.de/linux/LHB/node178.html % nett!: http://www.de-locher.ch/linux/paper/fs/ext.php % % TODO: block groups / blockgruppen -- entwederoder % TODO: wie der kernel pfadnamen auflöst. wo ist der link?! % todo: http://www.science.unitn.it/~fiorella/guidelinux/tlk/node101.html (fragm) \section*{Quellen} \begin{verbatim} http://www.science.unitn.it/~fiorella/guidelinux/tlk/node95.html http://www.linuxgazette.com/issue93/tag/2.html http://kris.koehntopp.de/artikel/diplom/node13.html http://portal.suse.de/sdb/en/2002/06/ext2frag.html http://de.wikipedia.org/wiki/Ext2 http://web.mit.edu/tytso/www/linux/ext2intro.html http://www.science.unitn.it/~fiorella/guidelinux/tlk/node95.html http://www.win.tue.nl/~aeb/linux/lk/lk-8.html http://tldp.org/LDP/tlk/fs/filesystem.html http://uranus.it.swin.edu.au/~jn/explore2fs/es2fs.htm http://web.mit.edu/tytso/www/linux/ext2intro.html http://www.linux-ag.de/linux/LHB/node177.html http://www.de-locher.ch/linux/paper/fs/ext.php /usr/src/linux/Documentation/filesystems/ext2.txt /usr/src/linux/Documentation/filesystems/ext3.txt \end{verbatim} \end{document} % vim:tw=80:fo+=a