linux inode是用來識別作業系統的檔案的一個特徵描述;linux系統為每一個檔案都指派了一個inode編號,這個編號中記錄了檔案相關的一些元訊息,透過這些元訊息可以用來唯一標識一個文件。
本教學操作環境:linux5.9.8系統、Dell G3電腦。
linux inode是什麼?
要了解 Linux 作業系統上的 inode 前,我們先來談談 Linux作業系統上的檔案。對 Linux 作業系統而言,[一切皆檔案]。而檔案是無法獨立於儲存媒體(這裡指的是實體磁碟或記憶體、快閃記憶體等)存在的,一切作業系統上的檔案都無時無刻不在和儲存媒體打交道。
例如,讀取檔案時需要將檔案從磁碟載入到記憶體中,當檔案操作結束後,檔案又會儲存到磁碟中。那麼,既然檔案要被儲存到磁碟中,而磁碟是有容量限制的,那麼也就是說磁碟上能存放的實體檔案的數量是有限的。
如果你已經理解了這一個觀點,那麼恭喜你,你大體上已經知道了 inode 是做什麼的。
沒錯,inode 是用來識別作業系統的檔案的一個特徵描述,而且作業系統上的inode 並非無窮無盡,通常在你安裝作業系統後,系統上的inode 數量就已經確定了下來(不過,你可以動態修改inode 的數量)。
你可以透過 sysctl -a 查詢系統上的 inode 數量。
[root@server ~]# sysctl -a | grep inode fs.inode-nr = 70212 21785
如上,fs.inode-nr 中的70212 標識當前作業系統已分配的inode 數量;21785 表示單前作業系統剩餘空閒的inode 數量
剛剛說過, inode 是用來標識文件的一個特徵,這是為什麼呢?
Linux 系統為每一個文件都分配了一個 inode 編號,這個編號中記錄了文件相關的一些元信息,透過這些元信息可以用來唯一標識一個文件。
你可以透過ls -i 查看任何一個檔案的inode 編號
[root@server ~]# ls -i logrotate.man 8986710 logrotate.man
而要檢視檔案的元訊息,你需要使用stat {filename}
[root@server ~]# stat logrotate.man 文件:"logrotate.man" 大小:18033 块:40 IO 块:4096 普通文件 设备:fd00h/64768d Inode:8986710 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:admin_home_t:s0 最近访问:2021-11-25 03:20:39.497330998 -0500 最近更改:2021-11-24 04:38:17.781399647 -0500 最近改动:2021-11-24 04:38:17.797398907 -0500 创建时间:-
如上,即為一個文件的inode 資訊。這其中包含:
大小:18033: 檔案的位元組數。這個檔案佔據的磁碟空間為 18033 Bytes
區塊:40:使用的 block(資料區塊)。這個檔案使用了40 個實體區塊
權限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root):文件的權限及屬組資訊。該文件為普通文件,權限為0644,用戶和屬組都為root
#最近訪問:2021-11-25 03:20:39.497330998 -0500:即atime(最後一次存取該檔案的時間)
最近更改:2021-11-24 04:38:17.781399647 -0500:即mtime(最後一次修改檔案的時間)
#最近改動:2021-11-24 04:38:17.797398907 -0500:即ctime(最後一次改變檔案(權限、屬群組)的時間)
#事實上,剛剛透過stat logrotate.man 中還包括一個字段硬連結:1。
為什麼硬連結會出現在 inode 訊息中?
一般情況下,作業系統中一個檔案對應一個 inode ,但是這種規則卻不適用於 硬連結 檔案。蓋因Linux作業系統上,允許多個檔案指向同一個 inode 編號。
硬連結場景下,可以使用不同的檔案名稱存取同一個檔案的內容,對檔案內容、屬性等的修改會傳遞到其他檔案。但刪除一個連結文件,並不影響其他文件的存取。
例如,建立 logrotate.man 的硬連結檔案
[root@server ~]# ln logrotate.man logrotate.man.1 [root@server ~]# ls -i logrotate.man* 8986710 logrotate.man 8986710 logrotate.man.1 # 可以看到,建立了硬链接的文件共用了同一个 inode 编号 [root@server ~]# stat logrotate.man 文件:"logrotate.man" 大小:18033 块:40 IO 块:4096 普通文件 设备:fd00h/64768d Inode:8986710 硬链接:2 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:admin_home_t:s0 最近访问:2021-11-25 03:20:39.497330998 -0500 最近更改:2021-11-24 04:38:17.781399647 -0500 最近改动:2021-12-05 01:22:05.716611059 -0500 创建时间:-
建立硬連結後,透過 stat 可以看到 硬連結的數量變成 2 了。
這時候我們刪除原始的連結文件,查看連結後的文件內容
[root@server ~]# rm -rf logrotate.man [root@server ~]# tail -n 1 logrotate.man.1 Linux Wed Nov 5 2002 LOGROTATE(8) [root@server ~]# stat logrotate.man.1 文件:"logrotate.man.1" 大小:18033 块:40 IO 块:4096 普通文件 设备:fd00h/64768d Inode:8986710 硬链接:1 权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root) 环境:unconfined_u:object_r:admin_home_t:s0 最近访问:2021-12-05 01:25:50.701384256 -0500 最近更改:2021-11-24 04:38:17.781399647 -0500 最近改动:2021-12-05 01:25:41.544800473 -0500 创建时间:-
刪除硬連結的原始文件後,可以成功讀取連結後的文件內容,此時,硬連結數量又變為了1。
出現這種情況的原因在於,硬連結實際上是對檔案增加了一個索引,這個索引指向檔案的 inode 編號。當硬連結的數量大於 1 時,表示該檔案除去自身外,還有多個硬連結。當硬連結的數量等於 0 時,此時作業系統已經沒有任何檔案指向該 inode,也就是作業系統會回收 inode。
事實上,每刪除一個文件,就是對該文件硬連結數的「減一」操作。當檔案的硬連結數歸 0 時,這個檔案會被作業系統徹底清除掉。
最後,通常情況下,作業系統分配的inode 數量是完全夠用的,但出於一些程式或人為的意外可能會導致作業系統的inode 溢出,你可以透過df -ih 查看系統分區下inode 的使用情況以便及時作出應對措施。
[root@server ~]# df -ih 文件系统 Inode 已用(I) 可用(I) 已用(I)% 挂载点 devtmpfs 121K 390 121K 1% /dev tmpfs 124K 1 124K 1% /dev/shm tmpfs 124K 522 124K 1% /run tmpfs 124K 16 124K 1% /sys/fs/cgroup /dev/mapper/centos-root 4.0M 129K 3.9M 4% / /dev/vda1 512K 332 512K 1% /boot tmpfs 124K 1 124K 1% /run/user/0
推薦學習:《linux影片教學》
以上是linux inode是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!