九、理解文件系统及inode
如果一个文件没有被打开,它肯定是存放在磁盘中的,刚刚是对内存文件进行了分析,接下来我们来谈谈磁盘文件。
1.磁盘的概念
我们所创建的大量文件,在没有被打开时都是在磁盘上存放的,以下是磁盘的基本结构图:
如下图所示,磁盘主要是通过机械臂上的磁头来读取磁盘上的数据,磁盘由一个或者多个圆盘组成,它们围绕着一根中心主轴旋转,磁盘被组织成磁道,磁道是单个盘片上的同心圆,所有盘面上半径相同的磁道构成了柱面,每一个磁道又按512个字节为单位划分为等分,叫做扇区, 向磁盘读取和写入数据时,要以扇区为单位。
2.磁盘的分区与格式化
1.磁盘的分区
磁盘由一个或者多个圆盘组成,我们可以把它想象成小时候都接触过的磁带,把磁盘展开成一条直线。(线性结构)磁盘是相当大的,如果对整个磁盘进行管理成本很高,那么就需要对磁盘进行分区操作。
2.磁盘的格式化
在Linux ext系列文件系统中,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。
Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。
超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了
GDT,Group Descriptor Table:块组描述符,描述块组属性信息;Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用
inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
数据区(Data block):存放文件内容
补充一点,以上我们是对文件进行了说明,我们知道一切皆文件,那么目录也是文件,只不过我们感官上觉的目录和文件有些区别;
目录既然也是文件,如何结合以上所讲来解释创建一个目录呢?
当我们创建一个目录后,它也是有inode编号的,在block中存放的是文件的文件名,因为文件名也是字符串,字符串也就是数据,再通过文件的inode编号进行映射,就能访问到文件了。
总结:
创建一个新文件主要有一下4个操作:
1. 存储属性
内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
2. 存储数据
该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。
3. 记录分配情况
文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
4. 添加文件名到目录
新的文件名 test 。linux如何在当前的目录中记录这个文件?内核将入口(263466, test )添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。
3. 查看inode信息
1.stat命令
stat命令用来显示文件或文件系统的详细信息,stat命令的输出信息要比ls命令的输出信息要更详细。
简单的介绍一下stat命令显示出来的文件其他信息:
- File:显示文件名
- Size:显示文件大小
- Blocks:文件使用的数据块总数
- IO Block:IO块大小
- regular file:文件类型(常规文件)
- Device:设备编号
- Inode:Inode号
- Links:链接数
- Access:文件的权限
- Gid、Uid:文件所有权的Gid和Uid(拥有者和所属组)
2. ls -al -i
查看文件的inode编号
4.Linux下的三个时间
- Access Time:简写为atime,表示文件的访问时间。当文件内容被访问时,更新这个时间(短时内访问不会更新)
- Modify Time:简写为mtime,表示文件内容的修改时间,当文件的数据内容被修改时,更新这个时间。
- Change Time:简写为ctime,表示文件的状态时间,当文件的状态被修改时,更新这个时间,例如文件的链接数,大小,权限,Blocks数。
十、软硬链接
1.软连接
我们可以通过以下命令创建一个文件的软连接。
[mlg@VM-20-8-centos lesson2]$ ln -s log.txt log_s //创建软连接 [mlg@VM-20-8-centos lesson2]$ unlink log_s //删除软连接
创建这个软连接有什么用呢?
例如:你想要执行bin目录下的a.out程序
这样子未免太麻烦,我们可以在lesson2的目录下直接创建软连接:
在Linux中有时候会存在执行路径特别深的程序,这时候我们就可通过软连接快速的找到;本质上就是充当索引的作用;并且两者的inode是不相同的,软连接是有独立的inode的,是个独立文件,可以跨文件系统;
需要注意,当我们完成软链接后如果删除链接的目标,软链接文件不会独立存在,虽然仍保留文件名:
2.硬链接
我们可以通过以下命令创建一个文件的硬连接。
[mlg@VM-20-8-centos lesson2]$ ln log1.txt hard
刚刚软连接我们将链接的目标删除后,是不能独立存在的;如果我们把硬链接的链接目标删除后会发生什么情况呢?
从上图可以看到,删除log.txt后,查看我们的硬链接文件,依旧能够看到内容。这里就相当于给log.txt重命名了。
我们发现硬链接的inode和源文件的inode是相同的,并且链接数是2,而软链接的链接数1;
这里的链接数表示的是硬链接数;
硬链接的本质是根本就不是一个独立的文件,而是一个文件名和inode编号的映射关系,因为自己没有独立的inode。
硬链接的另一个场景:
我们创建一个目录后,硬链接数就是2,其原因就是一个inode对应了两个文件名(test和.)