Wie werden Dateien / Verzeichnisse vor ls -a verborgen, während in einem POSIX-kompatiblen System sonst noch auf sie zugegriffen werden kann?

9

Zum Beispiel in ZFS unter FreeBSD und zol gibt es eine magische .zfsdir Innenseite jedes zpool einhängepunkt und Sie können verwenden , zfs set snapdir=visibledas zu machen .zfsdir sichtbar.

Was macht mich neugierig ist: Wenn die Einstellung auf „versteckt“ gesetzt ist, wie ist die .zfsdir 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 , cdum es oder Anruf statauf 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 -awährend es noch zugänglich ist? Wie machst du das?

s1lv3r
quelle
2
Ein guter Grund, das .zfsVerzeichnis ls(und andere verwendete User-Space-Dienstprogramme readdir()) 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.zfsfind.zfs
Andrew Henle

Antworten:

7

Nun, wie es geht, ist einfach genug: Die lsListe wird von einem Syscall (oder unter Linux der libc-Funktion) aufgerufen readdir. Der Wechsel in ein Verzeichnis erfolgt mit einem separaten Systemaufruf chdir. statist 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 weglassen readdir. Aber es funktioniert immer noch mit chdir(etc.), weil das ein anderer Systemaufruf ist.

Dies unterscheidet sich nicht so sehr von einem Verzeichnis, in dem Sie über +xBerechtigungen verfügen , aber nicht -r : Sie können auf Dateien und Verzeichnisse darin, cddarauf usw. zugreifen , aber es lswird 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 /afsNamespace, in dem Sie eine Verbindung zu jedem AFS-Server herstellen konnten, indem Sie im Wesentlichen cdseinen Namen eingeben. Ein lsOn /afswürde jedoch nicht alle Server der Welt anzeigen. Ich habe gesehen, dass FUSE-Dateisysteme ähnliche Aktionen ausführen (z. B. cdum eine Verbindung zu einem anonymen FTP-Server herzustellen).

(Ich bin nicht sicher, ob die zfs-Anordnung strikt mit POSIX übereinstimmt).

derobert
quelle
1
Unter Linux gibt es einen getdents()Systemaufruf, der die VFS- readdir()Implementierung aufruft. Daher ist es für die ZFS-Implementierung trivial, den .zfsEintrag wegzulassen, wenn die snapdirEigenschaft auf festgelegt ist hidden. 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.
Andrew Henle
Dies entspricht POSIX, da das Verhalten nicht von einem gleichzeitigen Prozess zu unterscheiden ist, bei dem die verborgene Datei immer gelöscht wird, bevor jemand versucht, sie aufzulisten (z. B. durch Aufrufen readdir), und sie erstellt wird, bevor jemand versucht, darauf zuzugreifen (z chdir. B. durch Aufrufen ).
Gilles 'SO - hör auf böse zu sein'