當原始檔案相同但獨立時,rsync 是否保留目標上的硬連結?

當原始檔案相同但獨立時,rsync 是否保留目標上的硬連結?

我正在運行一個(基於 Linux 的)rsync 伺服器來進行軟體分發。一個(基於 Windows 的)來源儲存庫伺服器不在我的控制範圍內,它透過 rsync 向其推送軟體包,全球大約一百個衛星伺服器也透過 rsync 從中提取軟體包。

來源儲存庫包含許多大型的重複檔案。我想透過用硬連結替換這些重複項來減少衛星伺服器上的磁碟空間和頻寬消耗。來源儲存庫的管理員不願意或無法在來源中這樣做,因此我嘗試事後在分發伺服器上執行此操作。我根據該fdupes命令創建了一個簡單的 bash 腳本,該腳本查找重複項組並將其替換為單個文件的硬連結。由於 -H 選項,到衛星伺服器的 rsync 傳輸可以根據需要保留這些硬連結。然而,從來源儲存庫的傳輸會產生不一致的結果。有時重複資料刪除會被保留。有時,來源伺服器會重新傳輸重複資料刪除群組的所有文件,即使來源檔案沒有更改,重複資料刪除也會被破壞。

因此我的問題是:如果要求同步兩個相同但獨立的文件,並且這些文件確實已經存在於目標中且內容正確,但作為指向同一文件的硬鏈接,那麼 rsync 的官方行為是什麼?重新傳輸檔案的確切標準是什麼?有沒有辦法確保在這種情況下保留目標中的硬鏈接,即使來源中不存在硬鏈接?

答案1

tl;dr:若要透過目標處的硬連結保留檔案層級重複資料刪除,請rsync使用該--checksum選項執行。

根據我所做的一系列實驗,完整答案:

如果兩個文件在來源​​處沒有硬鏈接,rsync則將每個文件單獨同步到目標。它不關心文件是否恰好在目標處被硬連結。如果其中一個檔案(或兩個檔案)最終被重新傳輸,則目的地的硬連結將被破壞,否則它將保持不變。也就是說,即使使用該--hard-links選項,rsync也不會因為檔案在來源處沒有硬連結而中斷目標處的硬連結。

重新傳輸檔案的標準取決於--checksum( -c) 和--ignore-times( -I) 選項。

  • --checksum如果給予該選項,則僅重新傳輸來源和目標之間大小或校驗和不同的檔案。因此,如果文件內容未更改,則目標處的硬連結將被保留,即使來源處不存在硬連結。
  • 如果--ignore-times給予該選項,則重新傳輸所有文件,從而破壞目標處不存在於來源處的任何硬連結。
  • 如果這兩個選項均未給出,rsync則將使用原始檔案和目標檔案的修改時間戳進行決策。在這種情況下,如果兩個原始檔案的時間戳記不同,則目標處的硬連結將始終被破壞,因為兩個時間戳中只有一個可以匹配。

答案2

如果使用 -H 或 --hard-links 選項,它會保留來源硬連結

那將不是建立硬連結-事後您必須尋找具有相同校驗和的文件,刪除一個文件,然後新增一個硬連結來取代它。畢竟,您不希望 rsync 讓每個內容重複的檔案成為指向相同檔案的硬連結。想像一下,如果每個 0 長度的文件都是一個硬連結 - 您向其中添加內容,則更改了所有文件的內容。

相關內容