Linux檔案系統依賴於inode。檔案系統內部工作的這些重要部分經常被誤解。讓我們看看他們到底是什麼,他們做了什麼。
根據定義,檔案系統需要儲存檔案,而且它們還包含目錄。檔案儲存在目錄中,這些目錄可以有子目錄。在某個地方,必須記錄檔案系統中所有檔案的位置、它們的名稱、它們所屬的帳戶、它們擁有的許可權等等。此資訊稱為元資料,因為它是描述其他資料的資料。
在LinuxExt4檔案系統中,inode和目錄結構共同提供了一個基礎框架,用於儲存每個檔案和目錄的所有元資料。它們使元資料對任何需要它的人都可用,無論是核心、使用者應用程式還是Linux實用程式,如ls、stat和df。
雖然確實存在一對結構,但檔案系統需要的遠不止這些。每座建築都有成千上萬的建築。每個檔案和目錄都需要一個inode,因為每個檔案都在一個目錄中,所以每個檔案也需要一個目錄結構。目錄結構也被稱為目錄條目,或“dentries”
每個inode都有一個inode編號,該編號在檔案系統中是唯一的。同一inode編號可能出現在多個檔案系統中。但是,檔案系統ID和inode編號結合起來就形成了一個唯一的識別符號,而不管您的Linux系統上安裝了多少個檔案系統。
請記住,在Linux中,您不需要掛載硬碟驅動器或分割槽。您可以掛載分割槽上的檔案系統,因此很容易在沒有意識到的情況下擁有多個檔案系統。如果在一個驅動器上有多個硬碟驅動器或分割槽,則會有多個檔案系統。例如,它們可能與所有ext4的型別相同,但它們仍然是不同的檔案系統。
所有索引節點都放在一張桌子上。使用inode編號,檔案系統可以輕鬆地計算inode所在inode表的偏移量。你可以理解為什麼inode中的“i”代表索引。
包含inode編號的變數在原始碼中宣告為32位無符號長整數。這意味著inode數是一個最大值為2^32的整數值,它的計算結果是4294967295,遠遠超過了40億個inode。
這是理論上的最大值。實際上,ext4檔案系統中inode的數量是在檔案系統以每16kb檔案系統容量一個inode的預設比率建立時確定的。目錄結構是在檔案系統使用時動態建立的,因為檔案和目錄是在檔案系統中建立的。
有一個命令可以用來檢視您的計算機上的檔案系統中有多少索引節點。df命令的-i(inodes)選項指示它以inodes的數量顯示其輸出。
我們將檢視第一個硬碟上第一個分割槽上的檔案系統,因此鍵入以下內容:
df -i /dev/sda1輸出給我們:
我們在這個檔案系統中使用了10%的inode。檔案以磁碟塊的形式儲存在硬碟上。每個inode指向儲存它們所代表的檔案內容的磁碟塊。如果你有數百萬個小檔案,你可以在用完硬碟空間之前用完索引節點。然而,這是一個非常困難的問題。
在過去,一些郵件伺服器將電子郵件儲存為離散檔案(這會迅速導致大量小檔案的收集)存在此問題。當這些應用程式將其後端更改為資料庫時,這就解決了問題。一般的家庭系統不會耗盡inode,這是因為在ext4檔案系統中,如果不重新安裝檔案系統,就不能新增更多inode。
要檢視檔案系統上磁碟塊的大小,可以使用blockdev命令和--getbsz(get block size)選項:
sudo blockdev --getbsz /dev/sda塊大小為4096位元組。
讓我們使用-B(塊大小)選項指定4096位元組的塊大小,並檢查常規磁碟使用情況:
df -B 4096 /dev/sda1此輸出顯示:
在我們的示例中,檔案儲存(以及inode和目錄結構的儲存)已經佔用了這個檔案系統上28%的空間,代價是inode的10%,所以我們的狀態很好。
要檢視檔案的inode編號,可以使用ls和-i(inode)選項:
ls -i geek.txt這個檔案的inode編號是1441801,所以這個inode儲存了這個檔案的元資料,而且,傳統上是指向檔案所在硬碟上的磁碟塊的指標。如果檔案是碎片、非常大或兩者都是,inode指向的某些塊可能會包含指向其他磁碟塊的進一步指標。其他一些磁碟塊也可能包含指向另一組磁碟塊的指標。這克服了inode大小固定並且能夠容納有限數量的指向磁碟塊的指標的問題。
這個方法被一個新的方案所取代,這個方案使用“擴充套件資料塊”來記錄用於儲存檔案的每組連續資料塊的開始和結束資料塊。如果檔案未分段,則只需儲存第一個塊和檔案長度。如果檔案是分段的,則必須儲存檔案每個部分的第一個和最後一個塊。這種方法(顯然)更有效。
如果要檢視檔案系統是否使用磁碟塊指標或擴充套件資料塊,可以檢視inode內部。為此,我們將使用帶有-R(request)選項的debugfs命令,並將感興趣的檔案的inode傳遞給它。這要求debugfs使用其內部的“stat”命令來顯示inode的內容。因為inode編號只在檔案系統中是唯一的,所以我們還必須告訴debugfs inode所在的檔案系統。
下面是這個示例命令的樣子:
sudo debugfs -R "stat <1441801>" /dev/sda1如下所示,debugfs命令從inode中提取資訊,並以較少的時間將其呈現給我們:
我們顯示了以下資訊:
我們現在有很多關於檔案的資訊,但是,正如您可能注意到的,我們沒有得到檔名。這就是目錄結構發揮作用的地方。在Linux中,就像檔案一樣,目錄也有inode。目錄inode不是指向包含檔案資料的磁碟塊,而是指向包含目錄結構的磁碟塊。
與inode相比,目錄結構包含的檔案資訊量有限。它只儲存檔案的inode編號、名稱和名稱長度。
inode和目錄結構包含您(或應用程式)需要了解的關於檔案或目錄的所有資訊。目錄結構在一個目錄磁碟塊中,所以我們知道檔案所在的目錄。目錄結構為我們提供了檔名和inode編號。inode告訴我們關於檔案的所有其他資訊,包括時間戳、許可權以及在檔案系統中從何處找到檔案資料。
您可以很容易地看到目錄的inode編號,就像您可以看到檔案的inode編號一樣。
在下面的示例中,我們將ls與-l(長格式)、-i(inode)和-d(目錄)選項一起使用,並檢視工作目錄:
ls -lid work/因為我們使用了-d(directory)選項,ls報告的是目錄本身,而不是它的內容。這個目錄的inode是1443016。
要對主目錄重複此操作,請鍵入以下內容:
ls -lid ~主目錄的inode是1447510,工作目錄在主目錄中。現在,讓我們看看工作目錄的內容。我們將使用-a(all)選項,而不是-d(directory)選項。這將向我們顯示通常隱藏的目錄項。
我們鍵入以下內容:
ls -lia work/因為我們使用了-a(all)選項,所以將顯示單點(.)和雙點(..)條目。這些條目表示目錄本身(單點)和其父目錄(雙點)
如果您檢視單點條目的inode編號,您會發現它是1443016—與我們發現工作目錄的inode編號時得到的inode編號相同。此外,雙點條目的inode編號與主目錄的inode編號相同。
所以你可以用這張cd。。命令在目錄樹中向上移動一級。同樣,當在應用程式或指令碼名稱前面加上./時,可以讓shell知道從何處啟動應用程式或指令碼。
如前所述,要在檔案系統中擁有格式良好且可訪問的檔案,需要三個元件:檔案、目錄結構和inode。檔案是儲存在硬碟上的資料,目錄結構包含檔名及其inode號,inode包含檔案的所有元資料。
符號連結是看起來像檔案的檔案系統條目,但實際上是指向現有檔案或目錄的快捷方式。讓我們看看他們是如何管理的,以及如何使用這三個元素來實現這一點。
假設我們有一個包含兩個檔案的目錄:一個是指令碼,另一個是應用程式,如下所示。
我們可以使用ln命令和-s(符號)選項建立到指令碼檔案的軟連結,如下所示:
ls -s my_script geek.sh我們已經建立了一個連結到我的_指令碼.sh打電話極客。我們可以鍵入以下內容並使用ls檢視兩個指令碼檔案:
ls-li*.sh檔案
的條目極客以藍色顯示。許可權標誌的第一個字元是“l”,表示連結->;指向我的_指令碼.sh. 所有這些都表明極客是一個連結。
正如您可能預期的,這兩個指令碼檔案具有不同的inode編號。不過,更令人驚訝的是,軟連線,極客,沒有與原始指令碼檔案相同的使用者許可權。實際上,的許可權極客所有的使用者都有完全的許可權。
的目錄結構極客包含連結及其inode的名稱。當您嘗試使用連結時,它的inode會被引用,就像普通檔案一樣。連結inode將指向磁碟塊,但磁碟塊不包含檔案內容資料,而是包含原始檔案的名稱。檔案系統重定向到原始檔案。
我們將刪除原始檔案,並檢視在鍵入以下內容以檢視極客:
rm my_script.sh cat geek.sh符號連結斷開,重定向失敗。
我們現在鍵入以下內容以建立指向應用程式檔案的硬連結:
ln special-app geek-app要檢視這兩個檔案的inode,請鍵入以下內容:
ls -li兩個看起來都像普通檔案。沒有任何關於geek應用程式的資訊表明它是ls列表中的一個連結極客做。另外,geek應用程式擁有與原始檔案相同的使用者許可權。然而,令人驚訝的是,這兩個應用程式都有相同的inode編號:1441797。
geek app的目錄條目包含名稱“geek app”和inode編號,但它與原始檔案的inode編號相同。因此,我們有兩個不同名稱的檔案系統條目,它們都指向同一inode。事實上,任意數量的項都可以指向同一inode。
我們將鍵入以下內容並使用stat程式檢視目標檔案:
stat special-app我們看到兩個硬連結指向這個檔案。它儲存在inode中。
在下面的示例中,我們刪除原始檔案並嘗試使用帶有祕密、安全密碼的連結:
rm special-app ./geek-app correcthorsebatterystaple令人驚訝的是,應用程式按預期執行,但是如何執行呢?它之所以有效,是因為當你刪除一個檔案時,inode是可以自由重用的。目錄結構被標記為inode編號為零,然後磁碟塊可用於儲存在該空間中的另一個檔案。
但是,如果指向inode的硬連結數大於1,則硬連結計數將減少1,並且已刪除檔案的目錄結構的inode數將設定為零。硬碟和inode上的檔案內容對現有的硬連結仍然可用。
我們將鍵入以下內容,並再次在極客應用程式上使用stat:
stat geek-app這些細節與前面的stat命令來自同一inode(1441797)。連結數減少了一個。
因為這個inode只有一個硬連結,如果我們刪除geek應用程式,它會真正刪除這個檔案。檔案系統將釋放inode並用inode為零標記目錄結構。一個新檔案可以覆蓋硬碟上的資料儲存。
相關:如何在Linux上使用stat命令
這是一個整潔的系統,但有間接費用。要讀取檔案,檔案系統必須執行以下所有操作:
如果資料是不連續的,就需要多跳一點。
想象一下ls要執行一個包含許多檔案的長格式檔案列表所要做的工作。對於ls來說,為了獲得生成輸出所需的資訊,需要進行大量的來回操作。
當然,加快檔案系統訪問速度是Linux儘可能多地進行搶佔式檔案快取的原因。這非常有幫助,但有時與任何檔案系統一樣,開銷會變得很明顯。
現在你知道為什麼了。
... 但就我們目前的目的而言,只要知道檔案分佈在這些部門就足夠了。當您儲存一個檔案時,您的作業系統開始將其資料一次一個扇區地寫入硬碟,直到完全儲存為止。稍後開啟檔案時,arm將一次讀取一個...
... 如果你想訂閱Netflix,但不確定它是否適合你,那麼你來對地方了。在這篇文章中,你將學到所有你需要知道的關於Netflix的知識,它是如何工作的,你可以在上面看什麼,以及...
...自己的作業系統或者你自己想要安裝的Linux發行版?也許你想把Chromebook用作媒體伺服器或機頂盒?也許你只是需要外殼?在所有這些情況下,開發者模式是您的朋友。 ...
... 你想要簡單的東西——有些人甚至會說基本的。每一個額外的工具欄或按鈕都會干擾你的工作。介面應該使用基本的顏色,只包括必要的按鈕。如果一個應用程式沒有太多...
... 如果你想知道在你的Linux電腦上有多少可用的磁碟空間,你的第一反應是什麼?對於許多人來說,可能需要檢查Linux發行版的磁碟管理工具,但這不是最好的選擇。正如有一個...
...快取的RAM。很明顯,這樣做會對效能產生負面影響。如果你想讓你的系統以最佳方式執行,那就讓事情順其自然吧。 ...
... 如果你想執行各種各樣的特定windows應用程式,那麼windows10iot是一個不錯的選擇。如果你想建立一個DIY魔鏡或簡單的Python指令碼,那麼windows10iot就太過分了。 ...
...這太容易了。萬用字元的一個小錯誤,你可以消除很多比你想要的。 預設的Linux檔案系統ext4使用inode儲存每個檔案的資料,並使用inode表跟蹤inode。inode包含有關檔案的元資料,例如檔名、檔案所有者、許可權等。 它還包含指向...