如果我mount --bind
/a
在/b
並且如果我mv /a/bigfile /b/
將花費很多時間(如果原始檔案很大)。這實際上會複製文件,然後刪除來源文件,而不是簡單地更新文件系統的文件表。
我了解如何以及為何mount --bind
有效。正如其他人指出的那樣,對此有一些很好的解釋:
有沒有什麼方法可以告訴 mount amount --bind
在同一個檔案系統中,以便透過實際更新檔案系統的檔案表來完成這樣的操作(移動)?
我問的是如何解決這個問題,而不是如何理解它:也許我不知道的內核補丁已經可用,或者我還沒有找到丟失的參數(等等)。
原因:在我當前的設定中,有一個服務(nextcloud)僅支援mount --bind
.我無法使用符號連結。例如,如果我需要在 nextcloud 的每個帳戶中擁有一個共用資料夾,則必須使用綁定。我可以接受任何適用於 nextcloud 的解決方案,如果它是在檔案系統/核心層級制定的。這是因為當前設定還包括以其他方式存取這些文件,例如 ssh。換句話說,我希望能夠使用任何命令或應用程式來移動文件,例如範例。
答案1
顯然不是,手冊頁rename(2)
提到了這一點:
EXDEV
舊路徑和新路徑不在同一個安裝的檔案系統上。 (Linux 允許在多個點掛載一個檔案系統,但rename()
不能跨不同的掛載點工作,即使在兩個掛載點上掛載相同的檔案系統也是如此。
如果我沒記錯的話,綁定安裝與多次安裝相同的檔案系統相同,即事後綁定沒有「來源」和「目標」。
還有另一個回答幾個月前關於同一主題的另一個問題。該連結指向與核心開發人員進行的討論。所以去投票吧。
答案2
我在 docker 容器中的 nextcloud 和 samba 也遇到同樣的問題。我透過將所有資料移至 nextcloud 中並讓其他人從該磁碟區綁定安裝它們來解決這個問題。
因此,從任何服務的角度來看,mv 總是只位於一個綁定掛載內。
不確定這是否對你有幫助
答案3
使用rsync
代替mv
應該可以解決問題。嘗試使用以下命令
rsync -avP /a/bigfile /b/bigfile
問題是因為 的視點mount --bind
位於內核中,並且對諸如 之類的更高級別程式是隱藏的mv
。與 不同的是mv
,rsync
僅移動文件的已修改部分。
這解釋了關於mount --bind
什麼是綁定安裝?