【Linux】文件系统和软硬链接

news2024/11/26 8:30:41

❤️前言

        今天的这篇博客主要是总结前几天学习的关于Linux系统下的文件系统以及软硬链接的内容。希望能对大家有所帮助。

正文

        我们今天要学习关于Linux下的文件系统——EXT2的知识,需要注意的是这里的文件和我们以前遇到的那些文件并不相同,以前我们主要是在研究一些被打开的文件,而我们现在要研究文件系统,则主要是将目光放在那些没有被打开的被存储于磁盘上的文件。

        除此之外,每个文件由文件属性和文件内容组成,其中文件内容存储在一个个数据块中,而文件属性则存储在一个叫做inode的东西之中。Linux在硬件中存储文件的方式是将文件的属性和内容分开存储的。

        那么Linux下的文件系统具体是怎么去存储一个文件的呢?先别着急,我们先从对相关的硬件也就是磁盘开始谈起。

认识硬件——磁盘

磁盘图片:

        磁盘是一个永久性存储介质,是计算机中唯一一个机械设备,也是一个外设。其中,磁盘被访问的最基本单元是扇区,扇区对应的大小是4KB也就是512字节。我们可以将一个磁盘看成非常多的扇区集合而成的一个存储介质,如果我们要讲一个数据存储到磁盘中,第一个需要解决的问题就是要寻找到一个扇区,其中磁盘有多个不同的扇面、扇面中有多个磁道,磁道中又有很多扇区。通过将这些信息编号,就可以基于编号一种磁盘独有的寻址方式,也就是使用Cylinder、Header、Sector三者信息所达成的CHS寻址方式。

        除此以外,如果大家对于磁盘有更深的兴趣,可以自行查找相关资料进行学习哦。

线性化理解磁盘的存储空间

        虽然我们看到磁盘真正的存储单元都是将圆形的扇面分成了许多的带状小段,但是我们其实可以将硬盘的存储空间在逻辑上线性化,也就是像一段非常非常长的数组。我们上面说过,磁盘的存储空间是以扇面、磁道和扇区进行编址过的,那么就可以将它抽象成数组,毕竟数组的下标也是编号,那么这里的编址就可以和编号相对应。

        具体点来说,我们只要知道一个磁盘中含有多少个扇面,一个扇面有多少个磁道,一个磁道有多少个扇区,不就可以进行编址吗,编址的行为就像这样:以扇区为最小单位空间,我们可以知道磁盘中总共有多少个这样的单位空间,那么这个数量可以平均分配给每个扇面,每个扇面分到相同多的最小单位空间以后,又可以平均分配到不同的磁道,这样就可以通过扇面在所有扇面中的编号(LBA地址)知道一个扇面属于哪一个扇面中的哪一个磁道中(CHS)。

文件系统

        在Linux下我们如果想要存储文件数据,就需要先进行磁盘分区,类似于我们上面讲的那样,磁盘分区就是将磁盘分成多个分区,不仅有利与对磁盘空间的管理,而且不同的分区还可以建立不同的文件系统。(这里不仔细讲了,有兴趣的话大家可以自行搜索答案,咱们这里并不太关心这个话题)

        当我们完成了磁盘的分区之后,接着就把磁盘中的某个分区格式化为某种格式的文件系统,这样磁盘才能存储文件。格式化文件系统的目的就是组织和管理磁盘中的文件。我们这里将会对Linux操作系统中最为常见的EXT2文件系统进行研究。(格式化:提前将部分文件系统的属性信息设置进对应的分区中,方便我们之后使用这个分区)

        EXT2 文件系统在格式化磁盘分区的时候一般会包含多个区块群组(block group)。EXT2 格式化后有点像下面这样:

        我们现在着眼于每个block group,如上图所示,每个 Block Group 都由下面几个组成部分:

  • Superblock(超级块)
  • Group Description(组描述)
  • Block bitmap(块位图)
  • Inode bitmap(inode 位图)
  • Inode table(inode 表)
  • Data Blocks(数据块)

        我们从右向左进行逐一介绍。

Data blocks

       我们上面说过,Linux操作系统中文件的文件属性和文件内容是分开存储的。这里的Date blocks就是用于存放文件内容的区域,其中Data blocks被分为很多很多的块(block),一个块的大小一般是4KB。另外,一般来说每个块都只包含一个文件的内容,如果一个文件比较大,会用多个块进行存储,如果一个文件比较小,小于一个块大小,则剩下的空间会被直接浪费。

inode Table

        inode Table 中存放着一个个 inode,每个inode都有自己的编号(以磁盘分区为界限),一个inode一般是128字节大小,inode 的内容记录单个文件的所有属性,inode 记录的主要的文件属性如下:

  • inode number  代表inode的编号
  • 该文件的读写权限(rwx)
  • 该文件的拥有者和所属组(owner/group)
  • 该文件的容量
  • 该文件的 ctime(创建时间)
  • 该文件的 atime(最近一次的读取时间)
  • 该文件的 mtime(最近修改的时间)
  • int blocks[15];这个数组记录着这个inode对应的文件的文件内容在当前区块群组的Data blocks中所占有的所有block的编号。其中当一个文件较小时block会一一索引数组下标,而文件比较大时就会采取特殊的索引方式。

        我们知道当系统需要管理某个资源,就需要对这个东西进行先描述,再组织。那么inode就是这个资源,首先描述它就是将它的所有属性封装成一个结构,再组织的过程就是将它“放进”inode Table和inode Bitmap并在这些数据结构中做操作。

inode Bitmap

        这个部分是一个位图,其中的比特位的位置与inode的编号映射起来,用于表示这个inode是否是有效的。

Block Bitmap

        这个位图中保存的是Data Block的使用情况,也就是将比特位的位置和块号对应映射起来,比特位的状态可以表现对应块是否被使用。

        那么我们现在来思考,如果我们删除一个文件,那么我们是否需要将其占用的所有块的内容(文件内容)全部清空呢?

        当然是不需要,我们只需要将这些数据块对应在位图中的状态设置为未使用的状态即可。(事实上,清空也没什么意义,毕竟一段数据是否为空白状态也是人为规定的)未使用状态下的数据块就可以被其他的文件拿来存储文件内容,可以说,数据块被删除后的状态就相当于允许被覆盖。

        所以平时当我们创建或者拷贝文件到我们的磁盘中时常常会花费较多的时间,但是删除文件却只需要较少的时间即可。(将数据写进块中是需要真的去一份份拷贝的,但是删除文件时就只需要在对应文件属性和文件内容的两个位图中将相应的位设置成删除的状态即可)

Group Description

        对当前块组进行描述,包含了有多少inode,起始的inode编号,有多少个inode被使用,有多少block被使用,还剩多少等待信息。

Super block

        文件系统的顶层数据结构,记录着整个磁盘分区的信息,记录的信息主要有:bolck 和 inode的总量,未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的时间,最近一次检验磁盘的时间等其他文件系统的相关信息。

文件名和目录

        上面我们聊了许多关于文件系统的事,知道了文件的inode存储着一个文件的所有文件属性,但我们作为用户在操作一个文件时,却从不关心inode,而使用文件名进行对应文件的指定。而且我们可以观察inode中的所有文件属性,其中并没有文件名。那么我们是怎么通过一个文件名对整个文件的文件属性和文件内容做操作的呢?

        那我们就需要了解到关于目录文件的一些知识:

        目录也是文件,它的inode编号与目录名的映射则需要在上级目录中得到,而上级目录又需要通过对应的上上级目录来得到inode和文件名的映射关系,从此往复找到根目录为止,但是这样的查找往往费劲,于是这里就产生了一个缓存机制,系统中保存着常用的文件路径,这样我们就可以很快地查找到常用目录下的文件。

软硬链接

        首先,我们可以通过chatgpt简单了解一下一些关于软硬链接的基础知识:

        在Linux系统中,软链接(Symbolic Link)和硬链接(Hard Link)是两种文件链接的方式,它们允许一个文件有多个路径指向它,从而提供了一些方便的功能。下面是对软链接和硬链接的解释:

软链接(Symbolic Link)

  1. 定义: 软链接是一个指向另一个文件的特殊文件,类似于Windows中的快捷方式。软链接包含指向目标文件的路径信息。

  2. 特点:

    • 可以跨越文件系统,甚至可以链接到不存在的文件。
    • 删除原始文件不会影响软链接,但如果软链接指向的文件被删除,软链接将失效。
    • 可以链接目录。
  3. 创建: 使用ln -s命令创建软链接,例如:

    ln -s /path/to/target /path/to/link
  4. 实例:

    ln -s /home/user/file /home/user/link
    

硬链接(Hard Link)

  1. 定义: 硬链接是文件系统中目标文件的另一种目录项,与原始文件的inode相同,实际上是相同的数据块。

  2. 特点:

    • 必须在同一文件系统内创建。
    • 删除原始文件并不影响硬链接,因为它们共享相同的inode。
    • 不可以链接目录。
  3.  创建: 使用ln命令创建硬链接,例如:

    ln /path/to/target /path/to/link
    
  4. 示例:

    ln /home/user/file /home/user/link
    

区别总结

  • 软链接允许链接到不存在的文件,而硬链接不允许。
  • 软链接可以跨越文件系统,而硬链接必须在同一文件系统内。
  • 删除软链接的目标文件不会影响软链接本身,但删除硬链接的目标文件并不会影响硬链接,因为它们共享inode。

        在选择使用软链接或硬链接时,需要根据具体的需求来决定。软链接通常用于跨文件系统链接或链接到目录,而硬链接通常用于在同一文件系统内创建文件的多个别名。

不允许建立目录的硬链接

        我们知道目录也是一种文件,那么当我们对目录进行硬链接的创建时会发生什么呢?

        我们会发现系统不让我们创建目录的硬链接,但是当我们查看当前目录的文件的详细信息时会发现我们经常使用的 . 和 .. 就是对当前目录和其父目录的硬链接。那么产生这种情况的原因是什么呢?

🍀结语

        今天的文章就分享到这啦!谢谢大家!

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

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

相关文章

安装配置Spark集群

安装Spark集群主要包括以下步骤: 1、下载Spark安装包,在各节点中安装部署spark集群 2、配置整合 3、启动并测试 下载Spark 可以从官方网站下载合适的版本。当前环境已经提供了安装包,存放在 /opt/software目录下。 在node1节点上安装Sp…

日期问题 刷题笔记

思路 枚举 19600101 到20591231这个区间的数 获得年月日 判断是否合法 如果合法 关于题目给出的日期 有三种可能 年/月/日 日/月/年 月/日/年 判断 是否和题目给出的日期符合 如果符合 输出 闰年{ 1.被4整除不被100整除 2.被400整除} 补位写法“%02d" 如果不…

数据“隐领”未来!【隐私计算实训营】限时免费招募!

数智经济时代,为强化个人隐私信息保护,国家颁布了《国家安全法》、《网络安全法》、《数据安全法》等数据安全法律法规,并严厉处罚数据违规出海、侵权、滥用等问题。数据安全和隐私保护成为大家的共识。隐私计算技术在此背景下应运而生&#…

Linux——线程(3)

在上一篇博客中,我介绍了关于Linux系统中pthread库线程的接口使用以 及对于pthread库的理解。但是我们单单会使用多线程的接口还不够,因为 在使用多线程解决问题的时候,由于进程中的数据对于其中的线程来说大 多是共享的,这也势必…

12双体系Java学习之局部变量和作用域

局部变量 局部变量的作用域 参数变量

找不到mfc140u.dll怎么办?修复缺失mfc140u.dll的多种方案分享

mfc140u.dll文件是一个重要的动态链接库文件,它在Windows操作系统中发挥着关键的作用。由于各种原因,例如应用程序冲突或系统错误等,mfc140u.dll文件有时会出现丢失的情况。一旦发生这种问题,运行依赖此文件的应用程序将无法正常启…

【C语言】初步解决指针疑惑

✨✨ 欢迎大家来到莉莉的博文✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 目录 一.理解内存和编址 1.1理解内存 1.2理解编址 二.指针变量和地址 1.1取地址操作符 三.指针变量和解引用操作符(*) …

设计模式八:观察者模式

文章目录 1、观察者模式2、示例3、spring中的观察者模式3.1 spring观察者模式的使用3.2 spring观察者模式原理解析 1、观察者模式 观察者模式(Observer Design Pattern),也叫做发布订阅模式(Publish-Subscribe Design Pattern)、模…

音视频学习笔记——c++多线程(二)

✊✊✊🌈大家好!本篇文章是多线程系列第二篇文章😇。首先讲解了利用mutex解决多线程数据共享问题,举例更好理解lock和unlock的使用方法,以及错误操作造成的死锁问题,最后讲解了lock_guard与unique_lock使用…

LEETCODE3

法一:记忆化递归 int climbStairsRecursive(int n, int* memo) {if (n < 2) {return n;}if (memo[n] > 0) {return memo[n];}memo[n] climbStairsRecursive(n - 1, memo) climbStairsRecursive(n - 2, memo);return memo[n]; }int climbStairs(int n) {int* memo (in…

QML 控件添加键盘事件

在QML中&#xff0c;可以使用Keys类型来处理键盘事件。以下是一个简单的示例&#xff0c;演示如何在QML控件中添加键盘事件&#xff1a; import QtQuick 2.12 import QtQuick.Window 2.12Window {visible: truewidth: 640height: 480title: qsTr("Hello World")Recta…

Linux的MySQL安装与卸载

安装与卸载 卸载安装配置yum源安装MySQL 声明一下本人用的Linux版本是CentOs7.9版本的。 卸载 如果我们用的云服务器&#xff0c;云服务器可能会自带MySQL或者mariadb&#xff08;其实就是MySQL的一个开源分支&#xff09;&#xff0c;如果我们不想用自带的&#xff0c;需要先…

理论学习 BatchNorm2d

import torch import torch.nn as nn# With Learnable Parameters m nn.BatchNorm2d(100) # Without Learnable Parameters m nn.BatchNorm2d(100, affineFalse) input torch.randn(20, 100, 35, 45) output m(input)print(output) print(output.shape)这段代码展示了如何使…

mybatis-plus-generator 使用 velocity 生成前后台代码

操作步骤 1&#xff09;准备mybatis-plus 生成代码的 vm文件 2&#xff09;添加依赖 mybatis-plus-generator 代码生成器的依赖 3&#xff09;执行工具方法生成代码 1、准备 mybatis-plus 生成代码的 vm文件 1&#xff09;找vm模板 去工程的 external Libraries 找到 mybati…

ES6基础6

Promise对象 Promise的含义 所谓Promise&#xff0c;简单说就是一个容器&#xff0c;里面保存着某个未来才会结束的事件&#xff08;通常是一个异步操作&#xff09;的结果。从语法上说&#xff0c;Promise是一个对象&#xff0c;从它可以获取异步操作的消息。Promise提供统一的…

深度学习笔记_8隐马尔可夫模型(HMM)

隐马尔可夫模型(Hidden Markov Model, HMM)是一种统计模型&#xff0c;在语音识别、行为识别、NLP、故障诊断等领域具有高效的性能。 HMM是关于时序的概率模型&#xff0c;描述一个含有未知参数的马尔可夫链所生成的不可观测的状态随机序列&#xff0c;再由各个状态生成观测随…

设计模式 -- 1:简单工厂模式

目录 代码记录代码部分 代码记录 设计模式的代码注意要运用到面向对象的思想 考虑到紧耦合和松耦合 把具体的操作类分开 不让其互相影响&#xff08;注意这点&#xff09; 下面是UML类图 代码部分 #include <iostream> #include <memory> // 引入智能指针的头文…

linux 模拟shell

&#x1f493;博主CSDN主页:麻辣韭菜-CSDN博客&#x1f493;   ⏩专栏分类&#xff1a;http://t.csdnimg.cn/G90eI⏪   &#x1f69a;代码仓库:Linux: Linux日常代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d;&#x1f5…

[linux] socket 非阻塞模式使用注意事项

在使用 socket 的一些 api 的时候&#xff0c;默认情况下都是阻塞模式。比如使用 tcp socket 时&#xff0c;客户端调用 connect() 创建连接&#xff0c;connect() 返回的时候要么是创建连接成功了&#xff0c;要么是出现了错误&#xff0c;反正 connect() 返回的时候结果是确定…

Unsupervised RL:METRA: Scalable Unsupervised RL with Metric-Aware Abstraction

ICLR 2024 Oral paper Intro 无监督RL旨在发现潜在的行为帮助提高下游任务效率以往方法集中于探索以及基于互信息的技能发现(skill)。然而去前者在高危复杂空间实现困难&#xff0c;后者也容易因为缺乏激励导致探索能力不足。本文提出METRA核心观点认为与其在复杂状态空间处理…