基础IO(三)—— 文件系统/硬链接和软链接

基础IO(三)

引言

在前两篇文件基础IO(一)基础IO(二)中讲解的文件都是打开的未见,但是大部分文件都是没有被打开的(当前并不需要被访问),都在磁盘中保存。那么我们也需要对没有被进程打开的文件进行管理,快速定位到文件。

所以文件的管理工作有下面两个

  • 打开的文件进行管理
  • 没有被打开的文件也要在磁盘中进行管理

这些都需要文件系统的介入。

文件系统

磁盘 —— 物理存储结构

磁盘的物理结构主要由以下几个部分组成:

  • 盘片:磁盘由一个或多个盘片组成,每个盘片都有两个面(正反两面),这些面都可以用于存储数据。盘片通常由金属或玻璃材料制成,表面涂有磁性物质。其中一个盘面可以有很多的同心磁道
    在这里插入图片描述

  • 磁头:每个盘面的上下两侧都各有一个磁头,用于读取和写入数据。磁头由磁性材料制成,能够在磁盘表面感应磁场的变化,从而实现数据的读写。磁头安装在磁头臂上,磁头臂通过电动机或电磁力控制,可以在盘片上移动到不同的磁道位置。

  • 磁道:磁盘表面被划分成许多同心圆,这些同心圆轨迹被称为磁道。磁道从外向内从0开始顺序编号,每个盘面都有多个磁道。磁道是磁盘存储数据的基本单位,利用磁性材料在磁场中的磁化方向变化来存储数据。

  • 扇区:在磁盘里的磁道上等分出若干个弧段,这些弧段便是磁盘的扇区。每个扇区可以存放一定量的数据,通常是512字节4KB(但通常以512字节为主)。扇区是磁盘存储数据的最小单位,每个扇区都有一个唯一的标识符,用于标识该扇区的位置和大小。
    在这里插入图片描述

  • 柱面:所有盘面中相对位置相同的磁道组成柱面。柱面是磁盘进行数据读写时的一个虚拟单位,数据读写时通常按柱面进行,以提高读写效率。

下图是磁盘的总结构

如果想向一个扇区内写入该如何定位

  • 先选则在哪一个盘面,本质就是选择磁头
  • 选择该面上的哪一个磁道
  • 选择该磁道哪一个扇面

所以定位一个地址需要三个内容盘面(Head),柱面(cylinder),扇面(sector)这种定位一个扇区的方式叫做**CHS定位法**。其中磁头摆动定位柱面,盘面旋转定位扇区。

我们可以向一个扇区写入,就可以向任意一个或者多个写入,从而就可以向连续多个扇区写入,也就可以进行随机写入。

CHS定位法

定义

CHS定位法通过三个参数来定位磁盘上的一个特定扇区:

  • Cylinder(柱面/磁道):磁盘上由同一半径的圆所组成的圆柱面,是磁盘数据分区的最小单位。
  • Head(磁头):用于读取磁盘上数据的读写磁头,每个盘面都有一个对应的磁头。
  • Sector(扇区):磁盘上存储数据的基本单位,每个磁道被划分为若干个扇区,每个扇区通常包含512字节或4096字节的数据。

定位过程

  1. 确定柱面(磁道):首先,通过确定半径来定位扇区所在的磁道(柱面)。磁道是磁盘上由同一半径的圆所组成的圆柱面,是磁盘数据分区的最小单位。
  2. 确定磁头:接着,通过磁头的移动来找到扇区所在的盘面。每个盘面都有一个对应的磁头,磁头负责读取该盘面上的数据。
  3. 确定扇区:最后,通过扇区的编号来确定具体的扇区位置。每个磁道被划分为若干个扇区,每个扇区都有一个唯一的编号。

应用与转换

  • 在物理结构上:磁盘通过CHS定位法来物理地定位扇区。然而,随着磁盘技术的发展,特别是大容量磁盘的出现,CHS定位法在某些情况下可能不再适用或效率较低。
  • 在逻辑结构上:操作系统内部更常用逻辑块地址(LBA)来管理磁盘。LBA将磁盘抽象为一个线性的数组结构,每个元素对应一个扇区或更大的数据块(如4KB)。LBA地址可以通过简单的数学运算转换为CHS地址,以便在需要时与磁盘的物理结构进行交互。在下面会详细讲解LBA

优缺点

  • 优点:
    • 简单直观:通过三个参数即可定位磁盘上的任意扇区。
    • 兼容性好:早期的磁盘和操作系统广泛支持CHS定位法。
  • 缺点:
    • 容量限制:随着磁盘容量的增加,CHS定位法可能无法直接表示所有的扇区地址。
    • 效率较低:在处理大容量磁盘时,CHS定位法可能需要更多的计算和转换步骤。

磁盘存储的逻辑抽象结构

将磁盘盘面想想成一个线性的空间 ,对磁盘的管理就变成了对数组的管理。

首先先将磁盘分成一个一个的盘面

在这里插入图片描述

盘面中的磁道逻辑抽象

在这里插入图片描述

扇区逻辑抽象
在这里插入图片描述

例子

假设有4个盘面,每个盘面有10个磁道,每个磁道有100个扇区那么第1234号在哪

1234 / (10 * 100) = 1 //在第一个盘面
1234 % 1000 / 100 = 2 //在第二个磁道
1234 % 1000 % 100 = 34 // 在第34个扇区

操作系统可以基于文件系统按照块为单位进行数据存取。操纵系统可以以8个扇区看做一个基本单位叫做一个文件块— 4kb为单位,来进行磁盘级别IO。所以我们只要知道起始的下标,我们就可以连续访问8个扇区。把这8个扇区的起始地址就叫做LBA(逻辑块地址)。

理解Linux文件系统(ext2)

根据上面所讲的磁盘存储的逻辑抽象结构可以知道,这些一个一个的文件块是要被管理的,但是假设一个500G的磁盘分成的文件块数量有太多,所以就把500G的磁盘分成一个一个的区,例如(100G,200G,100G,100G)对这些区来进行管理即可。

对其中的一个区管理好就相当于管理好了所有的区,在把其中的一个区划成许多组(2GB),这就又转换成只要把2GB管理好就可以把500G的磁盘管理好。这种思想就是一种分治思想。

对于一个块组里面也包含很多东西,其中要包括我的文件信息,还要包括很多的文件管理的数据。 其中首先要先让管理数据写入到块组当中去,这就是格式化

在这里插入图片描述

文件的inode编号

我们使用Linux命令ls -li查看文件的详细信息时会发现在最前面会有一串数字,这就是文件的inode编号,一般情况下一个文件对应一个inode编号,每个文件都必须要inode编号。

inode编号在整个分区具有唯一性,Linux内核中识 别文件和文件名无关,只和inode有关。

访问文件的时候,最开始应该要判断这个文件在哪一个分区里面。一个磁盘被分区格式化之后,Linux中要使用这个分区,要把这个分区进行挂载,每一个文件都有路径,可以通过路径的前缀判断出,路径在哪一个分区下。

Block Group中的结构

i节点表

  • 存放文件属性,如文件大小,所有者最近修改时间等

  • 保存文件属性是通过inode保存的,inode大小是固定的128字节

  • 每一个分组都有一个起始inode编号

数据区

  • 存放文件内容
  • 在数据区中存放着一个又一个的4kb的数据块
  • 为了方便找寻到某个文件对应的在数据区中的块号,在inode结构体中存放了一个数组存放的文件数据所在的块号。

inode位图

  • 比特位的位置表示第几个inode,比特位的内容表示对应的inode是否正在被使用

块位图

  • Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

GDT(块组描述表)

  • GDTLinux文件系统中用于描述文件系统分组(或块组)属性的数据结构。每个分组都包含有自己的GDT,该表记录了该分组的详细信息,如已使用的inode数量、空闲的inode数量、Block Bitmapinode Bitmapinode TableData Blocks等字段的区域划分等。
  • GDT的主要作用是管理文件系统的分组信息,确保系统能够高效地访问和管理各个分组内的数据。

Super Block

存放文件系统本身的结构信息。记录的信息主要有:data bolckinode的总量,未使用的data bolckinode的数量,一个data bolckinode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个文件系统结构就被破坏了

创建和删除一个文件

创建文件

  • 内核先找一个空闲的inode将文件信息记录到其中
  • 将文件的内容存放在数据区的数据块中
  • 将新文件添加到目录中,文件名和inode之间的对应关系将文件名和文件的内容及文件的属性连接起来。

删除文件

删除文件并不需要把文件的所有内容和属性全部删除,只需要在inode位图中,找到文件所对应的那个inode将比特位由1置为0,同样找到文件所使用的数据块,在块位图中将所对应的比特位由1置为0。

目录

用户在linux中只用文件名,而内核又使用inode,那文件名怎么映射到inode呢。这需要目录的存在。因为目录的内部保存是文件的文件名和inode的映射关系。所以同一个目录下不允许存在同名文件。

所以在这个目录下新建,删除,修改一个文件就需要写权限,就是修改目录中的内容也就是文件名和inode的映射关系。

dentry

定义

dentrydirectory entry(目录项)的缩写,是Linux文件系统中用于描述文件或目录的逻辑属性的数据结构。

功能

  • 存储文件名和inode号:dentry中包含了文件名和与之关联的inode号,inode号用于唯一标识文件系统中的一个文件或目录。
  • 加速查找:通过缓存文件名到inode的映射关系,dentry可以显著提高文件系统的查找性能。

内容

  • dentry是一个内存实体,只存在于内存中,而不是存储在磁盘上。
  • dentry结构通常包含指向父节点和子节点的指针,形成一个树状结构,这个树状结构就是文件系统的目录结构在内存中的缓存。
  • dentry结构还包含其他信息,如目录项对象使用计数器(d_count)、目录项标志(d_flags)、文件名(d_name)等。

工作原理

  • 当用户通过文件名访问文件时,文件系统会首先查找dentry缓存,看是否已经缓存了该文件名的dentry
  • 如果找到了,就直接通过dentry中的inode号访问inode结构,进而访问文件数据。
  • 如果没有找到,就会去磁盘上查找对应的inode,然后将文件名和inode号的映射关系缓存到dentry中。

软硬链接

软链接

特性

  • 软链接类似于Windows系统中的快捷方式,它本身是一个特殊的文件,该文件包含了另一个文件或目录的路径名。
  • 通过软链接,可以快速定位到链接所指向的源文件或目录。
  • 软链接是一个独立的文件,有独立的inode编号

创建软链接

使用ln -s命令可以创建软链接。例如,ln -s file1 link_to_file1会创建file1的一个软链接link_to_file1

在这里插入图片描述

硬链接

特性

  • 硬链接不是一个独立的文件,没有独立的inode编号

  • 硬链接就是在指定目录内部的一组映射关系,文件名和inode的映射关系

  • 硬链接之间共享相同的inode和数据块,不会占用额外的存储空间

  • 硬链接是文件的一个或多个文件名,它们指向同一个inode。因此,硬链接实际上是文件的一个别名,它们共享相同的文件内容和元数据。

当删除原文件时只是删除了原来的映射关系,而硬链接也是一个映射关系和原文件的映射关系相同,其实就相当于重命名。

inode当中有一个引用计数就是表明有几个文件名映射关系。所以当一个文件真正被删除时是没有文件名和inode映射的时候就删除了。

下图就是文件的硬链接数

在这里插入图片描述

我们发现新建一个普通文件的硬链接数为1,但是新建一个目录的硬链接数就是2。因为空目录中有两个隐藏的文件一个是 .(指向当前目录) 一个是…(指向上一级目录)

创建硬链接

使用ln命令(不带-s选项)可以创建硬链接。例如,ln file1 file2会创建file1的一个硬链接file2

在这里插入图片描述

用户无法对目录建立硬链接

如果允许目录的硬链接,那么一个目录可能会通过多个不同的路径被访问。这可能会导致文件系统的状态变得不一致,因为不同的路径可能会看到不同的目录内容或结构。此外,删除这样的目录也可能变得复杂和容易出错,因为需要确保所有硬链接都被删除,才能真正释放目录占用的资源。

硬链接与软链接的不同

硬链接软链接
定义通过inode连接的文件别名类似于Windows快捷方式的特殊文件
共享存储是,共享相同的inode和数据块否,占用独立的inode和数据块(存储路径信息)
跨文件系统
链接目录不支持支持
删除影响删除一个硬链接不影响其他硬链接或文件本身,直到最后一个硬链接被删除删除软链接不影响被链接的文件或目录,但被链接的文件或目录被删除后,软链接失效
创建命令ln [原文件] [链接名称]ln -s [原文件或目录] [链接名称]

上一篇:基础IO(二)

本专栏为“小菜”linux学习之路 该文章仅供学习参考,如有问题,欢迎在评论区指出。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值