【Linux】文件系统及软硬连接

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并没有被删除,只是换了一个文件名。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xiaomage1213888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值