何为挂载(mount)?

article/2025/9/9 3:15:17

在操作系统的Lab中,我们用bximage创建了一个1.44mb的软盘镜像img
然后为了将我们编译好的汇编程序写入该镜像,使用了如下命令:

sudo mount -o loop XX.img /mnt/floppy
sudo cp 汇编程序 /mnt/floppy
sudo umount /mnt/floppy

这其中发生了什么?何为挂载mount?

想要了解挂载过程的细节就需要知道文件系统和分区的知识。

分区

分区是一种对磁盘在逻辑上进行的划分。早期的磁盘最多只能支持四个分区。随着磁盘容量的增加,需要增加其分区数量,但是受制于分区表的大小和兼容旧的程序,不能直接增加,而是选一个分区标记为特殊的拓展分区,然后将该分区进一步划分为子分区,这种子分区被称为逻辑分区,这样就实现了将磁盘分成>4个分区
拓展分区本身是不能被直接使用的,必须进一步划分成逻辑分区,再使用逻辑分区。逻辑分区的编号从5开始,因为1-4号需要给旧的分区方式留着
那些不可进一步划分子分区的磁盘分区被称为主分区。一个磁盘最多有1个拓展分区。
在这里插入图片描述
分区表扫描的工作稍微复杂一些,需要以 MBR 引导扇区为入口,遍历所有主分区,然后找到总扩展分区,在其中递归遍历每一个子扩展分区,找出逻辑分区。由于涉及到分区的管理, 因此给每个分区起个名字,

Linux 设备命名方案。 Linux中所有的设备都在/dev/目录下,硬盘命名规则是[x]d[y][n],其中只有字母 d 是固定的,其他带中括号的字
符都是多选值,下面从左到右介绍各个字符。
x 表示硬盘分类,硬盘有两大类, IDE 磁盘和 SCSI 磁盘。 h 代表 IDE 磁盘, s 代表 SCSI 磁盘,故 x取值为 h 和 s。
d 表示 disk,即磁盘。
y 表示设备号,以区分第几个设备,取值范围是小写字符,其中 a 是第 1 个硬盘, b 是第 2 个硬盘,依次类推。
n 表示分区号,也就是一个硬盘上的第几个分区。分区以数字 1 开始,依次类推。

综上所述, sda 表示第 1 个 SCSI 硬盘, hdc 表示第 3 个 IDE 硬盘,
sda1 表示第 1 个 SCSI 硬盘的第 1个分区, hdc3 表示第 3 个 IDE 硬盘的第 3 个分区。

每个设备文件名和设备号是一一对应的。很多对设备的操作都需要使用设备号
(设备号=主设备号*256 + 次设备号)
内核维护着一个特殊的数据结构,用来存放设备号与设备的关系。在安装设备时,应该给设备申请一个设备号,使系统可以明确设备对应的设备号。设备驱动程序中的很多功能,是通过设备号来操作设备的。
磁盘是块设备的一种,而块设备有分区的概念,此时,次设备号既表示一个设备,也表示一个分区。

文件系统

一个文件系统通常占据块设备(硬盘)的一个分区。本质上是通过额外的数据结构建立一种使用数据块的方式。
一个文件系统通常要包含这样几个区域:

超级块+inode表+数据区
为了我们的目标,下面只是大致介绍要用到的内容。
超级块中存放一些描述文件系统本身的信息:inode个数,所在的设备号,被挂载到目录对应的inode…
inode表:每个inode都记录相当于是文件数据的目录,其中有一个数组i_zone[] 记录了此文件数据所在的块号。另外还有两个字段:一个代表此inode对应文件当前是否被使用【引用数】,另一个表示目录项中有几个项指向此inode【链接数】
数据区就是文件数据实际所在的位置

根据一次间接块号中找出的磁盘块中存放的内容是更多的磁盘块号
根据二次间接块号第二次找到的内容仍是其它磁盘块号
在这里插入图片描述

目录的实现,一个目录存放的数据包含文件名和对应的inode
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

挂载

所谓挂载就是将一个存放着文件系统分区与根文件系统(第一个默认被挂载的文件系统)中的某个目录对应的inode关联起来,并将其标记为已经挂载了文件系统,使之与一般的inode区分开
在这里插入图片描述

linux0.11中关于挂载的实现是sys_mount()
我们先来讨论正常的物理设备的挂载:
sys_mount接受两个参数,一个是设备名,另一个是要挂载到的目录名
操作系统在初始化是已经完成了对设备名和设备号等信息的注册
因此将设备名传给namei() ,以返回该设备文件对应的inode
再根据inode的字段判断是否为块设备文件的inode,若是则其数组i_zone[0]中存放的是其设备号。
到此,第一个小步骤完成:取得块设备的设备号
在这里插入图片描述
第二步就是将该设备(分区)和当前文件系统中目的目录的inode关联起来
通过函数read_super()根据块设备号得到其文件系统的元信息:超级块。
其中有一个关键字段是此文件系统挂载的inode指针,因此将目的目录的inode地址赋给该字段即完成了挂载。
在这里插入图片描述

不过还有一个问题没有解决。上面的这个过程是物理设备(分区)的挂载,其中的关键是使用了设备号。这些物理设备的分区信息当然在操作系统初始化时被读取并保存下来,可是在OS Lab中使用的 mount -o loop XX.img /mnt/floppy 又是怎么实现挂载虚拟软盘镜像的呢?
软盘镜像是一种特殊的文件——档案,它包含了一个完整文件系统的格式,操作系统不可能自动地将其识别为一个设备文件,进而它不可能被自动地分配设备号。这就要借助命令中的-o loop 将软盘镜像和一个假设备文件绑定,再将其按一般的物理设备文件那样挂载

在 linux 中, loop device 就是指 /dev/loop0, /dev/loop1, /dev/loop2 … 这些设备, 它们是虚假的设备, 不像 /dev/sda 在主机里物理存在
ok, 明白了什么是 loop device, 也明白了档案是什么, 那么到底如何把一个档案挂载到某个目录下呢?

实际上 loop mount 采取了一个瞒天过海的方式, 它先将这个档案映射到某个 loop device 上, 像这样:

# losetup /dev/loop0 xxxx.iso

通过这种方式来欺骗mount命令, 让mount命令以为 /dev/loop0 上面真的有设备. 这时运行mount就行了:

# mount -t iso9660 /dev/loop0 /path/to/mount/point

这么看起来, 当你想挂载某一个档案的时候(比如某个 iso), 你首先得把这个档案和某一个 loop device 关联起来, 使用
losetup 命令. 然后使用 mount 命令将这个 loop device 设备挂载到某个目录上.
实际上不必这样,mount命令自身其实就有一个能把这两步合并的功能, 那就是这样:

# mount -t iso9660 -o loop /dev/loop0 /path/to/mount/point

https://blog.csdn.net/binks_/article/details/70799134

如下是挂载一个虚拟软盘镜像的后半流程:
在这里插入图片描述

下面是linux0.11中的sys_mount() 源码

 安装(新) 文件系统(系统调用)。
// 参数 dev_name 是设备文件名, dir_name 是安装到的目录名, rw_flag 被安装文件系统的可
// 读写标志。将被加载的地方必须是一个目录名,并且对应的 i 节点没有被其他程序占用。
// 若操作成功则返回 0,否则返回出错号。int sys_mount(char * dev_name, char * dir_name, int rw_flag){struct m_inode * dev_i, * dir_i;struct super_block * sb;int dev;// 首先根据设备文件名找到对应的 i 节点,以取得其中的设备号。对于块特殊设备文件,设备
// 号在其 i 节点的 i_zone[0]中。另外,由于文件系统必须在块设备中,因此如果不是块设备
// 文件,则放回刚取得的 i 节点 dev_i,返回出错码。if (!(dev_i=namei(dev_name)))return -ENOENT;dev = dev_i->i_zone[0];if (!S_ISBLK(dev_i->i_mode)) {iput(dev_i);return -EPERM;}
// OK,现在上面为了得到设备号而取得的 i 节点 dev_i 已完成了它的使命,因此这里放回该设
// 备文件的 i 节点。接着我们来检查一下文件系统安装到的目录名是否有效。于是根据给定的
// 目录文件名找到对应的 i 节点 dir_i。 如果该 i 节点的引用计数不为 1(仅在这里引用),
// 或者该 i 节点的节点号是根文件系统的节点号 1,则放回该 i 节点返回出错码。另外,如果
// 该节点不是一个目录文件节点,则也放回该 i 节点,返回出错码。因为新文件系统只能安装
// 在一个目录名上。iput(dev_i);if (!(dir_i=namei(dir_name)))return -ENOENT;if (dir_i->i_count != 1 || dir_i->i_num == ROOT_INO) {iput(dir_i);return -EBUSY;}if (!S_ISDIR(dir_i->i_mode)) { // 安装点需要是一个目录名。iput(dir_i);return -EPERM;}
// 现在安装点也检查完毕,我们开始读取要安装文件系统(新文件系统) 的超级块信息。一个文件
// 系统的超级块会首先从超级块表中进行搜索,如果不在超级块表中就从设备上读取。 在得到了文
// 件系统超级块之后,我们对它先进行检测一番。如果新文件系统已安装在其他地方,或者将要安
// 装到的 i 节点已经安装了文件系统(安装标志已经置位),则都放回该 i 节点,也返回出错码。if (!(sb=read_super(dev))) {iput(dir_i);return -EBUSY;}if (sb->s_imount) {iput(dir_i);return -EBUSY;}if (dir_i->i_mount) {iput(dir_i);return -EPERM;}
// 最后我们设置新文件系统超级块的“被安装到 i 节点”字段指向安装到的目录名的 i 节点,
// 并设置安装位置 i 节点的安装标志和节点已修改标志。然后返回 0(安装成功)。sb->s_imount=dir_i;dir_i->i_mount=1;dir_i->i_dirt=1;   /*注意!这里没用 iput(dir_i)*/return 0; 	 /* 这将在 umount 内操作 */}

http://chatgpt.dhexx.cn/article/O1eC7ZLr.shtml

相关文章

挂载(mount)

Linux中,所有的数据都是由文件的形式呈现的,整个Linux中使用的是目录树架构,但其实,我们所有的数据都是放置在磁盘分区中的,所以如何结合目录树结构与磁盘中的数据呢?这就牵扯到挂载了。 挂载:利…

它拖慢你的网速,还泄露你的个人隐私,学一招治治它

你可能有一种感觉,虽然5G时代已经来了,但网速并没有快得很明显。 你可能还有一种困扰,在手机上随便搜一个商品,几分钟后竟然接到了推销电话。 但你有没有想过,这两件事的幕后黑手,是同一个? …

三步带你解决Docker拉取镜像报错:x509: certificate has expired or is not yet valid

报错信息: ...... 47a32314928e: Waiting f1bef6c845ef: Waiting b7403b550949: Waiting 313a800f9488: Waiting f45c5939b598: Waiting docker: Get https://registry-1.docker.io/v2/: x509: certificate has expired or is not yet valid.报错信息翻译过来的意思…

突然发现一款优化神器

前言 很多行业都会采用企业级网络,但在使用的时候会遇到很多问题,比如: “电脑被安装上一些莫名其妙的应用程序,拖慢电脑速度,影响办公效率” “电脑桌面上总是会不定时出现一些广告弹窗,让人烦不胜烦”…

干掉广告和钓鱼,这款神器绝了!

大家好,我是良许。 前几天,搜狐丢人丢大发了,自家的员工居然遭遇了钓鱼诈骗。。 据报道,某员工使用邮件时被意外钓鱼导致密码泄露,进而被冒充财务部盗发邮件。共有 24 名员工被骗取 4 万余元。 要知道,搜…

在地产行业做安全?也许你该换个专业的企业级DNS

如果你是地产公司仅有的一名安全负责人,每天要管全国所有分支机构和员工的网络安全,你是否也经常感觉头顶发凉、无从下手?地产行业的网络安全难做,主要有以下几点原因: 1.地产行业发展快、核心业务数据多,…

这个好用的办公网优化工具,官宣免费了

文章目录 ⛳️ 1. OneDNS优点⛳️ 2. OneDNS典型场景 微步在线OneDNS公益版终于官宣永久免费了! https://page.ma.scrmtech.com/landing-page/index?pf_uid15831_1728&id12702&channel30327 ⛳️ 1. OneDNS优点 作为一个OneDNS公益版的老用户,…

怕远程办公不安全?大企业同款神器,网络加速、防护、上网管理

在日常办公中,我们往往会遇到以下这些情况: 有同事反应电脑运行慢,你接过电脑一看,好家伙,能数出名的“全家桶”装了个遍,内存利用率80%以上。能不慢才怪呢!有同事反应网速太慢,连网…

没想到,这款国产软件牛炸了。

身为运维的一员,您是不是也会遇到以下这些情况: 有同事反应电脑运行慢,你接过电脑一看,好家伙,能数出名的“全家桶”装了个遍,内存利用率80%以上。能不慢才怪呢!有同事反应网速太慢,…

论网络安全的重要性

[福利:\[网络安全重磅福利:入门&进阶全套282G学习资源包免费分享 !\]](https://mp.weixin.qq.com/s/BWb9OzaB-gVGVpkm161PMw ) 前几天在家居家办公的时候(用的自己的电脑),感觉电脑很卡, 弄七弄八的,还…

利用OneDNS同步chrome数据

将DNS服务器改成OneDNS的 117.50.11.11 备用改为 117.50.22.22 然后刷新自己的DNS缓存,接着测试一下https://test.onedns.net即可 这样既可以正常登陆Google账号了,然后就可以同步书签等数据了,niubility 具体步骤:转自onedns主页…

oneDNS解决google等登陆问题

万恶的GFW,严重影响到众多开放人员和研发人员的工作。Google、Gmail等被屏蔽已有些时日了,如今不但没解禁,相继的Line、OneDrive、DropBox等相继也被屏蔽了……其大部分原因都是DNS被污染或劫持,导致无法解析出正确的ip地址。 在分…

使用OneDNS完美实现Chorme自动同步书签和插件

在CSDN上看到许多同步Chrome书签的方法,有手动导出导入的,有借助第三方插件和软件的,也有修改HOSTS文件的,总之都比较复杂且不太稳定,对需要在公司/家里/出差等频繁跨平台同步的场景下使用很不方便。 最近发现将系统的…

基于OneDNS实现上网安全防护和监控

前言介绍: 大家是不是经常遇到这种问题、明明上网页输入的是网址地址,打开的却是页游广告或者APP弹窗之类的。在上网的时候突然就打开一个“充值XX元就可获得流量大礼包”的页面。类似下面这样。 照成这样的原因是什么呢?网址输错了?有病毒木…

【网络安全】还在担心网络诈骗?让OneDNS替你揽下一切

目录 🍀1. 事情是这样的 🍀2. 事件分析 2.1. 邮件投递 2.2. 实施诈骗 🍀3. 资产分析 3.1. 资产特点 3.2. 溯源结果 🍀1. 事情是这样的 在互联网高度发达的今天,网络诈骗可以说无处不在,前有电信诈骗…

OneDNS助力高校行业网络安全

前言 虚竹哥有个朋友小五,他是在安全厂家公司工作。小五的大学系主任找他,咨询有没有比较优秀的网络通信安全防护的软件,需要对学校的网络进行安全防护。 主要有这么几个痛点: 传统本地化产品难以及时更新情报库,应对…

好用的办公网优化工具OneDNS

背景介绍 DNS是互联网访问必备的基础服务 DNS:域名系统(DomainNameSystem)的缩写,因特网的一项核心服务,相当于互联网的GPS。 可以看成一个巨大的通讯录,主机访问域名时,把网址解析为对应IP地址给出终端。 OneDNS的…

使用OneDNS完美解决办公网络优化问题

前言 企业办公中,你是不是经常遇到下列问题: 自己的电脑上被安装上一些莫名其妙的应用程序,拖慢电脑速度,影响办公效率;电脑桌面上总是会不定时出现一些广告弹窗,让人烦不胜烦;有其他人总是在…

OneDNS终端网络安全接入服务原理解析

OneDNS 互联网安全接入 目录 一、互联网中的GPS——DNS二、OneDNS是什么?2.1 简介2.2 功能概述 三、基于OneDNS规避网络安全风险3.1 OneDNS原理解析:在DNS基础上进行改造升级3.2 OneDNS高性能防御:3.3 核心能力3.4 OneDNS防护实现检测、拦截、定位、取证…

新一代企业级安全OneDNS

目录 一、了解OneDNS二、OneDNS是什么?三、OneDNS节点分布四、OneDNS个人用户纯净版、拦截版和家庭版的区别1、纯净版2、适用场景 五、OneDNS的好处分享1、阻断恶意软件攻击2、减少广告骚扰3、守护孩子的上网环境4、防止诈骗行为的发生5、反滥用限制 一、了解OneDNS OneDNS 互…