Wenn ich mount --bind
/a
eingebe /b
und wenn ich mv /a/bigfile /b/
eingebe, wird es sehr lange dauern (wenn die Quelldatei groß ist). Dadurch wird die Datei tatsächlich kopiert und dann die Quelldatei gelöscht, anstatt einfach die Dateitabelle des Dateisystems zu aktualisieren.
Ich verstehe, wie und warum mount --bind
es funktioniert. Wie andere bereits angemerkt haben, gibt es dazu einige gute Erklärungen:
- Was ist eine Bind-Mount?
- Warum kann ich aus einem „mount --bind“-Verzeichnis im selben Dateisystem keinen „Hardlink“ zu einer Datei erstellen?
Gibt es eine Möglichkeit, mount mitzuteilen, dass sich a mount --bind
im selben Dateisystem befindet, sodass Vorgänge wie dieser (Verschieben) durch die tatsächliche Aktualisierung der Dateitabelle des Dateisystems durchgeführt werden?
Ich frage, wie man dieses Problem löst und nicht, wie man es versteht: Vielleicht ist bereits ein Kernel-Patch verfügbar, von dem ich nichts weiß, oder es fehlt ein Parameter, den ich noch nicht gefunden habe (usw.).
Warum: In meinem aktuellen Setup gibt es einen Dienst (Nextcloud), der nur das unterstützt mount --bind
. Ich kann keine symbolischen Links verwenden. Wenn ich beispielsweise in jedem Nextcloud-Konto einen freigegebenen Ordner haben muss, muss dies mit Bind geschehen. Ich kann jede Lösung akzeptieren, die mit Nextcloud funktioniert, wenn sie auf Dateisystem-/Kernelebene erstellt wird. Dies liegt daran, dass das aktuelle Setup auch den Zugriff auf diese Dateien auf andere Weise, beispielsweise per SSH, ermöglicht. Mit anderen Worten, ich möchte eine Datei wie im Beispiel mit jedem beliebigen Befehl oder jeder beliebigen Anwendung verschieben können.
Antwort1
Offenbar nicht, diemanpagerename(2)
erwähnt dies:
EXDEV
alter PfadUndneuer Wegbefinden sich nicht auf demselben gemounteten Dateisystem. (Linux erlaubt das Mounten eines Dateisystems an mehreren Punkten,rename()
funktioniert aber nicht über verschiedene Mount-Punkte hinweg, selbst wenn an beiden das gleiche Dateisystem gemountet ist.
Wenn ich mich recht erinnere, ist ein Bind-Mount dasselbe wie das mehrmalige Mounten desselben Dateisystems, d. h. es gibt im Nachhinein keine „Quelle“ und kein „Ziel“ für das Bind.
Es gibt noch eine andereAntwortzu einer anderen Frage zum gleichen Thema von vor ein paar Monaten. Diese enthält Hinweise auf eine Diskussion darüber mit den Kernel-Entwicklern. Also stimmen Sie dafür.
Antwort2
ich habe das gleiche Problem mit Nextcloud und Samba in Docker-Containern. Ich habe es gelöst, indem ich alle Daten in Nextcloud verschoben und sie von anderen per Bind-Mount von diesem Volume aus mounten ließ.
Aus Sicht aller Dienste befindet sich ein MV daher immer nur innerhalb einer Bind-Einbindung.
bin mir aber nicht sicher, ob dir das hilft
Antwort3
Verwenden Sie rsync
stattdessen mv
sollte das Problem gelöst sein. Versuchen Sie es mit dem folgenden Befehl
rsync -avP /a/bigfile /b/bigfile
Das Problem liegt darin, dass der Ansichtspunkt von mount --bind
im Kernel liegt und vor Programmen höherer Ebene wie verborgen ist mv
. Im Gegensatz mv
zu rsync
verschiebt nur die geänderten Teile einer Datei.
Dies erklärt etwamount --bind
Was ist eine Bind-Mount?