Zum Beispiel in ZFS unter FreeBSD und zol gibt es eine magische .zfs
dir Innenseite jedes zpool einhängepunkt und Sie können verwenden , zfs set snapdir=visible
das zu machen .zfs
dir sichtbar.
Was macht mich neugierig ist: Wenn die Einstellung auf „versteckt“ gesetzt ist, wie ist die .zfs
dir versteckt tatsächlich von dem Ausgang einerls -a
oder Shell - Pfad-Auto-Vervollständigung, während nach wie vor zugänglich sonst (die können Sie immer noch , cd
um es oder Anruf stat
auf mich )?
Ich kann mich nicht wirklich um diese Tatsache kümmern, weil ich irgendwie denke, wenn etwas da und zugänglich ist, soll es aufgelistet werden ls -a
- auch wenn es nur magischer / virtueller Natur ist.
Kann jemand erklären, wie das funktioniert? Gibt es eine POSIX-konforme Möglichkeit, ein Verzeichnis zu haben, das verborgen ist, ls -a
während es noch zugänglich ist? Wie machst du das?
quelle
.zfs
Verzeichnisls
(und andere verwendete User-Space-Dienstprogrammereaddir()
) zu "verbergen" , besteht darin, zu sehen, was mit dem sichtbaren.zfs
Verzeichnis passiert . Wenn Sie so etwas wie ein sichtbares Verzeichnis ausführen, steigt das Dienstprogramm in das Verzeichnis ab und durchsucht jeden einzelnen Snapshot nach diesem Dateinamen sowie dem tatsächlichen "aktiven" Dateisystem.find . -name somefilename
.zfs
find
.zfs
Antworten:
Nun, wie es geht, ist einfach genug: Die
ls
Liste wird von einem Syscall (oder unter Linux der libc-Funktion) aufgerufenreaddir
. Der Wechsel in ein Verzeichnis erfolgt mit einem separaten Systemaufrufchdir
.stat
ist auch ein anderer Systemaufruf, wie die meisten anderen Dateioperationen.Kurz gesagt: "Was ist in diesem Verzeichnis?" und "Zugriff auf dieses Verzeichnis" sind völlig separate Anforderungen des Kernels, sodass sie so programmiert werden können, dass sie anders funktionieren.
Um ein Verzeichnis zu erstellen, das nicht angezeigt wird
ls -a
, muss der Kernel es einfach in den Ergebnissen von weglassenreaddir
. Aber es funktioniert immer noch mitchdir
(etc.), weil das ein anderer Systemaufruf ist.Dies unterscheidet sich nicht so sehr von einem Verzeichnis, in dem Sie über
+x
Berechtigungen verfügen , aber nicht-r
: Sie können auf Dateien und Verzeichnisse darin,cd
darauf usw. zugreifen , aber esls
wird fehlschlagen. Ich glaube, andere Dinge haben diese Anordnung ebenfalls verwendet - zum Beispiel (und dies ist aus dem Fuzzy-Speicher, ohne es nachzuschlagen). AFS hatte eine Art globalen/afs
Namespace, in dem Sie eine Verbindung zu jedem AFS-Server herstellen konnten, indem Sie im Wesentlichencd
seinen Namen eingeben. Einls
On/afs
würde jedoch nicht alle Server der Welt anzeigen. Ich habe gesehen, dass FUSE-Dateisysteme ähnliche Aktionen ausführen (z. B.cd
um eine Verbindung zu einem anonymen FTP-Server herzustellen).(Ich bin nicht sicher, ob die zfs-Anordnung strikt mit POSIX übereinstimmt).
quelle
getdents()
Systemaufruf, der die VFS-readdir()
Implementierung aufruft. Daher ist es für die ZFS-Implementierung trivial, den.zfs
Eintrag wegzulassen, wenn diesnapdir
Eigenschaft auf festgelegt isthidden
. Die Quelle finden Sie unter lxr.free-electrons.com/source/fs/readdir.c?v=2.6.35 . Die POSIX-Spezifikation scheint so formuliert zu sein, dass das Auslassen des Verzeichnisses nicht strikt dem Standard entspricht, aber ich nehme an, man könnte argumentieren, dass das "Verzeichnis" ein Implementierungsdetail ist, das optional als Verzeichnis verfügbar gemacht wird.readdir
), und sie erstellt wird, bevor jemand versucht, darauf zuzugreifen (zchdir
. B. durch Aufrufen ).