Gibt es irgendwelche Nachteile bei der Verwendung von mount --bind als Ersatz für symbolische Links?

55

Symlinks hat ihre Grenzen, wie Funktionen wie ls, mvund cpauf sie arbeiten kann , weil im Gegensatz zu Shell - Befehlen ausgelöst wie cddiese Funktionen haben keine Informationen darüber , wie der Benutzer das Verzeichnis in Bezug auf den logischen Pfad zugegriffen wird (siehe verwandte Post ). Anscheinend kann die Verwendung der mount --bindOption Abhilfe schaffen und die Funktionalität und Kompatibilität mit Samba und anderen Dateiservern verbessern, da das gemountete Verzeichnis dann zwei unabhängige physische Pfade anstelle einer Verknüpfung aufweist.

Ich möchte alle meine symbolischen Links mit der mount --bindOption durch Verweise ersetzen, aber dies würde bedeuten, dass mehr als 150 Punkte in fstab gemountet werden. Gibt es Leistungsprobleme, die möglicherweise auf diese oder andere Nachteile zurückzuführen sind, die ich berücksichtigen sollte?

mrtrujiyo
quelle
Haben Sie überlegt, harte Links zu verwenden ?
ire_and_curses
1
@ire_and_curses Die meisten Unix-ähnlichen Systeme verbieten aus gutem Grund harte Links (und aus den gleichen Gründen sollten Sie sie so gut wie nie auf Systemen verwenden, auf denen dies möglich ist).
Eliah Kagan
3
@ire_and_curses: Um die Aussage von Eliah zu verdeutlichen, können Sie keinen festen Link zu einem Verzeichnis erstellen (obwohl HFS + dies in gewisser Weise unterstützt). Durch das Erstellen eines rekursiven Baums fester Verknüpfungen werden nicht beide Verzeichnispfade synchronisiert.
Bahamat

Antworten:

62

Mit mount --bindexistiert ein Verzeichnisbaum an zwei (oder mehr) Stellen in der Verzeichnishierarchie. Dies kann eine Reihe von Problemen verursachen. Backups und andere Dateikopien wählen alle Kopien aus. Es wird schwierig anzugeben, dass Sie ein Dateisystem kopieren möchten: Am Ende kopieren Sie die gebundenen Dateien zweimal. Suchen mit find, grep -r, locate, etc., durchlaufen alle Kopien, und so weiter.

Sie erhalten keine "erhöhte Funktionalität und Kompatibilität" mit Bind-Mounts. Sie sehen aus wie jedes andere Verzeichnis, was die meiste Zeit nicht erwünscht ist. Beispielsweise macht Samba symbolische Links standardmäßig als Verzeichnisse verfügbar. Es gibt nichts zu gewinnen, wenn ein Bind-Mount verwendet wird. Andererseits können Bindungsbereitstellungen nützlich sein, um Verzeichnishierarchien über NFS verfügbar zu machen.

Sie werden keine Leistungsprobleme mit Bind-Mounts haben. Was Sie haben, ist Verwaltungskopfschmerzen. Bindungs-Mounts können verwendet werden, z. B. um einen Verzeichnisbaum von einer Chroot aus zugänglich zu machen oder um ein durch einen Mount-Punkt verborgenes Verzeichnis freizugeben (dies ist normalerweise eine vorübergehende Verwendung, während eine Verzeichnisstruktur umgebaut wird). Verwenden Sie sie nicht, wenn Sie keine Notwendigkeit haben.

Nur Root kann Bindungs-Mounts manipulieren. Sie können nicht mit normalen Mitteln bewegt werden. Sie sperren ihren Standort und die Ahnenverzeichnisse.

Wenn Sie einen symbolischen Link an einen Befehl übergeben, wirkt sich der Befehl im Allgemeinen auf den Link selbst aus, wenn er auf Dateien angewendet wird, und auf das Ziel des Links, wenn er auf Dateiinhalte angewendet wird. Dies gilt auch für Verzeichnisse. Dies ist normalerweise das Richtige. Einige Befehle haben Optionen symbolische Links unterschiedlich zu behandeln, zum Beispiel ls -L, cp -d, rsync -l. Was auch immer Sie versuchen, es ist viel wahrscheinlicher, dass Symlinks das richtige Werkzeug sind, als dass Bindungs-Mounts das richtige Werkzeug sind.

Gilles 'SO - hör auf böse zu sein'
quelle
Vielen Dank. Ich denke, ich habe die Auswirkungen auf Backups, Kopien und Dateisuchen nicht berücksichtigt. Ich konnte Samba dazu bringen, den Symlinks zu folgen, indem ich 'follow symlinks = yes' in smb.conf hinzufügte, aber dies gefährdet die Sicherheit, indem jeder Samba-Benutzer sagen kann: 'ln -s / etc' in einem beschreibbaren Ordner und Gewinn Zugriff auf Systemdateien. Ich versuche, einen Weg zu finden, um das zu umgehen. Bitte lassen Sie es mich wissen, wenn Sie eines kennen.
Mrtrujiyo
2
@mrtrujiyo Für diese Anforderung halte ich es für sinnvoll, den Samba-Server in einer Chroot-Umgebung auszuführen und die zu exportierenden Verzeichnisse innerhalb dieser Chroot-Umgebung zu binden. Stellen Sie sicher, dass Sie das Stammverzeichnis der Chroot von Sicherungen usw. ausschließen (bei dieser Organisation müssen Sie nur das eine Verzeichnis der obersten Ebene ausschließen, damit es keine großen Wartungsprobleme gibt).
Gilles 'SO- hör auf böse zu sein'
14

Neben was @Gilles schrieb früher, ist es erwähnenswert , dass einige Dienstprogramme könnten ein bind-hängten Verzeichnis betrachten ein eigenes Dateisystem zu sein. Dies kann Auswirkungen auf die Leistung oder die Funktionalität haben, wenn das Programm nicht mehr davon ausgehen kann, dass dieselbe Inode-Nummer auf dieselbe Datei verweist (was nicht der Fall ist, wenn sie sich auf verschiedenen Dateisystemen befinden). Ziel-dann-Verknüpfung-Quelle aufheben usw.

ein CVn
quelle
Vielen Dank. Ich habe mich gefragt, wie einfache Dienstprogramme wie df und du Verzeichnisgrößenberechnungen auf Dateisystemen mit Bind-Mounts handhaben.
Mrtrujiyo
1
Zumindest dfberücksichtigt GNU auf meinem System standardmäßig nicht einmal gebundene Verzeichnisse, aber wenn es speziell gefragt wird, wird es als ein weiterer Mount desselben Dateisystems behandelt. (Was, wenn Sie mich fragen, das erwartete Verhalten für ein Tool mit dem Zweck von df ist.)
CVn
6

Sie sollten auch Bindemounts anstelle von Symlinks verwenden, wenn Sie sich auf eine Unterstützung verlassen, die möglicherweise nicht immer vorhanden ist (z. B. eine externe Festplatte), und Sie möchten sicherstellen, dass die ursprüngliche Verzeichnisstruktur vorhanden ist, auch wenn die Unterstützung besteht schlägt fehl oder wird entfernt.

Wenn ich zum Beispiel / var / tmp auf einer SD-Karte behalten möchte, verwende ich das Bind-Mount, da einige Programme erwarten, dass / var / tmp ein gültiges Verzeichnis ist, auch wenn die Karte entfernt wird.

TopperH
quelle
1

Ich habe versucht, Mount zu binden, um ein Problem zu pacmanumgehen, indem einige Pakete mit (Archlinux, mehr dazu hier ) auf einem System installiert wurden, auf dem /var(sowie /homeund /usr/local) Symlinks vorhanden waren (zwischen Dateisystemen: SSD zu SATA).

Zuerst sah es großartig aus, aber, wie Gilles betonte, locatelieferte es trotz der PRUNE_BIND_MOUNTS = "yes"Zeile in immer mehrere Ergebnisse für eine einzelne Datei /etc/updatedb.conf.

$ locate \*/findutils-4.4.2 | xargs ls -ldiog
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /SHARED/LOCALS/Manjaro/src/findutils-4.4.2
33816600 drwxr-xr-x 12 4096 Dec  3 00:05 /usr/local/src/findutils-4.4.2

Als ich etwas weiter grub, stellte ich fest, dass komplexere Bindungs-Reittiere korrekt beschnitten werden können:

$ sudo mount --bind /SHARED/LOCALS/common/ /usr/local/common
$ findmnt | fgrep -n sdb
34:├─/SHARED/LOCALS                  /dev/sdb5           ext4           rw,relatime,data=ordered
35:│ └─/SHARED/LOCALS/Manjaro/common /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
36:├─/usr/local                      /dev/sdb5[/Manjaro] ext4            rw,relatime,data=ordered
37:│ └─/usr/local/common             /dev/sdb5[/common]  ext4            rw,relatime,data=ordered
38:├─/SHARED/HOMES                   /dev/sdb4           ext4            rw,relatime,data=ordered
39:├─/home                           /dev/sdb4[/Manjaro] ext4            rw,relatime,data=ordered
40:├─/SHARED/VARS                    /dev/sdb3           ext4            rw,relatime,data=ordered
41:├─/var                            /dev/sdb3[/Manjaro] ext4            rw,relatime,data=ordered
42:└─/opt                            /dev/sdb5[/opt]     ext4            rw,relatime,data=ordered

$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
Rebuilding bind_mount_paths:
Matching bind_mount_paths:
Skipping `/SHARED/LOCALS/Manjaro/common': bind mount
Skipping `/usr/local/common': bind mount

$ locate \*/mmedia
/SHARED/LOCALS/common/mmedia

Ohne die Option PRUNE_BIND_MOUNT hätte ich 3 Ergebnisse erhalten:

$ sudo sed -i '1 s/yes/no/' /etc/updatedb.conf 
$ sudo updatedb --debug-pruning 2>&1 >/dev/null | grep bind
prune_bind_mounts\000
$ locate \*/mmedia
/SHARED/LOCALS/Manjaro/common/mmedia
/SHARED/LOCALS/common/mmedia
/usr/local/common/mmedia
$ sudo sed -i '1 s/no/yes/' /etc/updatedb.conf 

Ein weiteres Problem mit Bindmounts:

Natürlich kann man manuell binden Halterungen (mounpoint oder Ziel) hinzufügen PRUNEPATHSin /etc/updatedb.conf.

Außerdem können in Tools mountpointverschiedene statBefehle oder Funktionen verwendet werden, um die hier vorgeschlagene Durchquerung von Dateisystemen zu verbessern

Steinige Straße
quelle