GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Befinden sich zwei Unterverzeichnisse mit demselben Stammverzeichnis garantiert im selben gemounteten Dateisystem?

Das ist ihnen nicht garantiert. Es ist möglich, dass /foo/oldPath ist ein Einhängepunkt.

Dies kann jedoch leicht durch Ausführen von mount | grep 'on /foo/oldPath' überprüft werden Keine Ausgabe sollte darauf hinweisen, dass oldPath Verzeichnis ist kein Einhängepunkt.

Sie müssen vorsichtiger sein, wenn Sie verschachtelte Verzeichnisse verwenden, da Sie überall einen Einhängepunkt haben können.

Ich bin mir nicht sicher, ob dies automatisiert ist, aber es ist erwähnenswert, dass das 3. Feld von mount (durch Leerzeichen getrennt) der Mount-Punkt für jede Zeile ist, also einen cut -d ' ' -f 3 verwendet könnte verwendet werden, um den Pfad zu extrahieren (falls Sie sicherstellen müssen, dass es sich nicht nur um eine Teilzeichenfolge eines anderen Einhängepunkts handelt, wie /foo/oldPath/nested/mountPoint )

Wenn Sie dies in C/C++-Code übersetzen möchten, können Sie möglicherweise system("mount | grep 'on /foo/oldPath'") verwenden , aber darauf schwöre ich nicht. Möglicherweise haben Sie bei StackOverflow mehr Glück, wenn Sie dort weitere Implementierungsdetails benötigen.


Sie sollten dies aus verschiedenen Gründen (ausführlich in den anderen Antworten) nicht versuchen:/foo/oldPath könnte selbst ein Einhängepunkt sein, oder ein Overlay-Dateisystem könnte vorhanden sein und das Verschieben von Dateien verhindern. Sie können sogar Bind-Mounts bei einzelnen Dateien feststellen, was ebenfalls Probleme beim Umbenennen von Dateien verursacht.

Anstatt zu versuchen, im Voraus festzustellen, ob die Dateien umbenannt werden können, sollten Sie versuchen, sie umzubenennen und die Fehler zu beheben. rename gibt -1 zurück, wenn ein Fehler auftritt, und errno wird auf EXDEV gesetzt wenn die Umbenennung aufgrund von Cross-Mount-Problemen nicht möglich ist. Sie können dann auf andere Weise fortfahren (kopieren und löschen).

Um festzustellen, ob sich zwei Dateisystemobjekte auf demselben Dateisystem befinden, sollten Sie im Allgemeinen stat ausführen darauf und sehen Sie sich die Gerätekennung an (die st_dev Feld in struct stat ). Zwei Dateisystemobjekte auf demselben Dateisystem haben dieselbe Gerätekennung.


Beachten Sie, dass Sie sich bei der Ausführung auf Overlayfs nicht auf rename() verlassen können von bereits bestehenden Verzeichnissen.

Ich denke, Sie könnten diese Möglichkeit normalerweise ignorieren, wenn Sie kein Allzweck-Dateiverwaltungstool schreiben ... Zum Beispiel einen Paketmanager ... in diesem Fall halten Sie es anscheinend nicht für reparierbar (aus Gründen der Atomizität) und wollen es auf den neuen redirect_dir zu verlassen Format von Overlayfs.

Das ist also eher eine pedantische Anmerkung, um Sie wissen zu lassen, dass dies Linux ist, wir POSIX nicht einhalten, wenn wir es nicht wollen, und "garantiert" ist ein sehr starkes Wort :).

https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt

Wenn die Funktion "redirect_dir" nicht aktiviert ist, schlägt rename(2) in einem niedrigeren oder zusammengeführten Verzeichnis mit EXDEV fehl.

Overlayfs entspricht bereits in anderen Details nicht den üblichen Erwartungen an ein Unix-Dateisystem:

Objekte, die keine Verzeichnisse sind (Dateien, symbolische Links, gerätespezifische Dateien usw.), werden je nach Bedarf entweder aus dem oberen oder unteren Dateisystem dargestellt. Wenn auf eine Datei im unteren Dateisystem auf eine Weise zugegriffen wird, die einen Schreibzugriff erfordert, wie z. B. das Öffnen für den Schreibzugriff, das Ändern einiger Metadaten usw., wird die Datei zuerst vom unteren Dateisystem in das obere Dateisystem kopiert (copy_up) ...

Die copy_up-Operation erstellt im Wesentlichen eine neue, identische Datei und verschiebt sie auf den alten Namen. Alle geöffneten Dateien, die auf diesen Inode verweisen, greifen auf die alten Daten zu.


Linux
  1. Deaktivieren Sie die Anmeldung mit dem Root-Konto

  2. Wie bearbeite ich Systemdateien mit dem Kate-Editor?

  3. So erstellen und mounten Sie das Btrfs-Dateisystem (mit Beispielen erklärt)

  4. Welche Mount-Optionen gibt es, um die Leistung des ext4-Dateisystems unter Linux zu verbessern?

  5. Wie leitet man die Ausgabe von system() in eine Datei um?

Einführung in das Linux-Dateisystem

Sichern Sie Linux mit der Sudoers-Datei

Linux-Mount-Befehl mit Beispielen

Wie kann ich zwei Abschnitte derselben Datei unterscheiden?

Soll der einzige Benutzer eines *nix-Systems zwei Konten haben?

Der beste Weg, um zu verhindern, dass sich das Root-System füllt, wenn ein Mount fehlschlägt?