首頁  >  文章  >  系統教程  >  Linux下的inode記錄

Linux下的inode記錄

PHPz
PHPz轉載
2024-02-11 09:51:291023瀏覽

檔案儲存在硬碟上。

硬碟上最小的儲存單位稱為磁區。

每個扇區儲存512位元組(相當於0.5kb)。

作業系統在讀取硬碟時,不會逐個磁區讀取,效率較低。

相反,它一次連續讀取多個磁區,即一次讀取一個區塊。

這個「區塊」由多個磁區組成,是檔案存取的最小單位。

區塊大小,最常見的是4kb,是一行八個磁區組成一個區塊。

Linux下的inode記錄

文件資料都儲存在」區塊」中,那麼很顯然,我們還必須找到一個地方儲存文件的元信息,例如文件的創建者、文件的創建日期、文件的大小等等。這種儲存檔案元資訊的區域就叫做inode,中文譯名為」索引節點」。

inode的內容

#inode包含檔案的元資訊,具體來說有以下內容:

* 檔案的位元組數

* 檔案擁有者的User ID

* 檔案的Group ID

* 檔案的讀取、寫入、執行權限

* 檔案的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指檔案內容上一次變動的時間,atime指檔案上一次開啟的時間。

* 連結數,即有多少檔名指向這個inode

* 檔案資料block的位置

可以用stat指令,查看某個檔案的inode資訊:

stat example.txt

總之,除了檔案名稱以外的所有檔案訊息,都存在著inode之中。至於為什麼沒有檔名,下文會有詳細解釋。
Linux下的inode記錄

#inode的大小

#inode也會消耗硬碟空間,所以硬碟格式化的時候,作業系統會自動將硬碟分成兩個區域。一個是資料區,存放檔案資料;另一個是inode區(inode table),存放inode所包含的資訊。

每 個inode節點的大小,一般是128位元組或256位元組。 inode節點的總數,在格式化時就給定,一般是每1KB或每2KB就設定一個inode。假設 在一塊1GB的硬碟中,每個inode節點的大小為128字節,每1KB就設定一個inode,那麼inode table的大小就會達到128MB,佔整塊硬碟的12.8%。

查看每個硬碟分割區的inode總數和已經使用的數量,可以使用df指令。

df -i

查看每個inode節點的大小,可以使用以下指令:

sudo dumpe2fs -h /dev/hda | grep "Inode size"

由於每個檔案都必須有一個inode,因此有可能發生inode已經使用光,但是硬碟還未儲存的情況。這時,就無法在硬碟上建立新檔案。

inode號碼

Linux下的inode記錄

#每個inode都有一個號碼,作業系統用inode號碼來辨識不同的檔案。

這 裡值得重複一遍,Unix/Linux系統內部不使用檔名,而使用inode號碼來辨識檔案。對於系統來說,檔案名稱只是inode號碼便於辨識的別稱或 者綽號。表面上,使用者透過檔案名,開啟檔案。實際上,系統內部這個過程分成三步:首先,系統找到這個檔案名稱對應的inode號碼;其次,透過inode號 碼,取得inode資訊;最後,根據inode訊息,找到檔案資料所在的block,讀取資料。

使用ls -i指令,可以看到檔名對應的inode號碼:

ls -i example.txt

目錄檔案

Unix/Linux系統中,目錄(directory)也是一種檔案。開啟目錄,實際上就是開啟目錄檔。

目錄檔案的結構非常簡單,就是一系列目錄項目(dirent)的清單。每個目錄項,由兩部分組成:所包含檔案的檔案名,以及該檔案名稱對應的inode號碼。

ls指令只列出目錄檔案中的所有檔案名稱:

ls /etc

ls -i指令列出整個目錄文件,即文件名稱和inode號碼:

ls -i /etc

如果要查看文件的詳細信息,就必須根據inode號碼,訪問inode節點,讀取信息。 ls -l指令列出檔案的詳細資訊。

ls -l /etc

硬連結

一 般情況下,檔案名稱和inode號碼是」一一對應」關係,每個inode號碼對應一個檔案名稱。但是,Unix/Linux系統允許,多個檔案名稱指向同一個 inode號碼。這意味著,可以用不同的文件名存取相同的內容;對文件內容進行修改,會影響到所有文件名;但是,刪除一個文件名,不影響另一個文件名的訪問 問。這種情況就被稱為」硬連結」(hard link)。

ln指令可以建立硬連結:

ln 源文件 目标文件

运 行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文 件名总数,这时就会增加1。反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系 统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的”链接数”。创建目录时, 默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当 前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录),这里的 2是父目录对其的“硬链接”和当前目录下的”.硬链接“。

Linux下的inode記錄

软链接

除了硬链接以外,还有 一种特殊情况。文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打 开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这 意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此 发生变化。

ln -s命令可以创建软链接。

ln -s 源文文件或目录 目标文件或目录

inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

\1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

\2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

\3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时 候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的 inode则被回收。

实际问题

在一台配置较低的Linux服务器(内存、硬盘比较小)的/data分区内创建文件时,系统提示磁盘空间不足,用df -h命令查看了一下磁盘使用情况,发现/data分区只使用了66%,还有12G的剩余空间,按理说不会出现这种问题。 后来用df -i查看了一下/data分区的索引节点(inode),发现已经用满(IUsed=100%),导致系统无法创建新目录和文件。

查找原因:

/data/cache目录中存在数量非常多的小字节缓存文件,占用的Block不多,但是占用了大量的inode。

解决方案:

1、删除/data/cache目录中的部分文件,释放出/data分区的一部分inode。

2、用软连接将空闲分区/opt中的newcache目录连接到/data/cache,使用/opt分区的inode来缓解/data分区inode不足的问题:

ln -s /opt/newcache /data/cache

以上是Linux下的inode記錄的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:lxlinux.net。如有侵權,請聯絡admin@php.cn刪除