Linux基础IO - 文件系统 | 软硬链接

news2024/12/24 2:18:30

之前的文章中我们与文件有关的内容谈论的都是被打开的文件,那么如果文件没有被打开呢?这样文件就一定不再内存中,只能在磁盘外设中存储,本文中我们就来讲述磁盘中文件的相关知识。

磁盘的物理存储结构

一个磁盘由多个盘片叠加而成,每个盘片有两面,盘片的表面有着磁性物质,这些磁性物资通过会被用来记录二进制数据。

磁盘中存储的基本单元:扇区一般是512字节或者是4kb,一般磁盘都有的扇区都是512字节。在同半径下的所有扇区被称为磁道。

在一面上,如何在硬件上定位一个扇区?1、可以先定位在哪一个磁道 - 由半径决定;2、再确定在该磁道的那一个扇区 - 根据扇区的编号,定位一个扇区;同时因为每一个面上都有着磁头,磁头就可以表示此时处在那一个面上。至此我们想要定位任意一个扇区就有了方法,通过磁头(head)确定在哪一面,通过柱面(磁道cylinder)确定在哪一个磁道,通过扇区(sector)找到想要的扇区。这种方法被称为CHS法。既然我们能够使用CHS法定位任意一个扇区,我们就能定位任意多个扇区,从而将文件从硬件角度,进行读取或者写入。

物理到逻辑的抽象

OS如果得知了任意一个CHS地址就能访问任意一个扇区,但是在OS中并不是直接访问的CHS地址,为了避免当硬件发生变化,操作系统也要变化,OS要和硬件解耦。扇区对于IO来说512直接太小了,OS实际进行IO,基本单位是4KB(可以进行调整)磁盘 -- 块设备,OS需要一套新的地址,进行块级别的访问。

我们可将磁盘按照磁道拉成一个线性结构,一个盘面就是一个线性结构,与靠近外圈的就是结构前面的内容,越靠近内部的就是结构后面的内容,同时在这个线性结构中同一个磁道的数据一定是紧挨着的。

我们可以将其看做一个数组,初步完成了一个从物理地址到线性逻辑地址的抽象过程,数组天然有着下标,此时定位一个扇区,只需要一个数组下标。而其中OS是以4KB为单位进行IO,一个OS级别的文件块要包括8个扇区。

计算机常规的访问方式:起始地址 + 偏移量的方式(在语言级别上是数据类型)。当操作系统访问数据块的时候,只需要知道数据块的起始地址(第一个扇区的下标地址)+ 4KB(块的类型)我们将数据块也看做一种类型。

所以块的地址本质就是数组的一个下标N,以后我们表示一个块就可以采用线性下标的方式,定位任意一个块。这种定位的方式在操作系统内叫做LBA -- 逻辑块地址。

但是,我们的磁盘只认识CHS,如何将LBA与CHS互相转化?

OS要管理磁盘,就将磁盘看做一个大数组,对磁盘的管理就变成了对数组的管理,通过先描述再组织的形式进行管理,struct block{}。

下面来介绍一下OS如何对这个数组进行管理呢?

文件系统

由于空间还是非常的大,我们就可以将大空间分为小空间,通过在小空间的管理,重复操作至大空间上,每一个小块依旧很大因此OS还需要对分区的空间进行分组。

Linux ext2文件系统,上图为磁盘文件系统图(内核内存映像肯定有所不同),磁盘是典型的块设备,硬盘分区被划分为一个个的block。一个block的大小是由格式化的时候确定的,并且不可以更改。例如mke2fs的-b选项可以设定block大小为1024、2048或4096字节。而上图中启动块(Boot Block)的大小是确定的。

文件 = 内容 + 属性,而在Linux中是将内容和属性分离的。无论是内容还是属性都要以块的形式保存在磁盘的某个位置。

  • Super Block:存放文件系统的所有属性信息1、文件系统的类型;2、整个分组的情况。SB在各个分组里面可能都会存在,而且是统一更新的,为了防止SB中的区域出现损坏,如果SB出现了故障整个分区就不可以被使用,因此要做好备份。
  • Group Descriptor Table:组描述符 -- GDT 该组内的详细等属性信息
  • inode Table:一般而言一个文件,内部所有的属性的集合 -- inode(128字节),一个文件,一个inode。一个分区会存在大量的inode节点,一个group需要有一个区域专门来保存该group内的所有文件的节点 -- inode Table。分组内部会存在多个inode,每一个inode都会有自己的inode编号,inode编号也属于对应文件的属性id。
  • Data Blocks:对于固定大小的文件属性而言,文件的内容是变化的,我们是用数据块来进行文件内容的保存的,所以一个文件要保存内容就需要[1, n]个数据块。Linux查找一个文件,是要根据inode编号,来进行文件的查找,包括读取文件,一个inode对应一个文件,而改变文件属性和该文件对应的数据块,是有映射关系的。
  • inode Bitmap:每个bit表示一个inode是否空闲可用。
  • Block Bitmap:Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没
    有被占用

1、Linux系统只认inode号,文件的inode属性中并不存在文件名。文件名是给用户使用的。

2、目录也是文件,有inode也有内容。

3、任何一个文件,一定存在一个目录内部,目录的数据块中保存的是该目录下文件名和文件inode编号对应的映射关系,而且在目录内文件名和inode互为key值。

4、当我们访问一个文件的时候,是在特定的目录下访问的,例如 cat log.txt 指令:先要在当前目录下,找到log.txt的inode编号;一个目录也是一个文件,以一定隶属于一个分区,在该分组中找到分区,在该分区的inode table中找到inode;通过inode和对应的data table的映射关系,找到该文件的数据块,并加载到OS,完成显示到显示器。

一些区域的细节:

根据文件名找到inode number;根据inode number -> inode属性中的映射关系,设置block bitmap对应的比特位为0;根据inode number设置inode bitmap对应的比特位为0;

inode确定分组,inode number是在一个分区内唯一有效,不能跨分区。分区、分组、填写系统属性都是OS做的,分区完成之后,要让分区能够正常的使用需要对分区做格式化,格式化的过程就是OS向分区写入文件系统的管理属性信息。

inode如果仅仅用数组与datablock建立映射关系,那一个文件不是只有很小的容量,这显然是不可能的。OS在inode的结构中的datablock数组前面的一部分存放一些比较小的文件使用直接索引的方式,后面还会有二级索引、三级索引,通过在datablock的数据块中存放其余数据块的内容,达到可以存放一些较大的文件。

软硬链接

软链接

软连接是一个独立的文件,有自己的inode number 必有自己的inode属性和内容。软链接内部放的是自己所指向的文件的路径。

硬链接

硬链接和目标文件共用的是一个inode number,没有独立的inode,意味着硬链接一定是和目标文件使用同一个inode。硬链接只更改了目录的内容,建立了新的文件名和老的inode的关系。

当我们把源文件删除时候会发现出现了链接错误的问题:

软链接的目的

将一个路径很深的程序或库或头文件建立到当前目录下:

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

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

相关文章

如何撰写高效且实用的Prompt

很多人说GPT并没有什么让人惊艳的地方,但实际上,他们并没有发挥好它的潜能。在很多情况下,他们往往没有使用恰当的prompt。一个恰到好处的prompt就如同魔法师在施展魔法时所需要吟唱的咒语,只有那些正确无误的咒语,才能…

Zstack实习-基础知识总结归纳-持续更新

什么是虚拟化? 虚拟化技术是一种将物理计算资源,如服务器、存储和网络等,转化成虚拟的逻辑资源的技术。通过虚拟化技术,可以将多个独立的操作系统运行在同一台物理计算机上,实现资源的共享,提高硬件的利用率…

商业智能之“道、法、器”——企业级BI能力构建指南

一个企业级BI项目看似简单,但实际建设难度却远超想象。如何从0到1搭建BI项目,有没有详细的实施步骤,有没有合适的BI工具推荐,这是很多企业在上BI系统前心中的疑问。因此,本文会详细探讨企业BI能力构建,到底…

【业务功能篇26】 ROW_NUMBER() 排名函数 给表单数据增加序列号

业务场景: 当业务在进行月报报表制作时,会有些模块是需要填充当前月的top问题单,那么这些问题单,在第一列就要给标记序列号从1开始的序号,所以这个序号是根据业务选择的问题单后,在根据当前问题单记录进行的…

BSN全球技术创新发展峰会在武汉举办,“延安链”正式发布

原标题:《第二届BSN全球技术创新发展峰会在武汉成功举行》 6月9日,由湖北省人民政府指导,湖北省发展改革委、国家信息中心联合主办,中国移动、中国电信、中国联通、武汉市江汉区人民政府、区块链服务网络(BSN&#xf…

Linux或Windows上实现端口映射

关注“云计算就该这么学”微信公众号,搜索“001”,即可获取氪肝整理的154页Linux学习笔记。 通常服务器会有许多块网卡,因此也可能会连接到不同的网络,在隔离的网络中,某些服务可能会需要进行通信,此时服务…

I.MX6ULL_Linux_驱动篇(38) 中断驱动

不管是裸机实验还是 Linux 下的驱动实验,中断都是频繁使用的功能,在裸机中使用中断我们需要做一大堆的工作,比如配置寄存器,使能 IRQ 等等。 Linux 内核提供了完善的中断框架,我们只需要申请中断,然后注册中…

Linux进程信号 | 信号保存

阻塞信号 信号其他相关常见概念 实际执行信号的处理动作称为信号递达(Delivery)信号从产生到递达之间的状态,称为信号未决(Pending)。进程可以选择阻塞 (Block )某个信号。被阻塞的信号产生时将保持在未决状态,直到进程解除对此信号的阻塞,才执行递达的动作.注意,阻塞和忽略是…

A Survey of Large Language Models

本文是LLM系列的第一篇文章,针对《A Survey of Large Language Models》的翻译。 大语言模型综述 摘要1 引言2 概述2.1 LLM的背景2.2 GPT系列模型 的技术演化 3 LLMs的资源3.1 公开可用的模型检查点或APIs3.2 常用的语料库3.3 库资源 4 预训练4.1 数据收集4.1.1 数…

图的企业应用-A*算法自动寻路

引言 MC想必大家都玩过,但鸡哥利用A*自动寻路算法来找箱子 箱子里有鸡你太美唱片,和准备好的篮球 当然在这是游戏中找到的宝箱 还得原石x5等一大堆的养成物品 ???等等 ,原神 玩家露出鸡脚了吧! 不应该是 有鸡你太美唱片,还有一条鱼并且给梅里猫的名叫荔枝的? 这…

【MyBatis学习】Spring Boot(SSM)单元测试,不用打包就可以测试我们的项目了,判断程序是否满足需求变得如此简单 ? ? ?

前言: 大家好,我是良辰丫,在上一篇文章中我们学习了MyBatis简单的查询操作,今天来介绍一下Spring Boot(SSM)的一种单元测试,有人可能会感到疑惑,框架里面还有这玩意?什么东东呀,框架里面是没有这的,但是我们简单的学习一下单元测试,可以帮助我们自己测试代码,学习单元测试可以…

SEO留痕霸屏技术原理实现分析

留痕效果 通常是查询某个关键词,出现大量搜索结果网页霸屏,而且都会引导到其他平台或者网站进行浏览和查看。留痕网站和指向网站或平台无关联。 示例图片: 原理分析 首先通过内容和链接很容易明白,本质上就是一个搜索页面&…

OpenAI API升级:新GPT-3.5 Turbo和GPT-4助力AIGC应用大放异彩

theme: orange 前言 北京时间2023年6月13日,OpenAI宣布对其领先的生成型AI模型GPT-3.5 Turbo和GPT-4进行一系列更新,以提高工作场所的人工智能能力。这些改进包括引入全新的函数调用功能、增强的可引导性、GPT-3.5 Turbo的扩展上下文,以及修订…

数值分析第九章节 用Python实现常微分方程初值问题的数值解法

参考书籍:数值分析 第五版 李庆杨 王能超 易大义编 第9章 常微分方程初值问题的数值解法 文章声明:如有发现错误,欢迎批评指正 文章目录 欧拉法后退的欧拉方法梯形方法改进欧拉公式补充龙格—库塔方法线性多步法阿当姆斯显示与隐式公式 9.1引…

5.3.3 因特网的路由协议(三)OSPF协议

5.3.3 因特网的路由协议(三)OSPF协议 前面我们学习了基于距离向量算法的路由信息协议RIP(5.3.2 因特网的路由协议(二)基于距离向量算法的RIP协议),为了克服RIP协议的局限性于是就有了新的内部网关协议OSPF…

30行代码实现通用无限列表函数

前言: 前两天接到了一个需求,主要功能是实现类似于 B站 消息页面的那种效果,右侧几个 tab 都需要使用到无限加载的功能。 大家都知道,程序员是很懒的,不可能这几个页面全都写一遍重复的逻辑。所以在接到这个需求的时…

HBuilder连接手机模拟器调试,进行抓包

hbuilder连接手机模拟器 1.adb是什么?引用 2. 进行adb路径设置,选中模拟器中的adb路径,配置好端口,夜神模拟器端口:62001 3.运行到Andriod基座 在HBuilder连接模拟器过程中,对接口进行抓包 1.安装抓包工…

Spring Security --- 自定义Filter

简介任何 Spring Web 应用本质上只是一个 servletSecurity Filter在 HTTP 请求到达你的 Controller 之前过滤每一个传入的 HTTP请求Filter请求过滤器可以帮助进行HttpServletRequest请求和HttpServletResponse响应的过滤在自定义的Filter过滤器中可以对请求进行过滤&#xff0c…

控制并发流程,做好线程间的协调

一、概述 1. 什么是控制并发流程? 线程一般是由线程调度器自动控制的,但有些场景需要按照我们程序员的意愿去实现多线程之间相互配合,从而满足业务逻辑。比如: 让线程A等待线程B执行完后再执行等一些相互合作的逻辑&#xff1b…

【表面缺陷检测】基于yolov5的钢轨表面缺陷检测(附代码和数据集,Windows系统)

写在前面: 首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。 路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就…