前言
操作系统为了方便管理硬盘的空间,会将硬盘进行分区管理;比如在window中就是我们所说的C盘D盘等盘符; 而 分区被分开后,需要载入文件系统才可以使用,文件系统是操作系统管理硬盘的一种软件的分层方式;
Linux的ext2文件系统
要了解文件系统,我们可以简单了解以下ext2文件系统的结构;Linux中使用的文件系统大多数都是ext2 ext3 ext4;这几种文件系统的管理方案基本相同,只不过细节上有些不一样;
在Linux ext2中,大概有以下的结构:
inux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被 划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设 定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的,就是存放一些操作系统启动的资料信息;
-
Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。也就是硬盘被分区了,然后又在每个分区中又分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是否空闲可用。 -
**i节点表(inode table) **: 存放文件属性 如 文件大小,所有者,最近修改时间等; -
date blocks数据区:存放文件内容 ;
一个没打开的文件,有文件属性和文件内容:在文件系统中:文件属性存储在inode表中,文件内容存放在数据区里;
系统的角度,是如何查找哪个inode table中的 inode 和date block 没有被使用的?
通过inode Bitmap 和 block Bitmap; 这两个是位图信息: 当系统要查找一个文件的inode 表哪个inode没被使用,那么就会将inode 加载到内存,然后通过位操作,就可以判断哪个bit没被使用; block Bitmap 也是这样,查找数据区哪个数据块没被使用,也是操作系统加载blok Bitmap到内存中,通过位操作就可以知道哪个数据块没被使用了;
inode
inode 和 inode 编号不是一个同样的东西,inode编号在inode里面;inode是存放文件的属性,而inode编号是文件属性之一; 系统查找一个文件就是通过inode编号查找的,而不是通过文件名; 并且在Linux中一个文件,对应一个inode,而我们所知道的硬链接有多个inode编号,不是该硬链接文件有多个inode,该硬链接有多个inode编号而已;
目录存储的内容
目录也是文件,文件就有属性和内容,文件的属性依旧是存放在inode表中,而目录的文件内容也是存放在date blocks中; 请问目录存储的内容是什么?
目录存储的内容是:该目录下的文件名和改文件名对应的inode编号;
当我们创建一个文件时候,系统的角度发生了什么事?
当我们创建了一个文件,系统就会找inode表,里面看看哪个inode没被使用,一旦找到了一个inode没被使用,那么就会把文件的属性,存入到inode里; 然后文件存放了属性,当然还有存放内容,操作系统也会去数据区找到一个没有被使用的数据块,把文件内容存放在数据块中; 然后通过inode里面的一个数据属性成员数组(数组存放的是文件数据的数据区),建立inode和文件的联系;
然后就会在该目录下,新增目录文件内容:也就是创建新的文件名和inode编号的对应关系,
系统角度,是如何查找一个文件并读取文件内容的?
在系统的角度,绝对不是按文件名查找文件的,而是先去当前文件名目录下:查找到该文件名对应的inode编号, 然后通过inode编号找到inode表,再通过inode找到文件的数据成员,找文件内容这样就可以读取一个文件了;
理解软硬链接
创建软链接在使用层面就是给文件名创建快捷方式: 最常用的地方就是:当一个文件的路径过于深的时候,我们就可以使用软连接的方式给该文件创建软链接也就是快捷方式嘛!
ln -s file_s.txt file.txt # 给file.txt创建软连接
unlink file_s.txt #删除软链接
创建硬链接的使用,基本都是在目录文件使用得多:因为当我们创建一个新目录时候,我们发现该目录的硬链接数总是为2,原因是,该目录下有个当前目录. ,该当前目录就是和你创建的目录是同一个inode,也就是硬链接啦。
ln file.txt_hard file.txt #给file.txt创建硬链接
|