文件節點表和原理
之前在安裝操作系統時,將一塊硬盤分成了四個分區,每個分區有自己的目錄結構,而分區下每個文件的數據分為元數據和數據本身兩部分組成。文件在磁盤中存儲的結構,而文件的元數據包含文件的時間(Timestamps)、大小(Size)、所屬組(Group info)以及所主(Owner info)和權限(Mode)以外,還包含文件的索引節點(index node)以及指針,而指針按照不同的文件大小分為直接指針、間接指針和雙重間接指針。
而直接指針有12個,直接塊指針指向數據塊,每個數據塊是4k大小,因此如果文件的大小不超過48k,使用直接指針指向數據塊即可。如果文件大小超過了48k,并且小于4M,那么就需要使用間接指針,間接指針指向的是指針塊,指針塊本身不存放數據,大小也是4K,存放的是指針,每個指針占用4個字節的空間,合計就是1024個指針,最多指向1024*4k即4M大小的文件。如果文件大小超過4M,不超過4G,那么就需要使用雙重間接塊指針,雙重間接塊指針指向的是一個文件塊指針。依此類推
在刪除文件時刪除的是文件的節點表,那對應節點表指向的數據塊會被標記為空閑,但是文件內容不會被立即刪除。因此刪除的數據可能是被還原的。而文件能不能刪除不是由文件決定,而是由文件所在的文件夾決定的。
inode
數據存在磁盤上時,每個文件都有唯一的索引節點編號,創建文件之后,在查看文件詳細信息時,可以使用ll -i選項查看,節點編號由系統自動分配。
[root@centos8 data]# touch file{1..10}.log
[root@centos8 data]# ll -i
total 0
140 -rw-r--r--. 1 root root 0 Aug 9 12:40 file10.log
131 -rw-r--r--. 1 root root 0 Aug 9 12:40 file1.log
132 -rw-r--r--. 1 root root 0 Aug 9 12:40 file2.log
133 -rw-r--r--. 1 root root 0 Aug 9 12:40 file3.log
134 -rw-r--r--. 1 root root 0 Aug 9 12:40 file4.log
135 -rw-r--r--. 1 root root 0 Aug 9 12:40 file5.log
136 -rw-r--r--. 1 root root 0 Aug 9 12:40 file6.log
137 -rw-r--r--. 1 root root 0 Aug 9 12:40 file7.log
138 -rw-r--r--. 1 root root 0 Aug 9 12:40 file8.log
139 -rw-r--r--. 1 root root 0 Aug 9 12:40 file9.log
每個分區的節點編號也是有限制的,例如/boot分區的可用節點是130762
[root@centos8 data]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 131072 310 130762 1% /boot
每創建一個文件,可用的文件編號就會自動減少
[root@centos8 boot]# touch test.txt
[root@centos8 boot]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 131072 311 130761 1% /boot
如果磁盤的節點編號耗盡,那么即使磁盤空間沒有滿,也無法再使用。
[root@centos8 testdir]# echo file{1..130761}|xargs touch
touch: cannot touch 'file130761': No space left on device
本質原因是文件節點編號耗盡
[root@centos8 testdir]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 131072 131072 0 100% /boot
刪除文件后便可以再次在/boot目錄下創建文件
[root@centos8 testdir]# rm -rf ../testdir/
[root@centos8 testdir]# df -i /boot
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 131072 312 130760 1% /boot
cp命令和inode
在執行cp命令時,系統會分配一個空閑的inode,并在inode表匯總生成新條目,在目錄中創建一個目錄項,將名稱與inode編號關聯,并拷貝數據生成新的文件。
rm和inode
在執行rm命令時,鏈接數遞減,從而釋放的inode號可以被重復使用,把數據塊放在空閑列表中,刪除目錄項,數據實際上不會立馬被刪除,但是當另一個文件使用數據塊時會被覆蓋。
在創建文件時,默認的鏈接數為1
數字1表示硬連接數為1
[root@centos8 data]# ll -i /data
total 0
140 -rw-r--r--. 1 root root 0 Aug 9 12:40 file10.log
131 -rw-r--r--. 1 root root 0 Aug 9 12:40 file1.log
132 -rw-r--r--. 1 root root 0 Aug 9 12:40 file2.log
133 -rw-r--r--. 1 root root 0 Aug 9 12:40 file3.log
134 -rw-r--r--. 1 root root 0 Aug 9 12:40 file4.log
135 -rw-r--r--. 1 root root 0 Aug 9 12:40 file5.log
136 -rw-r--r--. 1 root root 0 Aug 9 12:40 file6.log
137 -rw-r--r--. 1 root root 0 Aug 9 12:40 file7.log
138 -rw-r--r--. 1 root root 0 Aug 9 12:40 file8.log
139 -rw-r--r--. 1 root root 0 Aug 9 12:40 file9.log
當在同一個分區下創建一個硬連接后鏈接數會增加
file1.log和file1.log.link的鏈接數都是2,硬鏈接的本質是同一個文件有多個文件名
[root@centos8 data]# ln file1.log file1.log.link
[root@centos8 data]# ll !*
ll file1.log file1.log.link
-rw-r--r--. 2 root root 0 Aug 9 12:40 file1.log
-rw-r--r--. 2 root root 0 Aug 9 12:40 file1.log.link
當刪除file1.log時,硬連接文件不會受影響,但是鏈接數會遞減
[root@centos8 data]# rm file1.log
[root@centos8 data]# ll|grep file1.log.link
-rw-r--r--. 1 root root 0 Aug 9 12:40 file1.log.link
文件夾不能創建硬連接