ls -i 中的 inode 編號如何與磁碟上的 inode 相關
我試圖了解 inode 編號(由 顯示
ls -i
)如何與 ext4 分區一起使用。我試圖了解它們是否是 linux 核心的構造並映射到磁碟上的 inode,或者它們是否實際上是儲存在磁碟上的相同數字。
問題:
- 重新啟動電腦時,inode 編號是否會更改?
ls -i
掛載兩個分區時,只要兩個不同的文件在不同的分區上,就可以為它們生成相同的 inode 號。- 可以在不重新啟動或重新掛載分區的情況下回收 inode 編號嗎?
為什麼我要問…
我想在具有 1.5TB 數據和大約 2000 萬個文件(文件名)的 USB 硬碟上創建二級索引。文件範圍從 10s 字節到 100s GB。其中許多是多次硬連結,因此單個文件(磁碟上的 blob)可能有多達 200 個文件名。
我的任務是通過檢測重複並用更多的硬連結替換重複來節省磁碟空間。
現在作為一個單獨的練習,我想我可以為磁碟上的每個文件創建一個數據庫,它是 shasum、權限等……一旦建立,檢測重複應該是微不足道的。位我需要確定我使用的是正確的唯一鍵。由於存在大量硬連結,文件名不合適。我希望我可以使用 inode 編號。
我想了解的是,當我下次重新啟動機器時,我們的 inode 編號是否會改變。或者如果它們更加不穩定(在我建構數據庫時它們會改變嗎?)
我閱讀的所有文件都模糊了核心提供的 inode 編號和磁碟上的 inode 之間的區別。根據我已經閱讀過的文章,這些是否相同尚不清楚。
我試圖了解 inode 編號(由 ls -i 顯示)如何與 ext4 分區一起使用。
從本質上講,inode 是文件系統(!)的引用,是磁碟上實際數據(位和字節)和與該數據關聯的名稱(
/etc/passwd
例如)之間的橋樑。文件名被組織到目錄中,其中目錄條目是帶有相應 inode 的文件名。然後 inode 包含實際資訊 - 權限,磁碟上佔用的塊、所有者、組等。在 UNIX 文件系統中的目錄結構如何儲存中,有一個非常好的圖表,它更好地解釋了文件和 inode 之間的關係:
當你在另一個目錄中有一個文件指向相同的 inode 號時,你就有了所謂的硬連結。
現在,請注意我已經強調了 inode 是特定於文件系統的引用,這就是要注意這一點的原因:
任何給定文件的 inode 編號對於文件系統來說是唯一的,但對於安裝在給定主機上的所有文件系統不一定是唯一的。當您有多個文件系統時,您會看到文件系統之間的 inode 編號重複,這是正常的。
這與設備相反。您可能在同一設備上有多個文件系統,例如
/var
filesystem 和/
,但它們位於同一驅動器上。現在,inode 號可以改變嗎?有點。文件系統負責管理 inode,因此除非文件系統存在潛在問題,否則 inode 編號不應更改。在某些棘手的情況下,例如vim 文本編輯器,
重命名舊文件,然後用原始名稱寫入一個新文件,如果它認為它可以重新創建原始文件的屬性。如果您想重用現有的 inode(因此有失去數據的風險,或者浪費更多時間製作備份副本),請將 set backupcopy yes 添加到您的 .vimrc。
要記住的關鍵點是,數據對使用者來說可能是相同的,實際上它被寫入磁碟上的新位置,因此 inode 編號發生了變化。
因此,簡而言之:
- 重新啟動電腦時,inode 編號是否會更改?
除非重啟後文件系統有問題
2.掛載兩個分區時,ls -i 是否可以為兩個不同的文件生成相同的inode number,只要它們在不同的分區上即可。
是的,因為兩個不同的分區會有不同的文件系統。我對LVM了解不多,但在這種類型的儲存管理下,兩個物理卷可以組合成一個邏輯卷,在我的理論猜測中,
ls -
每個文件都會產生一個 inode
- 可以在不重新啟動或重新掛載分區的情況下回收 inode 編號嗎?
文件系統在刪除文件時執行此操作(即,當所有指向文件的連結都被刪除,並且沒有任何內容指向該 inode 時)。
我的任務是通過檢測重複並用更多的硬連結替換重複來節省磁碟空間。
好吧,檢測重複可以通過
md5sum
或其他校驗和命令完成。在這種情況下,您正在檢查實際數據,這些數據可能存在也可能不存在於磁碟上的不同 inode 下。一個例子來自heemayls 的回答:find . ! -empty -type f -exec md5sum {} + | sort | uniq -w32 -dD