在Linux雲端環境中,資料安全是非常重要的一項工作。而inode和擴充屬性這兩個概念則可能對你的資料安全產生重大影響。 inode是Linux檔案系統中的核心概念之一,它保存了檔案或目錄在磁碟上的實體位置、存取權限等資訊。而擴展屬性則是在inode中包含的一組額外的元數據,可以為文件或目錄添加更加詳細的信息,比如文件的作者、創建時間等,這些信息在數據恢復和保護方面都非常重要。
#一、inode是什麼?
理解inode,要從文件儲存說起。
檔案儲存在硬碟上,硬碟的最小儲存單位叫做」磁區」(Sector)。每個扇區儲存512位元組(相當於0.5KB)。
作業系統讀取硬碟的時候,不會一個個磁區地讀取,這樣效率太低,而是一次連續讀取多個磁區,也就是一次讀取一個」區塊」(block) 。這種由多個磁區組成的”區塊”,是檔案存取的最小單位。 「塊」的大小,最常見的是4KB,即連續八個 sector組成一個 block。
文件資料都儲存在」區塊」中,那麼很顯然,我們還必須找到一個地方儲存文件的元信息,例如文件的創建者、文件的創建日期、文件的大小等等。這種儲存檔案元資訊的區域就叫做inode,中文譯名為」索引節點」。
二、inode的內容
inode包含檔案的元資訊,具體來說有以下內容:
* 檔案的位元組數
* 檔案擁有者的User ID
* 檔案的Group ID
* 檔案的讀取、寫入、執行權限
* 檔案的時間戳,共有三個:ctime指inode上一次變動的時間,mtime指檔案內容上一次變動的時間,atime指檔案上一次開啟的時間。
* 連結數,即有多少檔名指向這個inode
* 檔案資料block的位置
可以用stat指令,查看某個檔案的inode資訊:
stat example.txt
總之,除了檔案名稱以外的所有檔案訊息,都存在著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號碼
#每個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是父目录对其的“硬链接”和当前目录下的”.硬链接“。
**七、软链接
**
除了硬链接以外,还有一种特殊情况。文件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和扩展属性是非常有用的工具,它们可以帮助我们更好地保护和管理数据。通过对inode和扩展属性的深入了解,我们可以更好地理解Linux文件系统的工作原理,更好地掌握数据安全的方法。因此,我们强烈建议Linux云环境下的用户不仅要了解inode和扩展属性,还要深入了解其他的相关概念和技术,从而更好地保护自己的数据安全。
以上是了解inode與擴充屬性,提升Linux雲端環境下的資料安全的詳細內容。更多資訊請關注PHP中文網其他相關文章!