【Linux】-文件系统的详解以及软硬链接

news2024/11/24 16:23:53

在这里插入图片描述

💖作者:小树苗渴望变成参天大树🎈
🎉作者宣言:认真写好每一篇博客💤
🎊作者gitee:gitee✨
💞作者专栏:C语言,数据结构初阶,Linux,C++ 动态规划算法🎄
如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧!

文章目录

  • 前言
  • 一、认识硬件
    • 1.1磁盘是什么??
    • 1.2磁盘的具体存储细节
    • 二、文件系统
  • 三、软硬链接
    • 3.1软硬链接效果的展示
    • 3.2 概念讲解
  • 四、补充知识


前言

今天我们开始讲解文件系统,上一篇我们通过文件操作,解决了一系列我们之前只停留在表面的操作,例如文件操作,重定向,缓冲区这些,但是我们还是不知道什么是文件系统,因为我们上一片讲解的被打开的文件,加载到内存,不在文件系统管理范围的了,今天我们要说的是没有被打开的文件,此时是放在硬盘里面的,那么硬盘怎么讲我们这些没有被打开的文件给存储起来的呢。这篇带大家来理解一下,让我们对文件系统有重新认识了一下。


本章讲解顺序
1.认识硬件
2.在谈文件系统

一、认识硬件

大家应该都知道,我们的硬盘是储存计算机数据的,以为内存是一个有电设备,断电后上面的数据都没有了,所以需要一个在断电后存储数据的硬件,那就是硬盘,我们现代的硬盘几乎都是SSD了,但是在以前我们使用的都是磁盘,今天博主给大家讲解的硬件设备就是磁盘,因为磁盘的样貌适合我们去讲解的,现代的SSD和磁盘原理都是一样的,只是集成了,不便于我们去了解他的原理,博主讲通过图片的方式一一给大家进行讲解。


1.1磁盘是什么??

磁盘是唯一的一个是机械设备的外设,让我们一起来看看。,

我们打开看看磁盘里面的结构,非常的光亮,里面有许多结构,主要的是磁头和盘片,数据就存储在盘片上,在盘片运作的时候磁头会移到盘片上,来扫描盘片里面的数据,盘片的个数是按照磁盘的存储数据量的大小而决定的,数据越多盘片就越多,这是在出厂的时候就设定好了的,而这些盘片都是由一个马达一起带着转动的,同事旋转,转动速度都是一样的。我们的每一片盘片都有两面,每一面都可以存储数据,所以都必须有磁头,磁头是盘片的两本,而这些磁头也是另一个马达同时控制转动的,这些磁头俯视来看都是重叠在一起的,我们找数据必须在盘片上进行寻找,而这些都是通过磁头转到那个位置去定位到我们要找到的数据,此时就要知道是哪个磁头,就可以对应到哪个盘片,在通过磁头转动的角度来读取数据

盘片转动的速度可以达到每秒几万转,大家看图,磁头和盘片很近,但是不会接触,这样就不会导致盘片刮花,导致数据读取失败,我们最好不要开始的来回拌匀电脑,开机状态磁盘会转到盘片上,震动有可能使磁头上面抖动,挂到盘片,我们的一个磁盘在生产的时候都会在一个无尘的地方用封胶,防止灰尘对盘片有影响,拆开后的磁盘一般都报废了

有了上面的介绍我们大致知道磁盘是怎么工作的,但是里面的细节我们不知道,只知道磁头同时转,盘片同时转,磁头在盘片上就可以读取数据了,关于怎么存储,我们是不知道的,接下来解决这个问题

1.2磁盘的具体存储细节

我们来看一下更内部的结构
在这里插入图片描述
博主拿一面过来介绍。
在这里插入图片描述

按照上面的
盘面我们划分成四个区域,每一个都是同心圆,而这每个圆叫做磁道,这四个区域中的其中一个里面的黄色部分就是扇区,他是一条有弧度的线,里面都是二进制位,类似于这样在这里插入图片描述
磁头会发射电流使得这上面的数据0/1之间来回变化的。大家看到垌一个区域上扇区的长度是不一样的,这样就导致不均匀,但是现在已经几乎均匀了,是通过盘片不同位置的密度所控制的,来圆心近一点的二进制位离得近一些,则反之.扇区是我们磁盘最基本的单位–512字节/4kb,(为什么是这个大小呢,这是一些数学家算出来这样的大小有利于提高整机效率,具体的博主也不清楚)磁盘可以看成是无数个扇区组成的存储介质

我们是通过磁头来将数据写入盘片,此时第一个要解决的问题就是定位一个扇区,就是先定位时哪个盘面(这是通过哪个磁头决定的),再定位到哪个磁道,最后就可以定位到是哪个扇区。

在这里插入图片描述


解决上面的问题:对磁盘进行逻辑结构分析
相信在我们这个年纪的人,在小时候应该都见过磁带,博主经常在英语听力的时候看到。
在这里插入图片描述

我们的磁带也是存储数据的,把他扯出来就是一个长长的直线,为什么磁带要设计成圆形??(因为这样可以更多的增加磁带的长度,增加磁带的存储容量),磁带扯出来以后整体就想一个数组,此时我们的磁盘就也可以抽象成数组,假设我们磁盘有三个盘片,就有六个磁头,把每个盘片分成10个磁道,每个磁道分成5个扇区,我们的数组就可以划分成如下图
在这里插入图片描述
此时我们就把磁盘的物理结构就变成了逻辑结构,只要给我一个数组下标,就可以计算出对应的盘片,磁头,磁道。


假设每个盘片2W个扇区,每个盘片有50个磁道,这样就可以算出每个磁道有400个扇区。外部传进来数组下标是28888
在这里插入图片描述
逻辑地址又叫LBA地址,这样我们就可以通过LBA地址计算出来磁盘的CHS地址,反过来计算也可以。

再次回归到硬件,我们之前说过不止CPU有寄存器,其他外设也有,当然这也包括磁盘在这里插入图片描述

所以大家应该知道我们是怎么让磁盘获得数组下标在进行转化的吧。

二、文件系统

我们知道可以从逻辑结构专程物理结构,那么我们接下来就在逻辑地址上进行讲解,因为逻辑结构是我们所熟悉的结构。
Linux下一切皆文件,这个大家都知道了,我们磁盘里面也存储了许多没有被打开的文件,那么这些文件不可能在磁盘里面里面随便放着,从进程开始我们就开始讲解管理,方便我们去操作,所以我们磁盘里面的文件也需要管理,这样读取文件的时候就方便。假设我们的磁盘有800G的容量,这太大了,管理起来太麻烦,所以我们要进行划分,将它划分成200G左右的,但是也太大了,在瓜分成10G的,把这10G管理好,其余区域复制粘贴过去较好,来看划分图,所以分区就是我们电脑上的C盘,D盘

在这里插入图片描述

此时我们的重点就来到最底下的一幅图,大家应该都不理解,接下来博主就来给大家一一介绍


最底下的一幅图就是我们的文件系统

**(1)**启动块(Boot Block),这个大小是设定好的
**(2)**Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相同的结构组成。 将着10个g的空间瓜分成n个block group,接下来我们介绍其中一个block group
**(3)**datablocks:这是数据块,里面有很多小块,大小都是4kb,里面存放的都是内容,所以存文件内容的区域,以块的形式呈现。
**(4)**inode table:这是属性数据块,里面存放单个文件的所有属性,一般而言,一个文件一个inode,inode是一个结构体,大小是128字节,这个结构体里面还有一个inode编号。
在这里插入图片描述

大家应该看到博主把里面的其中三个属性标红了吗,这是我们今天所讲的重点。第一个标红的属性是唯一标识文件的,只有找到他才能找到我们的文件所存储的位置,第二个标红的属性,等到讲解软硬件链接的时候再说,第三个标红的属性是找对应的数据块(在上面我们说过datablock被分成很多小块,每个小块大小为4kb,我们给这些小块设置下标,一个文件可能占用的不止一个小块而是多个,而第三个属性是一个数组,大小一般为15,他里面的内容就是小块的下标,这样就形成了映射了,有的人会说,一个小块4kb,数组才15个,这才可以对应60kb大小的文件啊,当文件特别大的时候,数组就不够,难道会扩容??答案是不会扩容,我们的数组前12个位置是直接映射关系,里面存放的是小块对应的编号,后面三位是间接映射关系,我们数据块里面规定好了,不止可以存放文件的数据,也可以存放其他小块的编号,后三位的前两位是两级索引,里面存放的也是小块的编号,只不过这个小块里面的内容是其他小块的编号,4kb的大小为4512字节,一个编号是一个整型,大小是4字节,所以两个小块可以存放1024个编号,大小变成了4096kb=4MB,最后一位是三级索引,里面存放的是小块的编号,里面的内容依旧存储编号可以存储512个小块的编号,在继续往下面的小块里面存储编号,每个小块又可以存储512个小块编号,此时就有512512=262144个小块,每个小块存储的数据大小为4kb,可以存储4*262144=1048576kb=1GB)来看图解,理解一下:
在这里插入图片描述
通过上面的讲解我们的文件是怎么存储了的吧,还有一个重要点的就是文件系统里面的文件属性和文件内容是分开存储的

(5)block bitmap:用来标识我们数据块有没有被使用,比特位的位置和块号映射起来,比特位的内容,就是表示该块有没有被使用,所以我们删除一个文件的时候,不需要讲数据块里面的内容清空,只需要将对应的比特位置0就可以了,下次在使用此位置就直接覆盖就行了,所以大家有没有发现,下载很大的文件时间很长,但是删除一个文件的时候速度很快,原因就在这里。大家如果误删一个文件后,其实可以恢复,蛋需要专业的软件和技术人员,将比特位置1,就可以了,但是此时你这块位置没有被使用过,不然内容就被覆盖了,所以误删最好就是什么都不要动,交给专业的人。

(6) inode bitmap:用来标识我们的inode有没有被使用,比特位的位置和inode的标号映射起来,这个inode的个数是在分区的时候就划分好的,个数是确定好的,当inode使用完了,而数据块还有,也是创建不了文件的,数据块没有,inode还有也创建不了文件。所以接下来就有了我们super block
(7) super block:文件系统的基本信息
里面包含了整个分区的基本使用情况(一共多少个组,每个组的大小,每个组的inode数量,每个组的block数量,每个组的起始inode,文件系统的类型与名称等),这是每个分区里面的属性,不会在每个分组里面都有的,一般只在开头。所以在每个分区使用前,都必须提前将部分文件系统属性的信息提前设置进对应的分区中,方便我们后续使用这个分区或者分组,这也叫格式化

(8) Group Descriptor Table:这是描述一个分组里面的情况,有多少数据使用,还剩多少,有多少inode被使用,还剩多少,一些属性的。


inode vs 文件名

我们的一切根源都是通过inode去操作的,找到文件:inode编号->分区特定的分组->inode->属性->内容。在Linux系统中,一个文件,一个inode,每个inode都有自己的inode编号(inode的设置,是以分区为单位的,不能跨分区),inode标识文件的所有属性,文件名并不属于inode这个结构体里面的属性,那我们怎么知道一个文件的inode编号的呢??我们用户从来没有使用过inode,我们一直使用的是文件名,所以这两者肯定有一种联系。这就要依托于我们的目录结构,我们的目录也是文件,有自己的inode, 就可以找到对应的数据块,那数据块里面存储的是什么内容呢??但是就是文件名和inode的映射关系,两者互为key值。这样我们操作文件名,就间接操作了inode了。因为inode是唯一的,所以统一目录下不能有同名文件

此时大家理解一下:

  1. 目录下,没有w,我们就无法创建文件
  2. 目录下,没有r,我们就无法查看文件
  3. 目录下,没有x,我们就无法进入文件
    在思考一下:
    新建文件,删除文件,查找文件,修改文件,系统要做什么??,这个问题博主交给读者,相信学习了上面的内容,我认为聪明的你肯定知道思考题的答案。

三、软硬链接

3.1软硬链接效果的展示

在讲解软硬件链接的时候,先不讲概念,先让大家看到软硬件链接怎么去操作,长什么样,才能更好的给大家讲解,就好比先给大家看看磁盘结构,在讲原理,大家才能更好的理解。
我们来看操作结果。
在这里插入图片描述

我们的第一个是建立文件的硬连接,第二个是建立文件的软链接,在ls上加一个-i选项就可以查看到文件的inode,对于软硬件链接,我们看到最明显的区别就是硬连接和原文件是同一个inode,所以说明硬连接没有创建新的文件,而软链接有一个属于自己的inode.两者的删除使用unlink,可能使用rm kennel不行,但是删除后都不会影响原文件。

3.2 概念讲解

通过上面的演示,我们看到两者出现了不同的效果:
(1)软链接的理解
软链接有自己独立的inode,也就是一个独立的文件,有自己的inode编号,和数据块,里面的内容存储的是指向原文件的路径,上面的演示是在同一目录下建立的软链接,看不出来优势,接下来给大家展示一下不同目录下建立软链接文件。在这里插入图片描述
软链接的应用场景
我们通过软链接,把深路径的程序在浅路径执行出来了,大家有没有发现这就是我们windows下的桌面快捷方式,相信大家小时候卸载软件都是直接把桌面的图标给删除了就认为都删除了,但实际上,只是删除掉快捷方式的文件,真正的可执行程序在你安装目录下存在着呢。

注意:我们软链接文件里面存储的是指向原文件的路径,所以只删除软链接文件么有问题,但是只删除原文件就会出现问题

(2)硬连接的理解
硬连接文件和原文件是同一个inode,可以理解为硬连接是我们原文件的一个别名,其实可以理解为互为别名,删除任意一个其他的都不受影响,大家还记得我们在介绍inode结构体的时候,说第二个标红的属性引用计数后面来讲,此时就是讲解他的最好时机。
在这里插入图片描述
这一串数字表示的就是硬连接数,当删除一个文件的时候,只有等到硬连接数减到0的时候,才会删除,不然只会计数减减,他家有没有发现技术有时候是相同,这个引用计数在智能指针,文件描述符表,和硬连接数都出现了,所以系统方面的知识连贯性很大。

硬连接具体做了什么,就是在指定目录下(可以不在同一个目录下),建立文件名和指定inode的映射关系–仅此而已

硬连接的应用场景
他的应用场景不是很多,但是运用在广泛的是进行目录间的切换。
我们先来创建一个目录文件
在这里插入图片描述

普通文件的默认硬连接数是1,目录文件的默认的硬链接数是2

我们来看一下此目录文件的inode
在这里插入图片描述
我们看到目录文件在一开始就要两个隐藏文件 点点代表当前路径,点点代表上一路径,所以点文件和当前文件的inode是同一个。
在这里插入图片描述


硬链接不允许给目录,软链接可以。
在这里插入图片描述

为什么硬链接不允许给目录呢??
这样会造成环路问题,我们的操作文件的前提是查找到这个文件,所以路径是方便我们查找的,所以查找回在路径文件里面去查找,如果在一个目录里面有硬链接后的路径文件,就要可能往回找了
在这里插入图片描述
所以我们才可以使用相对路径去进行操作,那点和点点不就是对目录进行硬链接?而且点和点也是存在环路问题啊?为什么可以呢?原因是这是系统自带的,人家可以,我们用户不可以,所以可以进行硬链接,而我们搜索路径的时候,不去点和点点里面进行搜索,这样就避免了环路。

四、补充知识

先发布,晚点再来补充,各位读者们。

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

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

相关文章

【Qt之QWizard】使用1

QWizard使用 描述方法枚举:enum QWizard::WizardButton枚举:enum QWizard::WizardOption枚举:enum QWizard::WizardStyle枚举:enum QWizard::WizardPixmap常用成员方法槽函数信号 示例设置标题添加page页设置按钮文本设置自定义按…

H5游戏源码分享-超级染色体小游戏

H5游戏源码分享-超级染色体小游戏 游戏玩法 不断地扩大发展同颜色的色块 用最少的步数完成游戏 <!DOCTYPE html> <html><head><meta charset"UTF-8"><meta name"viewport"content"widthdevice-width,user-scalableno,init…

Linux shell编程学习笔记25:tty

1 tty的由来 在 1830 年代和 1840 年代&#xff0c;开发了称为电传打字机&#xff08;teletypewriters&#xff09;的机器&#xff0c;这些机器可以将发件人在键盘上输入的消息“沿着线路”发送在接收端并打印在纸上。 电传打字机的名称由teletypewriters&#xff0c; 缩短为…

学习samba

文章目录 一、samba介绍二、samba的主要进程三、配置文件四、例子 一、samba介绍 1、SMB&#xff08;Server Message Block&#xff09;协议实现文件共享&#xff0c;也称为CIFS&#xff08;Common Internet File System&#xff09;。 2、是Windows和类Unix系统之间共享文件的…

Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图,Kotlin(6)

Android拖放startDragAndDrop拖拽Glide灵活加载堆叠圆角图&#xff0c;Kotlin&#xff08;6&#xff09; Android拖放startDragAndDrop拖拽Glide加载堆叠圆角图&#xff0c;Kotlin&#xff08;5&#xff09;-CSDN博客文章浏览阅读1.3k次。&#xfeff;&#xfeff;Android Dyna…

Python---集合中的交集 、并集 | 与差集 - 特性

用 & 来求两个集合的交集&#xff1a;-----键盘上的7上的符号&#xff0c;shift 7 同时按 用 | 来求两个集合的并集&#xff1a; -----键盘上的7上的符号&#xff0c;shift 同时按&#xff08;就是enter键上面那个|\ &#xff09; 用 - 来求两个集合的差集&#xff…

dbeaver导入sql脚本报错:unhandled event loop exception java heap space

在DBeaver里执行一个有8w条数据的sql文件&#xff0c;只保存了2k条 错误原因见&#xff1a; https://blog.csdn.net/liu_feng_zi_/article/details/122578880文章作者所描述的&#xff1a; 使用dbeaver连接MySQL数据库&#xff0c;在通过sql脚本插入数据&#xff0c;或将插入语…

模拟散列表(哈希表拉链法)

维护一个集合&#xff0c;支持如下几种操作&#xff1a; I x&#xff0c;插入一个整数 x&#xff1b;Q x&#xff0c;询问整数 x 是否在集合中出现过&#xff1b; 现在要进行 N 次操作&#xff0c;对于每个询问操作输出对应的结果。 输入格式 第一行包含整数 N&#xff0c;…

【论文阅读】(VAE-GAN)Autoencoding beyond pixels using a learned similarity metric

论文地址;[1512.09300] Autoencoding beyond pixels using a learned similarity metric (arxiv.org) / 一、Introduction 主要讲了深度学习中生成模型存在的问题&#xff0c;即常用的相似度度量方式&#xff08;使用元素误差度量&#xff09;对于学习良好的生成模型存在一定…

【C++】类与对象 I

类与对象 I &#xff1a; 前言&#xff1a;&#xff08;C&#xff09;面向过程 和&#xff08;C&#xff09;面向对象 初步认识前言&#xff1a;类的引入一、类的介绍二、类的定义&#xff08;一&#xff09;class 语法&#xff08;二&#xff09;类的两种定义方式&#xff1a;…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第七章 muduo编程示例(下)

7.5 一种自动反射消息类型的Protobuf网络传输方案 本节假定读者了解Google Protocol Buffers是什么&#xff0c;这不是一篇Protobuf入门教程。本节的示例代码位于examples/protobuf/codec。 本节要解决的问题是&#xff1a;通信双方在编译时就共享proto文件&#xff08;用于定…

解密N数之和问题的秘密

目录 两数之和三数之和 两数之和 我们来看力扣第一题 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一…

jetson配置笔记

typora-root-url: /home/msj/ubuntu笔记本台式机环境配置说明/images Ubuntu18.04 配置 说明&#xff1a;我们所有文档配置都是按照ubuntu18.04&#xff0c;保证x86架构(笔记本台式机)和 ARM架构(jetson Nano只能安装18.04)的一致性 1. 更换各类源 我们所有源都更换清华源&a…

一文说清楚Openai的这波更新内容,大地震 一大波套壳公司倒闭

前几天Openai召开了首届的开发者大会&#xff0c;45分钟的会议&#xff0c;让千万用户感到兴奋&#xff0c;但是让万千的套壳的创业公司&#xff0c;却感觉如坐针毡。这次发布会发布了哪些功能&#xff1f;为什么会导致这种情况的发生&#xff1f;让我们接着往下讲 API升级且降…

振南技术干货集:深入浅出的Bootloader(5)

注解目录 1、烧录方式的更新迭代 1.1 古老的烧录方式 (怀旧一下&#xff0c;单片机高压烧录器。) 1.2 ISP 与ICP 烧录方式 (还记得当年我们玩过的 AT89S51?) 1.3 更方便的 ISP 烧录方式 1.3.1串口 ISP &#xff08;是 STC 单片机成就了我们&#xff0c;还是我们成就了…

以阿里云全球故障为例,聊聊如何保障 Auth 服务的 SLA

在刚刚过去的“双十一”购物狂欢季&#xff0c;阿里云经历了一次大规模故障&#xff0c;导致阿里系产品集体中断服务。据报道&#xff0c;11 月 12 日&#xff0c;淘宝、钉钉、闲鱼、阿里云盘等阿里系产品出现无法使用的问题&#xff0c; “阿里全系产品崩了” 的话题迅速引发众…

龙迅LT9211D MIPI(DSI/CSI)转LVDS和集创北方ICN6202 MIPIDSI转LVDS比对

龙迅LT9211D描述&#xff1a; Lontium LT9211D是一款高性能的MIPI DSI/CSI- 2到双端口LVDS转换器。LT9211D反序列化输入的MIPI视频数据&#xff0c;解码数据包&#xff0c;并将格式化的视频数据流转换为AP和移动显示面板或摄像机之间的LVDS发射机输出。LT9211D支持最大14 dB输…

【luckfox】0、开发环境搭建

前言 本章简单介绍如何搭建luckfox的开发环境。 一、抓取luckfox源码 需要提前准备好ubuntu环境。 git clone https://github.com/LuckfoxTECH/luckfox-pico.git二、编译 youkaiubuntu:/home/luckfox/luckfox-pico$ ./build.sh lunchyoukaiubuntu:/home/luckfox/luckfox-p…

二十、泛型(7)

本章概要 动态类型安全泛型异常混型 C 中的混型与接口混合使用装饰器模式与动态代理混合 动态类型安全 因为可以向 Java 5 之前的代码传递泛型集合&#xff0c;所以旧式代码仍旧有可能会破坏你的集合。Java 5 的 java.util.Collections 中有一组便利工具&#xff0c;可以解…

ubuntu中使用 vscode 连接docker开发环境

文章目录 ubuntu中使用 vscode 连接docker开发环境步骤一&#xff1a;安装 Remote Development 插件步骤二&#xff1a;连接远程环境步骤三&#xff1a;开发 问题解决参考连接 ubuntu中使用 vscode 连接docker开发环境 Remote Development 是一个 Visual Studio Code 插件&…