rsync 連結到確切的檔案還是僅連結到同名的檔案?

rsync 連結到確切的檔案還是僅連結到同名的檔案?

我為最近更換的電腦(內部硬碟到外部硬碟)編寫了一些 rsync 備份腳本。

當我拿到新電腦時,我將檔案複製過來(舊的內部硬碟到新的內部硬碟)。相同的檔案結構、檔案名稱等。

我想知道是否可以在現在連接到舊外部硬碟的新電腦上執行備份腳本。

我預見的潛在問題圍繞著 rsync 連結到確切的檔案還是僅連結到檔案名稱。

我記得讀過一些關於文件系統在每個文件的“幕後”都有特定標識符(序號或其他東西)的內容,並且更改名稱不會更改該數字。

因此,如果 rsync 連結到該數字而不只是目錄結構中特定位置的檔案名,則可能會透過重複複製所有內容或出現其他奇怪的結果,從而使外部硬碟完全混亂。

只是 rsync 使用硬/軟連結工作,而我不是這方面的專家,無法了解具體細節或其含義...

任何幫助表示讚賞!

MacOS Ventura 13.4.1,APFS(檔案系統)

答案1

太長了;博士

沒有什麼好擔心的。讓你的腳本使用rsync --dry-run --verbose …親自看看。如果看起來正常,請繼續使用原始腳本(不含--dry-run)。


索引節點號

我記得讀過一些關於文件系統在每個文件的“幕後”都有特定標識符(序號或其他東西)的內容,並且更改名稱不會更改該數字。

索引節點數字。 Unix/Linux 中的本機檔案系統通常使用這個概念(macOS 是 Unix)。內部不使用 inode 的檔案系統看起來就像使用它們一樣,因此可以以類似的方式處理它們。所以是的,文件確實有序號,ls -i可以列印它們。

因此,如果 rsync 連結到該數字而不僅僅是文件名...

rsync不基於 inode 編號,它使用路徑名(路徑名包括檔案名稱)。索引節點號的設計目的並不意味著其檔案系統以外的任何內容。我的意思不是檔案系統類型;而是檔案系統類型。我的意思是它們位於檔案系統的特定實例的內部,而不連接到另一個檔案系統(即使是相同類型)中的索引節點號。

你是對的,如果rsync嘗試基於 inode 編號,它可能會造成嚴重破壞。它不這樣做。 AFAIK沒有標準介面可以透過 inode 號存取文件。並且您(或rsync)在建立新文件時無法請求特定號碼。對於不使用 inode 且僅顯示為使用 inode 的檔案系統,inode 編號可能會動態生成,並且在許多(全部?)情況下,無法保證卸載後完全相同的編號與完全相同的檔案關聯並再次掛載這樣的檔案系統。

所有這些意味著程式不應該關心 inode 編號,除非它們應該處理檔案系統本身的內部結構。索引節點號是檔案系統內部的。程式喜歡cprsync應該在不同的抽象層級上工作,而且它們確實做到了。不同的抽象層級是帶有路徑名的目錄樹。

索引節點號「洩漏」並被此類程式(安全)使用的一種情況是當程式想要發現硬連結時。硬連結檔案是指向單一檔案(inode 號)的兩個或多個路徑名。程式可以比較 inode 編號,從而判斷哪些路徑名通往相同檔案。硬連結僅在單一檔案系統中工作;碰巧具有相同索引節點號但存在於不同檔案系統中的檔案不相關,程式會考慮到這一點。

例如,rsync您可以使用--hard-links/-H選項:

這告訴rsync我們在來源中尋找硬連結檔案並將目標上的對應檔案連結在一起。如果沒有此選項,來源中的硬連結檔案將被視為單獨的檔案。

[…]

請注意,rsync 只能偵測傳輸集中檔案之間的硬連結。 […]

來源:man 1 rsync

rsync -H嘗試發現來源中的硬連結並在目標上建立硬連結。但即使如此,目標上的 inode 編號也與來源中的 inode 編號無關。當rsync -H注意到來源中的某些路徑名稱導致相同檔案系統中的相同 inode 號碼時,它將嘗試在目標上建立對應的路徑名稱以導致一些單一索引節點號;換句話說,它將嘗試建立硬連結檔案。確切的數字超出了 的範圍(和能力)rsync。此工具不需要關心數字,因為即使建立硬連結 ( link(2)) 的介面也使用路徑名,而不是 inode 編號。


我可以只運行備份腳本嗎?

我複製了文件(舊的內部硬碟到新的內部硬碟)。相同的檔案結構、檔案名稱等。

你可以。新來源中的索引節點號可能(而且很可能)與舊來源中的索引節點號完全不同,但這根本不重要。原始碼的相同目錄結構就足夠了。

記住有--dry-run/-n為了安全起見,建立腳本的副本並使其使用rsync --dry-run --verbose …左右;運行它並分析輸出。不過,您將遇到的問題(如果有的話)與 inode 編號無關。

相關內容