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

Linux相关概念和易错知识点(20)(dentry、分区、挂载)

目录

1.dentry

(1)路径缓存的原因

(2)dentry的结构

①多叉树结构

②file和dentry之间的联系

③路径概念存在的意义

2.分区

(1)为什么要确认分区

(2)挂载

①进入分区

②被挂载的目录文件

(3)模拟创建分区

①创建特定大小的文件

②模拟创建分区

③挂载目录

④卸载分区

(4)总结


1.dentry

(1)路径缓存的原因

定位文件了实际上就是根据文件路径的逆向解析,从根目录(根目录的inode编号、名称等都是特殊固定的)开始一直按解析的路径依次打开目录文件,最终找到我们要访问的文件。每个文件都要有路径,而路径是进程告诉系统的(如cwd可以协助提供绝对路径)。但如果我们对同级目录的文件多次访问,每次访问都会不断重新从根目录打开文件,这样效率太低了。因此我们需要路径缓存

(2)dentry的结构

①多叉树结构

每个dentry都含有一个inode指针,指向内存中缓存的inode结构体。当系统启动的时候,根目录的dentry被最先创建。

每个文件都最多有一个dentry,整个系统的dentry链接为一棵多叉树

当进行任何路径访问时,会根据我们要访问的路径进入内存级dentry树里面找,如果找到了就直接根据inode信息打开文件;如果找不到,则会从能找到的结点(目录)开始,读取该节点内容到内存中,根据文件名找到对应的inode编号,再去创建file、缓存inode、创建dentry结点到内存中,并按树状连接到根,进入这个新的结点,以此类推直到找到文件。当找到路径最后指向的文件后就终止。此时我们可以得到fd并进行文件操作。

注意,path的存在是有意义的,它记录了根目录的dentry指针等信息,保证每次创建dentry时能够正确地连接到同一颗dentry多叉树里面,并对当前结点dentry进行管理。

我们不需要担心多叉树越来越大,因为Linux的内核链表允许dentry中的结点链入其它链表中。

②file和dentry之间的联系

我们的文件系统在硬件侧的逻辑就是fd -> file -> path -> dentry -> inode -> 根据inode结合GDT、超级块等读取Data blocks数据到内存 -> 根据内存已有数据决定新修改内容如何存储 -> 结合inode、GDT、超级块以数据块为最小单位写回磁盘 -> 更新管理信息。

其中dentry的作用就是帮助我们快速找到文件,当我们想要从fd访问文件时,我们只需要在dentry里面进行内存级访问、查找文件inode即可。第一次查找时可能会慢,因为要一直读取目录文件的内容(硬盘级操作),根据上级目录逐级创建dentry、inode结点,但第二次、第三次访问就可以很快的从根dentry找到自己重复访问的目录文件的inode(内存级操作),进一步快速打开文件。

③路径概念存在的意义

通过上面的学习,我们发现Linux需要对路径结构进行缓存。事实上,在磁盘上并没有路径的概念,也不存在目录文件和普通文件的区别,它只需要按照自己的结构存数据即可。路径的概念是操作系统建立的,路径本质就是一个针对硬盘存储进行管理的结构,Linux任何对路径的操作本质都是针对dentry的查找,构建等操作,dentry再和文件直接打交道。

一句话总结就是:硬盘的物理结构不存在路径,但系统的逻辑结构构建出了路径,dentry是提高路径访问效率的协助者。

2.分区

(1)为什么要确认分区

我们的dentry讲解中存在一个巨大的漏洞,那就是文件的inode是以分区为界限的。同一个操作系统能访问不同分区,这就使得inode编号的唯一性被打破了,我们又如何能使用inode的唯一性来查找文件呢?进一步讲,进程的路径真的只有我们理解的那样层层目录文件包含的关系吗?

问题的根源来自分区的确定,我们只要确定了分区,上面的问题就都能解释了。

(2)挂载

认识一下分区的查看

对于整个操作系统而言,尽管存在多个分区,但只有一个分区包含根目录,系统最开始就要加载根目录到内存中,创建dentry,后续的访问也都是根据根目录文件的内容来逐渐建立dentry多叉树的。但是这就再次陷入了刚才的问题,因此就必须引入挂载的概念。

①进入分区

如果不能进入分区,这块分区相当于不可用,因为根目录所在分区不能直接访问其它分区,这会导致inode混乱。我们要如何进入一个分区?

我们已经知道路径访问文件的途中本质就是不断打开目录文件,那么我们是否可以将分区和目录文件联系起来呢?可以的,我们称为把一个分区挂载到目录上。什么意思呢?就是说当我们将一个分区挂载到目录上后,这个目录会特殊处理,当我们打开这个目录文件时,系统不会真的去打开这个目录文件,而是直接进入了挂载的分区的根目录。

我们可以查看磁盘的挂载情况(Mounted on),其中我们发现/dev/cda1挂载到了根目录下,这也就意味着当我们打开根目录时,会直接进入dev1分区的根目录。进一步讲,当系统启动时,就会将系统文件所在分区挂载到根目录下。当访问根目录时,理所应当的就进入了根目录分区了。

②被挂载的目录文件

我们可以很简单地认为被挂载的目录文件就是很普通的目录文件,它有实体、有大小、有属性、inode也没什么特别的。就是因为它被我们用分区挂载了,所以它被识别为了一个挂载点,当我们访问时系统会特殊处理,不进入目录文件,而是进入挂载分区的根目录。

通过上面的知识,我们可以知道我们所见的根目录其实也是被分区挂载了一次、跳转了的,实际上的根目录并不在任何分区里,只不过这里涉及到的内核最底层,我们了解即可

当被挂载后,原来的目录文件不会有任何影响,只不过我们没办法打开它了,因为系统相当于为这个目录文件做了掩护,针对挂载点特殊处理了。我们看似是访问了这个目录文件,实际上是访问到了另外一个分区的根目录。这也提醒我们最好使用空目录来挂载分区,因为挂载后原来目录的内容会被隐藏。当然如果我们取消挂载,这个目录文件的内容依然可以正常显示,不会受到任何影响。

(3)模拟创建分区

我们可以通过模拟创建一个分区来加深对挂载的认识

①创建特定大小的文件

我们先创建一个普通文件,用来模拟一个分区。这里介绍一个指令dd,它可以快速构建一个特定大小的文件。它的主要功能是块级别复制,也就是说它会直接按照硬盘的数据块(自己指定,不一定是4KB)复制数据,而不会兼顾文件系统。这就会导致不同文件系统之间使用dd会存在兼容性问题,因为不同文件系统的管理、解读数据方式不同。这也就意味着dd适合磁盘备份、启动盘备份等操作,文件级别的复制还是cp更合适。

②模拟创建分区

我们得到一个文件后,要对它进行初始化,按照特定文件系统ext的格式将里面的GDT、blocks、bitmap等进行初始化,让它长得像一个分区

mkfs.ext可以快速帮我们格式化一个ext文件系统,会按照ext2的格式结合我们文件的大小自动将分区分为不同的块,初始化超级块等操作。

③挂载目录

我们可以进一步查看分区状况

之后我们便能正常使用这个模拟分区

④卸载分区

我们可以使用umount卸载分区,当用户正在使用分区时,或当用户的工作路径包含这个分区时,我们不能卸载这个分区,只有完全退出才可以操作。这也能解释我们永远无法卸载根目录,因为根目录永远在我们的cwd中,我们无法退出。


如果我们再挂载一次,会发现原来模拟分区里面的内容一点都没有修改,原来的文件和目录都还在

这进一步证明了挂载和删除挂载点都只是系统层面为解决不同分区访问的特殊处理,挂载操作本身不会对文件做出任何处理。当没有挂载时,分区存在,数据存在,只不过只有挂载之后,我们才有机会从Linux系统层面对它从根目录进行访问。

(4)总结

当我们cd进入某一个目录里时,有可能我们根本没有进入对应的目录文件(目录文件真实存在),而实际上进入了一个分区,这是通过挂载点进行特殊实现的。只有当分区挂载到某个路径,我们才能通过路径的形式访问分区。

路径 = 挂载点(分区) + 该分区创建的目录Shell进程的属性保存这些信息,即时判断当前的分区,针对性的解读inode或是根据文件系统进行不同操作即可。

所有路径都是从根目录开始挂载的,甚至我们看到的根目录也是经过一层挂载的。

相关文章:

Linux相关概念和易错知识点(20)(dentry、分区、挂载)

目录 1.dentry (1)路径缓存的原因 (2)dentry的结构 ①多叉树结构 ②file和dentry之间的联系 ③路径概念存在的意义 2.分区 (1)为什么要确认分区 (2)挂载 ①进入分区 ②被挂…...

论 ONLYOFFICE:开源办公套件的深度探索

公主请阅 引言第一部分:ONLYOFFICE 的历史背景1.1 开源软件的崛起1.2 ONLYOFFICE 的发展历程 第二部分:ONLYOFFICE 的核心功能2.1 文档处理2.2 电子表格2.3 演示文稿 第三部分:技术架构与兼容性3.1 技术架构3.2 兼容性 第四部分:部…...

兵马未动,粮草先行-InnoDB统计数据是如何收集的

我们前面介绍查询成本的时候经常用到一些统计数据,比如通过SHOW TABLE STATUS可以看到关于表的统计数据,通过SHOW INDEX可以看到关于索引的统计数据,那么这些统计数据是怎么来的呢?它们是以什么方式收集的呢?本章将聚焦…...

oracle服务器意外宕机数据库启动失败故障处理记录

客户反馈由于服务器意外宕机,导致数据库业务不能正常运行,经过一番努力后通过redo日志恢复成功! 故障描述:ORA-00600: 内部错误代码, 参数: [krctcr_4], [1179922061], [1179942042], [], [], [], [], [], [], [], [], [] 现将主要…...

学习笔记——MathType公式编号:右编号和随章节变化

1.如何在word文档中插入带有编号的公式? 步骤:(前提是已经安装mathtype) 2.MathType公式编号怎么随章节变化? 想要编号级数也随标题级数进行自动变化,则需要插入或修改文档的“分隔符” 步骤:...

如何使用 SSH 连接并管理你的 WordPress 网站

在当今数字化的世界里,网站的管理与维护至关重要。对于使用 WordPress 搭建网站的用户而言,掌握基本的 SSH(安全壳)命令能够极大地简化网站管理工作。本指南将向你介绍 SSH 的基本知识,并教你如何通过 SSH 连接和管理你…...

力扣60. 排列序列

描述 力扣60. 排列序列 给出集合 [1,2,3,…,n],其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况,并一一标记,当 n 3 时, 所有排列如下: “123” “132” “213” “231” “312” “321” 给定 n 和 k,返回…...

Mac如何实现最简单的随时监测实时运行状态的方法

Mac book有着不同于Windows的设计逻辑与交互设计,使得Mac book有着非常棒的使用体验,但是在Mac电脑的使用时间过长时,电脑也会出现响应速度变慢或应用程序崩溃的情况,当发生的时候却不知道什么原因导致的,想要查询电脑…...

时间管理应用(可复制源码)

创建一个简单的时间管理应用程序&#xff0c;结合 Pomodoro 技术使用 HTML、CSS 和 JavaScript 1. HTML 创建一个基本的 HTML 文件 (index.html)&#xff1a; <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"&…...

SQL server 列转行

在 SQL Server 中&#xff0c;将列转换为行的操作通常被称为“透视”&#xff08;Pivot&#xff09;的逆操作&#xff0c;即“反透视”&#xff08;Unpivot&#xff09;。SQL Server 提供了 UNPIVOT 关键字来实现这一功能。假设你有一个表 EmployeeDetails&#xff0c;其中包含…...

aws申请ssl证书的方法【该证书仅供aws】

这里先声明&#xff0c;过程是对的&#xff0c;最终没有达到目的。 原本想着申请ssl证书替代&#xff0c;结果发现aws证书只能给自己的服务器用 但是整套申请证书以及下载&#xff0c;以及使用aws控制台的过程可以参考借鉴。 起因&#xff1a; 腾讯云的ssl证书越来越没法用了…...

Linux中目录配置标准的FHS

文件系统层次结构标准&#xff08;Filesystem Hierarchy Standard, FHS&#xff09;定义了Linux和其他类Unix操作系统中文件和目录的标准布局。FHS的目标是确保在不同的Linux发行版之间具有一致的文件系统结构&#xff0c;从而使软件能够在不同的系统上容易地安装和运行。 FHS…...

目标检测YOLO实战应用案例100讲-基于深度学习的人眼视线检测

目录 知识储备 视觉深度的测定 基本知识 视觉检测中的关键技术 单眼感知景深 内部摄像机距离的效果 Face ID 与3D传感技术 什么是Face ID? 3D传感技术原理 主动测距法 被动测距法 基于深度学习的人眼视线检测代码 数据集读取与预处理 卷积神经网络模型构建 模型…...

SpringCloud篇(微服务)

目录 一、认识微服务 1. 单体架构 2. 分布式架构 3. 微服务 3.1. 特点 3.2. 优点 3.3 缺点 二、微服务设计、拆分原则 1. AKF 拆分原则 2. Y轴&#xff08;功能&#xff09;关注应用中功能划分&#xff0c;基于不同的业务拆分 3. X轴&#xff08;水平扩展&#xff09…...

[每日一练]过去30天的用户活动

#该题目来源于力扣&#xff1a; 1142. 过去30天的用户活动 II - 力扣&#xff08;LeetCode&#xff09; Activity 表&#xff1a;------------------------ | Column Name | Type | ------------------------ | user_id | int | | session_id | int | …...

华为2288HV2服务器安装BCLinux8U6无法显示完整安装界面的问题处理

本文记录了华为2288HV2服务器安装BCLinux8U6无法显示完整安装界面&#xff0c;在安装过程中配置选择时&#xff0c;右侧安装按钮不可见&#xff0c;导致安装无法继续的问题处理过程。 一、问题现象 华为2288HV2服务器安装BCLinux8U6时无法显示完整的安装界面&#xff0c;问题…...

【python】OpenCV—findContours(4.6)

文章目录 1、功能描述2、代码实现3、效果展示4、完整代码5、涉及到的库函数cv2.inRange 6、参考 1、功能描述 给出一张仅含有手指的图片&#xff0c;判断图片中有多少根手指 2、代码实现 导入库函数&#xff0c;图像预处理 import numpy as np import cv2 as cv img cv.im…...

【C++】——多态

一.多态的概念 1.多态 多态(polymorphism)的概念&#xff1a;通俗的来说&#xff0c;就是多种形态。多态分为静态多态(编译时多态)和动态多态(运行时多态)&#xff0c;而我们讲的多态大部分都是动态多态。 静态多态主要就是我们前面了解过的函数模板和函数重载&#xff0c;它…...

Web前端开发--HTML语言

文章目录 前言1.介绍2.组成3.基本框架4.常见标签4.1双标签4.1.1.标题标签4.2.2段落标签4.1.3文本格式化标签4.1.4超链接标签4.1.5视频标签4.1.6 音频标签 4.2单标签4.2.1换行标签和水平线标签4.2.2 图像标签 5.表单控件结语 前言 生活中处处都有网站&#xff0c;无论你是学习爬…...

AI驱动的网络空间智能对抗;无人集群系统,多体协同算法创新和故障智能预警

目录 AI驱动的网络空间智能对抗 认知与认知域安全 认知攻击-杀伤链 PPDR主动安全框架 短视频内容分析 不良视频鉴别:人工+智能 舆情监测 非介入式监测 大模型对新闻内容审查与播报 无人集群系统,多体协同算法创新和故障智能预警 一、无人集群系统概述 二、多体协…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

前端导出带有合并单元格的列表

// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

Docker 本地安装 mysql 数据库

Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker &#xff1b;并安装。 基础操作不再赘述。 打开 macOS 终端&#xff0c;开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...