inodes 對於Linux是一個很重要的概念,它是 理解文件系統和磁盤存儲的關鍵,理解了 inodes,常見的文件系統相關的問題就會迎刃而解,所以深入了解 inods 對於 Linux 從業者來說是非常有必要的
磁盤存儲結構
安裝操作系統或格式化磁盤分區的時候,操作系統會自動把磁盤分區分為兩個區域 : Block存儲區 和 inodes 存儲區
Block存儲區主要存儲文件的內容
inodes存儲區是由許多的inode組成的列表,每個 inode 中存儲 文件元信息(文件大小,創建者,創建時間等)
以下是 磁盤分區中 Block存儲區 和 inodes 存儲區 圖示:
inode 是什么
inode 是一種數據結構,用來存儲文件以下的信息:
1、文件大小
2、文件類型(常規文件、目錄、軟連接等)
3、權限(讀寫執行權限)
4、屬主(所屬用戶)
5、屬組(所屬用戶組)
6、鏈接數(有多少個文件名指向這個inode)
7、文件創建時間
8、文件最近訪問時間
9、文件最近修改時間
10、文件內容所在Block位置
可以通過以下命令查看文件的 inode 信息
[root@ecs-centos-7 ~]# stat t.txt
File: ‘t.txt’
Size: 70 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 2498227 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-07-19 16:50:14.370189948 +0800
Modify: 2020-07-19 16:50:12.302176601 +0800
Change: 2020-07-19 16:50:12.302176601 +0800
Birth: -
inode 編號
每一個 inode 都有一個編號,系統根據 inode 編號可以快速的計算出 inode 信息在磁盤 inodes 存儲區的偏移,然后從中獲取 inode 信息,再根據 inode信息中記錄的 Block 塊位置,從Block存儲區讀出文件內容
inode 編號在一個文件系統中是唯一的,多個文件系統之間可能會出現相同的編號,前面的磁盤存儲結構示意圖中 /dev/vda1
和 /dev/vda2
在各自的文件系統中 inode 編號是唯一的
創建一個新文件的時候,文件名和對應的 inode 編號會存儲在目錄文件的Block塊中(關於目錄文件后面會講到)
文件的 inode 信息中記錄了文件 Block 塊的位置,Block塊中存儲着文件的內容,可以使用 ls -i
命令查看文件的 inode 編號
[root@ecs-centos-7 ~]# ls -i t.txt
2498227 t.txt
inode 大小
下面的命令是查看每個 inode 節點的大小, 單位是字節
[root@ecs-centos-7 ~]# dumpe2fs -h /dev/vda1 | grep "Inode size"
dumpe2fs 1.42.9 (28-Dec-2013)
Inode size: 256
從例子中可以看出,每個 inode 節點大小為 256 字節。通過 df -i
命令可以查看每個文件系統中 inode 的使用情況
[root@ecs-centos-7 ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 482393 339 482054 1% /dev
tmpfs 484984 1 484983 1% /dev/shm
tmpfs 484984 433 484551 1% /run
tmpfs 484984 16 484968 1% /sys/fs/cgroup
/dev/vda1 2621440 157202 2464238 6% /
tmpfs 484984 1 484983 1% /run/user/0
字段解釋:
Filesystem:文件系統
Inodes: 文件系統中 inodes 總數量
IUsed: inodes 已經使用了的數量
IFree: inodes 可供使用的數量
IUse%: 已經使用了的 inodes 百分比
Mounted on: 文件系統的掛載點
文件系統中的 inodes 數量在安裝系統或格式化磁盤分區的時候已經分配好了,也就是說 inodes 數量是有限的,所以 inodes 數量有可能耗盡的,耗盡之后就會出現磁盤還有空間,但是無法創建新文件的情況
目錄文件
Linux 中所有的一切都是文件,包括進程、線程、目錄等。每個文件都有對應的 inode 編號
當打開目錄時,實際上是打開一個目錄文件,目錄的存儲結構是目錄子項列表,每個目錄子項由 文件名、文件名對應的 inode 編號 組成
上圖中是列出了 tmp/ 目錄中所有文件,其中第一列是 inode 編號
紅框中的 .
表示當前目錄,它是當前目錄的一個硬鏈接,和當前目錄擁有相同的inode編號。我們執行一個文件需要輸入類似 ./test
的命令,命令中的 .
表示的就是當前目錄
紅框中的 ..
表示當前目錄的父目錄,它是父目錄的一個硬鏈接,和父目錄擁有相同的inode編號。還記得返回上一層目錄的命令 cd ..
嗎?這里的..
表示的就是當前目錄的父目錄
系統如何查看文件內容
tmp/ 目錄中有 a.txt , b.txt, c.txt 三個文件, 其中 b.txt 是 a.txt 的硬鏈接,文件內容如下:
[root@ecs-centos-7 tmp]# cat a.txt
this is a.txt file
[root@ecs-centos-7 tmp]# cat c.txt
222
上面的圖描述的是查看文件的流程,從圖中可以看出 tmp/ 目錄文件對應的 Block 塊中存儲的是該目錄下文件名以及文件名對應的 inode 編號,而 a.txt、c.txt 文件對應的 Block 塊中存儲的是 a.txt 、c.txt 文件的內容
現以查看 a.txt 文件內容為例來說明在文件系統是如何查看文件內容的
1、根據 tmp/ 目錄文件對應的 inode 編號(131098) 找到 tmp/ 目錄文件對應 Block 數據塊
2、從 tmp/ 目錄文件對應的 Block 塊中找出 a.txt 文件對應的 inode 編號(131101)
3、從 a.txt 文件對應的 inode 信息 中找到對應的 Block 塊
4、讀出 a.txt 文件對應的 Block 塊中的數據(this is a.txt file)
通過 inode 查找文件
如果知道一個文件的 inode 編號,就可以使用以下的命令找到這個文件
[root@ecs-centos-7 ~]# find . -inum 2498227
./t.txt
通過 inode 刪除文件
知道了 inode 編號, 用下面的命令可以刪除鏈接到此 inode 的文件
[root@ecs-centos-7 ~]# ls -i ta.txt
2498227 ta.txt
[root@ecs-centos-7 ~]# find -inum 2498227
./ta.txt
[root@ecs-centos-7 ~]# find -inum 2498227 -delete
[root@ecs-centos-7 ~]# find -inum 2498227
[root@ecs-centos-7 ~]#
上面的例子中, ta.txt 的 inode 編號是 2498227 ,當刪除編號為 2498227 的文件后, ta.txt 文件被刪除了
拷貝、重命名、移動文件
下面的命令分別對文件 ha.txt 進行拷貝,移動,重命名操作
[root@ecs-centos-7 ~]# ls -il ha.txt
2498227 -rw-r--r-- 1 root root 6 Aug 1 01:12 ha.txt
[root@ecs-centos-7 ~]# cp ha.txt ha.txt.bak
[root@ecs-centos-7 ~]# ls -il ha.txt*
2498227 -rw-r--r-- 1 root root 6 Aug 1 01:12 ha.txt
2498236 -rw-r--r-- 1 root root 6 Aug 1 01:13 ha.txt.bak
[root@ecs-centos-7 ~]# mv ha.txt haa.txt
[root@ecs-centos-7 ~]# ls -il haa.txt
2498227 -rw-r--r-- 1 root root 6 Aug 1 01:12 haa.txt
[root@ecs-centos-7 ~]# mkdir testdir
[root@ecs-centos-7 ~]# mv haa.txt testdir/
[root@ecs-centos-7 ~]# ls -il testdir/haa.txt
2498227 -rw-r--r-- 1 root root 6 Aug 1 01:12 testdir/haa.txt
上面的例子中 ha.txt 文件的inode初始編號是 2498227
cp拷貝: ha.txt 拷貝到 testdir/ha.txt 之后,
inode 編號變成 2498236
mv重命名: ha.txt 重命名成 haa.txt,haa.txt文件的 inode 編號和重命名之前的一樣,是 2498227
mv移動:haa.txt 移動到 testdir/ 目錄中
,移動之后 testdir/haa.txt 的inode 編號和移動之前一樣,是 2498227
從上面的例子可以知道:拷貝命令會重新分配新的 inode, 改名以及移動文件只會修改文件名或文件位置,文件的 inode 並不會改變