Linux文件系统
硬盘分区
首先硬盘是一个机械结构的计算机设备,它由盘片,读写磁头,转轴,电机等协作完成数据的读写操作。
一个硬盘可能由多个盘面,每个盘面都会对应一个磁头,通过磁头可以找到对应的盘面,在盘面内以盘片为圆心不同半径的同心圆构成的区域叫做磁道,而磁道又被分为平均的区域块,叫做扇区。
磁盘通过一级一级的结构完成文件的定位和读写操作,但是复杂的机械结构不便于操作系统进行管理,所以操作系统会把这些结构都抽象成逻辑地址,也就是把硬盘抽象成了一个大的数组结构,把硬盘的不同区域映射到数组当中,操作系统只需要对这个逻辑地址进行管理,对物理设备的管理转化成软件层面的管理,实现硬盘的管理操作。
但是一个硬盘的数据过于庞大,为了方便管理,操作系统要对抽象好的逻辑地址进行分区,缩小管理的难度,分好的分区,写入一个管理系统对数据进行管理,只要能管好一个分区,就能把对这个区的管理方式分别应用到别的分区,实现对整个硬盘的管理。
硬盘的文件系统
上面提到的对每个分区的管理系统,就是系统为硬盘的每个分区写入一定的结构和方法,实现对整个分区的管理,这就是Linux的文件系统。
下面的例子是Linux的ext2文件系统
硬盘的整个分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的,
对硬盘划分的分区进行细分,可以把一个分区划分为一个boot block,和若干不同的块组,相当于对分区再进行细分,分为更小的分区,boot block叫做引导分区或者启动分区,用来帮助操作系统找到分区。
我们的文件系统进行管理的,实际上就是一个个块组,一个Block group就是一个块组,每个块组都由不同的区域构成
- Super Block:超级块,存放文件系统的结构信息,block和inode的总量,未使用的block和inode的数量,block和inode的大小信息一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了,所以每个组块都有超级块,防止一个超级快损坏造成整个硬盘的损坏。
- Group Descriptor Table:GDT,块组描述符,描述块组的属性信息
- Block Bitmap:块位图 ,通过位图的01标识记录Data blocks中的block的占用情况。
- inode Bitmap:每个bit表示一个inode是否空闲可用。
- inode Table:存放文件属性 如 文件大小,所有者,最近修改时间等
- Data blocks:存放数据的区域
Inode
我们知道,文件从存储不光有文件的数据,还有文件的属性信息,而inode就是用来保存文件属性的数据结构
通过stat命令可以看到文件的属性信息
每个文件都会对应一个inode
每在硬盘上存放一个文件,文件对应的唯一inode信息都会被存放到inode Table表当中,而indoe Table中存放的indoe数量和剩余大小,则是通过inode Bitmap确定的,每存放一个inode到inode Table中,inode Bitmap的位图都会记录,文件存放到block中,每个block也都对应着Block Bitmap的位图,所以说Block Bitmap也会记录文件存放的位置信息等。
Inode id
它是一个inode的标识符,在分区内是唯一的不重复的,要找到inode,就要通过inode id ,用命令ls -i 就能查看文件的inode id
在Unix/Linux操作系统中,系统内部并不采用文件名查找文件,而是使用inode编号来识别文件。因此对于系统来说,文件名只是inode号码便于识别的别称或者绰号。而站在用户角度,用户通过文件名,打开文件,实际上,系统内部是获取inode信息找到数据块的,这个过程分成三步:
- 首先,系统找到这个文件名对应的inode号码;
- 其次,通过inode号码,获取inode信息;
- 最后,根据inode信息,找到文件数据所在的block,读出数据。
目录文件
“Linux下一切皆文件” ,目录结构其实也是一个文件,目录里面保存的,其实是文件名和inode的映射关系
目录文件构成=inode+数据
数据=文件名:inode id
我们用命令看到的文件详细信息,并不是说这些信息被保存在目录文件当中,我们要查看文件的详细属性信息,是通过文件名,在目录的数据中,找到文件名和inode id的映射关系,通过映射关系找到对应的inode,再把inode的信息拿出来,就能看到文件对应的属性信息。
软链接
用命令ln -s可以创建文件对应的软连接
ls -s IO.txt link
查看目录的详细信息,发现link和IO.txt文件拥有不同的inode id,说明两个文件不是一个文件
发现link指向的是IO.txt,我们再对link进行操作,写入字符串"link test"
我们对link进行写操作,但是link链接的IO.txt也发生了写操作。
但是两个文件的inod id不同,也就不是一个文件,为什么对link操作会影响IO.txt?
删除IO.txt文件
发现link的配色发生了变化,再对link进行操作,发现找不到文件。
这是因为link和IO.txt之间建立的是软连接,link是一个独立的文件,类似于window操作系统中的快捷方式,link文件中的数据,存的并不是IO.txt的inode,而是IO.txt的路径信息,所以在删除IO.txt之后,link就找不到IO.txt文件了。
软连接常用于大型工程,想把可执行程序拿到项目目录外面执行的话,就可以对可执行程序建立软连接,在目录外面不用配置环境变量就可以之间运行程序。
硬链接
使用命令ln 创建对应文件的硬链接
ln IO.txt h_link
可以看到硬链接的两个文件,inode id是同一个,也就是说这两个文件其实是同一个文件,而且文件详细信息里面的硬链接数,两个文件都变成了2
对这两个文件进行操作的话,毋庸置疑,肯定都会发生变化。
这个h_link文件对IO.txt 进行硬链接,这个h_link文件里面存的,其实是文件名和IO.txt的indoe id映射关系,这两个文件通过映射关系找到的indoe,其实是一个indoe,也就是一个文件属性,这两个文件其实是一个文件。
对IO.txt进行删除操作
这两个文件的链接消失了,但是这个文件本质上还是存在的,只是换了一个文件名,h_link里面依然是IO.txt里存放的映射关系,映射到的还是同一个inode,也就是说IO.txt并没有被删除,只是换了一个文件名。