【Linux】详解文件系统以及周边知识

一、磁盘的基本知识

        磁盘中可以被划分成一个一个的环,每个环都是一个磁道。每个磁道又可以被均分成一个一个的扇区,扇区是磁盘IO的基本单位(想要修改扇区中的一个比特位就必须把该扇区的全部比特位都加载到内存中)。磁盘中的盘面,磁道和扇区都是有编号的。要访问一个扇区中的内容,必须通过磁头先定位到哪一个磁道(柱面cylinder),再确定要读取哪一个盘面(磁头head),最后确定磁道上的哪一个扇区(sector),这种定位法被称为CHS定位法

1.1、磁盘逻辑结构的理解

         磁盘盘面的每个磁道我们都可以想象成把它扯出来,就变成了一个线性的结构,如果把每一个磁道都拼接在一起,再把每一个盘面拼接在一起,就形成了一个比较长的线性结构,就变得类似于磁带了。假设磁盘每一个盘面的大小为200GB,一共有四个盘面,假设每一个扇区大小为512kb,那800GB就可以被分成1677721600个扇区大小。那么如果把这个线性结构看成是一个数组的话,那么我们每次拿着要访问的扇区对应的数组下标通过对应的算法转化成CHS地址就能访问到该扇区了,该工作是由磁盘完成的。所以,操作系统需要知道磁盘有多少个扇面,每个扇面的大小是多少,每个扇区的大小是多少,每个磁道有多少个扇区,这个在操作系统内部编程的时候就可以统一使用线性地址,要访问磁盘数据时,将线性地址交给磁盘,磁盘会自己将线性地址转化成CHS地址,就可以实现操作系统对数据的读取和写入了。

 二、文件系统底层的实现原理

2.1、系统层面的数据块

         但是在操作系统层面上,会认为一次只和磁盘交互一个扇区的数据数据量太小了。在操作系统文件系统认为,IO的基本单位是4kb,也就是8个扇区(假设),也就是说操作系统和磁盘一次最小交换的数据量为8个扇区。那操作系统又可以对磁盘中的800GB进行重新分块,以8个扇区为一个数据块,第一个数据块数组下标编号为1,第二个数据块数组下标编号为2,以此类推,这种编址叫做LBA地址(Logical Block Address)。这个操作系统要对某个数据块进行读取或写入的时候,就只需要拿着数据块的数组编号乘8再加上[0,1,2,3,4,5,6,7],就可以找到对应连续的8个扇区,将8个扇区的线性地址交给磁盘转化成CHS地址就可以对这8个扇区进行读取或写入了。

2.2、分区和分组 

        上面我们已经谈了磁盘和操作系统对于存储空间的分块问题,接下来可以聊一聊操作系统如何对这800GB的空间进行管理了。在实际的情况中,操作系统并不是将这800GB的空间都当成一个整体来维护的,操作系统会对这800GB的空间进行分区(也就是我们平常电脑中所见的C盘,D盘,E盘),分区下面又会有分组,通过一个分组的管理经验再沿用到其它的分组中(当然了也可以沿用其它管理经验),就可以将800GB中所有的分组和分区都管理好了。

         Linux磁盘文件特性分为文件内容加上文件属性,文件属性包括类型,大小,权限,时间,inode编号等等......文件名不属于文件属性),一个文件的inode编号在它所属的分区内是唯一的系统中标识一个文件用的不是文件名,用的是它的inode编号。内容和属性是分开存储的。在磁盘中,文件的属性存储在struct inode结构体中,大小为128字节。操作系统一个数据块的大小为4kb(同上),也就是说一个数据块可以存储32个struct inode结构体。

2.3、组的管理模式

        为了管理好每一个分组中的10GB空间,系统将10GB进行了模块化管理。

i节点表(inode Table):存放文件属性 ,如文件大小,所有者,最近修改时间等。

inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。

数据区(Data blocks):存放文件内容 。

块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没有被占用。

Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。

超级块(Super Block):在磁盘中,每个分区都有一个super block,且只有个别的组有super block。存放文件系统本身的结构信息。记录的信息主要有:block和inode的总量, 未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个 文件系统结构就被破坏了。

GDT,Group Descriptor Table:块组描述符,描述块组属性信息。

        创建一个文件需要在一个组的inodeBitmap中从左向右遍历找到第一个非1的比特位,将该比特位置1,并通过该比特位索引到inodeTable中对应的位置申请一个struct inode结构体,将该填的属性一填,在Block Bitmap找到非1的比特位,置1并将数据填入到Data blocks对应的数据块中。删除一个文件只需要将其在inode Bitmap和Block Bitmap中所占有的比特位置0即可,而不需要再磁盘中将对应的数据全部删除掉,这也是为什么我们删除一个文件比下载一个文件快得多的本质原因每一个分区的每一个分组都有一个起始编号,struct inode结构体的inode编号可以理解成就是该分组的起始编号加上在inode Bitmap中的偏移量。这样就可以做到一个文件的inode编号在它所属的分区内是唯一的。        

        为了将文件的属性和内容之间建立起联系,struct inode结构体中还存在一个int block[15]的数组用来表征这个分组内的哪些数据块属于这个文件。block数组下标[0,11]直接保存的就是Data blocks中的编号(一级索引);[12,13]不直接保存编号,而保存的是其它保存数据的数据块对应的编号(二级索引),[14]保存就是三级索引,这样可以有效增加保存文件数据的数据块的个数,进一步的可以使一个文件保存更多的数据。

三、重谈文件的增删查改

        在Linux系统中,目录也是文件,其中目录的内容中就保存了目录中的文件的inode编号和文件名之间的映射关系这就是为什么如果我们对一个目录没有w权限,我们就无法在这个目录中新建文件的原因。因为新建文件要将文件的inode编号和文件名之间的映射关系写到目录的内容当中,本质就是修改目录的内容,操作系统就不让我修改。删除一个文件时,拿着文件名在当前目录中做字符串匹配,当匹配成功时,将所在分组的inodebitmap和blockbitmap中对应的比特位由一置零,再在所处目录的内容中将文件名和inode的映射关系删除掉,这样一个文件就被删除了。

四、重谈文件路径

        查找一个文件,在内核当中,都要递归似的帮我们找到根目录,从根目录进行路径解析。因为我们要得到一个文件的内容,就要先拿到它的inode编号,可是我们只有文件名啊,那怎么办?文件名和它的inode编号是存储在它所在的目录中的,所以要到目录的内容中去找。可是目录我们也只是知道目录名啊,我们又要去上级目录中找该目录的inode编号,依次类推,直到找到根目录,根目录的inode编号系统是已知的,所以我们就可以逆向找到所有目录的inode编号,进而找到我们的文件的inode编号,也就找到文件内容了。这就是文件路径最本质的作用

五、挂载的理解

        挂载(Mounting)是指由操作系统使一个存储设备(诸如硬盘、CD-ROM或网络共享)上的计算机文件和目录可供用户通过计算机的文件系统访问的一个过程一个被写入文件系统的分区要被Linux操作系统使用,必须将其挂载到一个目录下。分区的访问都是通过所挂载的路径访问的。通过文件路径前缀就可以知道文件处于哪一个分区中

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

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

相关文章

C++入门(函数重载、缺省参数、引用)

目录 函数重载函数重载的概念函数重载的原理----名字的修饰 缺省参数缺省参数的分类 引用引用的特征使用场景 函数重载 函数重载的概念 在自然语言中,相同的一个词可能有多重含义,人们可以通过上下文来判断这个词的具体意思,在C中也存在这种…

虚函数和纯虚函数

虚函数 被virtual修饰的成员函数称为虚函数 定义一个函数为虚函数&#xff0c;是为了使用基类指针调用子类函数。虚函数&#xff0c;不代表函数不被实现。只有纯虚函数才不被实现&#xff0c;纯虚函数定义了一个接口&#xff0c;起到规范的作用。 #include <iostream>…

快讯!TiDB v8 发版!超硬核 v8 引擎!

TiDB 是 PingCAP 公司自主设计、研发的开源分布式关系型数据库&#xff0c;是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactional and Analytical Processing, HTAP) 的融合型分布式数据库产品。 具备水平扩容或者缩容、金融级高可用、实时 HTAP、云原生的分布式数…

初识C++ · 入门(2)

目录 1 引用 1.1引用的概念 1.2 引用的特性 2 传值&#xff0c;传引用的效率 3 引用和指针的区别 4 内联函数 4.1 内联函数的定义 4. 2 内联函数的特性 5 关键字auto 5.1关于命名的思考 5.2 关于auto的发展 5.3 auto使用规则 6 范围for的使用 7 空指针 1 引用 …

瑞吉外卖实战学习--9、mybatisPlus公共字段自动填充

mybatisPlus公共字段自动填充 前言实现步骤实体类添加注解按照框架要求编写元数据对象处理器&#xff0c;在此类中统一为公共字段赋值&#xff0c;此类需要实现MetaObjectHandler接口1、在创建和更新的时候修改创建和更新的时候自动填充时间2、如何获取到当前的id 测试结果 前言…

【MySQL】内外连接——内连接、外连接、左外连接、右外连接、内外连接的区别、左外连接和右外连接的区别

文章目录 MySQLMySQL表的内连接和外连接1. 内连接2. 外连接2.1 左外连接2.2 右外连接 3. 内外连接的区别4. 左外连接和右外连接的区别 MySQL MySQL表的内连接和外连接 MySQL 中的内连接&#xff08;INNER JOIN&#xff09;和外连接&#xff08;包括左外连接 LEFT JOIN 和右外连…

腾讯2024实习生在线笔试-0331

Q1 小红的图上染色 小红拿到了一个无向图&#xff0c;其中一些边被染成了红色。 小红定义一个点是“好点”&#xff0c;当且仅当这个点的所有邻边都是红边。 现在请你求出这个无向图“好点”的数量。 注&#xff1a;如果一个节点没有任何邻边&#xff0c;那么它也是好点。 …

【Web】NSSCTF Round#20 Basic 个人wp

目录 前言 真亦假&#xff0c;假亦真 CSDN_To_PDF V1.2 前言 感谢17&#x1f474;没让我爆零 真亦假&#xff0c;假亦真 直接getshell不行&#xff0c;那就一波信息搜集呗&#xff0c;先开dirsearch扫一下 扫的过程中先试试常规的robots.txt,www.zip,shell.phps,.git,.sv…

类的新功能

类的新功能 默认成员函数 在C11之前&#xff0c;一个类中有如下六个默认成员函数&#xff1a; 构造函数。拷贝构造函数赋值重载析构函数取地址重载函数const取地址函数 其中前四个默认成员函数最重要&#xff0c;后面两个默认成员函数一般不会用到&#xff0c;这里默认成员…

[MSSQL]理解SQL Server AlwaysOn AG的备份

AG提供了以下几种备份策略 下面来看看各项的解释 Prefer Secondary(首选辅助副本) 应在辅助副本上执行此可用性组的自动备份。如果没有可用的辅助副本,将在主副本上执行备份。 这个选项只是概念上的选项。基本上,用户可以从任何复制节点上执行备份命令。 我们可以在主副本…

《计时器》是谁演唱的?

是李亚云演唱的。李亚云&#xff0c;湖南省中峰富盛控股集团有限责任公司旗下全签艺人 &#xff0c;就读于南昌航空大学本科表演专业&#xff0c;&#xff0c;一个拥有“模特、练习生、爱豆和演员”多重身份的艺人&#xff0c;2003年3月10日出生于湖南长沙&#xff0c;7岁童星出…

设计模式深度解析:AI如何影响装饰器模式与组合模式的选择与应用

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL应用》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 AI如何影响装饰器模式与组合模式的选择与应用 在今天这个快速发展的技术时代&#…

C++11新特性(二):更好用的 lambda 表达式和 function 包装器

目录 lambda 表达式 基本格式及参数列表 对于 lambda 捕捉列表的说明 function 包装器 bind 包装器 lambda 表达式 C11引入了lambda表达式&#xff0c;它是一种用于创建匿名函数的语法。lambda表达式可以被视为一个匿名函数对象&#xff0c;它可以在需要函数对象的地方使用…

并查集----格子游戏

并查集中最重要的是要搞懂&#xff1a; 不明白的可以拿纸自己先演示一番&#xff0c;find函数不仅能找到他们的祖先数&#xff0c;而且同时也能更新路径的子结点都等于祖先&#xff0c;然后以后寻找时会更加的方便&#xff01;

【Linux】详解软硬链接

一、软硬链接的建立方法 1.1软链接的建立 假设在当前目录下有一个test.txt文件&#xff0c;要对其建立软链接&#xff0c;做法如下&#xff1a; ln就是link的意思&#xff0c;-s表示软链接&#xff0c;test.txt要建立软链接的文件名&#xff0c;后面跟上要建立的软链接文件名…

C语言-文件操作

&#x1f308;很高兴可以来阅读我的博客&#xff01;&#x1f31f;我热衷于分享&#x1f58a;学习经验&#xff0c;&#x1f3eb;多彩生活&#xff0c;精彩足球赛事⚽&#x1f517;我的CSDN&#xff1a; Kevin ’ s blog&#x1f4c2;专栏收录&#xff1a;C预言 1. 文件的作用 …

TransmittableThreadLocal 问题杂记

0、前言 TransmittableThreadLocal&#xff0c;简称 TTL&#xff0c;是阿里巴巴开源的一个Java库&#xff0c;它能够实现ThreadLocal在多线程间的值传递&#xff0c;适用于使用线程池、异步调用等需要线程切换的场景&#xff0c;解决了ThreadLocal在使用父子线程、线程池时不能…

Inter开发板实验汇总

背景 产品型号&#xff1a;AIxBoard-N5105 开发公司&#xff1a;蓝蛙智能 蓝蛙智能成立于2018年&#xff0c;2021年成为英特尔OpenVINO官方技术伙伴&#xff0c;2023年推出英特尔数字化开发套件爱克斯板AIxBoard-N5105。 资源 类型 网站 备注 产品介绍 ​​产品介绍 - …

华为云免费云服务器-低价云虚拟主机VPS-个人免费云服务器

华为云80款云服务产品0元试用活动&#xff0c;免费试用云服务器&#xff0c;云数据库、云速建站、云安全、CDN、OBS、Redis等云计算产品。为用户提供免费的云服务试用机会&#xff0c;帮助企业和个人轻松享受云服务。 原文&#xff1a;https://www.vpspick.com/vps/442.html …

js垃圾回收新生代和老生代以及堆栈内存详细

js 堆栈内存、新生代和老生代、垃圾回收详聊 要想了解JS内存管理就必须明白存这些js数据的内存又分为&#xff1a;栈内存和堆内存 一、 栈|堆内存(Stack|Heap) 栈(Stack)内存 原始值&#xff1a;Number、String、Boolean、Null、Undefined、Symbol和BigInt 栈内存主要存储原始…