当前位置: 首页 > news >正文

Linux文件系列:磁盘,文件系统,软硬链接

Linux文件系列:磁盘,文件系统,软硬链接

  • 一.磁盘相关知识
    • 1.磁盘机械构成
    • 2.磁盘物理存储
    • 3.磁盘逻辑存储
      • 1.LBA地址
      • 2.磁盘的分区和分组
  • 二.文件系统和inode
    • 1.inode结构体
    • 2.文件系统
      • 1.Super Block(超级块)
      • 2.Group Descriptor Table(块组描述表GDT)
      • 3.inode Table
      • 4.Data Blocks
      • 5.Block Bitmap(块位图)
      • 6.inode Bitmap
    • 3.理解文件系统
    • 4.几个补充的点
      • 1.int block[15]的介绍
      • 2.通过inode编号查找文件的分组
      • 3.文件名和inode编号的映射
        • 补充:重新理解目录文件的权限
      • 4.重谈文件的增删查改
      • 5.重谈文件路径
        • 补充知识点:挂载
  • 三.软硬链接
    • 1.软硬链接的操作与现象
      • 1.软链接
      • 2.硬链接
    • 2.软硬链接的原理
    • 3.软硬链接的应用场景
      • 1.软链接
      • 2.硬链接

我们之前所学的都是被进程打开了的文件,接下来我们要学习没有被进程所打开的文件,它们是存储在磁盘当中的

要学习这些文件,首先我们要先学习一下磁盘

一.磁盘相关知识

1.磁盘机械构成

在这里插入图片描述

2.磁盘物理存储

在这里插入图片描述
在这里插入图片描述

3.磁盘逻辑存储

1.LBA地址

在这里插入图片描述
我们知道磁带在展开之后呈现一种带状结构,磁带中的数据就是以这种线性的方式进行存储的

那么我们可不可以把磁盘"展开"呢?
在逻辑上面我们可以想象一下磁盘"展开"后的样子,给磁盘上的每一个扇区进行编号,然后"折"回去.
最后只需要通过一种映射关系和CHS定位法不就可以定位到具体的扇区了吗?

其实"展开"之后,磁盘就类似于数组了,此时对磁盘的管理就变成了对数组的管理了
在这里插入图片描述
我们知道磁盘是外设,将磁盘加载到内存当中是很慢的,因此操作系统认为512字节太小了
因此操作系统认为IO的基本单位是4KB,将这个数组划分为若干个4KB的数据块,
数据块和扇区之间就要进行一些映射关系完成这种转换

一个数据块对应于8个扇区

在这里插入图片描述
这些数据块所对应的地址就被称为LBA(Logical Block Address 即:逻辑块地址)地址

2.磁盘的分区和分组

假设我们有800GB的磁盘,如何对这800GB进行管理呢?

我们都知道电脑当中有若干盘:C盘,D盘等等…
在这里插入图片描述
其实,我们日常提到的C盘,D盘…等等,本质上都只是对一块磁盘的不同分区而已,C盘是一个分区,D盘是一个分区…
在这里插入图片描述
其实这里采用了分治的思想,将800GB分为8个区,每个区100GB,只要管理好100GB,那么不就能够照猫画虎管理好这800GB了吗?
那么如何管理好100GB呢?
将100GB分为10个组,每个组10GB,只要管理好10GB,那么不就能管理好这100GB了吗?

那么如何管理好10GB呢?
这就是我们接下来要探讨的问题:文件系统和inode

二.文件系统和inode

1.inode结构体

我们知道:文件=内容+属性
其中文件内容的大小是不确定的,但是文件属性的大小是确定的

操作系统想要管理文件,就要通过"先描述,在组织"的原则来进行管理,
因此需要抽象出描述文件属性的结构体(就是这里要介绍的inode结构体)

大致的成员变量如下:
struct inode
{类型;大小;权限;时间;.....inode编号;int block[15];
};

我们要说明的几点如下:

  1. 文件名不属于文件属性,而属于文件内容!!(因为文件名是可变的,文件名的长度不同,所占用的空间大小不同)
  2. 文件的唯一标识是inode编号,inode编号在每一个分区内是唯一的,在每一个分组内不是唯一的
  3. inode结构体的大小是128字节
  4. int block[15]是用来查找该文件所对应的内容的一个字段,我们后面会介绍的
ll -li  查看inode编号的命令

在这里插入图片描述

2.文件系统

每个分区都对应一个文件系统

下面我们介绍Linux操作系统下的ext2文件系统
ext2文件系统会根据分区的大小将该分区划分为若干个Block Group,而每个Block Group都有着相同的组成结构

而且文件的内容和属性是分区域存储的
在这里插入图片描述
不是每一个分组当中都有Super Block,但是每个分组当中都有其余的这5个字段
下面我们分别介绍一下这几个字段:

1.Super Block(超级块)

1.存放该分区(即该文件系统)的相应信息,记录的信息主要有:
block和inode的总量,未使用和已经使用了的block和inode的数量,每个block和inode的大小等等

2.由于Super Block存放的是该分区的相应信息,因此无需所有的分组都具有该字段(否则会浪费大量空间),只有小部分分组当中具有该字段

3.Super Block的信息被破坏,就意味着整个文件系统的结构就被破坏了

4.为什么不让它跟Boot Block一样只存一份呢?
因为万一某个分组当中的Super Block的损坏了,可以用其他分组内的Super Block恢复过来,提高文件系统的容错率

2.Group Descriptor Table(块组描述表GDT)

存放该分组的相应信息,每一个分组都有该字段,记录的信息主要有:
该分组已经使用了多少个inode,一共有多少个inode,
Group Descriptor Table,Block Bitmap,inode Bitmap,inode Table,Data Blocks这些字段的区域划分等等

3.inode Table

存放文件的属性(即inode结构体)

4.Data Blocks

数据区:存放文件内容的区域

5.Block Bitmap(块位图)

记录着Data Block中哪个数据块已经被占用了,哪个数据块尚未被占用

根据位图的特性,我们可以得出:
比特位的位置:表示的是块号
比特位的内容:对应的块是否被占用了

6.inode Bitmap

跟Block Bitmap类似,只不过记录的是哪个inode是否空闲可用而已

3.理解文件系统

我们知道:
Super Block记录着该分区/文件系统的相应信息
因此就可以通过对Super Block进行管理来完成对这个分区/文件系统的管理

因此操作系统可以将Super Block使用某种数据结构(例如链表)来进行管理
此时对分区/文件系统的管理就变成了对链表的增删查改

但是分区当中的每个分组内的这些字段也不是与生俱来的,
而是在分区之后通过格式化这个操作写入文件系统的信息(也就是
划分完各个管理字段的区域,填好每个Super Block GDT等等数据,从而完成文件系统的搭建)

其中不同分区可以写入不同或者相同的文件系统
在这里插入图片描述

4.几个补充的点

了解了这些字段之后,我们可能还会有些疑问:
1.前面的int block[15]还没有介绍呢

2.inode编号在每个分区内唯一,在每个分组中不唯一
不过如何通过inode编号来定位这个文件在哪个分区里面,在哪个分组里面呢?

3.为什么我们可以通过文件名来操作一个文件呢?
文件名不是不属于文件属性吗?

4.如何理解文件的新建和删除,查找和修改呢?

5.文件路径是怎么一回事?

下面我们就来解决这些问题

1.int block[15]的介绍

我们回过头来重新理解一下这个int block[15]
它是负责查找对应文件的内容的
在这里插入图片描述

2.通过inode编号查找文件的分组

为什么不先介绍查找分区呢?
因为查找分区和路径有关,谈完路径之后我们会谈查找分区的
在这里插入图片描述
这里到inode Bitmap当中进行查找主要是为了确认这个文件是否真的存在

3.文件名和inode编号的映射

我们知道,每一个普通文件都一定在一个目录当中
而目录也是文件,目录文件的内容就是
文件名和inode编号的映射关系,因此可以通过文件名映射到对应的inode编号,因此我们就可以通过文件名来操作一个文件了

补充:重新理解目录文件的权限

此时我们就能够更好的理解目录文件的权限了
在这里插入图片描述

4.重谈文件的增删查改

当我们新建一个文件时:
1.在inode bitmap当中查找尚未被使用的inode结构体,将这个结构体的内容填好,分配给这个文件,并且将这个比特位置为1(表示这个inode结构体已经被占用了)

2.修改该文件所在的目录文件的内容,添加上这个新文件的文件名和inode编号的映射关系

3.写入内容时直接在data Block处写入即可,根据内容大小来调整int block[15]字段的映射关系

当我们删除一个文件时:
只需要根据inode编号找到inode bitmap中对应的比特位,将这个比特位由1置为0(表示这个inode结构体和它所对应的数据块已经空闲了,可以被新的文件所占用了,也就达到了删除的目的)

这样做显著提高了删除文件的效率
因此我们平常在下载APP时会比较慢,而删除APP时特别的快

关于文件的查和改大家也能凭借自己去理解了,我这里就不赘述了

5.重谈文件路径

谈完文件的增删查改之后,我们已经显然得知:对一个文件进行增删查改都跟该文件所处目录有关系

也就是说我想要访问当前目录的某个文件test.txt,就必须要先访问当前目录,而当前目录也是一个文件,是在上一个目录当中的文件
因此要想访问当前目录,就必须先访问上一个目录…

因此查找一个文件时都必须要这样逆向的,如同递归般地往上走,直到到达根目录为止

因此要访问某个文件,就必须要知道当前文件的路径,然后按照这个路径对该文件进行逆向查找
而这个过程,就是对路径进行解析的过程

例如:
我目前在这个路径下
在这里插入图片描述
我想要访问当前目录下的test.txt这个文件
在这里插入图片描述
在这里插入图片描述

谈完了路径解析之后,下面我们来探讨一下如何判断当前文件在哪一个分区下面

补充知识点:挂载

我们要补充一个知识点:挂载

一个被写入文件系统的分区,想要被Linux操作系统使用,就必须要先把这个具有文件系统的分区进行"挂载"

什么叫做"挂载"呢?
在这里插入图片描述
简而言之,挂载就是把一个文件系统的分区写入到一个目录当中,而访问该分区就是通过该分区所挂载的目录进行访问的

因此,通过对路径前缀的解析,我们就能够优先区分出文件在哪一个分区下面,因此inode编号对于分区而言是可以不唯一的,因为查找一个文件所在分区是通过文件路径来查找的,而不是通过inode编号来查找的

三.软硬链接

1.软硬链接的操作与现象

1.软链接

我们之前提到过软链接,对应博客:Linux中的shell外壳与权限(包含目录文件的权限,粘滞位的来龙去脉)

当时我们将软链接文件当作快捷方式一样来看待,今天,我们再来理解一下这个软链接文件

创建软链接文件的命令:

ln -s 目标文件名 链接文件名 (这个-s可以理解为-soft)

在这里插入图片描述
为了证明软链接存放的就是目标文件的路径,我们在当前目录新建一个目录dir,然后将目标文件test.txt移动到dir下面,然后查看链接文件的内容
在这里插入图片描述
然后我们把test.txt再移动回来
在这里插入图片描述
此时,这个软链接文件就正常了

下面我们证明一下访问软链接文件就是访问目标文件
在这里插入图片描述
证明完毕

2.硬链接

创建硬链接文件的命令:

ln 目标文件名 链接文件名

在这里插入图片描述
下面我们向hello.txt目标文件当中写入内容
然后看一看这两个文件的变化
在这里插入图片描述
下面我们把目标文件hello.txt删除,然后访问硬链接文件link.hard的内容
在这里插入图片描述

2.软硬链接的原理

经过上面的现象+经验总结
我们可以得出:

软链接的本质就是一个独立文件,软链接文件的内容就是目标文件的路径
访问软链接文件,本质就是访问目标文件

硬链接的本质就是在指定的目录下,插入新的文件名和目标文件inode编号的映射关系,并让inode的引用计数++
删除文件时,先将硬链接数–,如果硬链接数减为0,那么就会将该文件所对应的inode bitmap的比特位全部清0

3.软硬链接的应用场景

1.软链接

软链接的应用场景就是作为"快捷方式"发挥作用
当我们想要访问一个路径较为麻烦的文件时,可以为这个文件建立软链接,放在我们规定的位置,这样就能够通过访问软链接文件从而访问这个文件了

这是文心一言上面给出的答案,大家可以对照理解一下
在这里插入图片描述

2.硬链接

先抛出一个问题在这里插入图片描述
我们首先想到的就是这个目录当中有没有什么奇怪的东西呢?
还真有,就是我们习以为常的隐藏目录:一个点和两个点
在这里插入图片描述
也就是说,新建一个目录时,因为这个目录当中默认就有隐藏目录.
而.就是这个目录的一个硬链接文件,因此新建目录的硬链接数就是2

可是又出现了另一个问题:
在这里插入图片描述
解决完这个问题之后,我们就能显而易见地看出硬链接的应用场景了
用于目录当中的一个点和两个点

我们知道:我们可以给普通文件创建硬链接文件,那么可不可以给目录文件创建硬链接文件呢?
我们试一下,不行
在这里插入图片描述

以上就是Linux文件系列:磁盘,文件系统,软硬链接的全部内容,希望能对大家有所帮助!

相关文章:

Linux文件系列:磁盘,文件系统,软硬链接

Linux文件系列:磁盘,文件系统,软硬链接 一.磁盘相关知识1.磁盘机械构成2.磁盘物理存储3.磁盘逻辑存储1.LBA地址2.磁盘的分区和分组 二.文件系统和inode1.inode结构体2.文件系统1.Super Block(超级块)2.Group Descriptor Table(块组描述表GDT)3.inode Table4.Data Blocks5.Block…...

GPT4.0

GPT4.0 支持官网所有功能以及所有第三方GPTS,完全同步官网。无需魔法,填写授权码直达官网。全天超18小时维护,无需担心不稳定。没有永久卡,3.5免费提供,4.0可以按需下单即可,不存在跑路。 需要的联系...

软件工程(双语)

教材《软件工程 实践者的研究方法》 双语教学,但目前感觉都是在讲没用的 ”过程决定质量,复用决定效率” 介绍 软工的本质 程序数据结构算法 软件程序文档(需求、模型、说明书) 软件应用: 系统软件 应用 工程/科学…...

网络——套接字编程UDP

目录 端口号 源端口号和目的端口号 认识TCP协议和UDP协议 网络字节序 socket编程接口 socket常见接口 sockaddr结构 UDP socket bind recvfrom sendto 编写客户端 绑定INADDR_ANY 实现聊天功能 端口号 在这之前我们已经说过源IP地址和目的IP地址,还有…...

FPGA_AD9361

1.集成12位DAC和ADC的一款器件,2个输入模拟通道和2个输出模拟通道 2.• TX频段:47 MHz至6.0 GHz • RX频段:70 MHz至6.0 GHz 3.SPI配置成LVDS或CMOS接口,也可以还可以选择FDD(频分双工——全双工,操作时需…...

探讨Java代码混淆加固工具

摘要 本篇博客将介绍几种常用的Java代码混淆工具,如ProGuard、Allatori Java Obfuscator、VirboxProtector、ipaguard和DashO。我们将深入探讨它们的特点、功能以及在保护Java应用程序安全方面的作用。此外,还将强调在使用Java代码混淆工具时需要注意的安…...

Linux——du, df命令查看磁盘空间使用情况

一、实现原理: df 命令的全称是Disk Free ,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。 du 命令的全称是 Disk Used ,统计磁盘有已经使用的空间。它是直接统计各文件各目…...

数据库实验(一)SQL Server触发器

目录 触发器的定义 触发器和存储过程的区别 触发器的优点 触发器的作用 触发器的分类 DML触发器 DDL触发器 登录触发器 触发器的工作原理 inserted表 deleted表 创建触发器 编程要求 测试要求: 实验代码: 触发器的定义 触发器是建立在触…...

添加网址到主页

基于localStorage的网址收藏夹-CSDN博客 为了通过安卓菜单添加网址到主页中,调试了几个小时,主要踩了几个坑。 1.localStorage 通过域名隔离,需要加载主页才能读写。 2.WebView 可以不显示,但是 JS 代码要放在 window.onload 中…...

消息中间件如何实现高可用

消息中间件实现高可用的方式有很多种,常见的方法包括: 集群部署:通过在多台服务器上部署消息中间件实例,构成一个集群,提高整体系统的可用性。当一台机器出现故障时,其他机器可以继续提供服务。主从复制&a…...

Hbase 王者荣耀数据表 HBase常用Shell命令

大数据课本: HBase常用Shell命令 在使用具体的Shell命令操作HBase数据之前,需要首先启动Hadoop,然后再启动HBase,并且启动HBase Shell,进入Shell命令提示符状态,具体命令如下: $ cd /usr/local…...

家用智能洗地机哪个牌子好?4款型号让你解锁高效省力生活体验

在今天的社会中,随着生活节奏的加快,人们对于家庭清洁的需求不断增加。传统的清洁方法已经无法满足现代家庭的需求。因此,洗地机作为一种高效、方便的清洁工具,已经成为了许多家庭首选的清洁设备。然而,在市场上&#…...

Linux--进程(1)

目录 前言 1.冯诺依曼体系结构 2. 操作系统(Operator System)--第一个被加载的软件 3.进程 3.1基本概念 3.2Linux中的PCB 3.3通过系统调用创建子进程-fork初识 fork:创建一个子进程 为什么要创建子进程? fork的原理: 进一步了解fo…...

Qt登录页面

#include "mywidget.h" #include "ui_mywidget.h"MyWidget::MyWidget(QWidget *parent): QWidget(parent), ui(new Ui::MyWidget) {ui->setupUi(this);//接收动图QMovie *mv new QMovie(":/pictrue/luori.gif");ui->loglab->setMovie(…...

软件工程-第8章 软件测试

8.1 软件测试目标域软件测试过程模型 8.2 软件测试技术 8.3 静态分析技术-程序正确性证明 8.4 软件测试步骤 8.5 本章小结...

专业135+总分400+重庆邮电大学801信号与系统考研经验重邮电子信息与通信工程,真题,大纲,参考书。

今年分数出来还是比较满意,专业801信号与系统135,总分400,没想到自己也可以考出400以上的分数,一年的努力付出都是值得的,总结一下自己的复习心得,希望对大家复习有所帮助。专业课:(…...

主干网络篇 | YOLOv8改进之在主干网络中引入密集连接卷积网络DenseNet

前言:Hello大家好,我是小哥谈。DenseNet(密集连接卷积网络)是一种深度学习神经网络架构,它在2017年由Gao Huang等人提出。DenseNet的核心思想是通过密集连接(dense connection)来促进信息的流动和共享。在传统的卷积神经网络中,每个层的输入只来自于前一层的输出。而在…...

lavarel的php程序是顺序执行,用pdo mysql连接池好像没有什么用啊。没有办法挂起等待啊,为什么要用连接池,应用场景是什么

Laravel 的 PHP 程序确实是基于请求-响应模式,每个请求都是顺序执行的。这意味着一旦一个请求开始处理,它会按照代码的顺序执行,直到完成并返回响应。因此,从表面上看,使用 PDO 或 MySQL 连接池在 Laravel 中可能看起来…...

spring maven项目 实时接口请求次数及时间发送到grafana监控_亲测成功

spring maven项目 实时接口请求次数及时间发送到grafana监控_亲测成功 说明: spring项目使用aop方式拿到请求接口uri,算出从请求到响应的耗时, 然后使用statsd包发送udp数据给grafana去展示. 完全不影响代码性能和稳定性,因为使用udp协议发送,就算grafana那边挂了,也不影响项…...

银行数字人民币系统应用架构设计

2019年10月,01区块链联合数字资产研究院发布了《人民币3.0:中国央行数字货币运行框架与技术解析》,从数字货币界定和人民币发展历程出发,区分了央行数字货币与比特币、移动支付等的区别,全面介绍了央行数字货币的发展历…...

招商蛇口 | 执笔CID,启幕低密生活新境

作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...

libfmt: 现代C++的格式化工具库介绍与酷炫功能

libfmt: 现代C的格式化工具库介绍与酷炫功能 libfmt 是一个开源的C格式化库,提供了高效、安全的文本格式化功能,是C20中引入的std::format的基础实现。它比传统的printf和iostream更安全、更灵活、性能更好。 基本介绍 主要特点 类型安全&#xff1a…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...

热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁

赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...

boost::filesystem::path文件路径使用详解和示例

boost::filesystem::path 是 Boost 库中用于跨平台操作文件路径的类&#xff0c;封装了路径的拼接、分割、提取、判断等常用功能。下面是对它的使用详解&#xff0c;包括常用接口与完整示例。 1. 引入头文件与命名空间 #include <boost/filesystem.hpp> namespace fs b…...

大数据驱动企业决策智能化的路径与实践

&#x1f4dd;个人主页&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 一、引言&#xff1a;数据驱动的企业竞争力重构 在这个瞬息万变的商业时代&#xff0c;“快者胜”的竞争逻辑愈发明显。企业如何在复杂环…...

JavaScript 标签加载

目录 JavaScript 标签加载script 标签的 async 和 defer 属性&#xff0c;分别代表什么&#xff0c;有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...

统计学(第8版)——统计抽样学习笔记(考试用)

一、统计抽样的核心内容与问题 研究内容 从总体中科学抽取样本的方法利用样本数据推断总体特征&#xff08;均值、比率、总量&#xff09;控制抽样误差与非抽样误差 解决的核心问题 在成本约束下&#xff0c;用少量样本准确推断总体特征量化估计结果的可靠性&#xff08;置…...

Linux入门(十五)安装java安装tomcat安装dotnet安装mysql

安装java yum install java-17-openjdk-devel查找安装地址 update-alternatives --config java设置环境变量 vi /etc/profile #在文档后面追加 JAVA_HOME"通过查找安装地址命令显示的路径" #注意一定要加$PATH不然路径就只剩下新加的路径了&#xff0c;系统很多命…...