当前位置: 首页 > news >正文

文件系统

目录

1.认识磁盘

磁盘的物理结构

CHS定位法

磁盘的逻辑结构

2.认识文件系统

inode

分区和分组

磁盘上的文件系统

3.软硬链接

软链接

软链接的操作

创建软链接

查看软链接

删除软链接

软链接的特点

软链接的使用场景

硬链接

硬链接的操作

创建硬链接

查看硬链接

删除硬链接

硬链接的特点

硬链接的使用场景


1.认识磁盘

磁盘的物理结构

我们的计算机当中会存在许多的文件,有被打开的文件,也有没打开的文件,没打开的文件就是放在磁盘上存储的,磁盘的物理结构如下图所示:

  • 盘片:一个磁盘有多个盘片,一个盘片有上下两个盘面。
  • 磁头:一个盘面配有一个磁头,磁头会在盘面上方来回摆动读取盘面上的数据。
  • 主轴:多个盘片被主轴贯穿,绕主轴旋转。
  • 伺服系统:内部有各种控制电路和程序,控制磁盘的运动。

我们将磁盘的物理结构形象的表示成下面这幅图:

  • 磁道:盘面上的一圈就是一个磁道。
  • 扇区:磁道上的一小个扇装结构就是一个扇区,一个扇区的大小通常是512字节。

CHS定位法

磁盘上的磁头(Head)、磁道(Cylinder)、扇区(Sector)都有唯一的编号,那么我们就可以这样来定位磁盘上的一个特定扇区:

  • 首先确定使用哪一个磁头,通过这个磁头就能够找到一个固定的盘面。
  • 通过磁头的来回摆动,找到固定的一个磁道。
  • 盘片是绕轴旋转的,通过盘片的旋转,就能找到特定的扇区。

这种定位一个扇区的方法称为CHS定位法。扇区是磁盘进行IO的基本单位,文件又是在磁盘上存储的;那么,一个文件就是多个扇区所承载的数据了。

磁盘的逻辑结构

我们可以想象一下,把一个盘面按照磁道为单位进行展开,并且所有的磁道首尾相连,那么一个盘面不就相当于被展开成了一串 “磁带” 了吗?

我们可以把展开之后的盘面看成一个大数组,每个数组元素都是一个扇区。这个大数组就是磁盘的逻辑结构。

磁盘逻辑结构示意图:

对于操作系统来说,每次和磁盘进行IO的基本单位是4KB。 

2.认识文件系统

inode

文件是由文件的内容文件的属性共同组成的。文件内容的大小是不固定的,但是文件属性的大小是固定的,通常为128字节。而且,在Linux操作系统中,文件的内容和文件的属性是分开存储的,文件的属性存储在一个 struct inode 类型的结构体中,inode中通常记录着文件大小,所有者,最近修改时间等……

需要注意的是:inode中, 没有文件名,Linux系统中,标识一个文件用的不是文件名,而是inode编号,也正是inode中没有文件名,才能做到 struct inode 类型的对象大小固定。

分区和分组

我们计算机上的磁盘的存储空间是很大的,就现在而言,一般的计算机都有512GB的磁盘空间,那么操作系统要如何才能管理好着512GB的磁盘空间和磁盘上的文件呢?

操作系统对磁盘空间的管理其实是采用了分治思想,先把磁盘划分成多个区域,我们在Windows电脑上就可以很明显的看到有什么C盘、D盘…… 这其实就是操作系统对磁盘进行了分区;要管理好一个磁盘,就要管理好多个分区。那么操作系统是如何管理好一个分区的呢?同样采用了分治思想,操作系统先把一个分区分成多个组,这叫做分组,然后编写管理好一个分组的数据结构和算法,一个分组能够管理好,那么就能把管理管理一个分组的数据结构和算法拷贝给其他分组,这样就管理好了一个分区内的多个分组,也就意味着管理好了一个分区,既然能够管理好一个分区,那复用管理好着一个分区的数据结构和算法,就能管理好多个分区,管理好多个分区就意味着管理好了磁盘。

分区和分组示意图:

磁盘上的文件系统

每一个分组其实是 Block group 结构,多个 Block group 结构和头部的 BootBlock 结构 共同就构成了磁盘的文件系统,每一个 Block group 又都有相同的结构,分别是:

  • Date blocks:数据区,存放文件的内容。
  • Block Bitmap:块位图,Block Bitmap中记录着 Data blocks 中哪个数据块已经被占用,哪个数据块没有被占用;比特位的位置,表示块号,比特位的内容,表示对应的块是否被使用(1表示使用,0表示未使用)。
  • inode Table:i节点表,相当于一个 inode 数组。
  • inode Bitmap:inode位图,inode Bitmap中记录着 inode Table 中 inode 的使用情况;比特位的位置表示第几个inode,比特位的内容,表示inode是否被使用(1表示使用,0表示未使用)。
  • Super Block:超级块,存放文件系统本身的结构信息。
    记录的信息主要有:
    1.bolck 和 inode的总量。
    2.未使用的block和inode的数量。
    3.一个block和inode的大小。
    4.最近一次挂载的时间。
    5.最近一次写入数据的时间。
    6.最近一次检验磁盘的时间等其他文件系统的相关信息。
    Super Block的信息被破坏,可以说整个文件系统结构就被破坏了。
  • Group Descriptor Table:块组描述,符描述块组属性信息。

3.软硬链接

软链接

在Windows操作系统中,我们都使用过快捷方式打开一个软件,在Linux操作系统中,软链接文件就类似于Windows中的快捷方式。

软链接的操作

创建软链接

我们可以使用 ln -s 目标文件或目录 软链接名称 命令创建一个软链接文件:

  • 从开头的文件类型为l,表明软链接文件是一个链接文件。
  • 并且文件名当中会通过 -> 告诉我们软链接文件链接的是哪一个文件。
查看软链接

我们还可以使用 ll -l -i 命令查看文件的 inode编号

  • 可以看到这两个文件的inode编号不同,表明一个文件的软连接确实是一个文件。
删除软链接

我们可以使用 rm 命令或者 unlink 命令删除一个软链接文件:

软链接的特点

  • 软链接是一个独立的文件,因为它有自己的inode编号。
  • 软连接会记录目标文件或目录的路径,相当于Windows中的快捷方式。
  • 可以为目录创建软链接。

软链接的使用场景

软链接中会记录目标文件or目录的路径,我们可以使用这一点来进行以下操作:

  • 简化路径:为长路径的文件或目录创建软链接,方便访问。
  • 版本管理:通过软链接指向不同版本的文件或目录,方便切换。

硬链接

硬链接是Linux操作系统中的一种文件链接方式。它与软链接不同,硬链接直接指向文件的 inode,而不是存储目标路径。硬链接更像是文件的 “别名”,多个硬链接共享同一个 inode 和 数据块。

硬链接的操作

创建硬链接

我们可以使用 ln 目标文件 软链接名称 为指定文件创建硬链接:

  • 开头的文件类型为 - ,表明硬链接是一个普通文件。
查看硬链接

我们可以使用 ll -l -i 命令 查看硬链接文件:

  • 开头的文件类型为 -,表明这是一个普通文件。
  • code.c 和 code_link.hard 的 inode 编号是一样的,说明code_link.hard只是code.c的一个别名
  • 可以看到 code.c 和 code_link.hard 文件的硬链接数都是2。
删除硬链接

我们可以使用 rm 命令 或者 unlink 命令删除一个硬链接文件:

  • 可以看到文件的硬链接数变成1了。
  • 硬链接数相当于一个文件的引用计数,当硬链接数大于1时,删除硬链接不会影响其他的硬链接or文件;只有当硬链接数为1的时候,删除硬链接才会释放文件数据。

硬链接的特点

  • 硬链接与目标文件共享同一个 inode,因此它们指向相同的物理数据。
  • 用户不能给目录建立硬链接,只能由系统给目录建立硬链接。

硬链接的使用场景

  • 文件备份:硬链接可以提供额外的访问路径,即使删除一个硬链接,文件数据依然存在。
  • 文件共享:多个用户可以通过硬链接共享同一个文件,而无需复制路径。

在Linux操作系统中,我们经常可以看到 ... 这两个目录,. 代表当前目录,.. 代表上一级目录,这是如何实现的呢?

Linux 系统当中目录本质上是一个特殊的文件它存储了文件名和对应的 inode 编号的映射关系,当我们创建一个目录的时候,文件系统会自动生成两个硬链接:

  • .指向当前目录的 inode。

  • ..指向父目录的 inode。

这样,就能够通过 cd . 命令 进入当前目录,cd ..命令进入上一级目录了。

注意:我们只是说用户不能给目录创建硬链接,但是系统是可以给目录创建硬链接的,这两个硬链接就是操作系统自己创建的。

http://www.lryc.cn/news/543493.html

相关文章:

  • 力扣LeetCode:1472 设计浏览器历史记录
  • 【FL0091】基于SSM和微信小程序的社区二手物品交易小程序
  • 【笔记ing】每天50个英语词汇
  • 联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘
  • Java基础关键_012_包装类
  • 【react】TypeScript在react中的使用
  • vllm的使用方式,入门教程
  • IDEA 使用codeGPT+deepseek
  • vue3中测试:单元测试、组件测试、端到端测试
  • 机器学习介绍与数据集
  • React 源码揭秘 | 更新队列
  • 关于网络端口探测:TCP端口和UDP端口探测区别
  • Vue.js 中使用 JSX 自定义语法封装组件
  • 设计模式教程:备忘录模式(Memento Pattern)
  • 使用 C# 以api的形式调用 DeepSeek
  • CS5366AN:高集成Type-C转HDMI 4K60Hz芯片的国产突破
  • 瑞芯微RK安卓Android主板GPIO按键配置方法,触觉智能嵌入式开发
  • Dify自定义工作流集成指南:对接阿里云百炼文生图API的实现方案
  • 前端项目配置 Nginx 全攻略
  • 基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
  • 电子电气架构 --- 主机厂电子电气架构演进
  • 物联网通信应用案例之《智慧农业》
  • Java注解的原理
  • AI知识架构之神经网络
  • OpenGL 04--GLSL、数据类型、Uniform、着色器类
  • 学习笔记06——JVM调优
  • 深度学习(3)-TensorFlow入门(常数张量和变量)
  • 3-2 WPS JS宏 工作簿的打开与保存(模板批量另存为工作)学习笔记
  • 【GO】学习笔记
  • 【TypeScript】ts在vue中的使用