Erstellt ein Block Device (Container) und initialisiert es.
- wird wie folgt aufgerufen:
mkfs.myfs <container-datei> [datei1, datei2, ...]
- ausgewählte Dateien werden alle im Root-Verzeichnis des Containers platziert unabhängig von dem Ordner aus dem sie stammen#
- die Anzahl der Dateien ist beschränkt auf
NUM_DIR_ENTRIES
- wirft
EEXIST
falls eine bereits existierende Datei hinzugefügt wird
- die Anzahl der Dateien ist beschränkt auf
- die meisten Attribute (Name, Größe,
atime
,mtime
,ctime
) werden von der Originaldatei kopiert- die Länge des Dateinamens ist beschränkt auf
NAME_LENGTH
- die Länge des Dateinamens ist beschränkt auf
- Besitzer (
uid
undgid
) wird abhängig vom aktuallen Nutzer gesetzt - Zugriffsrechte (
mode
) der Dateien sind gesetzt aufS_IFREG | 0644
- ausgewählte Dateien werden alle im Root-Verzeichnis des Containers platziert unabhängig von dem Ordner aus dem sie stammen#
Hängt das Block Device ein.
- wird wie folgt aufgerufen:
mount.myfs <container-datei> <log-datei> <ziel-verzeichnis>
- das Root-Verzeichnis gibt die folgenden Werte zurück für...
- ...seine eigenen Zugriffsrechte (
mode
):S_IFDIR | 0755
- ...seinen eigenen Verknüpfungen (
nlink
):2
- ...Verknüpfungen einer Datei (
nlink
):1
- ...seine eigenen Zugriffsrechte (
- die Anzahl der gleichzeit geöffneten Dateien ist beschränkt auf
NUM_OPEN_FILES
- wirft
EACCES
falls versucht wird Dateien oder Verzeichnisse hinzuzufügen, zu ändern oder zu löschen - die folgenden Operationen müssen implementiert werden (minimal):
- Container
MyFS::fuseInit()
MyFS::fuseRelease()
- Verzeichnis
MyFS::fuseOpendir()
- kann zusammen mit dem Container geöffnet werden (fuseInit())
MyFS::fuseReaddir()
- wirft
ENOTDIR
falls es für ein anderes Verzeichnis außer Root aufgerufen wird
- wirft
MyFS::fuseReleasedir()
- kann zusammen mit dem Container freigegeben werden (fuseRelease())
MyFS::fuseGettatr()
- wirft
ENOENT
falls es für einen Eintrag aufgerufen wird, der nicht existiert
- wirft
- Datei
MyFS::fuseOpen()
MyFS::fuseRead()
- der zuletzt gelesene Block soll gepuffert werden
MyFS::fuseRelease()
- relevant Fehler
- wirft
ENFILE
falls zu viele Dateien offen sind - wirft
ENOENT
falls eine Datei nicht gefunden wurde - wirft
EBADF
fallsfileInfo->fh
auf keine offene Datei zeigt - wirft
ENXIO
falls versucht wird auf einen Index außerhalb der Grenzen der Datei zuzugreifen
- wirft
- Container
- für jede geöffnete Datei sollte der zuletzt gelesene Block gepuffert werden
- legt ein leeres Block Device mit einer fixen Größe an (mindestens 30 MB)
- optional kann es weiterhin mit Dateien initialisiert werden
- Dateien auf dem Block Device können gelesen, geändert (überschrieben, angehängt) sowie gelöscht werden und neue Dateien können hinzugefügt werden
- wirft
EACCES
falls versucht wird ein neues Verzeichnis anzulegen - die folgenden Operationen müssen nun zusätzlich implementiert werden (minimal):
- neue Datei anlegen
MyFS::fuseMknod()
- wird aufgerufen falls
MyFS::fuseGetattr()
zuvorENOENT
zurückgegeben hat - wirft
EEXIST
falls die Datei bereits existiert - wirft
ENOSPC
falls nicht genügend Speicherplatz vorhanden ist
- wird aufgerufen falls
MyFS::fuseCreate()
- nur wenn notwendig
- Dateiinhalt (über)schreiben
MyFS::write()
- die Datei muss zuvor geöffnet sein, es sollte also
fileInfo
verwendet werden - muss gepuffert werden
- wirft
EBADF
fallsfileInfo->fh
auf keine offene Datei zeigt - wirft
ENOSPC
falls nicht genügend Speicherplatz vorhanden ist
- die Datei muss zuvor geöffnet sein, es sollte also
- Datei löschen
MyFS::unlink()
- wirft
ENOENT
falls die Datei nicht existiert
- wirft
- neue Datei anlegen