Linux文件系统 软硬链接

文章目录

    • 文件背景知识
    • 磁盘文件
      • 磁盘物理结构
      • 磁盘存储结构
      • 对磁盘的存储进行逻辑抽象
      • Boot Block
      • Super block
      • Data blocks
      • Inode Table
      • BlcokBitmap
      • inode Bitmap
      • Group Descriptor Table
    • 文件名和inode编号
      • 创建文件
      • 删除文件
      • 查找文件
    • 软硬链接
      • 软链接
      • 硬链接
      • 查看文件信息stat命令
      • 取消软硬链接unlink

文件背景知识

  • 在我们平时学习Linux系统的时候,我们都知道在语言级,系统级,Linux一切皆文件,我们所操作的都是被打开的文件
  • 其本质上是:一个文件被加载到系统当中,操作系统就把该文件管理起来了。
  • 那么我们没有被打开的文件在哪呢?—>磁盘

磁盘文件

  • 操作系统作为管理者,硬盘级文件没有被打开,就是由系统在磁盘上统一管理的。
    • 单个文件角度:这个文件在哪里,这个文件多大,这个文件的其他属性是什么?
    • 在系统角度:一共有多少个文件?各自属性在哪里,如何快速找到,还可以存储多少个文件?如何让快速找到指定的文件等等,对于这一系列问题,可以转化成 如何对磁盘文件进行分门别类的存储,以便更好地进行存储。

磁盘物理结构

  • 内存:掉电易失存储介质

  • 磁盘:永久性存储介质 (还有SSD,U盘,光盘,磁带等)

  • 磁盘是一个外设 + 计算机中唯一的机械设备。磁盘结构:磁盘盘片、磁头、伺服系统、音圈马达……

在这里插入图片描述

  • 其中,大多数 盘面是多层结构的,两面可读写数据

磁盘存储结构

  • 磁盘所采用的是CHS:Cylinder Head Sector的简称,是FDISK在分区期间所需磁盘信息。

在这里插入图片描述

在这里插入图片描述

  • 可以使用CHS定址法来找到一个指定位置的扇区

    • 首先找到指定的磁头
    • 再找到指定的磁道(柱面)
    • 最后定位指定的扇区
  • 文件本质上就是在磁盘中占有几个扇区的的问题


对磁盘的存储进行逻辑抽象

  • 为什么操作系统要用CHS,耦合度太高,为了方便实现内核磁盘管理

  • 磁盘的盘面结构(圆形结构)-> 磁带的线性结构。我们可以将磁盘盘面根据磁带的原理拉伸成一个数组,磁盘的扇区是存储数据的基本单位。

在这里插入图片描述

  • 操作系统就需要对500G的磁盘进行管理,但是500G的数据量是巨大的,如果整体管理就是低效的。操作系统采取的是分治的方式,对磁盘的管理 -> 对一个小分区的管理。

    • 逻辑结构

在这里插入图片描述

  • 再将这几个区再次进行细分:

在这里插入图片描述

  • 所以只要管理好一组,就能管理好每一个组

  • 此时划分后的每一块叫做块组。每个块组的结构又如下:

在这里插入图片描述

  • Linux在磁盘上存储文件的时候,将内容和属性是分开存储的

Boot Block

一个分区有一个启动块,开机的属性信息等,每个分区可能存在一份,主要是为了备份,有时候计算机有可能无法成功启动。windows说要不要恢复,也就是可能其中的一个分区的启动块出问题了,恢复也就是找其他分区的启动块,将数据备份一份过去。


Super block

  • 超级块(Super Block)是磁盘块组中的一个特殊数据结构,包含了文件系统的元数据信息,让操作系统能够理解和操作文件系统。它记录了文件系统的整体信息,包括文件系统的类型、大小、块位图和inode位图的位置等重要信息。
  • 超级块通常是每隔几个分组有一个,它在文件系统格式化时被创建并初始化。超级块记录了文件系统的整体信息,以便操作系统可以理解和操作文件系统。
  • Super block相当于是一个文件系统的"总指挥",扮演着一个非常重要的角色.

Data blocks

  • 磁盘的基本单位是扇区(512字节),但是操作系统(文件系统)和磁盘进行IO的基本单位是4KB(8*512字节).

  • 就算OS想从磁盘中读取一个字节的数据,那么最少也必须读取4KB的数据。至于为什么是4KB,这是经过一些科学的计算最终得出的结论,4KB是最合适的.

  • 如果使用512KB,可能会进行更多次数的IO,造成效率降低,而且如果操作系统使用和磁盘一样的大小,万一磁盘基本大小变化了,OS的源代码也需要改变,所以OS有自己一套的规定,这样就完成了软件和硬件的解耦。

  • 操作系统与磁盘 IO的基本单位是4KB,这也是一个block大小,所以磁盘也一般叫做块设备。

所以Data blocks可以理解为:

  • 1.多个4KB(8*扇区)大小的集合.
    linux下文件内容 和 属性是 分开存储的。
  • 2.Data blocks里保存的都是特定文件的内容.

Inode Table

inode是一个大小为128字节的空间,保存的是对应特定文件的属性,该块组内,所有文件的inode空间的集合,需要标识唯一性,每一个inode块,都要有一个inode编号。一般而言一个文件,一个inode,一个inode编号

  • 可以使用ls-li来查看inode编号

在这里插入图片描述

  • 可以简化成下面这张图:

在这里插入图片描述

  • 相对应的,文件的属性与内容是分开管理的,并且一个块组内的为文件个数也是很多的,因此对于文件的属性与内容我们也需要进行管理。此处的管理方式是位图

BlcokBitmap

  • 回想刚才的data blocks,有那么多的block,我们怎么知道哪一个被占用,哪一个没有被占用呢?

  • 这个时候便用到了BlockBitmap,它的内部是一个位图,它的每一个比特位和特定的block是一一对应的,对应的bit位位1, 表示该block已经被占用,否则表示空闲可用。

  • 通过块位图,操作系统可以快速了解文件系统上哪些块是可用的,从而进行块的分配和释放。当需要分配一个块给新的文件或目录时,操作系统会查找位图中的空闲位,并将其设置为已分配状态,然后返回该块的地址给请求的进程。


inode Bitmap

  • 有那么多的inode,怎么标识哪个被占用,哪个没有被占用呢?还是用inode Bitmap

  • 它的内部也是一个位图,每一个比特位和 特定的inode是一一对应的,如果该比特位为1,说明该inode已经被占用,否则表示空闲可用。

  • 假设有10000+的inode,那么就有10000+的比特位,分别一一对应,然后用0和1表示未被占用和已占用的两种状态.


Group Descriptor Table

  • Group Descriptor Table(GDT)叫做块组描述符.

  • 它用来记录这个块组多大,已经使用了多少,有多少个inode,已经占用了多少,还剩多少,一共有多少个block,使用了多少…等等

  • 通过将整个磁盘划分为:大分区 -> 小分区 -> Boot Block + n个块组 -> 块组 -> 6个区域。通过此方式,将快组分割成如此,并且写入相关的管理数据 -> 每一个块组都这么干 -> 整个分区就被写入了文件系统信息(格式化)。


一个文件只能有一个inode,和一个inode编号.

  • 我们知道,DataBlocks中是通过每个block存储内容的,那么一个文件 可以有多个block吗?答案是肯定可以的,如果只有一个的话,那么每个文件只能存储4KB大小,这也不切合实际。

  • 在文件属性inode中,会有文件的各种属性,其中就包括了一个blocks数组,里面保存了每个block的位置.

  • 对于数据量小的文件:

在这里插入图片描述

那么如果一个文件特别大,有很多block,blocks数组容不下了,此时如何找到每个block呢?

  • 其实我们要知道,一个block块里不仅可以存储文件内容,也可以存储其它块的块号

  • 比如blocks[在文件属性inode中]只有15个元素大小,我们可以前12个对应的block[磁盘结构中]存储文件内容(直接映射),后3个对应的block存储的其它block的位置(间接)。

  • 一个block是4KB=4096字节大小,存储一个位置只需要4/8字节(32/64位平台),这样一个block就可以存储1000个其它block的位置,如果还是不够,可以取前997个存储内容,后3个存储block的位置,以此类推…

在这里插入图片描述


文件名和inode编号

  • 找到文件:先找到文件inode编号 —> 找到分区特定的blcok group —> 找到inode —>相当于知道了属性 —>根据属性便可以找到文件内容.

可问题是我们怎么知道inode编号呢?我们平时用的都是文件名进行操作,比如创建或删除等,所以我们此时需要弄清楚文件名和inode编号之间的关系.

  • linux中,inode属性里面,没有文件名这一说法!只根据inode编号辨识文件.

有下面两种场景 :

  • 1.在同一个目录下,可以保存很多的文件,但是文件名不能重复.

  • 2.目录是文件,也有自己的inode,也有自己的data block,但问题是目录data block里面存储的是什么呢?

虽然说linux下是按inode编号来识别文件的,但是我们看到就是文件名啊,这些文件名也一定是被管理的。

  • 这里直接说结论: 目录里的data block 存储的是inode 编号文件名的映射关系

  • 它们互为key值的,也就是说即可用inode编号做key值,也可以用文件名做key值.

  • 这也可以立即为什么创建文件,需要目录有写权限,因为目录保存的是文件名与 inode编号映射关系,只有目录有了写权限,才能将这个映射关系写到磁盘,才能创建成功.


  • 回想对于目录的权限操作:

  • 进入文件需要x(可执行)权限

  • 创建文件需要w(可写)权限

    • 因为,需要将文件名与inode编号的映射关系写入到目录的data block中。
  • 显示文件名与属性需要r(可读) 权限。

    • 因为,需要显示文件名,但是文件名存储在目录中,需要文件名就需要在目录中查找;显示文件属性,就需要查找到文件,就需要依托于目录中文件名与inode编号的映射关系。
  • 正是因为,查找inode编号是依托于目录结构,所以Linux下查找文件需要绝对路径或相对路径。

创建文件

  • 通过我们传入的路径,找到对应的分区、块组,然后在该块组内通过对inode Bitmap的遍历,查找0的同时,使用计数器计算inode编号。以inode Bitmap中0说所对应的位置开辟inode,将属性存储,再根据文件内容,调整其中的black数组(如果没数据清空,有数据根据Black Bitmap分配Data block)。至此文件系统将空间分配,相关数据存储并给出了新建文件的inode编号。再根据该文件处于的目录名,找到目录的inode属性信息,再以属性信息找到目录对应的Data black将用户给予的文件名与文件系统给予的inode标号,存储构建映射。

  • 以目录的文件名,找到目录相关数据:Linux内核中会将常用的目录结构构建成一颗树,其内部帮我们构建了文件名与其目录的inode编号的映射关系。本质上:也就是只要你拿到了文件名它的inode,最后就能通过文件目录找到目录的inode,进而找到目录的data block将新建的文件名与其inode标号写进去。


删除文件

  • 删除文件,即通过传入文件名,以此找到对应的目录与目录的inode,以此在目录的data black中根据映射关系,找到文件名对应的inode标号,以此找到文件的inode,然后将该文件的inode Bitmap与black Bitmap进行置0。

这也正是:为什么拷贝(下载)文件的时候很慢,而删除文件的时候很快的原因。

  • 正是由于拷贝(下载)文件,需要对inode的分配,data block的分配。并覆盖式的一一写入数据。而删除文件只需将标识inode与data block是否有效的Bitmap置0即可。

  • 如同通行的路,开辟时需要慢慢建造填补,因为废弃等原因而放弃时只需要一个标识牌即可。需要再次使用时直接铺设就行。


查找文件

  • 根据文件名,在其处于的目录的data block中查找到映射的文件inode编号,以此找到文件的inode。

  • 当重装操作系统的时候:

  • 需要你对磁盘进行分区,就是电脑中的A、B、C……盘。

  • 首先需要进行格式化,在磁盘写入文件系统,也就是从哪到哪是一个Block group块的区域的划分、块中的Data block区域划分、inode Table区域的划分、Bitmap区域的划分以及清0、……。(格式化也很简单,就是重写文件系统,清空数据本质上:将Super Bloack、Group Rescriptor Table、两个Bitmap的4个区域全部清0)

  • 由于inode是固定的,data block是固定的。所以有时可能出现,其中一个还有空间但是另一个没空间了。于是就会出现系统里还有空间,但是创建文件老是失败的问题。


软硬链接

  • 为解决文件的共享使用,Linux 系统引入了两种链接:硬链接 (hard link) 与软链接(又称符号链接,即 soft link 或 symbolic link)。链接为 Linux 系统解决了文件的共享使用,还带来了隐藏文件路径、增加权限安全及节省存储等好处。

创建软链接

ln -s src dest

创建硬链接

ln src dest

在这里插入图片描述

  • 我们观察到硬链接的inode一样,而这里有两个2代表的是引用计数。(一会再说)
  • 我们观察到软链接,又叫做符号链接,软链接文件相对于源文件来说是一个独立的文件,该文件有自己的inode号,但是该文件只包含了源文件的路径名,所以软链接文件的大小要比源文件小。软链接就类似于Windows操作系统当中的快捷方式

在这里插入图片描述

软链接

  • 使用快捷方式打印和使用源文件打印都是可以的

在这里插入图片描述

  • 但是软链接文件只是其源文件的一个标记,当删除了源文件后,链接文件不能独立存在,虽然仍保留文件名,但却不能执行或是查看软链接的内容了。

在这里插入图片描述

硬链接

  • 通过ls -i -l命令我们可以看到,硬链接文件的inode号与源文件的inode号是相同的,并且硬链接文件的大小与源文件的大小也是相同的,特别注意的是,当创建了一个硬链接文件后,该硬链接文件和源文件的硬链接数都变成了2。

我们删除源文件后,计数变为1了

在这里插入图片描述

  • 这里面的文件内容还是可以访问,也就是相当于重命名了一下

在这里插入图片描述

  • 所以硬链接不是一个独立的文件,因为没有独立的inode,使用的是目标文件的inode,在属性列中有一列就是硬链接数

  • 文件的磁盘引用计数:有多少个文件名字字符串通过inode指向我就是多少


所以定位一个文件有两种方式:

  1. 通过路径
  2. 直接找到目标文件的inode
    两者都是最终还是要通过inode
  • 简单的来说硬链接就是一个文件名和inode的映射关系,建立硬链接,就是在指定目录下,添加一个新的文件名和inode的映射关系!

那么以上两者都有什么作用呢?

  • 其实在我们linux机器上有很多的软硬链接

  • 就比如/目录下就有很多软硬链接

在这里插入图片描述

  • 硬链接的场景也有很多,比如平时我们创建一个文件夹默认的计数就是2,因为里文件夹里面默认有...

在这里插入图片描述

  • 当再次向这个目录里面新建目录>

在这里插入图片描述

  • 计数+1

在这里插入图片描述

  • 任何一个目录,刚开始建立的时候,引用计数一定是2

在这里插入图片描述

  • 在目录A内部新建立一个目录,会让A目录i引用计数自动+1
  • 一个目录内部有几个目录:A的引用计数-2

在这里插入图片描述

  • 在Linux系统中,不允许给目录建立硬链接

查看文件信息stat命令

在Linux当中,我们可以使用命令stat文件名来查看对应文件的信息。

在这里插入图片描述

这其中包含了文件的三个时间信息:

Access: 文件最后被访问的时间。
Modify: 文件内容最后的修改时间。
Change: 文件属性最后的修改时间。

  • 当我们修改文件内容时,文件的大小一般也会随之改变,所以一般情况下Modify的改变会带动Change一起改变,但修改文件属性一般不会影响到文件内容,所以一般情况下Change的改变不会带动Modify的改变。
  • 我们若是想将文件的这三个时间都更新到最新状态,可以使用命令touch文件名来进行时间更新。

注意: 当某一文件存在时使用touch命令,此时touch命令的作用变为更新文件信息。

取消软硬链接unlink

  • 直接使用该命令即可
unlink 文件名

在这里插入图片描述

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

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

相关文章

玩转智能:深度强化学习在游戏AI中的应用

玩转智能:深度强化学习在游戏AI中的应用 1 引言 1.1 简述深度强化学习(DRL)在游戏AI中的革命性影响。 当我们回顾人工智能的发展历程,可以明显地看到深度强化学习(Deep Reinforcement Learning, DRL)的出现,在游戏AI…

【埋点探针】微信小程序SDK安装

一、下载微信小程序SDK埋点代码 选择Wechat,复制sdk代码 在项目根目录下,创建sdk文件,webfunny.event.js 二、在app.js文件中,引入埋点SDK代码 首先引入sdk代码 require("./webfunny.event.js")引入兼容代码&#x…

DHT11实验

文章目录 11.11.2 234 DS18B20 只能检测温度 右边这几个 都能 1 1.1 数字信号输出 指 0/1使用单总线通信 1个IO口就能获取温湿度 T/H要有 模数转化(内部还有个8位单片机)电容感湿元件 白色的 还有个ic NTC测温 可能在ic内部 使用单片机内部测温 精确度不…

STM32存储左右互搏 SDIO总线FATS文件读写SD/MicroSD/TF卡

STM32存储左右互搏 SDIO总线FATS文件读写SD/MicroSD/TF卡 SD/MicroSD/TF卡是基于FLASH的一种常见非易失存储单元,由接口协议电路和FLASH构成。市面上由不同尺寸和不同容量的卡,手机领域用的TF卡实际就是MicroSD卡,尺寸比SD卡小,而…

基于STM32温控风扇冷却系统设计

摘要: 在当前社会,随着大家对生活质量的追求和环保意识的加强,温控风扇作为一种节能产品备受社会的关注。温控风扇广泛应用于工业生产、家用电器、医疗美容设备和公共场所,提高了人们的生活效率和生活上的便利。这篇文章是根据单…

【网络协议】 TCP与UDP协议区别及应用场景深度分析

1. TCP与UDP简介 1.1 TCP 1.1 定义 TCP(TransmissionControl Protocol)传输控制协议。 是一种可靠的、面向连接的协议(eg:打电话)、传输效率低全双工通信(发送缓存&接收缓存)、面向字节流。使用TCP的应…

电子印章盖骑缝章

电子印章盖骑缝章是指在电子文档(如PDF文件)中,使用电子印章技术,为文档添加一个跨越多页、连续显示的电子印章图像,以模拟传统纸质文档上的骑缝章效果。以下是实现电子印章盖骑缝章的步骤: 一. 准备电子印…

docker的安装以及docker中nginx配置

机器 test3 192.168.23.103 1机器初始化配置 1.1关闭防火墙,清空防火墙规则 systemctl stop firewalld iptables -F setenforce 01.2部署时间同步 yum install ntp ntpdate -y1.3安装基础软件包 yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c make…

【webrtc】m98 RoundRobinPacketQueue的优先级处理

m98 代码 PacedSender::EnqueuePackets 的调用者可能是多个地方,所以这个要加锁保护。RoundRobinPacketQueue 本身是没有锁的发现m98和新版本不同,参考:【webrtc】m114自己实现的PrioritizedPacketQueuepush和pop都是RtpPacketToSend 但是实际上,内部是封装为QueuedPacket 处…

基于Springboot的人职匹配推荐系统

基于SpringbootVue的人职匹配推荐系统的设计与实现 开发语言:Java数据库:MySQL技术:SpringbootMybatis工具:IDEA、Maven、Navicat 系统展示 用户登录 首页 企业信息 岗位信息 新闻资讯 后台管理 用户管理 企业信息管理 岗位信…

Docker之注册中心的使用与操作

一、Docker注册中心与仓库 Reastry 可译为注册中心或注册服务器,是存放仓库的地方,一个注册中心往往有很多仓库。Docker默认的注册中心是Docker Hub,其可以通过浏览器访问,也可以使用docker search命令访问。 仓库是集中存放镜像…

html2Canvas截图包含滚动条解决思路

概况描述 在项目中使用html2Canvas进行截图时发现无法截取滚动条部分,前端是使用vue2的版本,网上找了很多方式都没效果,冷静思考后,给出解决办法。 解决思路 当我们截取的div容器的宽和高与内部的子容器div的宽和高不一样时&am…

Django模型的属性与方法

本节介绍Django模型的属性和方法,以及如何重写之前定义的模型方法等内容。 3.5.1 模型属性 Django模型中最重要的属性就是Manager,它是Django模型和数据库查询操作之间的接口,并且被用作从数据库当中获取实例的途径。如果Django模型中没有…

JAVA学习笔记27(异常)

1.异常 ​ *异常(Exception) ​ *快捷键 ctrl alt t 选中try - catch ​ *如果进行了异常处理,那么即使出现了异常,程序可以继续执行 1.1 基本概念 ​ *在Java语言中,将程序执行中发生的不正常情况称为"异常"(开发过程中的语…

MySQL行格式(row format)

MySQL行格式(row format) 表的行格式决定了其行的物理存储方式,这反过来又会影响查询和 DML 操作的性能。随着单个磁盘页面容纳更多行,查询和索引查找可以更快地工作,缓冲池中需要的高速缓存内存更少,写出…

耐高温300度锅炉轴承,江苏鲁岳轴承制造的行业标杆

自润滑轴承-产品类型-耐高温轴承-不锈钢轴承-江苏鲁岳轴承制造有限公司。锅炉轴承,耐高温至200度-800度。 江苏鲁岳轴承制造有限公司,一家专注于锅炉轴承和耐高温轴承的研发与生产的企业,致力于为客户提供高质量、高性能的轴承解决方案。其中…

使用 OpenCV 测量物体尺寸

使用 OpenCV 测量物体尺寸 你是否曾经遇到过这样的问题:想要知道计算器的精确尺寸,但手头又没有专业的测量工具?别担心,今天我们就来教大家一个简单又实用的方法,通过一张A4纸就能估算出计算器的宽度和高度&#xff0c…

iZotope RX 10 音频修复和增强工具 mac/win

iZotope RX 10 for Mac是一款出色的音频修复和增强工具,凭借其卓越的音频处理技术,能够轻松应对各种音频问题。 无论是背景噪音、回声还是失真,RX 10都能精准去除,还原清晰纯净的音频。同时,它还提供了丰富的增强工具&…

【Linux系统编程】第六弹---权限的概念

✨个人主页: 熬夜学编程的小林 💗系列专栏: 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、什么是权限 2、权限的本质 3、Linux中的用户 4、Linux中文件的权限 4.1、文件访问者的分类(角色) 4.2、文件类型和访问权…

Python 全栈安全(三)

原文:annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者:飞龙 协议:CC BY-NC-SA 4.0 第十一章:OAuth 2 本章内容 注册 OAuth 客户端 请求对受保护资源的授权 授权而不暴露身份验证凭据 访问受保护的资源 OAuth …