什麼是inode

### 什麼是inode?


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

    inode也會消耗硬盤空間,所以硬盤格式化的時候,操作系統自動將硬盤分成兩個區域。一個是數據區,存放文件數據;另一個是inode區(inode table),存放inode所包含的信息。


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


       文件的字節數

      文件擁有者的User ID

      文件的Group ID

      文件的讀、寫、執行權限

      文件的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指文件內容上一次變動的時間,atime指文件上一次打開的時間。

      鏈接數,即有多少文件名指向這個inode

      文件數據block的位置 

---------------------

### inode表結構

inode.png


 ### 直接塊指針:

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的大小:


1. ```

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

       inode號並不是無限的,如果一個分區的節點數被使用完了,那麼即使磁盤空間還有剩餘也不能再存放任何數據。可以使用df -i或者stat命令查看節點使用情況

       [root@centos6 ~]#df -i

       Filesystem      Inodes  IUsed   IFree IUse% Mounted on

       /dev/sda3       320000 133693  186307   42% /

       tmpfs           125377      6  125371    1% /dev/shm

       /dev/sda1       128016     38  127978    1% /boot

       /dev/sda2      1281120     17 1281103    1% /data

       /dev/sr0             0      0       0     - /media/CentOS_6.10_Final

       

   

   

   ```


---------------------

### 目錄文件:

```

目錄inode.png

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


    ls命令只列出目錄文件中的所有文件名:

    [root@centos6 /data]#ls

httpd.conf  httpd.conf.bak  lost+found  my.cnf  test1.text  test2.text  test3.text

ll -i命令列出整個目錄文件,即文件名和inode號:

[root@centos6 /data]#ll -i

     total 92

     15 -rw-r--r--  1 root root 34419 Dec 15 09:39 httpd.conf

     17 -rw-r--r--  1 root root 34419 Dec 15 09:41 httpd.conf.bak

     11 drwx------. 2 root root 16384 Dec 12 11:16 lost+found

     16 -rw-r--r--  1 root root   251 Dec 15 09:39 my.cnf

     12 -rw-r--r--  1 root root     0 Dec 15 09:36 test1.text

     13 -rw-r--r--  1 root root     0 Dec 15 09:36 test2.text

     14 -rw-r--r--  1 root root     0 Dec 15 09:36 test3.text

     

     [root@centos6 /data]#stat /etc/fstab 

  File: `/etc/fstab'

  Size: 899       Blocks: 8          IO Block: 4096   regular file

     Device: 803h/2051dInode: 25          Links: 1

     Access: (0644/-rw-r--r--)  Uid: (    0/    root)   Gid: (    0/    root)

     Access: 2018-12-15 13:01:33.284289685 +0800

     Modify: 2018-12-12 11:21:05.675000006 +0800

     Change: 2018-12-12 11:28:55.543999998 +0800


     

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

```




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


cp命令:


- [ ] ```

  分配一個空閒的inode號,在inode表中生成新條目在目錄中創建一個目錄項,將名稱與inode編號關聯

  拷貝數據生成新的文件

  [root@centos6 /data]#df -i

  /dev/sda2      1281120     13 1281107    1% /data

  

  [root@centos6 /data]#cp a.txt a.cp

  [root@centos6 /data]#ls -il a.txt a.cp 

  13 -rw-r--r-- 1 root root 7 Dec 15 18:43 a.cp

  11 -rw-r--r-- 2 root root 7 Dec 15 18:39 a.txt

  

  [root@centos6 /data]#df -i

  /dev/sda2      1281120     14 1281106    1% /data

  

  我們只對比這兩個文件,發現Inode number不一樣,發現inodes減少了一個,而blocks也少了,這就說明,複製文件是創建文件,並佔Inode和Block的。

  

  ```


rm命令:


```

減少鏈接數量,如果鏈接數爲0,釋放inode(inode號也已被重新使用);

如果inode被釋放,則數據塊放到可用空間列表中;

刪除目錄中的目錄項

```


 mv命令:


```

如果mv命令的目標和源在相同的文件系統,作爲mv 命令

用新的文件名創建對應新的目錄項

刪除舊目錄條目對應的舊的文件名

不影響inode表(除時間戳)或磁盤上的數據位置:沒有數據被移動!

如果目標和源在一個不同的文件系統, mv相當於cp和rm

```


### 鏈接與inode


```

[root@centos6 /data]#touch a.txt

[root@centos6 /data]#mkdir a

[root@centos6 /data]#ll -i

total 4

130561 drwxr-xr-x 2 root root 4096 Dec 15 18:19 a

    11 -rw-r--r-- 1 root root    0 Dec 15 18:18 a.txt

目錄的鏈接數爲2,文件的鏈接數爲1。爲什麼會這樣呢?其實很好理解。對於目錄而言,每個目錄裏面肯定會有兩個特殊目錄,那就是.和..這兩個目錄,我們前面的課程中也講到,.表示當前的目錄,而..則是表示上層目錄。我們也知道,在Linux系統中,是從根來開始查找的,要想找到某個目錄,必需要先找到他的上層目錄,所以說,空目錄(嚴格的來說,不能叫空目錄)是有兩個鏈接到相應的Inode number的。作爲文件很明顯,他只有一個鏈接到相應的Inode number。

[root@centos6 /data]#ln a.txt a.hard

[root@centos6 /data]#ln -s a.txt a.soft

[root@centos6 /data]#ll -i

total 4

130561 drwxr-xr-x 2 root root 4096 Dec 15 18:19 a

    11 -rw-r--r-- 2 root root    0 Dec 15 18:18 a.hard

    12 lrwxrwxrwx 1 root root    5 Dec 15 18:27 a.soft -> a.txt

    11 -rw-r--r-- 2 root root    0 Dec 15 18:18 a.txt

    再查看文件和目錄的屬性,我們就發現:創建一個硬鏈接後,a.txt的inode值增加了一個;a.txt和a.hard的inode值是一樣的。這個硬鏈接就是重新創建了一個文件名對應到原文件的Inode。實質就是在Directory中增加了一個新的對應關係。

    

    下面再來看看這個軟鏈接

    [root@centos6 /data]#ll -i

total 4

130561 drwxr-xr-x 2 root root 4096 Dec 15 18:19 a

    11 -rw-r--r-- 2 root root    0 Dec 15 18:18 a.hard

    12 lrwxrwxrwx 1 root root    5 Dec 15 18:27 a.soft -> a.txt

    11 -rw-r--r-- 2 root root    0 Dec 15 18:18 a.txt

    他的Inode number和原文件不一樣。而且大小也發生了變化。可見,這個軟鏈接是重新建立了一個文件,而文件是指向到原文件,而不是指向原Inode。當然他會佔用掉 inode 與 block。當我們刪除了源文件後,鏈接文件不能獨立存在,雖然仍保留文件名,但我們卻不能查看軟鏈接文件的內容了。但軟鏈接是可以跨文件系統,而且是可以鏈接目錄。他就相當於windows系統下的快捷方式一樣。通過這個特性,我們可以通過軟鏈接解決某個分區inode conut不足的問題(軟鏈接到另一個inode count足夠多的分區)。

```


### **硬鏈接和軟鏈接**


```

 硬鏈接:其實就是同一個文件具有多個別名,具有相同inode,而dentry不同。


              1. 文件具有相同的inode和data block

              2. 只能對已存在的文件進行創建;

              3. 不同交叉文件系統進行硬鏈接的創建

              4. 不能對目錄進行創建,只能對文件創建硬鏈接

              5. 刪除一個硬鏈接並不影響其他具有相同inode號的文件;


軟鏈接:軟鏈接具有自己的inode,即具有自己的文件,只是這個文件中存放的內容是另一個文件的路徑名。因此軟鏈接具有自己的inode號以及用戶數據塊。


              1. 軟鏈接有自己的文件屬性及權限等;

              2. 軟鏈接可以對不存在的文件或目錄創建;

              3. 軟鏈接可以交叉文件系統;

              5. 創建軟鏈接時,鏈接計數i_nlink不會增加;

              6. 刪除軟鏈接不會影響被指向的文件,但若指向的原文件被刪除,


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