文件系统 与 软硬链接

目录

一、文件系统

认识磁盘

磁盘存储的逻辑抽象结构

块组的内容

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.mfbz.cn/a/464011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redisinsight默认端口改成5540了!网上的8001都是错误的

Redisinsight 打开白屏解决方法 最近发现一个很讨厌的bug&#xff0c;就是redisinsight运行之后&#xff0c;不行了&#xff0c;在网上找到的所有资料里面&#xff0c;redis insight都是运行在8001端口&#xff0c;但是我现在发现&#xff0c;变成了5540 所以对应的docker-com…

Node.js与webpack(三)

上一节&#xff1a;Node.js与Webpack笔记&#xff08;二&#xff09;-CSDN博客 从0来一遍&#xff08;webpack项目&#xff09; 将之前的webpack 的纯开发配置&#xff0c;重新创建空白项目&#xff0c;重新做一遍&#xff0c;捋一遍思路防止加入生产模式时候弄混 1.创建文件夹…

SVM-支持向量机实验分析(软硬间隔,线性核,高斯核)

目录 一、前言 二、实验 0. 导入包 1. 支持向量机带来的效果 2. 软硬间隔 3. 非线性支持向量机 4. 核函数变换 线性核 高斯核 对比不同的gamma值对结果的影响 一、前言 学习本文之前要具有SVM支持向量机的理论知识&#xff0c;可以参考支持向量机&#xff08;Support Vector …

epoll怎么就高效了?

目录 摘要 1 举个栗子 2 从 epoll_create 开始 3 epoll_ctl&#xff0c;插入待监听的描述符 3.1 故事围绕 ep_item 展开 3.2 在 socket 等待队列上设置 epoll 回调 3.3 关系变得复杂 4 epoll_wait 等你 4.1 等待就绪事件 4.2 共享内存&#xff1f; 5 来了来了&#xf…

第 126 场 LeetCode 双周赛题解

A 求出加密整数的和 模拟 class Solution { public:int sumOfEncryptedInt(vector<int> &nums) {int res 0;for (auto x: nums) {string s to_string(x);char ch *max_element(s.begin(), s.end());for (auto &c: s)c ch;res stoi(s);}return res;} };B 执行…

Java学习笔记(15)

JDK7前时间相关类 Date时间类 Simpledateformat Format 格式化 Parse 解析 默认格式 指定格式 EE&#xff1a;表示周几 Parse&#xff1a;把字符串时间转成date对象 注意&#xff1a;创建对象的格式要和字符串的格式一样 Calendar日历类 不能创建对象 Getinstance 获取当…

8款手机宝藏APP,每款都非常强大实用!

1. 综合AI工具箱——HuluAI 综合AI工具https://h5.cxyhub.com/?invitationhmeEo7 HuluAI是一款聚合式全能AI工具&#xff0c;完美接入官方正版GPT4.0和Midjourney绘画&#xff01;。除此之外&#xff0c;还拥有文心一言语言大模型和DallE3绘图功能。经过长时间的稳定运行&am…

【数据结构】深入理解AVL树:实现和应用

AVL树是一种自平衡的二叉搜索树&#xff0c;它能够保持良好的平衡性质&#xff0c;使得在最坏情况下的时间复杂度也能保持在对数级别。本文将深入介绍AVL树的原理、实现和应用&#xff0c;并通过示例代码演示其基本操作。 文章目录 什么是AVL树&#xff1f;AVL树的实现在AVL树…

Linux - 安装 Jenkins(详细教程)

目录 前言一、简介二、安装前准备三、下载与安装四、配置镜像地址五、启动与关闭六、常用插件的安装 前言 虽然说网上有很多关于 Jenkins 安装的教程&#xff0c;但是大部分都不够详细&#xff0c;或者是需要搭配 docker 或者 k8s 等进行安装&#xff0c;对于新手小白而已&…

2024人工智能四大趋势→

2023年&#xff0c;世人见证了ChatGPT在全球范围的大火。以生成式人工智能为代表的新一代人工智能问世&#xff0c;改变了人工智能&#xff08;AI&#xff09;技术与应用的发展轨迹&#xff0c;加速了人与AI的互动进程&#xff0c;是人工智能发展史上的新里程碑。2024年&#x…

职场中的“跨界思维”:如何拓宽你的职业发展道路?

在当今职场&#xff0c;单一技能的竞争已经越来越激烈&#xff0c;具备跨界思维的人才越来越受到企业的青睐。本文将探讨职场中的“跨界思维”&#xff0c;帮助您拓宽职业发展道路&#xff0c;提升自身竞争力。 一、什么是跨界思维&#xff1f; 跨界思维&#xff0c;顾名思义&a…

【重新定义matlab强大系列十八】Matlab深度学习长短期记忆 (LSTM) 网络生成文本

&#x1f517; 运行环境&#xff1a;Matlab &#x1f6a9; 撰写作者&#xff1a;左手の明天 &#x1f947; 精选专栏&#xff1a;《python》 &#x1f525; 推荐专栏&#xff1a;《算法研究》 #### 防伪水印——左手の明天 #### &#x1f497; 大家好&#x1f917;&#x1f91…

Etcd 介绍与使用(入门篇)

etcd 介绍 etcd 简介 etc &#xff08;基于 Go 语言实现&#xff0c;&#xff09;在 Linux 系统中是配置文件目录名&#xff1b;etcd 就是配置服务&#xff1b; etcd 诞生于 CoreOS 公司&#xff0c;最初用于解决集群管理系统中 os 升级时的分布式并发控制、配置文件的存储与分…

Bean的作用域、Bean的自动装配、注解自动装配 (Spring学习笔记五)

1、Bean 的作用域 官网上显示有六种 1、Bean的作用域默认的是singleton&#xff08;单例模式的实现&#xff09; 也可以显示的设置&#xff08;单例模式的实现&#xff09; <!--用scope可以设置Bean的作用域--><bean id"user2" class"com.li.pojo.Us…

Elasticsearch从入门到精通-05ES匹配查询

Elasticsearch从入门到精通-05ES匹配查询 &#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是程序员行走的鱼 &#x1f4d6; 本篇主要介绍和大家一块学习一下ES各种场景下的匹配查询,有助于我们在项目中进行综合使用 前提 创建索引并指定ik分词器: PUT /es_db {"…

[ Linux ] vim的使用(附:命令模式的常见命令列表)

1.下载安装 这里是在通过yum进行下载安装 yum install -y vim 2.了解 vim是一款编辑器&#xff0c;它具有多模式的特点 主要有&#xff1a;插入模式&#xff0c;命令模式&#xff0c;底行模式 3.使用 打开 vim 文件名 命令模式的常见命令列表 插入模式 按「 i 」切换…

建设IAM/IDM统一身份管理,实现系统之间的单点登录(SSO)

企业实施身份管理的现状&#xff1a; 1.身份存储分散&#xff0c;不能统一供应诸多应用系统&#xff0c;企业用户信息常常存在于多个系统&#xff0c;如HR系统有一套用户信息&#xff0c;OA系统也有一套用户信息&#xff0c;身份存储不集中&#xff0c;不能统一地为诸多应用系…

BUUCTF-WEB1

[ACTF2020 新生赛]Exec1 1.打开靶机 是一个ping命令 2.利用管道符“|” ping一下本地主机并查看ls ping 127.0.0.1 | ls 可以看到回显的内容是一个文件 127.0.0.1 | cat index.php #查看主机下index.php 127.0.0.1 | ls / #查看主机根目录下的文件 看的一个flag文件 …

C++:菱形继承与虚继承

看下面这个示例代码 class A{ public: int num10; A(){cout<<"A构造"<<endl;} virtual void fun(){cout<<"A虚函数"<<endl;} };class B:public A{ public: B(){cout<<"B构造"<<endl;} void fun(){cout<…

Linux基本使用

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;热门专栏&#xff1a;网络原理&#x1f4d5;格言&#xff1a;那些在暗处执拗生长的花&#xff0c;终有一日会馥郁传香欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 Linux是什么&#xff1f; Linux常用命令介绍 命令提示…
最新文章