Linux 文件系统(下)

目录

一.文件系统

1.文件在磁盘上的存储方式

a.盘面、磁道和扇区

b.分区和分组

2.有关Block group相关字段详解

a.inode编号

b.inode Table(节点表)

c.Data blocks(数据区)

d.小结

二.软硬链接

1.软链接

a.软链接的创建

b.为什么要有软链接?

2.硬链接

a.硬链接的创建

b.硬链接是什么??

c.硬链接的应用场景


一.文件系统

在我们的电脑里,文件按照是否被进程打开可以分成两类:① 已加载到内存的文件;② 保存在磁盘中的文件。

我们知道,操作系统是计算机软硬件资源的管理者,而文件也是资源的一种,所以,操作系统需要对文件进行管理。上一篇博客中,博主主要讲解的是操作系统对第一类文件(加载到内存的文件)的管理;而本篇文章,博主会详解操作系统是如何管理保存在磁盘上的文件的!!

所以,什么是文件系统?--- 操作系统对没被打开的文件也要进行管理(增删查改),其管理的核心工作就是能够快速定位某一文件,这就需要我们有文件的路径,对这些没有被打开的文件进行管理的过程,称为文件系统。

而在学习操作系统对文件(磁盘文件)的管理之前,我们需要了解一个前置知识,即文件在磁盘上的存储方式!!

1.文件在磁盘上的存储方式

在了解文件在磁盘上的存储方式之前,我们可以了解一下磁盘的结构,虽然这涉及到磁盘的物理结构,较为枯燥,但这样可以帮助我们快速理解磁盘上数据存储的底层原理~~

a.盘面、磁道和扇区

盘面 --- 二进制数据都是直接存储在磁盘的盘面上,盘面会告诉转动,我们可以通过磁头读取盘面上的数据,磁盘上会有多个盘面,它们在我们人类的视角中是层状结构;但在计算机的逻辑中,所有的盘面都是线性的(连续的)。

磁道 --- 一个盘面上会有多个同心圆环,它们叫做磁道,是磁盘数据存储的次级单位(相较于盘面),磁头通过上下摆动来读取磁道中的数据,而且,在计算机的视角中,同一个盘面上的所有磁道都是线性的(连续的)。

扇区 --- 一个磁道上会存在多个扇区,扇区是磁盘数据存储的再次级单位(相较于磁道),由于盘面会告诉旋转,所以,即使磁头保持静止,也可以读取扇区中的连续数据,同理,在计算机的视角中,所有的扇区都是线性的(连续的)。

将磁盘的物理结构,抽象成计算机眼中的线性数组结构,这一过程,就是对磁盘理解的建模!!

b.分区和分组

有了分区和分组的概念,操作系统对磁盘上数据(文件)的管理,就变成了对某个 Block group 的管理,所以,我们接下来要学习的就是 Block group 中的各属性字段啦~~

2.有关Block group相关字段详解

格式化:每一个分区或分组在被使用之前,都必须先将这部分文件系统的属性信息写到对应分区或分组的Super block中,方便我们后续管理这个分区或分组!

a.inode编号

一般情况下,每个文件都要有独属自己的inode编号,inode编号在整个分区具有唯一性,Linux内核中,识别文件和文件名无关,只和inode编号有关。

ls -li (Linux系统中,查看文件的inode编号)

b.inode Table(节点表)

存放文件属性数据,如:文件大小、文件的所有者、文件最近修改时间等.

inode Table 内有多个inode结构体,而一个inode结构体如下:

struct inode{

    大小、权限、拥有者、所属组、ACM时间、inode编号 ... 等属性数据

    int blocks[N]; 存放文件内容数据的所有空间块的编号

};

c.Data blocks(数据区)

数据区就是一块较大的地址空间,该地址空间以一个个地址块为结构单元,每个地址块的大小一般都是4KB,并且每个地址块都有自己的编号,而已被使用了的编号会被保存在inode中的bitmap中和blocks[]数组里。

问:我们怎么知道inode表中有哪些结点已经被使用,哪些没被使用呢?

答:通过 inode Bitmap(位图),bit位的大小表示inode编号,bit位的内容(1/0)表示该inode编号是否存在。

同样的:

Block Bitmap(块位图):bit位的大小表示地址块的编号,bit位的内容(1/0)表示该地址块是否被使用。

所以,文件的删除只需要修改inode Bitmap 与 Block Bitmap这两个位图即可!!

d.小结

通过文件的inode编号 ——> 通过innode bitmap判断该innode是否存在,若存在 ——> 遍历inode table,找到对应的inode结构体——>找到文件的所有属性数据和内容数据(blocks数组)

创建一个文件,计算机的底层都做了哪些事?

一个文件的创建,首先要根据文件的cwd(当前工作目录)确定该文件在哪个分区和分组,然后再查 inode Bitmap,以由低到高的顺序找一个没被使用的bit位,先将该bit位置成1,然后将其换算成inode编号,并通过inode编号在inode Table中创建该inode结点,同时将文件的属性数据写入该inode结点中。接着,在Block Bitmap中找一个或多个没被使用的bit位,并将bit位的值写入inode结点中的blocks[]数组中,然后便可以将我们要写的内容写入数据区中的块地址内。

FILE* pf = fopen("./log.txt","r"); 执行这句代码时,操作系统底层做了些什么??

--- 是由进程打开了文件,通过进程的CWD(当前工作目录)找到log.txt的当前目录(确定文件在磁盘上的某个分区内),在当前目录的数据区内找到文件名和inode的映射关系,找到log.txt的inode编号,将inode内的log.txt文件属性数据加载到内存,在内存里面构建struct file结构体,并将log.txt文件的属性数据填充到struct file里面。同时,通过inode还可以找到log.txt的数据区,将数据区加载到内存构成文件缓冲区!最终将缓冲区里的数据拷贝到应用层,给用户读!

目录的本质也是一个文件,而文件=内容+属性,目录的属性我们知道,那么目录的“内容”是什么??--- 内容就是,该目录下,各文件名和文件inode的映射关系!!

注意:如果我们想要知道文件对应的inode,就要从该文件所在的目录内容中去查找,而想要查看目录的内容,就得先找到目录的innode编号,这就又得去目录的父目录的内容中去找,层层向上,直到根目录!!!

所以我们可以得知:

①为什么同一个目录下不能存在同名文件(因为文件名需要与innode编号构成映射关系).

②目录下,没有"写w"权限,我们就无法在该目录下创建文件(因为目录的内容,就是该目录下的子文件).

③目录下,没有“读r”权限,我们就无法查看文件(理由同上).

④目录下,没有“进入x”权限,我们就无法进入这个目录.

二.软硬链接

1.软链接

a.软链接的创建

ln -s  log  log.soft.link  表示:为log文件创建一个软链接,并将其命名为 log.soft.link

ls  -li (查看文件属性,包括“硬链接数”)

软链接是一个独立的文件,而硬链接不是!!

b.为什么要有软链接?

示例:

即,软链接相当于是给可执行程序创建了一个快捷方式让我们可以便捷的运行某一程序,它并不影响原文件的“引用计数”,软链接的内容是指向的目标文件的路径!!

通过软链接,我们可以快速找到某个文件,而无需该文件所在的目录,这就是软链接存在的最大价值!

可以用unlink解除软链接,如:unlink log.soft.link

2.硬链接

a.硬链接的创建

ln  text  text.hard.link  表示:为log文件创建一个硬链接,并将其命名为 log.hard.link

b.硬链接是什么??

---本质就是指定目录内的一组文件名和inode的映射关系!!

c.硬链接的应用场景

在Linux系统中,我们是从一个目录返回到上层目录(cd .. )的底层原理是什么呢?

我们知道,一个目录一定会有两个隐藏文件,即 '.' 和 '..',它们分别表示当前目录和上级目录,当前目录的存在使我们可以用相对路径的方式访问某一文件,上级目录的存在可以使我们回到上级目录,'.' 和 '..' 的本质其实就是当前目录和上级目录的一份硬链接。

所以,硬链接通常用于目录间的切换!!

注意:Linux系统不允许对目录建立“硬链接”---因为目录中若存在硬链接,那么可能会使某一文件路径形成环路!!

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

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

相关文章

数据湖 Data Lake-概述

Data Lake 1. 数据湖的定义 数据湖是一种存储系统,用于集中存储大量的原始数据,可以按数据本来的原始格式进行存储,用户可以在需要时提取和分析这些数据。 A data lake is a centralized repository designed to hold vast volumes of data …

kotlin的密封类

引言 密封类是一种特殊的类,它用来表示受限的类继承结构,即一个类只能有有限的几种子类,而不能有任何其他类型的子类。 这不就是JAVA的枚举么。 概念 密封类使用sealed关键字声明, 在Kotlin 1.0中,密封类的所有子…

OpenCV特征检测(4)检测图像中的角点函数cornerHarris()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 Harris 角点检测器。 该函数在图像上运行 Harris 角点检测器。类似于 cornerMinEigenVal 和 cornerEigenValsAndVecs,对于每个像素 (…

如何将生物序列tokenization为token?

原理讲解 tokenization是自然语言处理领域非常成熟的一项技术,tokenization就是把我们研究的语言转换成计算机能够识别的数字——token。 在生物领域,如何把核苷酸或氨基酸序列tokenization成token呢? 我们可以使用k-mer技术: k-m…

网络设备登录——《路由与交换技术》实验报告

目录 一、实验目的 二、实验设备和环境 三、实验记录 1.通过 Console 登录 步骤1:连接配置电缆。 步骤2:启动PC,运行超级终端。 步骤3:进入Console 配置界面 2.通过 Telnet 登录 步骤1:通过 Console 接口配置 Telnet 用户。 步骤2:配置 super 口令 步骤3:配置登录欢迎…

C++——求3*3矩阵对角元素之和。

没注释的源代码 #include <iostream> using namespace std; int main() { int a[3][3],i,j,sum0; cout<<"请输入a组中的元素:"<<endl; for(i0;i<2;i) { for(j0;j<2;j) { cin>>a[i][j]…

神经网络构建原理(以MINIST为例)

神经网络构建原理(以MINIST为例) 在 MNIST 手写数字识别任务中&#xff0c;构建神经网络并训练模型来进行分类是经典的深度学习应用。MNIST 数据集包含 28x28 像素的手写数字图像&#xff08;0-9&#xff09;&#xff0c;任务是构建一个神经网络&#xff0c;能够根据输入的图像…

吉首大学--23级题目讲解

7-1 单链表基本操作 在 C/C 中&#xff0c;.&#xff08;点&#xff09;和 ->&#xff08;箭头&#xff09;运算符用于访问结构体或类的成员&#xff0c;但它们的使用场景不同。 1. . 运算符 . 运算符用于访问结构体或类的成员&#xff0c;通过对象或结构体变量直接访问。…

JS函数部分

函数调用 无参数 var fun function() {console.log(被调用) //不区分单引号双引号}fun () //有无分号都可有参数 var fun function(a, b) {var sum abconsole.log(sum) }fun (10,20) 立即执行函数 被定义完立即调用&#xff0c;且执行一次 (function (){alert(ni);})()创建…

es的封装

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、类和接口介绍0.封装思想1.es的操作分类 二、创建索引1.成员变量2.构造函数2.添加字段3.发送请求4.创建索引总体代码 三.插入数据四.删除数据五.查询数据 前…

Element Plus 中Input输入框

通过鼠标或键盘输入字符 input为受控组件&#xff0c;他总会显示Vue绑定值&#xff0c;正常情况下&#xff0c;input的输入事件会正常被响应&#xff0c;他的处理程序应该更新组件的绑定值&#xff08;或使用v-model&#xff09;。否则&#xff0c;输入框的值将不会改变 不支…

windows环境下配置MySQL主从启动失败 查看data文件夹中.err发现报错unknown variable ‘log‐bin=mysql‐bin‘

文章目录 问题解决方法 问题 今天在windows环境下配置MySQL主从同步&#xff0c;在修改my.ini文件后发现MySQL启动失败了 打开my.ini检查参数发现没有问题 [mysqld] #开启二进制日志&#xff0c;记录了所有更改数据库数据的SQL语句 log‐bin mysql‐bin #设置服务id&#x…

梧桐数据库(WuTongDB):Volcano/Cascades 优化器框架简介

Volcano/Cascades 是现代关系数据库系统中使用的两种重要的查询优化器框架&#xff0c;它们用于将高层 SQL 查询转换为高效的执行计划。它们采用了一种基于规则的方式来探索各种可能的查询执行计划&#xff0c;目的是选择一个代价最小的计划。以下是对这两种框架的详细讲解&…

[数据集][目标检测]不同颜色的安全帽检测数据集VOC+YOLO格式7574张5类别

重要说明&#xff1a;数据集里面有2/3是增强数据集&#xff0c;请仔细查看图片预览&#xff0c;确认符合要求在下载&#xff0c;分辨率均为640x640 数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件…

Python 二级考试

易错点 电脑基础知识 定义学生关系模式如下&#xff1a;Student &#xff08;S#&#xff0c; Sn&#xff0c; Ssex&#xff0c;class&#xff0c;monitorS#&#xff09;&#xff08;其属性分别为学号、学生名、性别、班级和班长学号&#xff09; 在关系模式中&#xff0c;如果…

全志A523 系统篇(一) 获取vmlinux

通过固件获取 longan/build/getvmlinux.sh ./getvmlinux.sh <aw-format-firmware> 其中<aw-format-firmware>为全志格式的包含vmlinux的固件 运行成功后&#xff0c;会在脚本目录下生成output目录&#xff0c;目录里面包含vmlinux.fex&#xff08;vmlinux的.ta…

python-SZ斐波那契数列/更相减损数

一&#xff1a;SZ斐波那契数列题目描述 你应该很熟悉斐波那契数列&#xff0c;不是吗&#xff1f;现在小理不知在哪里搞了个山寨版斐波拉契数列&#xff0c;如下公式&#xff1a; F(n) { $\ \ \ \ \ \ \ \ \ \ \ \ $ a,( n1) $\ \ \ \ \ \ \ \ \ \ \ \ $ b,( n2) $\ \ \ \ \ \ …

【优选算法之双指针】No.2--- 经典双指针算法(下)

文章目录 前言一、双指针示例&#xff1a;1.1 ⽔果成篮1.2 和为s的两个数字1.3 三数之和1.4 四数之和 二、双指针总结&#xff1a; 前言 &#x1f467;个人主页&#xff1a;小沈YO. &#x1f61a;小编介绍&#xff1a;欢迎来到我的乱七八糟小星球&#x1f31d; &#x1f4cb;专…

git-fork操作指南

git-fork操作指南 1.fork github仓库2. clone fork仓库3. 分支修改4.与原始仓库保持修改同步4.1添加上游仓库4.2 拉取上游分支4.3 合并更改4.4 推送更改 参考&#xff1a; 有时候我们需要将github的项目fork到自己名下&#xff0c;然后修改并提交pull request&#xff0c;这里将…

安装黑群晖系统,并使用NAS公网助手访问教程(好文)

由于正版群晖系统的价格不菲&#xff0c;对于预算有限的用户来说&#xff0c;安装黑群晖系统成为了一个不错的选择&#xff08;如果您预算充足&#xff0c;建议选择白群晖&#xff09;。如您对宅系科技比较感兴趣&#xff0c;欢迎查看本文&#xff0c;将详细介绍如何安装黑群晖…