【Linux】文件系统与软硬连接

在这里插入图片描述

欢迎来到Cefler的博客😁
🕌博客主页:折纸花满衣
🏠个人专栏:题目解析
🌎推荐文章:【LeetCode】winter vacation training

在这里插入图片描述


👉🏻 磁盘

当你谈论磁盘时,通常指的是计算机存储设备中的硬盘驱动器(HDD)或固态驱动器(SSD)。它们都是用于存储和检索数据的重要组件。

硬盘驱动器(HDD):硬盘驱动器使用旋转的磁盘和移动的读写头来存储和访问数据。它由一个或多个磁性盘片组成,每个盘片上都有一个磁性涂层。读写头在盘片上移动,通过磁场读取或写入数据。硬盘驱动器的优点包括较大的存储容量和相对较低的成本

固态驱动器(SSD):固态驱动器使用闪存芯片来存储数据,而不需要任何移动部件。它类似于您在手机、平板电脑或USB闪存驱动器中使用的存储设备。固态驱动器的优点包括更快的数据访问速度、更高的数据传输速率和更好的耐用性。然而,与硬盘驱动器相比,它们通常具有较小的存储容量,并且价格相对较高。

无论是硬盘驱动器还是固态驱动器,它们都是计算机中重要的存储设备。它们用于存储操作系统、应用程序、文件和其他数据,并且对于计算机的整体性能至关重要。

HDD的物理存储结构

在这里插入图片描述
HDD(硬盘驱动器)是一种常见的存储设备,用于在计算机系统中保存和检索数据。它由以下几个主要硬件组成部分组成:

  1. 盘片(Platters):是HDD的主要部分,通常由金属或玻璃制成的圆盘形结构。数据存储在盘片的表面上,每个盘片都有两个表面。

  2. 磁头(Read/Write Heads):位于盘片的表面上,负责读取和写入数据。磁头可以感应盘片上的磁性颗粒,并将其转换为数字数据或将数字数据转换为磁性颗粒。

  3. 手臂(Actuator Arm):连接磁头的部分。手臂可在盘片上移动,将磁头定位到指定的磁道上以读取或写入数据。

  4. 主轴电机(Spindle Motor):驱动盘片旋转的电机。主轴电机使盘片以高速旋转,通常每分钟数千转。

  5. 逻辑板(Logic Board):位于HDD的电路板上,负责控制和管理HDD的操作。逻辑板上包含处理器、内存芯片和接口电路等组件。

  6. 运动控制器(Controller):连接逻辑板和手臂,负责控制手臂的移动,并确保磁头正确定位到指定的磁道上。

以上是HDD的主要硬件组成部分。它们密切协作以实现数据的读取和写入操作。

磁盘的逻辑抽象结构

在这里插入图片描述

👉🏻磁盘文件系统

常见磁盘文件系统

磁盘文件系统是一种用于在计算机硬盘驱动器上组织和管理文件和文件夹的方法。它定义了文件和目录的结构、命名规则、访问权限以及如何在物理介质上存储和检索数据。

以下是几种常见的磁盘文件系统:

  1. FAT(文件分配表):FAT是一种较早的文件系统,最早由微软引入。它使用文件分配表来跟踪文件在磁盘上的存储位置,并支持文件和目录的命名。FAT文件系统广泛应用于早期的Windows操作系统和可移动存储介质(如磁盘和闪存驱动器)。

  2. NTFS(新技术文件系统):NTFS是微软开发的一种高级文件系统,用于Windows NT系列操作系统(包括Windows XP、Windows 7、Windows 10等)。它提供了更高级的功能,如对大容量硬盘的支持、文件压缩、访问控制和日志记录等。

  3. ext4:ext4是Linux操作系统中广泛使用的文件系统,是对先前的ext3文件系统的改进。它提供了更高的性能和可靠性,并支持更大的文件和文件系统容量。

  4. HFS+(Mac OS 扩展):HFS+是苹果公司在早期Mac OS系统中使用的文件系统。它支持文件和目录的命名、访问权限以及对大容量存储介质的支持。

  5. APFS(Apple 文件系统):APFS是苹果公司在最新的macOS和iOS系统中引入的先进文件系统。它具有高级的数据完整性和安全性功能,并支持快照、加密和快速文件系统操作等。

这些是常见的磁盘文件系统,不同的操作系统和应用场景可能会选择不同的文件系统来满足其特定需求。

磁盘文件系统组成部分

磁盘文件系统通常由以下几个组成部分组成:

  1. 分区表(Partition Table):分区表是磁盘上的一个特殊区域,用于记录分区的信息。它定义了磁盘上各个分区的位置、大小和类型等信息。

  2. 引导扇区(Boot Sector):引导扇区位于分区表之前,是磁盘上的第一个扇区。它包含引导加载程序(Boot Loader),用于启动操作系统。引导扇区也包含了其他文件系统的元数据和相关配置信息。

  3. 文件分配表(File Allocation Table):文件分配表是一种常见的文件系统结构,例如FAT文件系统。它记录了文件在磁盘上的存储位置和状态信息,以及文件和目录的命名信息。

  4. 超级块(Superblock):超级块是文件系统的关键元数据结构之一。它包含了文件系统的整体信息,如文件系统类型大小块大小inode表的位置等。超级块在文件系统初始化时创建,并在运行时被读取以获取文件系统的元数据信息。

  5. Inode(Index Node):Inode是文件系统中的索引节点,用于存储文件和目录的元数据,如文件大小、权限、所有者等。每个文件和目录都对应一个唯一的Inode节点

  6. 数据块(Data Blocks):数据块是用于存储实际文件内容的区域。文件系统将文件内容分割成多个数据块,每个数据块通常有固定的大小(如4KB)。文件系统通过Inode节点中的指针将数据块链接在一起,以构建和管理文件的存储。

这些组成部分共同构成了磁盘文件系统的结构和功能,使得文件和目录可以被组织、存储和访问。不同的文件系统可能会有稍微不同的组成部分和实现方式,但大体上都包含了类似的概念和结构。

下面举Linux下的ext2文件系统图来深入了解
在这里插入图片描述

  • Block Group:ext2文件系统会根据分区的大小划分为数个Block Group。而每个Block Group都有着相
    同的结构组成。政府管理各区的例子
  • 超级块(Super Block):存放文件系统本身的结构信息。记录的信息主要有:bolck 和 inode的总量,
    未使用的block和inode的数量,一个block和inode的大小,最近一次挂载的时间,最近一次写入数据的
    时间,最近一次检验磁盘的时间等其他文件系统的相关信息。Super Block的信息被破坏,可以说整个
    文件系统结构就被破坏了

Super Block之所以在多个Block Group存在,就是为了防止一个Super Block的信息被破坏导致整个
文件系统结构就被破坏

  • GDT,Group Descriptor Table:块组描述符,描述块组属性信息
  • 块位图(Block Bitmap):Block Bitmap中记录着Data Block中哪个数据块已经被占用,哪个数据块没
    有被占用
  • inode位图(inode Bitmap):每个bit表示一个inode是否空闲可用。
  • i节点表:存放文件属性 如 文件大小,所有者,最近修改时间等
  • 数据区:存放文件内容

一个文件对应一个inode编号,linux中根据inode编号识别文件,与文件名无关。

因为有了块位图和inode位图,操作系统对文件的管理就非常轻松了,我们想创建一个文件时,就在inode位图中查看哪个比特位为0(即未被使用),此时就可以将该位置比特位对应的i节点表中的inode编号赋这个文件。块位图也是同理,只是对文件内容的分配进行处理。

所以删文件只要改位图,这就解释为什么下载文件慢,而删除文件就非常快了,而且文件之所以能够恢复,就是因为我们只是更改了位图的状态,实际上在数据块中的数据没有清除。但是,如果我们不小心误删了文件,尽量不要进行文件操作,因为新的文件操作可能会将新的文件内容覆盖到我们原本删除的文件对应的数据块,如果数据块的内容被覆盖了,即使文件恢复了,也不是原来的模样了。

创建一个文件的具体过程

[root@localhost linux]# touch abc
[root@localhost linux]# ls -i abc
263466 abc

在这里插入图片描述

🧆 创建一个新文件主要有一下4个操作:

  1. 存储属性
    内核先找到一个空闲的i节点(这里是263466)。内核把文件信息记录到其中。
  2. 存储数据
    该文件需要存储在三个磁盘块,内核找到了三个空闲块:300,500,800。将内核缓冲区的第一块数据
    复制到300,下一块复制到500,以此类推。
  3. 记录分配情况
    文件内容按顺序300,500,800存放。内核在inode上的磁盘分布区记录了上述块列表。
  4. 添加文件名到目录
    新的文件名abc。linux如何在当前的目录中记录这个文件?内核将入口(263466,abc)添加到目录文
    件。文件名和inode之间的对应关系将文件名和文件的内容及属性连接起来。

dentry

dentry(Directory Entry)是Linux文件系统中的一个重要概念,它代表着目录项。每个目录都有一个或多个dentry,用于表示该目录下的文件和子目录

dentry是与路径名相关联的数据结构,它包含了文件或目录的元数据,如文件名、权限、所有者等。dentry还包含指向对应inode的指针,通过这个指针可以获取到文件的具体内容、大小等信息

dentry的主要作用是加速文件系统的操作。当用户打开、读取或写入一个文件时,操作系统需要根据路径名找到对应的inode来执行相应的操作。而dentry充当了一个缓存,当用户再次访问相同的文件时,可以直接从缓存中获取dentry,避免了频繁的磁盘访问,提高了文件系统的性能。

此外,dentry还具有层次化的结构,反映了目录的层级关系。每个dentry都有一个指向其父目录dentry的指针,从而构成了一个目录树。

总结起来,dentry是Linux文件系统中的目录项,通过缓存文件和目录的元数据,加速文件系统的操作,同时构建了目录的层级结构

挂载分区

在Linux系统中,挂载分区是将文件系统连接到文件系统树中的特定位置,以便可以访问其内容。当你插入一个新的磁盘或者创建一个新的分区时,需要将其挂载到文件系统树上的某个目录才能对其进行访问。

以下是在Linux系统中挂载分区的一般步骤:

  1. 创建挂载点:首先,你需要在文件系统中选择一个目录作为挂载点。这个目录将成为访问该分区内容的入口点。你可以选择一个已有的目录作为挂载点,也可以创建一个新的目录作为挂载点。

  2. 查看可用分区:使用命令lsblkfdisk -l查看当前系统上可用的分区和设备信息。确定要挂载的分区的设备名称,如/dev/sdb1

  3. 挂载分区:使用mount命令挂载分区。语法为:

sudo mount <device> <mount_point>

其中,<device>是待挂载的分区设备名称,<mount_point>是挂载点的路径。

  1. 访问分区:分区挂载成功后,你可以通过挂载点路径来访问分区中的文件和目录。可以使用cd命令进入挂载点,然后执行其他操作,如查看文件列表、拷贝文件等。

  2. 卸载分区:当你不再需要访问分区时,可以使用umount命令将其卸载。语法为:

sudo umount <mount_point>

其中,<mount_point>是挂载点的路径。

请注意,执行挂载和卸载操作时通常需要具有超级用户(root)权限,因此需要使用sudo命令或以root身份执行。

挂载分区是将磁盘、分区与文件系统连接起来,使其可用于存储和访问文件。通过正确挂载分区,你可以轻松管理和利用系统中的不同存储设备。

👉🏻硬连接和软连接

在Linux系统中,硬连接(Hard Link)和软连接(Symbolic Link,也称为符号链接或软链接)是两种不同的文件链接方式。

硬连接

  • 硬连接是通过在文件系统中创建一个指向同一inode的新目录项来实现的。换句话说,硬连接是多个文件名指向相同的物理数据块。

硬连接就是在指定目录内的映射关系:文件名<->inode
一个文件真正被删除时:没有文件名<->inode映射关系了,inode内部有引用计数,知道有几个文件名映射关系

  • 硬连接与原始文件之间没有任何区别,它们都指向相同的数据块。因此,删除其中一个硬链接并不会影响其他硬链接或原始文件。
  • 硬链接只能在同一文件系统内创建,不能跨文件系统创建。
  • 修改硬链接或原始文件的内容都会反映在其他连接上。

软连接

  • 软连接是一个指向目标文件或目录的特殊文件。
  • 软连接文件本身包含了目标文件的路径信息。当访问软连接时,系统将追踪到目标文件或目录。
  • 软连接类似于Windows系统中的快捷方式
  • 删除原始文件或目录后,软连接仍然存在,但无法访问到有效的目标。
  • 软连接可以跨文件系统创建。

总结:
硬连接和软连接都允许你创建一个文件名指向另一个文件的链接,但它们的实现方式和行为有所不同。硬连接是多个文件名指向相同的物理数据块,而软连接是一个特殊的文件,指向目标文件或目录的路径。根据具体需求,可以选择使用硬连接或软连接来满足不同的链接需求。

区别和应用场景

硬连接和软连接之间存在的区别和用途如下:

  1. 文件系统中的链接方式不同:

    • 硬连接是通过在文件系统中创建一个指向同一inode的新目录项来实现的,它们与原始文件共享相同的物理数据块。
    • 软连接是一个特殊的文件,其中包含了目标文件的路径信息。
  2. 跨文件系统的支持:

    • 硬连接只能在同一文件系统内创建,不能跨文件系统创建。
    • 软连接可以跨文件系统创建。
  3. 对目标文件或目录的处理:

    • 删除目标文件或目录后,硬连接仍然存在,并且可以继续访问。因为硬连接与原始文件没有关联,只是共享相同的数据块。
    • 删除目标文件或目录后,软连接将无法访问有效的目标。软连接只是指向目标文件或目录的路径,当目标不存在时,软连接失去了有效性。
  4. 修改链接和目标的影响:

    • 修改硬链接或原始文件的内容都会反映在其他链接上,因为它们共享相同的数据块。
    • 修改软连接不会影响目标文件或目录,因为软连接只是指向目标的路径

软链接是一个独立的文件
硬链接不是,因为它没有独立的inode编号

应用场景:

  • 硬连接通常用于创建文件的备份,或者在不同的位置使用相同的文件内容,以节省存储空间。
  • 软连接常用于创建快捷方式或提供方便访问的链接,可以跨越文件系统,并且在目标文件被替换时仍然有效。

需要注意的是,软连接的性能相对较低,因为它需要解析路径。而硬连接没有这个开销,因为它们直接指向相同的数据块。因此,在选择使用硬连接或软连接时,应根据具体需求和情况做出适当的选择。

ln命令

在Linux下,"ln"命令是用于创建链接(link)的。它有两种主要的使用方式:

  1. 创建硬链接:

    ln <目标文件> <链接文件>
    

    这会在当前目录下创建一个指向目标文件的硬链接。硬链接实际上是目标文件的一个副本,但与原文件共享相同的inode和数据块,因此对其中一个文件的修改会影响到其他文件。
    在这里插入图片描述

  2. 创建符号链接(软链接):

    ln -s <目标文件> <链接文件>
    

    这会在当前目录下创建一个指向目标文件的符号链接。符号链接是一个特殊的文件,它只包含指向目标文件的路径信息,不直接包含目标文件的内容。符号链接可以跨越文件系统边界,并且可以指向目标文件或目录。
    在这里插入图片描述

请注意,ln命令的参数顺序与cp和mv等命令的参数顺序不同。在ln命令中,目标文件通常是现有的文件或目录,而链接文件是要创建的文件名。

硬链接不能对目录进行链接

硬链接不能对目录进行链接,而软链接可以的原因在于它们的工作方式和实现机制不同。

硬链接的本质是通过共享inode和数据块来创建一个文件的副本。在文件系统中,每个文件都有一个唯一的inode(索引节点),该inode包含文件的元数据(如权限、所有者等)以及指向数据块的指针。硬链接是目标文件的一个额外名称,它与原始文件共享相同的inode。因此,无论是原始文件还是硬链接文件,它们都指向相同的数据块。由于目录是特殊类型的文件,其中包含其他文件和子目录的列表,创建硬链接会破坏目录结构的完整性和规范性,可能导致混乱和循环依赖的问题。
在这里插入图片描述

相比之下,软链接是一个特殊的文件,它只包含指向目标文件或目录的路径信息。软链接与原始文件具有不同的inode,因此它们不共享数据块。当你打开软链接时,实际上是根据路径信息找到目标文件进行操作。由于软链接只是路径的映射关系,所以可以链接到目录,而不会破坏文件系统的结构


如上便是本期的所有内容了,如果喜欢并觉得有帮助的话,希望可以博个点赞+收藏+关注🌹🌹🌹❤️ 🧡 💛,学海无涯苦作舟,愿与君一起共勉成长

在这里插入图片描述
在这里插入图片描述

  • 19
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值