rsync 的 –inplace 選項如何與 –backup 一起使用?
我將數據與
rsync --delete --backup --backup-dir=[some directory] -avz [source] [destination]
.
- 在執行 rsync 的機器上,
[source]
和[destination]
目錄都是本地掛載的 NFS 導出(即執行 rsync 的機器是 NFS 客戶端)。- 在成功
rsync
+一些檢查後,備份被刪除。我區域網路的另一台機器是應用程序伺服器,並且
[destination]
在本地安裝了相同的 NFS 導出。由於應用程序方面的一些複雜性,我沒有控制,看起來應用程序通過它們的 inode 而不是使用它們的名稱來引用文件。當文件從以下位置更改時會帶來困難[source]
:
- 比方說
[destination]
,這個文件有 inode123
- 應用程序“指向”具有 inode 的文件
123
[source]
rsync 檢測到這個文件的版本和版本之間的差異,[destination]
並且必須傳輸它- 在傳輸它之前,它通過“移動”它來創建一個備份:備份文件現在有 inode
123
- 文件的更新版本由 rsync 傳輸,並獲得一個新的 inode (
456
)123
在成功rsync + 檢查後,備份被刪除:沒有文件有 inode- 仍然指向 inode 的應用程序
123
已損壞
- 您是否確認我清楚了解如何
rsync --backup
工作和 inode ?--inplace
rsync 選項如何使用--backup
:
- rsync 會創建一個擁有自己的 inode 的備份文件嗎?
- 文件會保留其目前的 inode 嗎?
幾乎不可能通過 inode 引用文件。要打開文件,必須打開對目錄中文件名的引用。然後你有一個文件句柄,它現在獨立於文件名(這就是為什麼文件可以從文件系統中刪除但仍然是打開和活動的)。因此,讓我們假設文件在應用程序的整個生命週期中保持打開狀態。您現在需要使用
rsync
.通常,
rsync
它將在任何現有實例旁邊創建目標文件的臨時副本,然後在最後一刻刪除(或備份)原始文件並切換到替換。可以使用該--inplace
選項修改此行為,這樣就不會創建新副本,而是rsync
寫入實際目標。現在,您還指定了
--backup
,所以做正確的事情並在允許更新原始實例rsync
之前為備份創建一個副本。--inplace
您可以通過一個簡短的範例看到這一點:# Prepare scenario mkdir /tmp/624404 cd /tmp/624404 date >src cp -p src dst # Initial files, with inodes ls -li src dst 149172 -rw-r--r-- 1 roaima 29 Dec 14 11:49 dst 137559 -rw-r--r-- 1 roaima 29 Dec 14 11:49 src # Update, copy, and list date >src rsync --times --inplace --backup src dst ls -li total 12 149172 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst 149194 -rw-r--r-- 1 roaima 29 Dec 14 11:49 dst~ 137559 -rw-r--r-- 1 roaima 29 Dec 14 11:50 src # Update again, copy, and list date >src rsync --times --inplace --backup src dst ls -li total 12 149172 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst 149194 -rw-r--r-- 1 roaima 29 Dec 14 11:50 dst~ 137559 -rw-r--r-- 1 roaima 29 Dec 14 11:50 src
您可以看到目標 (
dst
) 文件仍然具有其原始 inode,但已為備份提供了新的 inode。第二次更新顯示此後保留了 inode。在你的例子中,聽起來確實
--inplace --backup
是你需要的。但是,請注意手冊頁警告,警告:您不應使用此選項來更新其他人正在訪問的文件,因此在選擇將其用於副本時要小心。
不是預設值的原因
--inplace
是中斷的部分副本可能會使目標文件處於不一致狀態,並且作者認為擁有內部一致的過期文件比損壞的文件更好-of-date 文件。這種行為可以用諸如--inplace
和之類的標誌來修改--partial
(甚至--append
使用rsync
3.0.0 及更高版本)。