高级Linux运维工程师养成记-文件节点表和原理

文件节点表和原理之前在安装操作系统时 , 将一块硬盘分成了四个分区 , 每个分区有自己的目录结构 , 而分区下每个文件的数据分为元数据和数据本身两部分组成 。文件在磁盘中存储的结构 , 而文件的元数据包含文件的时间(Timestamps)、大小(Size)、所属组(Group info)以及所主(Owner info)和权限(Mode)以外 , 还包含文件的索引节点(index node)以及指针 , 而指针按照不同的文件大小分为直接指针、间接指针和双重间接指针 。

高级Linux运维工程师养成记-文件节点表和原理

文章插图
 
而直接指针有12个,直接块指针指向数据块 , 每个数据块是4k大小 , 因此如果文件的大小不超过48k,使用直接指针指向数据块即可 。如果文件大小超过了48k , 并且小于4M , 那么就需要使用间接指针 , 间接指针指向的是指针块 , 指针块本身不存放数据 , 大小也是4K , 存放的是指针 , 每个指针占用4个字节的空间 , 合计就是1024个指针 , 最多指向1024*4k即4M大小的文件 。如果文件大小超过4M , 不超过4G , 那么就需要使用双重间接块指针 , 双重间接块指针指向的是一个文件块指针 。依此类推
在删除文件时删除的是文件的节点表 , 那对应节点表指向的数据块会被标记为空闲 , 但是文件内容不会被立即删除 。因此删除的数据可能是被还原的 。而文件能不能删除不是由文件决定 , 而是由文件所在的文件夹决定的 。
高级Linux运维工程师养成记-文件节点表和原理

文章插图
inode
数据存在磁盘上时 , 每个文件都有唯一的索引节点编号 , 创建文件之后 , 在查看文件详细信息时 , 可以使用ll -i选项查看 , 节点编号由系统自动分配 。
[root@centos8 data]# touch file{1..10}.log[root@centos8 data]# ll -itotal 0140 -rw-r--r--. 1 root root 0 Aug9 12:40 file10.log131 -rw-r--r--. 1 root root 0 Aug9 12:40 file1.log132 -rw-r--r--. 1 root root 0 Aug9 12:40 file2.log133 -rw-r--r--. 1 root root 0 Aug9 12:40 file3.log134 -rw-r--r--. 1 root root 0 Aug9 12:40 file4.log135 -rw-r--r--. 1 root root 0 Aug9 12:40 file5.log136 -rw-r--r--. 1 root root 0 Aug9 12:40 file6.log137 -rw-r--r--. 1 root root 0 Aug9 12:40 file7.log138 -rw-r--r--. 1 root root 0 Aug9 12:40 file8.log139 -rw-r--r--. 1 root root 0 Aug9 12:40 file9.log每个分区的节点编号也是有限制的,例如/boot分区的可用节点是130762
[root@centos8 data]# df -i /bootFilesystemInodes IUsedIFree IUse% Mounted on/dev/sda1131072310 1307621% /boot每创建一个文件 , 可用的文件编号就会自动减少
[root@centos8 boot]# touch test.txt[root@centos8 boot]# df -i /bootFilesystemInodes IUsedIFree IUse% Mounted on/dev/sda1131072311 1307611% /boot如果磁盘的节点编号耗尽 , 那么即使磁盘空间没有满 , 也无法再使用 。
[root@centos8 testdir]# echo file{1..130761}|xargs touchtouch: cannot touch 'file130761': No space left on device本质原因是文件节点编号耗尽
[root@centos8 testdir]# df -i /bootFilesystemInodesIUsed IFree IUse% Mounted on/dev/sda1131072 1310720100% /boot删除文件后便可以再次在/boot目录下创建文件
[root@centos8 testdir]# rm -rf ../testdir/[root@centos8 testdir]# df -i /bootFilesystemInodes IUsedIFree IUse% Mounted on/dev/sda1131072312 1307601% /bootcp命令和inode在执行cp命令时 , 系统会分配一个空闲的inode,并在inode表汇总生成新条目 , 在目录中创建一个目录项 , 将名称与inode编号关联 , 并拷贝数据生成新的文件 。
rm和inode在执行rm命令时 , 链接数递减 , 从而释放的inode号可以被重复使用 , 把数据块放在空闲列表中 , 删除目录项 , 数据实际上不会立马被删除 , 但是当另一个文件使用数据块时会被覆盖 。
在创建文件时 , 默认的链接数为1
数字1表示硬连接数为1
[root@centos8 data]# ll -i /datatotal 0140 -rw-r--r--. 1 root root 0 Aug9 12:40 file10.log131 -rw-r--r--. 1 root root 0 Aug9 12:40 file1.log132 -rw-r--r--. 1 root root 0 Aug9 12:40 file2.log133 -rw-r--r--. 1 root root 0 Aug9 12:40 file3.log134 -rw-r--r--. 1 root root 0 Aug9 12:40 file4.log135 -rw-r--r--. 1 root root 0 Aug9 12:40 file5.log136 -rw-r--r--. 1 root root 0 Aug9 12:40 file6.log137 -rw-r--r--. 1 root root 0 Aug9 12:40 file7.log138 -rw-r--r--. 1 root root 0 Aug9 12:40 file8.log139 -rw-r--r--. 1 root root 0 Aug9 12:40 file9.log


推荐阅读