理解 Linux 中的 inodes


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 並不會改變


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM