在Linux中,文件是最重要的一部分,很多的接口都是通过文件的方式展现出来。
文件有很多种:
最常见的是普通文件,例如文本文件,二进制文件等。
文件夹其实也是一种文件,你可以vim一个文件夹的内容,可以看到文件夹下面的。
还有一种Char Dev也是一种文件,例如从/dev/random里面,可以读取随机数。
还有一种Block Dev也是一种文件,例如/dev/vda就代表着一块硬盘。
还有一种称为symbolic link文件,指向其他的文件,例如/etc/systemd/system/multi-user.target.wants中的文件指向/lib/systemd/system/中的相应的文件。
还有一种socket文件,用于两个进程之间通信,例如/var/run/docker.sock,就是docker客户端和daemon通信的文件。
一个普通的文件看起来是连续的,但是是分成很多的Block存放在硬盘上的不同的位置,如何知道一个文件包含哪些文件块呢,需要一种称为inode的数据结构。
mode是对权限的控制
uid和gid是属于哪个用户哪个组
atime是文件最后一次被访问的时间
mtime是文件的内容被修改的时间
ctime是inode被修改的时间
dtime是inode被删除的时间
最最重要的是block数组,保存着这个文件保护哪些数据块,数据块里面才是真正的文件内容。
这个数组是怎么组织的呢?
在ext3中的组织方式是这样的。
这是一个层次的结构,前12项(第0到11项)直接指向的就是数据块,当文件太大的时候,第12项则变成了两层的,先指向一个中间块,然后中间块里面再保存指向真正数据块的指针。第13项则变成了三层的,第14项则变成了四层的。
在ext4中这个结构发生了变化,变成了属性架构,称为extend
组织结构如下
在 extent 树中,节点一共有两类:叶子节点和索引节点。
保存文件数据的磁盘块信息全部记录在叶子节点中;而索引节点中则存储了叶子节点的位置和相对顺序。