将硬盘划分为一个个块组:
Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的,其中每个块组又分为多个小的块,每个块的功能如下:
- Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。类似于政府管理各区。
- 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。
- GDT,Group Descriptor Table:块组描述符,描述块组属性信息。
- 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。
- inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。inode中包含数据区对应的映射关系。inode id可以用来标识一个inode。
- i节点表(inode Table):存放文件属性 如 文件大小,所有者,最近修改时间等.。
- 数据区(Date blocks):存放文件的内容。
inode
通过ls -i
的命令可以查看文件的inode id:
要找到一个文件,操作系统会通过inode id找到对应的inode,由于inode中包含数据区对应的映射关系,所以可以通过inode找到对应的数据区,读取里面存放的内容。
inode编号是有限的,所以如果inode编号用完了,即使磁盘空间没满也无法创建新的文件了。
以创建一个名字为abc的文件为例:
创建一个新文件主要有一下4个操作:
- 存储属性:内核先在inode Bitmap中找到inode表中一个空闲的inode节点(这里是263466)。内核把文件信息记录到inode中,并填入到inode Table。将inode Bitmap的那一位置为1,表示该inode节点已经被使用。
- 存储数据:该文件需要存储在三个磁盘块,内核找到了三个空块:300,500,800。将内核缓冲区的第一块数据复制到300,下一块复制到500,以此类推。
- 记录分配情况:文件内容按顺序300,500,800存放。并把相应的块编号填入inode中的文件数据块列表中,建立inode和块编号的映射关系。
- 最后把这个inode id和文件名的映射关系放入目录的存储列表中
内核将入口(263466,abc)添加到目录文件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。
删除文件:先找到这个文件,然后把这个inode 在inode Bitmap的那一位和数据列表在Block BItmap的那一位由1置0,表示该inode已经是空闲的,以及对应的数据块也空闲是空闲的。这是一种伪删除,这也是为什么创建一个文件需要的时间比删除一个文件需要的时间多很多。最后删去该目录下inode id和文件名的映射关系。
查找文件:先找到文件所在的磁盘分区和块组,如何在inode表中找到文件的属性信息,根据inode中的块数据映射关系找到对应的数据,如何取出来即可。
软硬链接
相比于硬链接,软连接的应用场景比较多。ln[选项]...源文件或目录目标文件或目录
这条命令可以对文件进行链接,加-s
选项为软连接,不加则为硬链接。
软连接
可以看到软连接是一个独立的文件(有独立的inode),
软连接更像是Windows下的快捷方式,软链接的inode
所指向的内容实际上是保存了一个绝对路径,当用户访问这个文件时,系统会自动将其替换成其所指的文件路径。所以当这个文件已经被删除或者路径发生改变,自然就会显示无法找到该文件了。
软连接的使用场景一般是源文件的路径比较深的时候,直接在项目顶层对该源文件进行软连接,就可以不需要进入源文件的目录打开它了。
readlink -f 软链接文件
,该命令可以实现查看软链接真实目标绝对路径
硬链接
硬链接和指向的文件共享同一个inode,说明它们是同一个文件。
这个h_link其实就是该目录下文件名和inode的映射关系。
所以此时即使把log.txt这个文件删掉,h_link依然可以打开,因为删掉的仅仅也是一个文件名和inode的映射关系,相当于对文件名进行重命名。删掉以后对应的链接数会减一。
链接数是有几个文件和inode有映射关系。
对于一个目录,其链接数是2,这是因为有两个文件名和其inode发生映射关系:
比如这里的tmp目录,一个文件名是tmp,还有一个是tmp目录下的.
(当前目录)文件,如果在tmp目录下新建一个tmp1,tmp的链接数会变为3,因为tmp1目录下有一个..
(上一级目录)文件。
而如果在该目录下创建一个子目录,链接数会变成3,这是因为子目录下有一个隐藏的上级目录..
也指向该目录:
软硬链接的区别总结
- 硬链接的源文件和链接文件共用一个inode号,说明他们是同一个文件;而软链接原文件和和链接文件是不同的文件,链接文件inode指向的是源文件的绝对路径。
- 硬链接在文件属性上体现不出来,其表示文件类型的字符处为“-”原文件是普通文件,硬链接文件也是普通文件;而软链接明确标识是链接文件,其表示文件类型的字符处为“l”。
- 硬链接链接数目要增加,软链接的链接数目不会增加。
- 硬链接文件大小跟原文件相同;软链接文件大小与原文件不同。
- 硬链接有自己的文件名;软链接的文件名通常是指向其链接的原文件。
- inode id只在本文件系统内有效,所以硬链接是无法跨越两个文件系统来建立链接的。软连接的则不同,因为新的inode中存储的是目标文件的路径,该路径是可以找到原始文件的inode的,所以可以跨文件系统建立。
- 软连接一般有以下作用:1.当用户需要在不同的目录下用到相同的文件时,不需要在每一个目录下都存放该文件,只要在某个固定的目录下存放,然后在其它的目录下用命令链接( link)它即可,不必重复的占用磁盘空间。2.解决磁盘空间不足的情况。例如某个磁盘分区的空间已经快用完,但是现在必须在该磁盘分区下创建一个新的目录并存储大量的文件,那么可以在分区中建立指向另一个剩余空间较多的磁盘分区中目录的软链接,这样就能解决空间不足问题。
目录
目录也是一个文件,目录的inode放的是目录的创建时间、大小等信息,目录的内容则是文件名和inode的映射关系,文件名是给人看的,而系统看的是inode编号。