科技 · 實用指南
rsync --link-dest 產生了副本?驗證路徑結構與保留屬性
從目的目錄解析基準目錄,找出屬性不相符之處,並以裝置號和 inode 驗證硬連結,而非只相信相同的雜湊值。

對 rsync --link-dest 而言,檔案位元組完全相同還不夠。先前快照中的檔案必須位於相同的相對路徑,而且命令要求保留的每項屬性都必須一致。相對於目的目錄的基準路徑錯誤、--relative 前綴不一致、mode 權限模式或群組不同,或是使用了 --ignore-times,都可能在不改變檔案內容的情況下產生獨立副本。
把硬連結建立視為可驗證的備份屬性。記錄完整命令與接收端解析後的路徑,以同一命令加入 --dry-run 與 --itemize-changes 執行,再寫入空快照目錄,接著比較裝置號與 inode。雜湊值相同只能證明位元組相同,不能證明共用儲存空間。
1. 固定完整命令,並準備空的目的目錄
將完整的 rsync 命令複製到故障記錄,包括來源與目的路徑結尾的斜線、-a 展開後的選項、-R 或 --relative、-H、ACL 或 xattr 選項、排除規則,以及每個 --link-dest。使用新的空快照目錄;上游手冊提醒,目的目錄中既有檔案的屬性可能被修改,也可能讓逐項變更輸出難以判讀。
不要將加入 --ignore-times 當作診斷捷徑。rsync 手冊明確指出,這個選項會阻止 --link-dest 建立連結,因為連結是傳輸的替代方式,而不是更新後再執行的第二輪作業。
2. 從目的目錄解析基準目錄
若 DEST=/backups/2026-10-28,且指定 --link-dest=../2026-10-27,基準目錄應解析為 /backups/2026-10-27。對目的目錄及組合後的基準路徑分別使用 realpath,並確認先前的檔案位於新傳輸將建立的相同相對路徑。不要從目前的 shell 目錄解析相對基準路徑。
來源路徑以斜線結尾時,傳輸的是目錄內容;沒有結尾斜線時,rsync 會額外建立一層來源目錄。使用 --relative 也會保留來源路徑前綴。絕對基準路徑只會消除 DIR 起點的歧義,不會移除 --relative 引入的前綴;先前的基準目錄仍須包含完全相同的傳輸相對路徑。
3. 區分位元組相同與屬性相同
在與原命令相同的發起主機、使用者帳號和工作目錄下執行 rsync,保持來源與目的端點及其餘所有選項不變,只加入 --dry-run 與 --itemize-changes。在接收端檢查基準路徑、目的路徑及其裝置號。解讀逐項輸出中的字母,不要看到檢查碼相同就停止。p、o、g、t、a 或 x 的差異可能解釋 rsync 為何建立本機副本:硬連結名稱不能各自具有不同的 inode 中繼資料。
以 stat 比較來源檔案與先前快照中的候選檔案,記錄 mode 權限模式、擁有者、群組、大小和修改時間。如果刻意不保留某項屬性,應將其列為明確的原則決定,並讓來源、先前快照與新執行作業保持一致;不要為了強行去除重複資料而盲目取消屬性保留。
4. 檢查檔案系統與 rsync 的適用邊界
GNU 文件說明,硬連結不能跨越檔案系統邊界。記錄先前檔案與新目的目錄的裝置號。如果裝置號不同,rsync 仍可能將先前檔案作為傳輸基準,但無法建立跨檔案系統硬連結。特殊檔案類型和檔案系統還可能有其他限制。
區分 -H 與 --link-dest。-H 保留來源中已存在的硬連結群組;--link-dest 則利用另一套快照目錄樹中未變更的檔案建立連結。使用其中一個選項,無法修復另一個選項所面對的錯誤基準路徑。
5. 執行一次,再證明連結確已建立
實際執行前,從已核對的命令中移除 --dry-run(若使用 -n,則移除 -n),保留其餘已核對的選項,再執行 rsync 寫入空的目的目錄;下文的 stat -c 檢查使用 GNU stat。抽樣未變更的一般檔案,在先前路徑與新路徑上執行 stat -c '%d %i %h %a %s %Y %n'。只有裝置號和 inode 皆相同,才能接受節省空間的結論;連結計數應反映新增的檔名。
同時記錄雜湊值以檢查內容完整性,但應將兩類結論分開。在本機 rsync 3.2.7 測試案例中,屬性完全相同的檔案共用同一 inode,連結計數為 2。只變更 mode 權限模式時,產生了逐項輸出 cf...p..... 與新 inode;--ignore-times 則產生了 >f......... 及另一個新 inode,即使所有 SHA-256 雜湊值皆相同。
6. 帶著證據進一步處理特定版本故障
進一步處理前先按觀察結果分支。如果計算出的 --relative 路徑找不到先前的候選檔案,應同時檢查傳輸路徑的階層,以及所選先前快照是否包含該檔案、是否成功完成;單憑缺少檔案不能認定前綴不符。確認是階層不符時,在傳輸設定中修正配置。如果參考快照不完整或沒有該檔案,可改選已核實完整且包含該候選檔案的參考快照;沒有可用參考時,應預期該檔案會重新複製。p、o、g、t、a 或 x 標記表示對應的保留屬性值不同;先將來源與先前快照的中繼資料和預期的保留原則比較,再決定要改什麼。-I 或 --ignore-times 會停用以連結取代傳輸;裝置號不同則不可能建立硬連結。只有這些檢查都通過後,才記錄本機與遠端 rsync 版本、傳輸模式、逐項輸出和最小重現。2026 年的專案第一手問題記錄了常駐程式相對基準路徑回歸:它會在沒有提示的情況下重新傳輸資料,並已在專案中修復;應保留版本證據,而不是把所有失敗都歸因於該缺陷。
這套流程只證明抽樣路徑中的一般檔案實現了連結重用,無法為每種 ACL、xattr、符號連結、裝置節點、遠端掛載或舊版 rsync 建置提供全面保證。應依照備份承諾涵蓋的具體檔案類別擴大樣本,再監控新快照中的 inode 重用情況,以及非預期的傳輸位元組數。
