之前对磁盘分区已经有了详细的描述,这篇主要介绍文件系统.Linux的文件系统是出了名的.下面就
大概介绍下.
可以把文件系统大概分成 SuperBlock inodeBlock DataBlock 三部分
SuperBlock
SuperBlock记录文件系统的基本信息比如每块数据块的大小,空闲磁盘的块数信息.
inodBlock
inodBlock上面主要是 inode 表,每个项都是一个 inode 结构,每个 inode 记录的是文件的基本
信息和属性.每个inode 结构都对应一个文件或者目录,目录也是特殊的文件.只是目录里面记
录的是 inode 节点和文件名对应关系.另外 inode 结构还记录了每个文件对应数据块在磁盘上的
位置,从而索引到所有的文件数据.
DataBlock
DataBlock 就是文件实际内容的存放地方.
举个例子,比如 ls > dir.txt,Linux 做了以下工作
- 在 inode 表里面找一个空闲的节点,并且申请
- 在 DataBlock 里面找到足够的空闲块来装载文件,从而OS从内核缓冲区写到空闲块里
- 在 inode 结构里面填充 DataBlock 所在位置以及其他信息
- 在目录项里面添加 inode 和文件名对应关系
文件在目录中的含义
目录也是一种特殊的文件,只是它记录的是文件名和 inode 编号的对应关系,凡是对文件的操作
都先根据 inode 节点编号,在 inodeBlock 里面找到对应的 inode 结构,再读取到相应的文件数据.
文件在目录,也就是在目录文件里面有文件对应的 inode 编号.
子目录在目录中的含义
每个目录在 mkdir 的时候肯定会有对应两个 inode 编号,一个是 “.”,另一个是 “..”,分别代表当前
目录和父目录,根据对应的 inode 编号来指定(根文件两者是一样的!).现在假设 a 目录下有一个
b目录
[firefoxbug@firefoxbug a]$ ls -ia
1312717 . 1312861 .. 1312857 a
[firefoxbug@firefoxbug a]$ cd a/
[firefoxbug@firefoxbug a]$ ls -ia
1312857 . 1312717 .. 1313177 b
a目录"."inode 编号就是 b 目录 “..”的节点编号,这也是连接目录和目录之间的关系.
硬链接和软链接
看上面的实验,总结
硬链接创建之后,是和原文件共享一个 inode 节点,系统会对原文件的硬链接增加一个.
有点类似创建了一个镜像一样,此时 inode 节点对应了"两个"文件,删除一个文件之后,
对于原来的文件并不影响,因为系统检测到 inode 节点依然是存在的,只是计数变成了1.
对于软链接创建之后,则是新建一个 inode 节点,对于目录项里多了一条指示"到那个文件
怎么走".一旦原文件删除了,这时候就找不到了原文件了.这和 windows 的快捷方式是一样的.