新聞中心
文件是文件系統(tǒng)對(duì)數(shù)據(jù)的分割單元。文件系統(tǒng)用目錄來(lái)組織文件,賦予文件以上下分級(jí)的結(jié)構(gòu)。在硬盤(pán)上實(shí)現(xiàn)這一分級(jí)結(jié)構(gòu)的關(guān)鍵,Linux使用inode來(lái)虛擬普通文件和目錄文件對(duì)象,下面為大家詳細(xì)講解一下Linux inode。

inode在文件系統(tǒng)創(chuàng)建是確定,并且每個(gè)文件系統(tǒng)都有一個(gè)inode集合。最大的目錄大小取決于不同的文件系統(tǒng)。為了獲得更好的性能,通常將文件放入不同的子目錄中,而不是將所有文件放入同一個(gè)目錄。
什么是inode number
inode是inode table中的一個(gè)條目,包含有關(guān)目錄和常規(guī)文件的元數(shù)據(jù)。inode是傳統(tǒng)Unix風(fēng)格文件系統(tǒng) (比如ext3/ext4) 上的數(shù)據(jù)結(jié)構(gòu)。Linux擴(kuò)展文件系統(tǒng) (如ext2/ext3) 維護(hù)了一個(gè)inode的數(shù)組:inode table。inode table包含該文件系統(tǒng)中所有文件的列表。inode table中的各個(gè)inode項(xiàng)具有唯一的編號(hào) (該文件系統(tǒng)唯一),即inode number。深入inode數(shù)據(jù)結(jié)構(gòu),我們發(fā)現(xiàn)它存儲(chǔ)了如下信息:
-
文件類型: 普通文件,目錄,管道等等
-
權(quán)限:可讀,可寫(xiě),可執(zhí)行
-
鏈接數(shù):鏈接到該inode的硬鏈接數(shù)
-
User ID:文件所有者
-
Group ID:所有者組ID
-
文件大小
-
時(shí)間信息
-
屬性:比如,不可改變位
-
訪問(wèn)控制列表
-
文件數(shù)據(jù)存儲(chǔ)的實(shí)際位置
-
其他元數(shù)據(jù)
注意:inode中不存儲(chǔ)文件名數(shù)據(jù)
如何查看inode信息
如果你希望查看文件系統(tǒng)的inode信息,你可以使用一些shell命令來(lái)查看文件系統(tǒng)的屬性
a. 顯示指定文件信息
你可以使用stat命令顯示某個(gè)文件或目錄的inode信息,你必須指定文件或目錄名
# stat log.txt
File: 'log.txt'
Size: 212 Blocks: 8 IO Block: 4096 regular file
Device: fd01h/64769d Inode: 591912 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-11-26 11:27:13.683598803 +0800
Modify: 2018-12-06 17:18:49.799424595 +0800
Change: 2018-12-06 17:18:49.799424595 +0800
Birth: -
命令的輸出告訴了你該文件的各種時(shí)間信息,它的所有權(quán)和權(quán)限,以及文件存儲(chǔ)的位置。存儲(chǔ)文件數(shù)據(jù)的磁盤(pán)塊信息也展示在stat命令的輸出中。
你也可以選擇只列出文件的inode number:
# stat --format=%i log.txt
591912
b. 打印文件的inode number
ls命令用于列出文件/文件夾的信息。參數(shù) -i 說(shuō)明需要顯示每個(gè)文件的inode number。我們可以結(jié)合參數(shù) -l 一起使用以列出詳細(xì)信息:
# ls -li
total 16
592404 drwxr-xr-x 6 root root 4096 Nov 2 15:01 config
591900 -rw-r--r-- 1 root root 453 Nov 25 22:25 docker-compose-single.yml
592414 -rw-r--r-- 1 root root 2714 Nov 2 15:01 docker-compose.yml
592415 drwxr-xr-x 2 root root 4096 Nov 2 15:01 mariadb
輸出的第一列顯示了文件的inode number。
c. 顯示文件系統(tǒng)inode的使用信息
默認(rèn)情況下,df命令匯總可用和已用的磁盤(pán)空間。你可以通過(guò)傳遞 -i 或 --inodes 選項(xiàng)來(lái)接收有關(guān)可用和已使用的inode報(bào)告。
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
udev 2032387 398 2031989 1% /dev
tmpfs 2037595 1224 2036371 1% /run
/dev/vda1 3276800 325180 2951620 10% /
tmpfs 2037595 7 2037588 1% /dev/shm
tmpfs 2037595 4 2037591 1% /run/lock
tmpfs 2037595 16 2037579 1% /sys/fs/cgroup
overlay 3276800 325180 2951620 10% /var/lib/docker/overlay2/c1955f95c338497d2f669ee0baf2706f93c2765001cafd3568b5af9ebfbe0dfd/merged
overlay 3276800 325180 2951620 10% /var/lib/docker/overlay2/85a6ee4a64760a9e52efa312094092121160030132aaaf4bd32ecf5585324dfd/merged
overlay 3276800 325180 2951620 10% /var/lib/docker/overlay2/692ed70766a4ee954c0f0f1b19d69b906c33ae54a618f8686f66e31e9ac05606/merged
shm 2037595 1 2037594 1% /var/lib/docker/containers/2a09d78972ebb74a7631dfd5e567a2b54282886ac8d8dc54dc1f5badffc692b8/mounts/shm
shm 2037595 1 2037594 1% /var/lib/docker/containers/fd9619309707c1026876a401ac22eaf8dd9bfbaceb237ee927017818a6ffa3ff/mounts/shm
shm 2037595 1 2037594 1% /var/lib/docker/containers/080d0d79e069041a2997dfaf2c07e69a0518ad44271dad4688f459958dac09c5/mounts/shm
tmpfs 2037595 4 2037591 1% /run/user/1000
如果分區(qū)包含很多小文件,這些信息可能會(huì)有幫助,這可能會(huì)比耗盡可用磁盤(pán)空間更快的耗盡可用的inode。
d. 列出文件系統(tǒng)超級(jí)塊的信息
你可以使用 tune2fs -l 命令來(lái)顯示所有與inode相關(guān)的信息。
# tune2fs -l /dev/vda1 | grep inode
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent sparse_super large_file uninit_bg
Free inodes: 2952348
First inode: 11
Journal inode: 8
First orphan inode: 221187
Journal backup: inode blocks
目錄的inode結(jié)構(gòu)
上面提到過(guò),Linux中的目錄也被視為文件。目錄是將文件名映射到其inode number的特殊文件 (此映射稱為dentry)。因此,當(dāng)我們說(shuō)某個(gè)目錄包含文件和其他目錄時(shí),我們的意思是該目錄將這些文件和目錄映射到它們的inode number。這就是目錄無(wú)法容納兩個(gè)具有相同名稱的文件的原因,因?yàn)樗鼰o(wú)法使用兩個(gè)不同的inode number映射一個(gè)名稱。
當(dāng)一個(gè)文件通過(guò)其父目錄映射到它到inode時(shí),那么最頂層的目錄(即 / 目錄)如何映射到它的inode?實(shí)際上,/ 目錄的inode number是固定的,始終為2。
# stat /
File: '/'
Size: 4096 Blocks: 8 IO Block: 4096 directory
Device: fd01h/64769d Inode: 2 Links: 24
Access: (0755/drwxr-xr-x) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-07-24 17:05:52.740982553 +0800
Modify: 2018-12-21 18:02:05.258315357 +0800
Change: 2018-12-21 18:02:05.258315357 +0800
Birth: -
鏈接
在命令 ls -l 的輸出中,權(quán)限之后和所有者之前的列是鏈接計(jì)數(shù)。 鏈接計(jì)數(shù)是指文件的硬鏈接數(shù)。 要理解硬鏈接,我們從鏈接開(kāi)始。 鏈接是指向另一個(gè)文件的指針。 在Linux世界中,存在兩種類型的鏈接:
a. 符號(hào)鏈接 (軟鏈接)
符號(hào)鏈接是一個(gè)單獨(dú)的文件,其內(nèi)容指向被鏈接的文件。 要?jiǎng)?chuàng)建符號(hào)鏈接,請(qǐng)使用帶有-s選項(xiàng)的ln命令。 使用ln命令時(shí),請(qǐng)確保首先引用原始文件的名稱,然后引用要?jiǎng)?chuàng)建的鏈接的名稱。
# ln -s /home/opt/sync.sh filesync
這里filesync是sync.sh的符號(hào)鏈接。 把它想象成一個(gè)快捷方式。 編輯filesync就像直接編輯原始文件一樣。 如果我們刪除或移動(dòng)原始文件,鏈接將被破壞,我們的filesync文件將不再可用。
ls -l 命令顯示生成的文件是符號(hào)鏈接。 這由 ls -l 輸出的第一個(gè)位置中的字母l以及列表末尾的箭頭指示,該箭頭表示鏈接所指向的文件。
# ls -l filesync
lrwxrwxrwx 1 root root 20 Apr 7 06:08 filesync -> /home/opt/sync.sh
比較符號(hào)鏈接和原始文件時(shí),您會(huì)發(fā)現(xiàn)它們之間存在明顯差異。
# ls -il /home/opt/sync.sh filesync
258674 lrwxrwxrwx 1 root root 20 Apr 7 06:08 filesync -> /home/opt/sync.sh
517333 -rw-r----- 1 root root 5 Apr 7 06:09 /home/opt/sync.sh
原始文件只是一個(gè)直接連接到inode的文件,而符號(hào)鏈接指向該文件。 符號(hào)鏈接的大小是它引用的文件名稱的字節(jié)數(shù),因?yàn)榉?hào)鏈接中沒(méi)有其他信息可用。
b. 硬鏈接
要了解硬鏈接是什么,關(guān)鍵是要了解文件的標(biāo)識(shí)是其inode編號(hào),而不是其名稱。 硬鏈接是一個(gè)引用inode的名稱。 這意味著如果file1有一個(gè)名為file2的硬鏈接,那么這兩個(gè)文件都引用相同的inode。 因此,當(dāng)您為文件創(chuàng)建硬鏈接時(shí),您真正要做的就是為inode添加一個(gè)新名稱。 為此,請(qǐng)使用不帶選項(xiàng)的ln命令。
# ls -l /home/opt/sync.sh
-rw-r----- 1 root root 5 Apr 7 06:09 /home/bobbin/sync.sh
# ln /home/opt/sync.sh synchro
讓我們來(lái)比較這兩個(gè)文件
# ls -il /home/bobbin/sync.sh synchro
517333 -rw-r----- 2 root root 5 Apr 7 06:09 /home/opt/sync.sh
517333 -rw-r----- 2 root root 5 Apr 7 06:09 synchro
關(guān)于硬鏈接的有趣之處在于原始文件和鏈接之間沒(méi)有區(qū)別:它們只是連接到同一個(gè)inode的兩個(gè)名稱。
正如您必須注意到的,與軟鏈接不同,硬鏈接不是特殊文件。 現(xiàn)在,鏈接計(jì)數(shù)是文件硬鏈接的數(shù)字。 因此,創(chuàng)建硬鏈接后鏈接計(jì)數(shù)會(huì)增加,如上圖所示。 這些硬鏈接有兩個(gè)限制:
-
目錄不能硬鏈接。 Linux不允許這樣做以維護(hù)目錄的非循環(huán)樹(shù)結(jié)構(gòu)。
-
無(wú)法跨文件系統(tǒng)創(chuàng)建硬鏈接。 這兩個(gè)文件必須位于相同的文件系統(tǒng)上,因?yàn)椴煌奈募到y(tǒng)具有不同的獨(dú)立inode表(不同文件系統(tǒng)上具有相同inode編號(hào)的兩個(gè)文件是不同的)。
結(jié)論
每個(gè)Linux文件都有一個(gè)inode數(shù)據(jù)結(jié)構(gòu),inode包含文件的所有屬性,但不包含文件名。 符號(hào)鏈接類似于指向原始文件的快捷方式,而硬鏈接類似于文件的一份拷貝。 原始文件和硬鏈接之間沒(méi)有區(qū)別,他們都引用同一個(gè)inode。
分享標(biāo)題:詳解Linuxinode
網(wǎng)站鏈接:http://www.5511xx.com/article/dpehicg.html


咨詢
建站咨詢
