### 什麼是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表結構
### 直接塊指針:
前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
```
---------------------
### 目錄文件:
```
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. 刪除軟鏈接不會影響被指向的文件,但若指向的原文件被刪除,