理解文件系统与inode

进程中讨论的都是被打开的文件,那在磁盘中有大量的没有被打开的文件,需要系统进行管理。

一、磁盘 

磁盘(disk)是指利用磁记录技术存储数据的存储器。

磁盘是计算机主要的存储介质,可以存储大量的二进制数据,并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘(Floppy Disk,简称软盘),如今常用的磁盘是硬磁盘(Hard disk,简称硬盘)。

磁盘结构:

  1. ​盘片:一个磁盘(如一个 1T 的机械硬盘)由多个盘片叠加而成。盘片的表面涂有磁性物质,这些磁性物质用来记录二进制数据。因为正反两面都可涂上磁性物质,故一个盘片可能会有两个盘面。
  2. 磁道、扇区:每个盘片被划分为一个个磁道,每个磁道又划分为一个个扇区。其中,最内侧磁道上的扇区面积最小,因此数据密度最大。
  3. 柱面:每个盘面对应一个磁头。所有的磁头都是连在同一个磁臂上的,因此所有磁头只能“共进退”。所有盘面中相对位置相同的磁道组成柱面。 

磁盘存储数据:

磁盘存储数据的基本单位是扇区,一般扇区大小为512自己(4KB),每一面盘片被被分为多个通同心的圆,也就是磁道,每一个磁道上划分多个相同大小的扇区

如何找到一个扇区?CHS寻址方式

  1.  在哪一个磁道(柱面)上,Cylinder
  2.  在哪一个面上(对应的就是哪一个磁头),Head
  3.  在哪一个扇区上,Sector

磁盘的抽象(逻辑、虚拟)结构:

相当于将每一个磁道拉长,再按顺序依次链接起来。所以在逻辑上就可以看成一个数组,每一个扇区就是数组中的一个元素

  1.  所以就认为磁盘是线性结构,要访问某一个扇区,就是直接定位数组的下标,( LBA寻址(logic block address))。
  2. 操作系统内部使用的是 LAB寻址,LAB方式寻址和 CHS方式寻址可以相互转化,这样就实现了系统对磁盘之间数据的交互。

二、inode 

磁盘空间很大,管理成本高,磁盘采用分治思想,对磁盘进行分区,对于每一个分区来说,分区的头部会包括一个启动块(Boot Block),对于该分区的其余区域系统将其划分为一个个的块组(Block Group)

启动块的大小是确定的,而块组的大小是由格式化的时候确定的,并且不可以更改,每个分区的大小由 OS 决定

每个块组都有着相同的结构,都由超级块(Super Block)、块组描述符表(Group Descriptor Table)、块位图(Block Bitmap)、inode位图(inode Bitmap)、inode表(inode Table)以及数据表(Data Block)组成

  • Block Group:文件系统会根据分区的大小划分为数个Block Group,而每个Block Group都有着相同的结构组成
  • 超级块(Super Block):存放整个文件系统本身的结构属性信息。主要有:bolck 和 inode 的总量,未使用的block和inode 的数量,一个 block 和 inode 的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block 的信息被破坏,可以说整个文件系统结构就被破坏了
  • GDT(Group Descriptor Table):块组描述表,描述块组属性信息。对应分组的宏观的属性信息,inode有多少个,已经使用多少,已经被占用多少个,还剩下多少个。
  • 块位图(Block Bitmap):Block Bitmap 中记录着 Data Block 中哪个数据块已经被占用,哪个数据块没有被占用
  • inode位图(inode Bitmap):用每个位表示每一个对应的inode 是否被使用
  • inode属性节点表(inode Table):存放文件属性,如文件大小,所有者,最近修改时间,每个文件的 inode编号等
  • 数据区(Data Blocks):存放文件内容
  1. 超级块(Super Block)是每个块组都有一个,不能像Boot Block一样在分区的开头,如果某个块组的Super Block出现异常,因为每一个分区都有一个相同的Super Block,就可以将同一分区下其他块组中的Super Block拷贝到出异常的Super Block中。
  2. 磁盘的格式化本质上就是重新写入文件系统,比如 Windows 下的磁盘分区 C/D/E...盘,假设对E盘格式化就是对该分区重新写入文件系统
  • 在 Linux 下,磁盘文件的内容和属性是分开存储的,文件属性里面有一个重要的东西:inode,inode 是固定大小的,一般是 128字节,也有 256字节的。Linux 下的 inode 一般是 128字节,每一个文件都有一个 对应的inode。
  • inode 几乎包含了文件的所有的属性,文件名除外,文件名并不在 自己的inode 中存储,在对应的目录文件的inode中存储的
     

inode的是一个结构体,其中包含了文件的属性信息,以及数据存放的信息

文件内容放在data blocks中,文件属性保存在inode中,而inode内部有一个数组,保存对应data blocks块的编号,二者就联系起来了。

如果存储文件特别大,怎么办? 

在data block中,不是所有的data block都只能存文件数据,也可以存其他块的块编号。inode内部的block数组的最后三个元素指向的数据块,就不是存储文件的数据,而是存的是其他块的块编号。这三个元素分别是一级索引、二级索引和三级索引。当该文件使用数据块的个数超过12个时,会使用这三个索引进行数据块扩充,不用担心数据块不够使用

目录文件:

也有自己的inode,有自己的data blcok,其中会保存目录下存在的文件名和其对应inode编号的映射关系。文件名是用户给的,inode编号是系统给的。

1.创建文件,系统做了什么 

  1. 在某一个块中,遍历inode btimap,找到一个空闲的,未被使用的inode,将其由0置为1
  2. 在inode table中找到对应的inode,将属性信息写入进去
  3. 将文件名和inode编号,在目录文件的data block中建立映射关系

2.删除文件,系统做了什么?

  1. 找到文件所在目录,根据目录的inode找到目录的data block,在其中根据文件名和映射关系找到文件inode编号
  2. 根据inode,将inode bitmap对应位置0
  3. 根据inode,将block bitmap对应位置0
  4. 在目录文件的data block中删除该映射关系

3.查看文件,系统做了什么? 

  1.  显示文件名时,根据目录文件找到所要查看文件的inode
  2. 根据inode在inode table中找到属性信息显示出来
  3. 根据inode在data block中找到文件内容显示出来

三、软硬链接

1.软链接

ln -s l1/l2/mytest mytest

从图中可以看出软链接之后,该链接文件有新的inode编号,所以是一个独立的文件,所以就可以理解软链接文件的内容就指向对应的路径 

软链接的作用:软链接就类似于windows下的快捷方式(桌面的软件图标就是该软件exe的快捷方式,软件实际上的存储位置并不在桌面,我们可以通过快捷方式直接去执行该exe文件)。当执行路径非常深,导致路径非常长不方便记忆,因此我们可以通过软链接来访问文件,这样就不用每次都输入长长的路径来访问文件

2.硬链接

ln log.txt hard_log.link

硬链接没有独立的inode,所以没有生成一个独立的文件。就是在指定的目录下,建立了文件名与指定inode的映射关系。

在inode结构体中,有一个引用计数,当有文件指向这个inode时,引用计数+1,当删除一个文件的时候,引用计数-1,当引用计数为0的时候,这个文件才算真正的删除,也就是在磁盘上被完全释放。

默认创建目录,为什么引用计数(硬链接数)为2?

  • 因为:自己目录名指向这个inode,目录内还有个 . 文件(当前目录文件)也指向这个inode
  • 特别的,在当前目录下创建再一个目录,当前目录的硬链接数会变为3,因为当前目录下创建的那个目录中存在的 .. 文件(..表示上一层目录,它也是文件名)和inode也是一组映射。 

 Linux不允许普通用户给目录创建硬链接,因为假如给根目录创建硬链接,新创建的硬链接的文件名从根目录开始查找,查找到的硬链接就是根目录,此时就造成了递归式查找(环形查找),导致软件无法正常进行查找。因此不允许普通用户给目录建立硬链接。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值