网站建设 万网/qq推广链接
目录
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电脑的使用时间过长时,电脑也会出现响应速度变慢或应用程序崩溃的情况,当发生的时候却不知道什么原因导致的,想要查询电脑…...

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

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

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

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

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

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

[每日一练]过去30天的用户活动
#该题目来源于力扣: 1142. 过去30天的用户活动 II - 力扣(LeetCode) Activity 表:------------------------ | Column Name | Type | ------------------------ | user_id | int | | session_id | int | …...

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

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

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

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.表单控件结语 前言 生活中处处都有网站,无论你是学习爬…...

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

推荐一款SSD硬盘优化器:Auslogics SSD Optimizer Pro
SSD Optimizer Pro 是一款专为优化固态硬盘 (SSD) 性能而设计的专业工具,旨在最大化 SSD 的效率,延长硬盘使用寿命。凭借简便的操作界面和强大的优化功能,SSD Optimizer Pro 可以让用户充分利用 SSD 的优势,从而获得更高的系统性能…...

k8s-service、endpoints、pod之间是怎么进行网络互通的
k8s-service、endpoints、pod之间是怎么进行网络互通的 1、service2、endpoints3、service、endpoints、pod通信图4、不通服务pod内部间访问 1、service 在K8S中,Service是一种抽象,定义了一组Pod的逻辑集合和访问这些Pod的策略。首先,我们需…...

Go语言开发商城管理后台-GoFly框架商城插件已发布 需要Go开发商城的朋友可以来看看哦!
温馨提示:我们分享的文章是给需要的人,不需要的人请绕过,文明浏览,误恶语伤人! 前言 虽然现在做商城的需求不多,但有很多项目中带有商城功能,如社区医院系统有上服务套餐、理疗产品需求、宠物…...

【51单片机】UART串口通信原理 + 使用
学习使用的开发板:STC89C52RC/LE52RC 编程软件:Keil5 烧录软件:stc-isp 开发板实图: 文章目录 串口硬件电路UART串口相关寄存器 编码单片机通过串口发送数据电脑通过串口发送数据控制LED灯 串口 串口是一种应用十分广泛的通讯接…...

高性能分布式缓存Redis-高可用部署
一、主从架构搭建 为什么要进行主从架构搭建,一台redis不行吗? ①、持久化后的数据只在一台机器上,因此当硬件发生故障时,比如主板或CPU坏了,这时候无法重启服务器,有什么办法可以保证服务器发生故障时数…...

如何使用XSL-FO生成PDF格式的电子发票的技术博文示例
目录 使用 XSL-FO 生成电子发票 PDF:从布局设计到优化为什么选择 XSL-FO?1. 初始设置2. 标题区块3. 买卖方信息4. 商品明细表格5. 合计信息6. 优化代码结构与布局7. 生成 PDF 文件8. 示例总结 使用 XSL-FO 生成电子发票 PDF:从布局设计到优化…...

TDengine 签约山东港,赋能港口数字化转型
随着全球港口物流数字化进程的加速,港口运营面临日益复杂的数据管理挑战,从能源管理、设备监控到运营安全保障,各类数据需要及时存储并高效分析。山东港在信息化建设过程中,数字化综合管理平台的性能和查询功能一度受到瓶颈制约。…...

基于YOLO11/v10/v8/v5深度学习的煤矿传送带异物检测系统设计与实现【python源码+Pyqt5界面+数据集+训练代码】
《------往期经典推荐------》 一、AI应用软件开发实战专栏【链接】 项目名称项目名称1.【人脸识别与管理系统开发】2.【车牌识别与自动收费管理系统开发】3.【手势识别系统开发】4.【人脸面部活体检测系统开发】5.【图片风格快速迁移软件开发】6.【人脸表表情识别系统】7.【…...

mysql-workbench 导入csv格式数据报错:Unhandled exception: Could not determine delimiter
xlsx文件中第二行某个单元格有换行符,csv文件中用双引号包起来了,但是python 在采样的时候,只读了前两行,readline可不认识csv的规则。csv文件可以识别双引号包起来的换行符是单元格内部的换行,python的readline识别不…...

使用Python简单实现客户端界面
服务端实现 import threading import timeimport wx from socket import socket, AF_INET, SOCK_STREAMclass LServer(wx.Frame):def __init__(self):wx.Frame.__init__(self, None, id1002, titleL服务器端界面, poswx.DefaultPosition, size(400, 450))# 窗口中添加面板pl …...