【从浅学到熟知Linux】基础IO第三弹=>文件系统介绍、软链接与硬链接(含磁盘结构、文件系统存储原理、软硬链接的创建、原理及应用详解)

news2024/11/14 15:00:53

在这里插入图片描述

🏠关于专栏:Linux的浅学到熟知专栏用于记录Linux系统编程、网络编程等内容。
🎯每天努力一点点,技术变化看得见

文章目录

  • 理解文件系统
    • 物理角度认识磁盘
    • 逻辑角度认识磁盘
      • 磁盘寻址
      • 磁盘中的寄存器
    • 磁盘存储管理
  • 软链接与硬链接
    • 软链接
    • 硬链接


理解文件系统

在计算机中存在着已经被打开的文件,也存在着没有打开的文件。由于内存空间较小,资源较为紧张,故没有打开的文件都会存储在磁盘上。此时,我们会关注哪些问题呢?无非是文件如何存储在磁盘上的,如何获取该文件的属性和文件内容,磁盘上读取文件效率,不同路径上的文件如何被分门别类地存储在磁盘上的。下面,我们就一起聊聊文件系统中如何管理各个文件的。

物理角度认识磁盘

磁盘是计算机上唯一的机械设备,但现在计算机多采用固态硬盘(SSD)替代了磁盘,这里仅讨论磁盘。磁盘是外设中的一种,它是通过磁盘的磁性(N/S级)存储0或1,属于永久性存储介质。(ps:非永久性存储设备,如内存,其为掉电易失设备)

每个磁盘由多个盘片组成,每个盘面的上下两面均是光滑的,均可以存储数据。磁盘需要借助磁头来读取数据,故每个面需要一个磁头,即一个盘片上的上下两个盘面均有一个磁头(一个盘面合计2个磁头)。而磁盘读取盘面上某个位置的数据时,通过摆动磁头和转动盘面来实现。
在这里插入图片描述

磁盘中的每个盘面,以中心向外,划分了不同的同心圆,这些同心圆称为磁道,如下图左侧所示。两个磁道与两半径构成的扇形区域称之为扇区,如下图右侧所示。磁盘被访问的基本单元就是扇区,扇区的大小一般为512字节或4KB。我们可以把磁盘看作无数个扇区构成的存储介质。
在这里插入图片描述
在磁盘中,定位某个扇区的方法是:①磁头左右摆动定磁道(也称为柱面);②确定数据在哪个盘面,确定具体从哪个磁头读取数据;③盘面转动确定扇区。这种方法简称为CHS(Cylinder、Header、Sector)。

【示例】若要读取下图左侧中,橙色方块处的数据(假设已经确定使用哪个磁头读取的情况下)。
①磁头摆动到指定磁道上,即确定读取的磁道。
在这里插入图片描述

②一个磁道上,包含许多个扇区,需要通过转动盘面来确定扇区。转动后,如右图所示,此时可以读取数据存储区域的内容了。
在这里插入图片描述

由于磁盘属于机械设备,它的整体速度较慢。故在使用磁盘时,要让磁盘运动越少,效率才能越高;若磁盘运动越多,则效率越低。同时,我们也意识到:具有相关性的数据要存储在一起,这样可以减少磁盘运动。

逻辑角度认识磁盘

磁盘寻址

在十年前左右,流行使用磁带听读英语。磁带中的塑料带被卷成圆圈,但实际读取是线性读取的。如下图右侧所示,当我们将磁带中的塑料袋拉出来,可以看出,它存储数据是线性存储的。
在这里插入图片描述

我们也可以将磁盘看作线性结构。即将磁道上的扇区按照某种规则,给予线性顺序编号。如下图所示,从左向右依次是盘面1、盘面2、盘面3…;每个盘面内,从左向右分别是该盘面的不同磁道;每个磁道又由多个扇区组成。(这里我们假设每个磁道的扇区个数相同)
在这里插入图片描述

【示例】假设有一个磁盘,它的每个盘面有50个磁道,每个磁道有400个扇区(即一个盘面有20000个扇区)。若某个文件存储在第28888号扇区中,则它属于哪个盘面的哪个磁道的哪个扇区呢?

盘面号 = 28888 / 20000 = 1号盘面(即第2个盘面),磁道号 = 8888 / 400 = 22 号(即第23个磁道),扇区号 = 8888 % 400 - 1 = 87号扇区(即第88个扇区)。

像上述示例中寻找扇区的方式,称为LBA寻址方式(又称为逻辑寻址方式)。

磁盘中的寄存器

不仅CPU中包含寄存器,其他外部设备中也存在寄存器。如果某个进程要向磁盘中写入数据,则需要将磁盘中的r/w寄存器标志为写状态,将要写入的数据放入数据寄存器中,将要写入的地址空间首地址写入地址寄存器。当磁盘完成当前读写操作后,磁盘会将状态寄存器改为读写失败或读写成功(在读写时,则标志为正在读写)。

ps:这里仅仅要说明,磁盘中也包含寄存器,并未列出磁盘中的所有寄存器。

在这里插入图片描述

磁盘存储管理

由于一个磁盘中包含大量的扇区,为了方便管理,我们可以将一个磁盘划分为多个扇区。但每个分区依然包含许多扇区,我们可以进一步将每个分区划分为多个块组(Block Group),每个块组中包含该块组的数据存储情况及具体的数据。

假设,有一个800GB的磁盘,先将其分为5个区,第1个200GB,第2个100GB,第3个150GB,第4个150GB,第5个200GB。

在这里插入图片描述

由于每个分区的存储空间依然很大,每个分区被进一步分为不同的块组(Block Group)。

★ps:在某些分区中会在分区开头存储一个Boot Block(引导块),Boot Block用于存储引导加载程序,这个程序负责在系统引导时加载操作系统,并启动计算机。Boot Block用于启动系统,是关键的数据,它在其他分区中也可能被重复存储,以保证某个分区存储的Boot Block出问题时,能从其他分区读取并启动系统。

而每个块组(Block Group)开始处包含着该块组的描述信息,描述信息后面才是存储的具体数据。每个块组第一个存储的Super Block(超级块),而接下来的Group Descriper Table包含了当前块组的信息,包含剩余的块数、inode数量等。接下来,我们再来聊聊余下的4个区域:Block BitMap、Inode BitMap、InodeTable及Data Block。

★ps:Super Block是文件系统中的一个关键数据结构,用于存储文件系统的整体信息,包括文件系统的大小、单个数据块大小等;Super Block提供了文件系统的基本参数和元数据,使操作系统能够正确地管理文件和目录(为了保证文件系统能安全运行,避免因当前Super Block存储区域错误导致文件系统无法访问,故Super Block也被存储了多份)。

文件的数据包含文件属性及文件内容。Linux 系统在磁盘存储文件时,将文件的属性和数据分开存储。其中,文件的内容存储在数据块中(Data Block,以块的形式程先,常见的块大小为4KB),而文件的属性存储在Inode中(Linux系统中规定,单个文件的所有属性占128字节)。

一个文件有特定的一组属性,而属性存放于Inode中,即一个文件配有一个Inode。为了保证Inode的唯一性,每个Inode的编号是唯一的。我们可以通过ls -li查看当前目录下所有文件的Inode↓↓↓
在这里插入图片描述
也可以通过stat [文件名]查看某个文件的Inode↓↓↓
在这里插入图片描述
Inode中保存着对应文件的文件类型、权限、引用计数、所属组、所有者、ACM时间、文件存储在哪些数据块中等。
★注意:Linux系统中,文件的属性不包含文件名

★ps:Linux系统中,一个文件一个Inode,每一个Inode都有自己的Inode编号。Inode的设置,是以分区为单位的,不能跨分区。

Inode存储文件的所有属性,文件名不属于Inode内的属性!那我们怎么知道一个文件的Inode的编号?使用者从来没有关心过Inode,用的都是文件名。

关于上面这个问题,我们就需要聊聊Linux中的目录了!那怎么理解目录呢?目录本质也是文件,也有自己的inode,因为目录也有自己的属性↓↓↓
在这里插入图片描述
而目录也有自己的存储内容,目录的内容中存储着该目录中包含了哪些文件。既然有数据,故目录也要有自己的数据块。那里面存的具体的内容就是它所包含的各个文件名与其Inode的映射关系。因而,使用者只需要使用文件名就可以访问一个文件了(因为有了文件名,就能在当前目录的数据块中找到该文件名映射的Inode,也就能访问该文件了)。

有了上面的认识,我们可以总结出以下内容:

  • ①为什么同一个目录下不能存在同名文件呢?
    因为文件名与Inode的映射关系唯一,如果存在同名文件,则会存在多个文件映射到用一个Inode的情况,故一个目录下不能存在同名文件。
  • ②如果没有一个目录的w权限,则不能在该目录下创建文件,这是为什么?
    在文件中创建文件,需要将文件名与Inode的映射关系写入该目录的数据块中,由于没有w权限,故无法写入数据块。
  • ③如果没有一个目录的r权限,则不能查看目录中的文件存储情况,这是为什么?
    要查看目录中存储的文件情况,则需要读取目录的数据块,由于没有r权限,则不能读取。
  • ④如果没有一个目录的x权限,则不能进入该目录,这是为什么?
    可以将目录假想成一个程序,要进入这个目录就要执行这个目录,由于没有x权限,故无法进入。

BlockBitMap:比特位的位置与块映射起来,比特位的内容表示该块是否被使用。
InodeBitMap:比特位的位置和Inode编号映射起来,比特位的内容表示该Inode是否有效(是否被使用)。

  • 新建一个文件,系统做了什么?

①在InodeBitMap申请一个Inode;
②在BlockBitMap申请当前文件需要的对应数量的Data Block,并在这些Data Block中存储文件的内容;
③并在InodeTable中找到申请的Inode,存储该文件的信息及申请了哪些Data Block;
④在当前目录的Data Block保存该文件的文件名与Inode的映射关系。

  • 删除一个文件,系统做了什么?

①将文件存储内容的块在BlockBitMap中的对应位置设置为无效;
②将文件存储属性的Inode在InodeBitMap中的对应位置设置为无效;
③删除当前目录的数据块中存储的该文件与Inode的映射关系。
ps:不需要情况Inode和Data Block中的数据,等下一个文件直接覆盖该文件的内容即可。

  • 修改or查询一个文件,系统做了什么?

①在当前目录的数据块中,通过文件名找到该文件的Inode;
②从Inode中获取文件的属性信息及文件内容存储在哪些Data Block中;
③返回文件属性及文件内容。

★ps:为什么拷贝数据慢,而删除数据快呢?
拷贝数据数据时,需要将数据挨个比特位写入到文件对应的Data Block中;而删除数据的时候,不需要情况Data Block中的数据,只需要将该文件的Data Block对应在BlockBitMap中的位置置为无效即可。

★ps:为什么系统提示还有空间,但却无法创建文件呢?
Inode还有但DataBlock没有了,或Inode没了但DataBlock还有。

软链接与硬链接

软链接

建立软链接的方法

ln -s [file-name] [soft-link-name]

在这里插入图片描述
我们可以通过软链接向file1中写入"Jammingpro"↓↓↓
在这里插入图片描述
我们再来看一下file1与soft-file1的inode↓↓↓
在这里插入图片描述
由上面的结果可知,软链接是一个独立的文件,因为它有独立的inode,故它们的数据块(Data Block也是不同的)。软链接中存储的是file1的路径

当访问软链接时,它会到对应的路径中找到file1的文件名与inode的映射关系,并访问对应的inode。软链接就类似与Windows中的快捷方式(它在Linux系统中的应用也是用于创建快捷方式)↓↓↓
在这里插入图片描述
如果要删除软链接,除了使用rm [软链接名称],也可以使用unlink [软链接名称]↓↓↓
在这里插入图片描述

硬链接

创建硬链接的方法

ln [file-name] [hard-link-name]

在这里插入图片描述

从上面的建立结果可以看出,file1在创建硬链接前的引用计数为1,当建立硬链接后的引用计数变为了2。我们再来看看者两个文件的信息↓↓↓
在这里插入图片描述

两个文件除了文件名不同,其他信息(Inode编号,占用数据块数量、大小等)均相同。故所谓建立硬链接,本质其实就是在特定的目录的数据块中新增文件名和指定文件的Inode编号的映射关系,并将对应文件的引用计数+1。也就是说,硬链接就是给对应的文件取别名。

★ps:任意一个文件(无论是目录还是普通文件)都有Inode,每个Inode内部都有一个叫做引用计数的字段。只有该文件的引用计数变为0时,该文件的Inode及Data Block才会被删除。

硬链接用途有什么呢?关于它的用途,我们需要先来探索关于目录的一些问题↓↓↓

为什么我们创建文件夹的使用,它的引用计数为2呢?
在这里插入图片描述
下图查看了dir的Inode,并进入dir中,查看了.的Inode。可以看出,dir的Inode与.的Inode是相同。也就是说,当我们创建目录时,会在该目录中自动创建一个该目录的硬链接,其名称为.。
在这里插入图片描述
如果在dir目录中创建一个名为start的目录,可以发现,.的引用计数变为3。这是为什么呢?
在这里插入图片描述
进入start目录,可以发现该文件夹中的…的Inode与上一级目录中的.的Inode编号相同,也就说:每当在当前目录下创建一个目录,该目录中会自动创建一个名为…的上一级目录的硬链接。
在这里插入图片描述
通过上面我们可以知道,硬链接可以用于目录的跳转。因为我们使用.、…来跳转目录。但Linux并不允许用户给目录创建硬链接,这是为什么呢?

假如我们将某个目录中的.和…均改为根目录,则此时会出现环结构。当我们使用搜索指定时,就会出现无穷循环的现象。

🎈欢迎进入从浅学到熟知Linux专栏,查看更多文章。
如果上述内容有任何问题,欢迎在下方留言区指正b( ̄▽ ̄)d

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

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

相关文章

60.网络游戏逆向分析与漏洞攻防-利用数据包构建角色信息-根据数据包内容判断数据包作用

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 如果看不懂、不知道现在做的什么,那就跟着做完看效果 现在的代码都是依据数据包来写的,如果看不懂代码,就说明没看懂数据包…

docker (CentOS,ubuntu)安装及常用命令

Docker和虚拟机一样,都拥有环境隔离的能力,但它比虚拟机更加轻量级,可以使资源更大化地得到应用 Client(Docker客户端):是Docker的用户界面,可以接受用户命令(docker build&#xff…

【JavaSE】异常

欢迎关注个人主页:逸狼 创造不易,可以点点赞吗~ 如有错误,欢迎指出~ 目录 认识异常 异常分类 举例 栈溢出错误 空指针异常(运行时异常) 编译时异常 处理异常 抛出 异常 程序本身触发异常 手动抛出异常 举例 利用try ca…

C++修炼之路之多态--多态的条件与例外,重载+重写+重定义

目录 前言 一:构成多态的条件及一些特殊情况(前提是构成父子类) 1.多态是在不同的继承关系的类对象,去调用同一函数,产生了不同的结果 2.两个条件 3.三同的两个例外 1.协变---返回值类型可以不同,但必…

【简单讲解下Stylus入门使用方法】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

从OWASP API Security TOP 10谈API安全

1.前言 应用程序编程接口(API)是当今应用驱动世界创新的一个基本元素。从银行、零售、运输到物联网、 自动驾驶汽车、智慧城市,API 是现代移动、SaaS 和 web 应用程序的重要组成部分,可以在面向客 户、面向合作伙伴和内部的应用程…

数据结构 -- 二叉树二叉搜索树

二叉树 二叉树是这么一种树状结构:每个节点最多有两个孩子,左孩子和右孩子 重要的二叉树结构 完全二叉树(complete binary tree)是一种二叉树结构,除最后一层以外,每一层都必须填满,填充时要遵…

【Windows游戏】大头菜小子抢银行游戏介绍

游戏介绍 今天写的是一款游戏,叫《大头菜小子抢银行》。 《大头菜小子抢银行》是《大头菜小子避税历险记》的续作,玩家需要联手泡菜团队,进行史上最奇怪的劫案,绑架人质,偷取珍贵财报,探索植物银行的黑暗…

MapReduce工作流程(Hadoop3.x)

MapReduce 是一种用于并行处理大规模数据集的——编程模型和处理框架。它通常用于分布式计算环境中,如Apache Hadoop。 工作流程 1. 切分阶段(Splitting): 数据集被分成多个数据块,每个数据块的大小通常在64MB到12…

nginx反向代理及负载均衡

node1192.168.136.55Nginx主负载均衡器node3192.168.136.57Web01服务器node4192.168.136.58Web02服务器node5192.168.135.131客户端(测试) nginx反向代理 1. 安装nginx 三台机器都安装nginx yum install nginx -y 2. 配置用于测试的Web服务(以下操作…

C++进阶:搜索树

目录 1. 二叉搜索树1.1 二叉搜索树的结构1.2 二叉搜索树的接口及其优点与不足1.3 二叉搜索树自实现1.3.1 二叉树结点结构1.3.2 查找1.3.3 插入1.3.4 删除1.3.5 中序遍历 2. 二叉树进阶相关练习2.1 根据二叉树创建字符串2.2 二叉树的层序遍历I2.3 二叉树层序遍历II2.4 二叉树最近…

ChatGPT研究论文提示词集合1-【主题选择与问题研究、文献综述】

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.主题选择与问题定义 2.文献综述 3.书籍介绍 AIPaperPass智能论文写作平台 近期小编按照学术论文的流程,精心准备一套学术研究各个流程的提示词集合。总共14个步骤…

AI翻译英语PDF文档的3种方法

短的文章,直接丢进kimichat、ChatGPT里面很快就可以翻译完成,而且效果很佳。但是,很长的PDF文档整篇需要翻译,怎么办呢? ●腾讯交互翻译TranSmart https://transmart.qq.com/ 软件下载后,点击左边的文件翻…

天才简史——Sylvain Calinon

一、研究方向 learning from demonstration(LfD)领域的专家,机器人红宝书(Springer handbook of robotics)Robot programming by demonstration章节的合作者。主要研究兴趣包括: 机器人学习、最优控制、几…

从零自制docker-11-【pivotRoot切换实现文件系统隔离】

文章目录 busyboxdocker run -d busybox topcontainerId(docker ps --filter "ancestorbusybox:latest"|grep -v IMAGE|awk {print $1})docker export -o busybox.tar $containerId or sudo docker export 09bbf421d93f > ./busybox.tar tar -xvf busybox.tar -C …

Python | Leetcode Python题解之第41题缺失的第一个正数

题目&#xff1a; 题解&#xff1a; class Solution:def firstMissingPositive(self, nums: List[int]) -> int:n len(nums)for i in range(n):while 1 < nums[i] < n and nums[nums[i] - 1] ! nums[i]:nums[nums[i] - 1], nums[i] nums[i], nums[nums[i] - 1]for …

域名信息查询同款WHOIS源码

域名查询一般是指查询域名的whois注册信息&#xff0c;域名WHOIS是当前域名系统中不可或缺的一项信息服务。在使用域名进行Internet冲浪时&#xff0c;很多用户希望进一步了解域名、名字服务器详细信息&#xff0c;这就会用到WHOIS。 域名信息查询同款WHOIS源码

在Postgres中,如何有效地管理大型数据库的大小和增长

文章目录 一、定期清理和维护1. VACUUM和ANALYZE2. 删除旧数据和归档 二、分区表三、压缩数据四、配置优化1. 调整维护工作负载2. 监控和日志 五、使用外部存储和扩展1. 外部表和FDW2. 扩展和插件 六、定期备份和恢复测试结论 管理大型数据库的大小和增长是数据库管理员&#x…

EA包图上嵌套的包位置不对

Extreme 2024-4-11 11:36 我从工具栏把一个包拖在另一个包里面&#xff0c;可是项目树上两个包的位置并列&#xff0c;拖了几次结果都一样。我的目的是做一个多层级的包图&#xff0c;是不是&#xff08;EA&#xff09;不能在图上做&#xff1f; UMLChina潘加宇 确实是这样&a…

m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平均分的人数作为函数值返回,将低于平均分的分数放在below所指的数组中。

本文收录于专栏:算法之翼 https://blog.csdn.net/weixin_52908342/category_10943144.html 订阅后本专栏全部文章可见。 本文含有题目的题干、解题思路、解题思路、解题代码、代码解析。本文分别包含C语言、C++、Java、Python四种语言的解法和详细的解析。 题干 m个人的成绩…