Inode的理解與補充

    對於剛開始學習Linux的人來說inode總是那麼的懵懵懂懂。本文主要來分享一下我對inode的理解,以及在實踐當中遇到的一個關於inode號的小問題。

    一、什麼是inode

    inode是指在許多“類Unix文件系統”中的一種數據結構。每個inode保存了文件系統中的一個文件系統對象(包括文件、目錄、設備文件、socket、管道, 等等)的元信息數據,但不包括數據內容或者文件名——維基百科。

    在Linux中有一個重要的哲學思想就是“一切皆文件”,而一個文件是要保存在磁盤上的,更直觀的來說,比如一個文本文件,在GUI下我們要雙擊打開它,在CLI下我們需要用cat等命令查看它,但是我們看到的都是它的內容,那它自身的屬性信息存放在哪呢?沒錯,就是放在inode裏。

    這要從磁盤的區域劃分說起,拿到一塊新硬盤的時候我們通常都要先格式化才能使用,那什麼是“格式化”呢?通俗一點來講就是將一塊磁盤打上一個個的小格子,類似於格子狀的信紙。其中有兩個主要的“大格子”:一個叫元數據區,另一個叫數據存儲區。數據存儲區就是存數據的了,那什麼是元數據呢?其實就是一個文件的inode號、權限、屬主屬組、大小、時間戳、文件所佔的磁盤塊、擴展屬性等等,但要記住inode中是沒有文件名的。我們使用stat FILENAME可以查看一個文件的元數據。

wKiom1UXubqz9lqAAAENIdyxvzE940.jpg

    二、爲什麼要有inode

    對於計算機來說,它記憶一個文件的時候使用數字要比使用文字輕鬆多了,所以計算機就是靠inode號來標識每一個文件的,同一個文件系統中inode號是唯一確定的,這樣也就可以唯一確定一個文件了。

    三、文件名的存放

    我們剛纔說了inode中什麼都有就是沒有文件名,那文件名到底在哪呢?是在目錄中。Linux中一切皆文件,目錄也是文件(其實Windows中文件夾也是個文件)。目錄文件的結構是一系列目錄項的列表。每個目錄項,由兩部分組成:所包含文件或目錄的名字,以及該文件或目錄名對應的inode號碼。創建一個目錄需要執行三個步驟:

        1、在其“父目錄文件”中增加一個條目;

        2、分配一個inode;

        3、分配一個存儲塊,用來保存當前被創建目錄包含的文件與子目錄。

    被創建的“目錄文件”中自動生成兩個子目錄的條目,名稱分別是:“.”和“..”。前者與該目錄具有相同的inode號碼,因此是該目錄的一個“硬鏈接”。後者的inode號碼就是該目錄的父目錄的inode號碼。所以,任何一個目錄的"硬鏈接"總數,總是等於它的子目錄總數(含隱藏目錄)加2。即每個“子目錄文件”中的“..”條目,加上它自身的“目錄文件”中的“.”條目,再加上“父目錄文件”中的對應該目錄的條目。

wKioL1UXwWai4MRcAAOLlGfqGtg763.jpg


    此/下所有文件都爲目錄,可見/的硬鏈接數爲24,/下一共有22個目錄,至於wc -l爲23是因爲顯示時有一行total。

    四、分享發現的一個小問題

wKioL1UXwkmAJhT1AAOInTaoStk796.jpg

    

    我們發現有幾個目錄的inode號是相同的,比如usr、var、boot,我們不是說inode號是計算機識別文件的唯一標識嗎,inode號相同是否意味着這幾個目錄都是同一個文件呢?答案是否定的,它們不是同一個文件。因爲inode唯一對應一個文件或者目錄的條件是:建立在“同一個FILE SYSTEM”上,不同分區之間就是不同的FILE SYSTEM(據說LVM可以做到同一個分區劃分不同FILE SYSTEM,但這是後話了),所以不同FILE SYSTEM裏面可以存在同號碼的INODE,所以它們就是不同的幾個文件了。上圖中inode號相同的目錄是劃分在了單獨的文件系統中。

wKioL1UXxfayQdgRAAFPb7s2vU0952.jpg

    好了希望這篇文章能夠給您帶來幫助,敬請各位看官提出此文章的不當之處,拜謝!

    PS:今天看了一篇關於亞投行的文章,感覺AIIB的建立只證明了一點:天下熙熙,皆爲利來;天下攘攘,皆爲利往。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章