文件系统 与 软硬链接

目录

一、文件系统

认识磁盘

磁盘存储的逻辑抽象结构

块组的内容

inode Table

Data blocks

inode Bitmap

Block Bitmap

Group Descriptor Table

Super Block

理解目录

二、软硬链接

软链接​

硬链接

硬链接数


一、文件系统

之前的博客主题叫做"进程打开文件", 研究是本质是被打开的文件,也就是内存中的文件!而不是所有的文件都被打开了,还有很多没有被打开的文件,这些文件在磁盘上存放,磁盘文件同样也要被分门别类地管理好,只有管理好了才能快速定位,方便用户随时读取!

文件系统本身是包含管理内存文件和磁盘文件的,而本文研究的文件系统重点是磁盘文件的管理!

认识磁盘

磁头左右摆动(每一面都有1个磁头),盘面(存储数据)高速旋转,就可以实现寻址数据!而盘面无论转动多快,都是机械运动,所以磁盘比较慢!

一个磁盘有很多个同心磁道,一个磁道有很多个扇区,扇区是磁盘的最小存储单位(大多512字节), 所以从磁盘加载数据到内存中,至少加载一个扇区的数据,所以磁盘叫做块设备

CHS寻址:

Cylinder:磁道

Head:磁头

Sector:扇区

磁盘要寻址定位,只需要先确定磁头(本质确定哪一个面), 然后确定磁道,然后确定扇区!

磁头左右摆动定位磁道,盘面旋转定位扇区!

这样我们就可以向一个扇区/多个扇区随机写入!

磁盘存储的逻辑抽象结构

OS直接用CHS寻址是不合适的,因为如果磁盘读写方式变了,OS(软件)也要做出相应变化,所以我们要对磁盘存储的结构进行逻辑抽象,使得无论磁盘读取的方式如何变化,上层软件处理方式是一样的!

但是对于OS来说,一个扇区的大小有些小,I/O次数有点多,所以OS可以按照扇区为单位读取数据,但更多的是基于文件系统,按照文件块为单位进行数据存取

1个文件块包含八个扇区,也就是4kb大小的空间,这样OS每次读取的数据大小就是4kb的倍数了

一旦规定了1个文件块是8个扇区,OS存取数据只需要知道读取文件块的起始地址即可,这个起始地址叫做LBA(Logical Block Address)

有了这些概念之后,以后我们的观念中OS读取数据就不关心磁道,扇区这些了,直接把磁盘空间当成每个元素大小为4kb的数组即可, 所以对磁盘的管理,在OS层面,就变成了对数组的增删查改

但是我们自己的电脑磁盘空间一般很大,比如说500GB, 直接管理这500GB空间比较难,所以为了方便管理,把磁盘进行分区管理!比如我们的电脑只有1块磁盘,而C盘,D盘,E盘本质就是在进行分区管理!

而分区之后1个区还是太大了,于是又把每个区进行划分,划分成很多个块组!

块组无非存储了两类数据, 用户的文件信息(内容+属性)以及很多文件管理的数据!而管理文件的数据一定是最先写到块组上的!

块组的内容

inode Table

文件的inode编号

1. 一般情况,1个文件只有1个inode编号

2. 基本上,每个文件都有inode编号

3.inode编号在所在的整个分区具有唯一性

4.Linux内核识别文件,和文件名无关,只和inode编号有关

磁盘上的各个文件的内容可能不一样,但文件属性种类一定是一样的!inode Table 可以理解为一个数组,里面每个元素类型都是 struct inode, 该结构体里面存储了文件的各个属性,比如文件的大小,权限,拥有者,所属组,ACM时间,inode编号等等(注意inode 结构体中没有文件名)! inode结构体的大小是固定的128字节!所以在inode Table表中具体的一个inode根据相对位置就很好查找了!

Data blocks

文件的属性表存在了inode Table 中,而文件的内容保存在了Data blocks, Data blocks 是一张非常大的以4kb为单位的数据块区域

为了能够保证每个文件找到自己对应的内容的数据块区域,inode结构体中还存储了一个数组 int blocks[N], 数组保存的是inode编号对应的文件内容所在的数据块,比如该数组里面存的是1,2,4, 意思就是文件内容保存在了编号为1,2,4这三个数据块中!

而OS中,N的大小一般只有15, 总共也就4*15=60kb的大小,如何保存大文件呢??

这15个数据块不都是直接映射的,比如0-12是直接(一级)映射,而13是二级映射,13对应的数据块保存的并不直接是文件内容,而是更多块列表(可以理解为存储的是列表的索引),  而14是三级映射,最终就可以保存大文件了

inode Bitmap

在一个块组中,如何知道哪些文件的inode被用了,哪些没有被用了呢???

inode Bitmap 是一串二进制数字,比特位的位置表示inode编号,某一个比特位为0/1表示对应的inode有没有被使用!

Block Bitmap

inode Bitmap 也是一串二进制数字,比特位的位置表示block编号,某一个比特位为0/1表示对应的block块有没有被使用!

比如说要新建一个文件:

1.先查inode Bitmap, 找到最低的1个没有被使用的比特位,比特位位置就是inode编号,将比特位由0置1

2. 找到inode编号对应的inode Table,将属性填充到对应的inode结构体中

3.在Block Bitmap中找到最低的比特位为0的位置,将比特位置成1,比特位的位置就是块号,将文件内容写到对应块号的块中

4.将inode编号反馈给用户

比如说要删除一个文件:

1. 根据inode编号,将inode Bitmap对应比特位由1置成0

2. 根据inode结构体中的blocks数组中保存的使用的数据块编号,将Block Bitmap中对应的比特位置成0

所以删除文件只需要改位图即可!!!

这就是为啥新建一个文件很慢,但是删除文件很快!!!

删除一个文件之后,并不会将删除文件的内容都清空,所以是可以恢复的!但是如果又新建了文件就很难恢复了,因为很有可能新的inode编号已经被分配给新的文件了,导致删除文件的数据块内容和inode结构体中的属性都被覆盖了!

Group Descriptor Table

GDT保存的是整个块组的使用情况!

Super Block

Super Block 叫做 超级块, 每一个块组中都有上述提到的字段,但是并不是每一个块组中都有Super Block,  只有几个块组才有Super Block, 存放的是整个分区的情况!

Q:为啥要把Super Block字段放在几个块组中呢??只需要1个块组中存放整个分区的使用情况不就可以了吗??

A:因为如果只把Super Block存放在1个分区中,一旦出了问题,整个分区都无法访问了!所以在几个块组中保存本质就是保存副本,1个块组的Super Block出了问题,OS就把其他副本复制到该块组的Super Block上面,就修复了问题,这样可以保证整个文件系统的稳定性!

理解目录

目录也是文件,上述讲述的所有内容都适用目录文件,目录也有inode编号,也有各种属性,但是目录的数据块内容存储什么呢??

存储 自己目录内部直接保存的文件的文件名和inode的映射关系

之所以同一个目录下不允许存在同名文件,是因为文件名和inode要映射,互为键值!!!

而inode结构体中只保存了inode编号,并没有存储文件名!文件名是在目录的内容中保存的!

挂载

在一个分区内部,inode是唯一的,但是不同分区的inode可能重复,所以如何确定inode在哪一个分区呢??这就要引出挂载的概念了!

一个磁盘,被分区格式化之后,Linux要使用这个分区,要把这个分区进行挂载mount

挂载本质就是把磁盘的一个分区和一个目录关联起来!访问分区就是访问目录!

比如下面的/dev/sb1就是磁盘的一个分区,mnt就是目录!

sudo mount /dev/sdb1 /mnt

每一个文件,都有路径,可以通过路径的前缀,就可以判断文件在哪一个分区下!

二、软硬链接

软链接

可以看到,软链接有独立的inode编号,是一个独立的文件!软链接文件的内容保存的是指向文件的路径!

软链接,类似windows桌面上的快捷方式!!! 之所以要有软链接文件,是因为有些可执行程序存放的路径很深,不方便查找或者直接执行,还要先进入可执行程序所在目录,比较麻烦~

硬链接

硬链接文件和指向的文件inode是一样的,所以inode不是一个独立的文件!

硬链接本质就是指定目录内部的一组映射关系: 文件名<->inode的映射关系

当文件名和inode没有映射关系时(没有人用该文件了), 文件就被真正删除了!而在文件系统层面,目标文件如何知道没有文件名指向自己了呢?? 在inode结构体中,还有1个字段是 int ref_count, 这就是引用计数,表明有几个文件名映射关系!

硬链接数

硬链接数,表明哪些文件名指向对应的inode!

之所以新建目录文件的硬链接数是2,是因为目录中包含了.这个隐藏文件,指向和inode和目录文件名指向的inode是一样的!

同理的,如果在dir目录下,新建了一个目录,硬连接数会变成3

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

为啥不能对目录建立硬链接呢???

查找一个文件或者目录是需要路径的,而路径的获取就是遇到目录就进入根据文件名和inode映射关系进行查找,硬链接本质是一个目录,如果建立了硬链接,可能就会导致查找形成了环形路径,无法结束查找!

而软链接是一个普通文件,查找时压根不会进入普通文件,所以不会有什么影响!

而 . 与 .. 目录是硬链接文件,这是系统的特殊处理,方便用户进行目录切换!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/753954.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【物联网应用】基于云计算的智能化温室种植一体化平台

目录 第一章 作品概述 1.1. 作品名称 1.2. 应用领域 1.3.主要功能 1.4.创新性说明 第二章 需求分析 2.1 现实背景 2.2 用户群体及系统功能 2.3 竞品分析 第三章 技术方案 3.1. 硬件组成与来源 3.2. 硬件设计合理性 3.3. 硬件系统设计图 3.4. 接口的通用性与可扩展性 3.5. 代码规…

vue中判断是否使用自定义插槽

在封装自定义组件时&#xff0c;需要判断使用者是否使用了插槽<slot"aaa">&#xff0c;如果没有则使用一个组件中默认的值&#xff0c;反之就用传入的内容<template name"aaa"></template>,实现如下&#xff1a; <div class"lin…

苍穹外卖-day06:HttpClient、微信小程序开发、微信登录(业务流程)、导入商品浏览功能代码(业务逻辑)

苍穹外卖-day06 课程内容 HttpClient微信小程序开发微信登录导入商品浏览功能代码 功能实现&#xff1a;微信登录、商品浏览 微信登录效果图&#xff1a; 商品浏览效果图&#xff1a; 1. HttpClient 1.1 介绍 HttpClient 是Apache Jakarta Common 下的子项目&#xff0c;…

文件系统I/O FATFS RW 源码分析

文件系统I/O FATFS RW 源码分析 0 参考 FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块。FatFs 整个项目都按照 ANSI C (C89) 编写。与存储器 I/O 解耦良好&#xff0c;便于移植到 8051、PIC、AVR、ARM、Z80、RX 等小型微控制器中。 下面是关于 FAT 文件系统格式…

20.回文链表

给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff1a;head …

linux 安装常用软件

文件传输工具 sudo yum install –y lrzsz vim编辑器 sudo yum install -y vimDNS 查询 sudo yum install bind-utils用法可以参考文章 《掌握 DNS 查询技巧&#xff0c;dig 命令基本用法》 net-tools包 yum install net-tools -y简单用法&#xff1a; # 查看端口占用情况…

【学习学习】学习金字塔

学习金字塔&#xff08;Cone of Learning&#xff09;&#xff0c;全称学习吸收率金字塔&#xff0c;是一种现代学习方式的理论。网上流传它是美国缅因州的国家训练实验室&#xff08;National Training Laboratories&#xff09;研究成果&#xff0c;用数字形式形象显示了采用…

【重温设计模式】观察者模式及其Java示例

观察者模式的概念和原理 在编程世界中&#xff0c;设计模式作为一种解决问题的策略&#xff0c;它的存在就如同人类语言中的成语&#xff0c;是一种经过时间考验的有效解决方案。 观察者模式就是其中一种重要的设计模式&#xff0c;它在很多场景中都有着广泛的应用。那么&…

外包干了5天,技术退步明显。。。。

说一下自己的情况&#xff0c;本科生&#xff0c;19年通过校招进入广州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&a…

Java项目:63 ssm网上花店设计+vue

作者主页&#xff1a;舒克日记 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 系统具备友好性且功能完善。管理员登录进入后台之后&#xff0c;主要完成花材选择管理&#xff0c;用户管理&#xff0c;鲜花管理&#xff0c;鲜花出入…

【数据结构与算法】(16):桶除了能装饭还能排序?

&#x1f921;博客主页&#xff1a;Code_文晓 &#x1f970;本文专栏&#xff1a;数据结构与算法 &#x1f63b;欢迎关注&#xff1a;感谢大家的点赞评论关注&#xff0c;祝您学有所成&#xff01; ✨✨&#x1f49c;&#x1f49b;想要学习更多数据结构与算法点击专栏链接查看&…

源神,启动!马斯克开源史上最大模型Grok,参数高达3140亿,可商用!

马斯克真不愧是源神&#xff0c;自开源X的推荐算法以及特斯拉智能驾驶算法后&#xff0c;又说到做到&#xff0c;开源旗下大模型Grok&#xff01; 代码和模型权重已上线GitHub。官方信息显示&#xff0c;此次开源的Grok-1是一个3140亿参数的混合专家模型&#xff0c;远超OpenAI…

HTML选择文件的实时预览

HTML选择文件的实时预览 目录 HTML选择文件的实时预览HTML代码JS代码预览 HTML代码 <input type"file" id"adv_img_input" style"width: 1000px ;height:30px"> <img src"#"id"adv_img">JS代码 <script>…

配置OGG 如何批量修改源端及目标端序列值_满足客户变态需求学会这招你就赚了

欢迎您关注我的公众号【尚雷的驿站】 **************************************************************************** 公众号&#xff1a;尚雷的驿站 CSDN &#xff1a;https://blog.csdn.net/shlei5580 墨天轮&#xff1a;https://www.modb.pro/u/2436 PGFans&#xff1a;ht…

WanAndroid(鸿蒙版)开发的第三篇

前言 DevEco Studio版本&#xff1a;4.0.0.600 WanAndroid的API链接&#xff1a;玩Android 开放API-玩Android - wanandroid.com 其他篇文章参考&#xff1a; 1、WanAndroid(鸿蒙版)开发的第一篇 2、WanAndroid(鸿蒙版)开发的第二篇 3、WanAndroid(鸿蒙版)开发的第三篇 …

2024年3月GESP认证Scratch图形化编程四级真题及答案

GESP 图形化四级试卷 &#xff08;满分&#xff1a;100 分 考试时间&#xff1a;120 分钟&#xff09; 学校&#xff1a; 姓名&#xff1a; ​ 一、单选题&#xff08;共 10 题&#xff0c;每题 2 分&#xff0c;共 30 分&#xff09; 题号 1 2 3 4 5 6 7 8 9 10 11 1…

【开源】SpringBoot框架开发学生综合素质评价系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生功能2.2 教师功能2.3 教务处功能 三、系统展示四、核心代码4.1 查询我的学科竞赛4.2 保存单个问卷4.3 根据类型查询学生问卷4.4 填写语数外评价4.5 填写品德自评问卷分 五、免责说明 一、摘要 1.1 项目介绍 基于J…

数字化转型导师坚鹏:人工智能在金融机构数字化转型中的应用

人工智能在金融机构数字化转型中的应用 课程背景&#xff1a; 金融机构数字化转型离不开人工智能&#xff0c;在金融机构数字化转型中&#xff0c;人工智能起到至关重要的作用&#xff0c;很多机构存在以下问题&#xff1a; 不清楚人工智能产业对我们有什么影响&#xff1f;…

考研数学|概率应该怎么学?

考研概率论老师很多&#xff0c;但是我最推荐两个老师&#xff0c;李良和方浩 我认为李良概率论基础讲解相比于其他老师最大的优点就是&#xff0c;每一步都会耐心解释其中的逻辑。很少会像方浩老师那样过于跳跃或者频繁串联&#xff0c;这点对于零基础思维转换慢的人来说&…

Transformer self-attention源码及原理理解

自注意力计算公式&#xff1a; 在公式(1)中Q(query)是输入一个序列中的一个token&#xff0c;K(key)代表序列中所有token的特征。 可以得到当前token与序列中其他token的相关性。在论文原文中512&#xff0c;表示每个token用512维特征表示&#xff08;序列符号的embedding长度…