当前位置: 首页 > article >正文

【Linux系统】分区挂载




在这里插入图片描述



我们能够根据一个 inode 号在指定分区寻找目标文件的 struct inode,也能根据目录文件的内容,通过映射关系,找指定的 inode,可是,现在有个问题:

问题:inode 是不能跨分区使用的!Linux不是可以有多个分区吗?我怎么知道我当前在哪一个分区?

这就涉及到分区挂载问题!

查看系统分区情况

利用命令查询当前系统的分区情况:

命令 ls /dev/vda* :查看当前 Linux 系统中的所有磁盘分区

在这里插入图片描述



命令 df -h:用于显示文件系统的磁盘空间使用情况。

  • 这里的 -h 选项表示以“人类可读”的格式输出信息
  • 显示出系统中每个已挂载的文件系统的总空间、已使用的空间、剩余的空间以及这些文件系统被挂载的位置。

在这里插入图片描述

图中的 tmpfs 是临时文件系统,暂时不用理会

我们只需关心像 /dev/vda3 这样的文件系统分区


你可以看到/dev/vda3 条目中显示 Mounted on 挂载着 / 根目录



到这里可能还不怎么明白,先继续向下看

做个小实验:我们自己创建一个分区!



(1)创建一个大空间文件

命令 dd if=/dev/zero of=./disk.iso bs=1M count=5

  • if=/dev/zero:指定输入文件为 /dev/zero,这是一个特殊的文件,可以无限提供零值的数据。
  • of=./disk.iso:指定输出文件为当前目录下的 disk.iso 文件。
  • bs=1M:设置每次读写操作的数据块大小为 1MB。
  • count=5:指定要复制的数据块数量为 5 个。

整条命令的意思是从 /dev/zero 中读取数据,每次读取 1MB,总共读取 5 次,然后将这些数据写入到名为 disk.iso 的文件中。因此,最终会在当前目录下创建一个大小为 5MB 的全零文件 disk.iso

这种命令常用于创建空的文件或测试文件



不用记住本命令如何写,只要知道该命令最终为我们创建了一个 大小为 5MB 的全零文件!


(2)写入文件系统

向上面的那个新建文件,写入文件系统


命令 mkfs.ext + 双击tab:查询当前Linux系统中支持的文件系统类型

在这里插入图片描述

命令 mkfs.ext4 disk.iso 向文件写 disk.iso 入文件系统 ext4
在这里插入图片描述

到这一步相当于我们有了一个小的分区: disk.iso

但该分区现在还使用不了

还需将这个 “磁盘” 挂载到系统目录下



(3)创建目录

命令 sudo mkdir /mnt/myvda2 :在该目录下创建目录文件 myvda2

意思是准备将我们前面创建的分区挂载到该目录下
在这里插入图片描述



(4)将“虚拟”磁盘分区挂载到目录下

命令 sudo mount -t ext4 ./disk.iso /mnt/myvda2

本条命令的意思是:

mount :挂载
-t ext4 :指明文件系统类型 -t ,为 ext4
./disk.iso /mnt/myvda2 :将分区 ./disk.iso ,挂载到指定路径 /mnt/myvda2

在这里插入图片描述



(5)实验一下

我们 cd 到该文件目录下,即进入该分区内:cd /mnt/myvda2

我们在该目录下创建一个文件,就是在该虚拟磁盘分区中创建

在这里插入图片描述

实际上我们进入的并不是 /mnt/myvda2 ,而是该目录下挂载的虚拟磁盘分区:disk.iso



(6)卸载虚拟分区

命令 sudo umount /mnt/myvda2 :解除挂载

它提示这个卸载目标是忙的,因为当前用户处在这个目录下

在这里插入图片描述

因此需要先退出来再卸载,就能发现消失了
在这里插入图片描述

那我们能不能通过这个方式,卸载掉根目录挂载的磁盘分区呢?

卸载一个路径挂载分区,必须退出该分区所挂载的目录路径

逻辑上做不到卸载掉根目录挂载的磁盘分区,因为我们无论如何都一定处在根目录下,因此这个模块肯定不能通过这个方式卸载


(7)总结


每一个数据分区需要挂载到一个具体的目录下才能被访问和使用。当一个分区被挂载到某个目录后,该目录就成为了该分区的挂载点。从这时起,所有对该挂载点及其子目录的操作实际上都是对这个分区的操作

具体来说,如果你将一个数据分区挂载到了 /mnt/myvda2/ 这个目录下,那么:

  • 你创建的所有文件和目录都将存储在这个分区上。
  • 访问这些文件和目录时,必须通过挂载点 /mnt/myvda2/ 开始指定路径。

例如,如果你在这个分区上创建了一个名为 test1 的目录,然后再在这个目录下创建了一个名为 test2 的子目录,那么这个子目录的完整路径将会是 /mnt/myvda2/test1/test2

  • /mnt/myvda2/ 是挂载点提供的路径部分。
  • test1/test2 是在分区内部创建的路径部分。

这样的设计使得多个不同的物理存储设备可以通过统一的文件系统层次结构(文件系统层次结构是指整个系统的目录树结构)来访问,用户无需关心文件实际存储在哪个物理设备上,只需要通过标准的路径来访问即可。


  1. 根目录(/:整个文件系统层次结构的起点。所有其他的目录和文件都是从根目录开始的。
  2. 挂载点:一个分区或外部存储设备被挂载到现有目录树中的某个特定目录上,这个目录就称为挂载点。挂载点之后的所有文件和目录都属于这个分区。
  3. 统一的命名空间:无论文件实际存储在哪个物理设备上,用户都可以通过一个统一的路径来访问它们。这意味着用户不需要知道文件的具体存储位置,只需知道路径即可。


(8)回答最开始的问题

你怎么确认你在哪一个分区里面???

实际上你在某个挂载了数据分区的目录下,这个目录就是挂载点

所有对该挂载点及其子目录的操作实际上都是对这个分区的操作

只要我们在这个目录下了,其实就已经处于该分区中操作了!

而访问操作一个文件必须通过唯一路径访问,而路径的前缀不就是该数据分区挂载点的路径吗!,不就自动直接进入了该分区中进行操作吗!!!!


我们所有的文件操作都是在根目录的基础下操作的

表示我们就已经进入了挂载到根目录的 /dev/vda3 磁盘分区中,进行操作了!!!

在这里插入图片描述


(9)衍生问题

既然根目录挂载了 /dev/vda3 的磁盘分区

既然在根目录中做的所有操作,实际上都是 /dev/vda3 的磁盘分区中进行的操作,是不是说明我在基于根目录的目录 /mnt/myvda/ 下挂载的一个新数据分区,实际上也存储在/dev/vda3 的磁盘分区中,该数据分区也在 /dev/vda3 的磁盘分区中操作??

并不是的,挂载点具有独立性

当一个目录被挂载到另一个分区时,所有对该目录及其子目录的操作都会在被挂载的分区上进行,而不是在原本的分区上。而挂载点的上级路径仍然在原本的分区中进行操作:

例如:在/mnt/myvda/ 下挂载一个新数据分区,则该目录及其子目录的操作都会在挂载的新数据分区中进行,而挂载点的上级路径仍然在原本的分区中进行(即 /mnt 下的操作还是在原本的分区中)

总结:无论你当前路径属于谁,只要我另外挂载新的分区,则我这个目录就指向新的分区了,独立出去操作了



而我们将分区一挂载到根目录,我们在根目录下又创建几个新目录,用于挂载新分区

不妨碍我们从根目录下开始解析路径,只是解析路径到一个挂载了新分区的目录,则自动进入到这个新分区中继续进行操作,这个解析路径换分区过程实际上是不同目录挂载不同分区,只是跳转到不同的存储分区中继续进行操作罢了



在这里插入图片描述


解析路径的过程

  • 从根目录开始解析
    • 路径从根目录 / 开始。
    • 系统依次查找 /test1, /test2, 和 /test3 目录。
  • 遇到挂载点
    • 发现 /test3 是一个挂载点,挂载了 /dev/vda2 分区。
    • 系统自动跳转到 /dev/vda2 分区中继续解析路径。
  • 在新分区中继续解析
    • /dev/vda2 分区中查找 03.txt 文件。
    • 最终找到并操作 /test3/03.txt 文件。

理论总结

  • 共用同一套文件层次路径:虽然所有的目录和文件共享相同的路径层次结构,但实际存储位置取决于它们所在的分区。
  • 不影响路径指向不同的分区:即使路径看起来相同,由于挂载点的存在,某些路径可能指向不同的物理分区

http://www.kler.cn/a/507721.html

相关文章:

  • Jira中bug的流转流程
  • uniapp实现“到这儿去”、拨打电话功能
  • 【Git版本控制器--1】Git的基本操作--本地仓库
  • HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口
  • 单片机存储器和C程序编译过程
  • idea上git log面板的使用
  • 图像的旋转之c++实现(qt + 不调包)_c++图像旋转
  • 晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版
  • 【机器学习实战入门】有趣的Python项目:使用OpenCV进行性别和年龄检测
  • [Mac + Icarus Verilog + gtkwave] Mac运行Verilog及查看波形图
  • 计算机网络 (47)应用进程跨越网络的通信
  • cpu架构
  • Linux之文件系统前世今生(二)
  • Notepad++移除所有空格
  • js-闭包(封装私有变量,创建模块,函数柯里化接收多个参数转换为接收单一参数,实现迭代器-遍历数组与对象)
  • 御载 MATLAB
  • RHCE是什么级别
  • 鸿蒙Flutter实战:16-无痛开发指南(适合新手)
  • ios文件管理,沙盒机制以及如何操作“文件”APP,把文件共享到文件app
  • Golang Gin系列-2:搭建Gin 框架环境
  • Word2Vec中的CBOW模型训练原理详细解析
  • (2)Elasticsearch8.17的web管理工具:kibana
  • Vue3 Element-Plus el-tree 右键菜单组件
  • 案例 —— 怪物出水
  • 【绝对无坑】Mongodb获取集合的字段以及数据类型信息
  • 没有正确使用HTTP Range Request,导致访问Azure Blob存储的视频没有实现流式播放