什麼是inode?

    理解inode,要從文件儲存提及。文件儲存在硬盤上,硬盤的最小存儲單位叫扇區(Sector)。每一個扇區儲存512字節(至關於0.5KB)。操做系統讀取硬盤的時候,不會一個個扇區地讀取,這樣效率過低,而是一次性連續讀取多個扇區,即一次性讀取一個塊(block)。這種由多個扇區組成的塊是文件存取的最小單位,塊的大小,最多見的是4KB,即連續八個sector組成一個block,文件數據都儲存在塊中,那麼很明顯,咱們還必須找到一個地方儲存文件的元信息,好比文件的建立者、文件的創年日期、文件的大小等等。這種儲存元信息的區域叫作inode,中文譯名爲」索引節點」。inode (index node) 表中包含文件系統的全部文件列表。

 

 

inode包含文件的信息(元數據)

        Inode編號

        用來識別文件類型,以及用於stat C函數的模式信息

        文件權限

        文件的擁有者的UID

        文件所屬組的GID

        連接數(指向這個文件名路徑名稱個數)

        文件的大小

        文件的間戳(ctime指inode上一次變更的時間,mtime是指文件內容上一次變更的時間,atime指文件上一次打開的時間)

        指向磁盤文件的數據塊指針

        有關文件的其它數據

        注意:要想查看文件的inode信息可使用stat命令查看

inode表結構

    inode表結構.png

        直接塊指針:

            前12個直接指針,直接指向存儲數據的區域。如Blocks大小爲4*1024KB,前12個直接指針就能夠保存48KB的文件

        間接塊指針:

            設每一個指針佔用4個字節,則以及指針指向的Blocks能夠保存(4*1024)/4KB,可指向1024個Blocks,一級指針可存儲文件數據大小爲1024*(4*1024)KB=4MB

        雙重間接塊指針:

            一樣Blocks大小爲4*1024,則二級指針可保存Blocks指針數量爲((4*1024)/4)*((4*1024)/4),則二級指針保存文件數據大小爲(1024*1024)*(4*1024)=4GB

        三重間接塊指針:

            以次類推三級指針能夠儲存文件數據大小爲(1024*4*1024*1024)*(4*1024)=4TB

inode的大小:

        每一個inode都有一個編號,操做系統用inode號來識別不一樣文件。Unix/Linux系統不使用文件名,而使用inode號來識別文件,對於系統來講,文件名只是inode號碼便於識別的別稱或綽號。表面上,經過文件名打開文件;實際上,系統內部這個過程分紅三步:首先,系統找到這個文件名對應的inode號;其次,經過inode號,獲取inode信息;最後,根據inode信息,找到文件數據所在的block,讀出數據。

        注意:inode號並非無限的,若是一個分區的節點數被使用完了,那麼即便磁盤空間還有剩餘也不能再存聽任何數據。可使用df -i命令查看節點使用狀況

    df-i.png     

        注:1節點總數、2使用過節點數、3剩餘節點數、4節點使用率

目錄文件:

    Unix/Linux系統中,目錄(directory)也是一種文件。打開目錄,實際上就是打開目錄文件目錄文件的結果很是簡單,就是一系列目錄項(direct)的列表。每一個目錄項,由兩部分組成:所包含文件的文件名,以及該文件名對應的inode號。

    ls命令只列出目錄文件中的全部文件名:

        ls-1.png

    ls -i命令列出整個目錄文件,即文件名和inode號(箭頭標的即爲inode號):

        ls-i.png

    若是要查看文件的詳細信息,就必須根據inode號,訪問inode節點,讀取信息。ls -i -l 目錄文件 列出整個目錄文件,即文件名和inode號(箭頭標註的列即爲inode號)

        ls-i-l.png

    理解了上面的知識,就能理解目錄的權限,文件的讀權限(r)和寫權限(w),都是針對目錄文件自己。因爲目錄文件內只有文件名和inode號,因此只有讀權,只能獲取文件名,沒法獲取其餘信息,由於其餘信息都儲存在inode節點中,而讀取inode節點內的信息須要目錄文件的執行權限(x)。

Linux中cp、rm、mv 、ln對inode的影響:

    cp命令

  •         分配一個未被使用的inode號,在inode表中添加一個新項目,(注意:若是是cp到謳歌已經存在的文件,則inode號採用被覆蓋以前的目標文件的inode號,若是對運行中的apache共享模塊so文件進行cp操做,就會出現Segmentation fault<段錯誤>)

  •         在目錄中新建一個目錄項,並指向步驟1中的inode

  •         把數據複製到block中

    rm命令

  •         減小連接數量,若是連接數爲0,釋放inode(inode號也已被從新使用);

  •         若是inode被釋放,則數據塊放到可用空間列表中;

  •         刪除目錄中的目錄項

    mv命令

        1.若是mv命令的目標文件和源文件所在額文件系統相同:

        使用新文件名創建目錄項;

        刪除帶有原來文件名的目錄項;

        注意:該操做對inode表沒有影響(除時間戳),對數據的位置也沒有影響,不移動任何數據。(即便是mv到一個已經存在的目標文件,新目錄項指源文件inode,會先刪除目標文件的目錄項,因此若是對運行中的apache的共享模塊so文件進行這種操做的話不會有問題,新的so文件inode號變了)

        2.若是目標和源文件所在的問價系統不相同,就是cp和rm;

    ln命令

        符號(軟)連接:

        符號連接的內容是它引用文件的名稱,能夠是任意文件或目錄,也能夠連接不一樣問價系統的文件,甚至能夠連接不存在的文件,這就產生通常稱爲斷裂的問題,還能夠不斷的循環連接源文,可是其大小爲指向的路徑字符串的長度;不增長或減小目標文件inode 的引用計數。

        使用ln -s source_file softlink_file (注意:源文件(source_file)的路徑是相對路徑(也能夠是絕對路徑,一般使用的是相對路徑),必定是相對於軟連接文件的路徑,而非相對於當前工做目錄的路徑)建立符號連接,在對符號連接進行讀寫操做的時候,系統會自動把該操做轉換爲對源文件的操做,可是刪除鏈接文件時,系統僅僅刪除符號連接文件,而不是刪除源文件自己。

    硬連接:

        不容許給目錄建立硬連接,建立硬連接會正價額外的記錄項以引用文(不能跨驅動或分區建立硬連接),硬連接件對應於同一文件系統上的一個物理文件,硬連接節點編號是相同的,建立硬連接連接數遞增,刪除文件時:rm命令遞減計數的連接,文件若是存在,至少有一個連接數,當連接數爲0時,該文件被刪除。

        使用ln existfile newfile 命令建立硬連接

        硬連接於軟鏈接的區別:

        一、本質不一樣:硬連接是指向同一個文件,軟連接指向的不是同一個文件

        二、刪除時:硬連接不受影響,軟連接失效

        三、建立連接時:建立硬連接連接數加1,建立軟連接鏈接數不變

        四、是否能夠跨分區:硬連接不能夠跨分區,軟連接能夠跨分區

        五、目錄是否能夠建立連接:硬連接不能夠對目錄建立,軟連接能夠對目錄建立

        六、硬連接的inode號相同,軟連接inode號不一樣