文件节点表和原理
之前在安装操作系统时,将一块硬盘分成了四个分区,每个分区有自己的目录结构,而分区下每个文件的数据分为元数据和数据本身两部分组成。文件在磁盘中存储的结构,而文件的元数据包含文件的时间(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
文件夹不能创建硬连接