當源文件相同但分開時,rsync 是否會保留目標上的硬連結?
我正在執行一個(基於 Linux 的)rsync 伺服器來進行軟體分發。我無法控制的(基於 Windows 的)源儲存庫伺服器通過 rsync 將軟體包推送到它,全球大約有一百個衛星伺服器從它那里拉出,也通過 rsync。
源儲存庫包含許多大的重複文件。我想通過硬連結替換這些重複項來減少衛星伺服器上的磁碟空間和頻寬消耗。源儲存庫的管理員不願意或無法在源上這樣做,所以我試圖在分發伺服器上這樣做。我創建了一個簡單的 bash 腳本,基於
fdupes
命令查找重複組並將其替換為指向單個文件的硬連結。由於 -H 選項,rsync 傳輸到衛星伺服器會根據需要保留這些硬連結。但是,從源儲存庫進行的傳輸會產生不一致的結果。有時會保留重複數據刪除。有時,源伺服器會重新傳輸去重組的所有文件,即使源文件沒有更改,去重也會中斷。因此我的問題是: rsync 的官方行為是什麼,以防它被要求同步兩個相同但獨立的文件,並且這些文件確實已經存在於目標中並且具有正確的內容,但是作為同一個文件的硬連結?重新傳輸文件的確切標準是什麼?有沒有辦法確保在這種情況下保留目標中的硬連結,即使源中不存在硬連結?
tl;dr:要通過目的地的硬連結保留文件級重複數據刪除,請
rsync
使用該--checksum
選項執行。完整答案,根據我所做的一系列實驗:
如果兩個文件未在源處硬連結,
rsync
則將每個文件單獨同步到目標。它不關心文件是否恰好在目的地硬連結。如果其中一個文件(或兩個文件)最終被重新傳輸,則目的地的硬連結將被破壞,否則它將保持不變。也就是說,即使使用該--hard-links
選項,rsync
也不會僅僅因為文件在源處沒有硬連結而破壞目標處的硬連結。重新傳輸文件的標準取決於
--checksum
(-c
) 和--ignore-times
(-I
) 選項。
- 如果給出該選項
--checksum
,則僅重新傳輸源和目標之間大小或校驗和不同的文件。因此,如果文件內容沒有更改,那麼即使源中不存在硬連結,也會保留目標處的硬連結。- 如果給出該選項
--ignore-times
,則重新傳輸所有文件,從而破壞源中不存在的目標上的任何硬連結。- 如果這兩個選項都沒有給出,
rsync
將使用源文件和目標文件的修改時間戳來決定。在這種情況下,如果兩個源文件的時間戳不同,則目標處的硬連結將始終斷開,因為只有兩個時間戳中的一個可以匹配。
如果您使用 -H 或 –hard-links 選項,它會保留源硬連結
這不會創建硬連結——你必須在事後通過查找具有相同校驗和的文件、刪除一個文件並添加一個硬連結來替換它。畢竟,您不希望 rsync 使每個內容重複文件成為指向同一文件的硬連結。想像一下,如果每個長度為 0 的文件都是一個硬連結——你向一個文件添加內容,你就改變了所有文件的內容。