3827 字
19 分钟
Linux 的挂载原理:为什么硬盘、U 盘、目录都能“挂”到文件树上?
2026-06-05
2026-06-06

理解 Linux 挂载,最关键的是先抓住一句话:

挂载不是“把硬盘接到电脑上”,而是把某个文件系统接入 Linux 的目录树。

在 Windows 里,我们习惯看到 C:、D:、E: 这样的盘符;而在 Linux 里,所有文件都组织在一棵统一的目录树下:

/
├── bin
├── etc
├── home
├── root
├── usr
├── var
└── mnt

Linux 没有“D 盘”这种概念。无论是系统盘、U 盘、移动硬盘、网络共享目录,还是内存文件系统,最终都要被接入这棵目录树的某个位置。这个“接入”的过程,就叫 挂载。


一、从一个简单例子理解挂载#

假设你有一个 U 盘,它在系统中被识别为:

Terminal window
/dev/sdb1

你想访问这个 U 盘里的文件,通常会这样做:

Terminal window
sudo mkdir -p /mnt/usb
sudo mount /dev/sdb1 /mnt/usb

执行之后,你进入:

Terminal window
cd /mnt/usb
ls

就能看到 U 盘里的文件。

这里发生的事情不是“把文件复制到了 /mnt/usb”,而是:

Linux 把 /dev/sdb1 这个分区上的文件系统,接到了 /mnt/usb 这个目录位置。

所以 /mnt/usb 被称为 挂载点。

卸载时执行:

Terminal window
sudo umount /mnt/usb

之后 /mnt/usb 目录仍然存在,但里面不再显示 U 盘内容。

这说明一个重要事实:

挂载点本身只是一个普通目录,挂载之后,它变成了进入另一个文件系统的入口。


二、设备、分区、文件系统、挂载点分别是什么?#

很多人刚学 Linux 挂载时,会把几个概念混在一起:硬盘、分区、文件系统、目录、挂载点。它们其实不是一回事。

1. 块设备:系统识别到的存储硬件#

Linux 会把硬盘、U 盘、SSD 等存储设备抽象成设备文件,通常放在 /dev 目录下。

常见形式有:

/dev/sda
/dev/sdb
/dev/nvme0n1

其中:

/dev/sda 第一块 SATA/SCSI 磁盘
/dev/sdb 第二块 SATA/SCSI 磁盘
/dev/nvme0n1 第一块 NVMe SSD

这些是“整块磁盘”。

2. 分区:磁盘上的区域划分#

一块磁盘可以分成多个分区,例如:

/dev/sda
├── /dev/sda1
├── /dev/sda2
└── /dev/sda3

对于 NVMe 硬盘,分区命名一般是:

/dev/nvme0n1
├── /dev/nvme0n1p1
├── /dev/nvme0n1p2
└── /dev/nvme0n1p3

一般来说,我们挂载的不是整块磁盘,而是某个分区,例如:

Terminal window
sudo mount /dev/sda1 /mnt/data

3. 文件系统:数据在分区里的组织方式#

光有分区还不够。一个分区里面必须有文件系统,Linux 才知道如何解释里面的数据。

常见文件系统包括:

ext4
xfs
btrfs
vfat
exfat
ntfs
iso9660

文件系统决定了:

文件名怎么存
目录结构怎么存
权限怎么记录
文件内容对应哪些磁盘块
空闲空间怎么管理
日志如何记录

所以,一个分区如果没有格式化成文件系统,Linux 就无法像访问普通目录一样访问它。

格式化文件系统的命令类似:

Terminal window
sudo mkfs.ext4 /dev/sdb1

注意:格式化会清空原有数据,不能随便执行。

4. 挂载点:文件系统接入目录树的位置#

挂载点就是一个目录,例如:

/mnt/usb
/mnt/data
/media/user/disk
/home
/boot

执行:

Terminal window
sudo mount /dev/sdb1 /mnt/data

意思是:

把 /dev/sdb1 上的文件系统接入到 /mnt/data 这个目录。

从此以后,访问 /mnt/data,看到的就是这个文件系统里的内容。


三、Linux 为什么需要挂载?#

Linux 的文件系统组织方式和 Windows 不同。

Windows 常用盘符区分不同文件系统:

C:\
D:\
E:\

而 Linux 使用统一目录树:

/
├── home
├── boot
├── var
├── mnt
└── media

不同的磁盘分区可以挂载到目录树的不同位置。

例如:

/ 挂载系统根分区
/boot 挂载启动分区
/home 挂载用户数据分区
/data 挂载数据盘
/mnt/usb 挂载 U 盘

这样做的好处是,用户看到的是一棵统一的目录树,而不需要关心底层到底有几块硬盘、几个分区。

例如:

Terminal window
cd /home/nemo/Documents

你不需要知道 /home 是不是单独一块盘,也不需要知道它具体来自哪个设备。只要它被挂载到 /home,就可以像普通目录一样使用。


四、挂载的核心原理:把文件系统接入 VFS#

Linux 能统一管理 ext4、xfs、btrfs、ntfs、tmpfs 等不同文件系统,靠的是一个重要机制:

VFS,Virtual File System,虚拟文件系统。

VFS 可以理解为 Linux 内核中的“文件系统抽象层”。

用户程序访问文件时,通常使用的是统一接口:

open()
read()
write()
close()

比如你执行:

Terminal window
cat /mnt/data/a.txt

从用户角度看,只是在读取一个文件。

但内核内部大致会经历:

用户程序
↓
系统调用 open/read
↓
VFS
↓
具体文件系统驱动 ext4/xfs/ntfs
↓
块设备层
↓
磁盘驱动
↓
真实硬件

VFS 不直接关心 ext4 或 ntfs 的具体细节,它只定义统一的文件操作接口。真正解释磁盘上数据结构的,是具体文件系统驱动。

挂载时,Linux 大致做了几件事:

1. 找到要挂载的设备,例如 /dev/sdb1
2. 识别或指定文件系统类型,例如 ext4
3. 读取该文件系统的元数据
4. 在内核中建立对应的挂载结构
5. 把这个文件系统关联到某个目录,也就是挂载点

挂载完成后,路径解析就会发生变化。

例如原来访问:

/mnt/data

只是访问根文件系统里的一个普通目录。

挂载之后再访问:

/mnt/data

VFS 会发现这里是一个挂载点,于是跳转到新挂载的文件系统中查找内容。

这就是挂载的核心:

挂载改变的是路径和文件系统之间的映射关系。


五、数据读取时到底发生了什么?#

假设你已经执行:

Terminal window
sudo mount /dev/sdb1 /mnt/data

然后读取文件:

Terminal window
cat /mnt/data/hello.txt

这个过程可以这样理解。

1. Shell 启动 cat 程序#

你输入命令后,Shell 启动 cat 程序,并把路径 /mnt/data/hello.txt 交给它。

2. 程序发起系统调用#

cat 调用类似这样的系统调用:

open("/mnt/data/hello.txt")
read(...)

用户程序不能直接读硬盘,它必须通过内核。

3. VFS 解析路径#

内核中的 VFS 开始解析路径:

/
↓
mnt
↓
data
↓
hello.txt

当解析到 /mnt/data 时,VFS 发现:

这里是一个挂载点

于是它不再继续在原来的根文件系统里找,而是进入 /dev/sdb1 对应的文件系统。

4. 文件系统驱动查找文件#

如果 /dev/sdb1 是 ext4 文件系统,那么 ext4 驱动会负责查找:

hello.txt 的 inode 是什么
文件大小是多少
文件内容分布在哪些磁盘块
权限是否允许读取

5. 块设备层读取数据#

文件系统驱动知道文件内容在哪些块之后,会通过块设备层去读取磁盘数据。

路径大致是:

ext4 文件系统
↓
块设备层
↓
磁盘驱动
↓
硬盘 / SSD

6. 数据返回给用户程序#

磁盘数据被读入内核缓存,再返回给 cat,最后显示到终端上。

所以你看到的简单命令:

Terminal window
cat /mnt/data/hello.txt

背后其实经过了:

路径解析
挂载点判断
文件系统解释
块设备读取
页缓存
权限检查
数据返回

六、挂载会不会覆盖原目录内容?#

一个常见问题是:

如果 /mnt/data 原来里面有文件,挂载之后这些文件会怎样?

假设原来:

Terminal window
ls /mnt/data

看到:

old.txt

然后执行:

Terminal window
sudo mount /dev/sdb1 /mnt/data

此时再执行:

Terminal window
ls /mnt/data

你看到的是 /dev/sdb1 文件系统里的内容,而不是原来那个 old.txt。

这是不是说明 old.txt 被删除了?

不是。

它只是被“遮住”了。

挂载之后,/mnt/data 这个路径被新文件系统接管,原目录中的内容暂时不可见。卸载之后:

Terminal window
sudo umount /mnt/data

原来的 old.txt 又会出现。

所以:

挂载不会自动删除挂载点原有内容,但会暂时遮蔽它们。

实际使用中,通常建议挂载点使用空目录,避免混淆。


七、根文件系统是怎么挂载的?#

前面讲的是手动挂载 U 盘或数据盘。但 Linux 系统启动时,根目录 / 本身也是一个被挂载的文件系统。

启动过程可以简化为:

BIOS / UEFI
↓
Bootloader,例如 GRUB
↓
加载 Linux 内核
↓
加载 initramfs
↓
识别真正的根分区
↓
挂载根文件系统到 /
↓
启动 systemd 或 init
↓
继续挂载其他文件系统

这里有一个问题:

根文件系统还没挂载时,系统怎么读取驱动和配置?

这就是 initramfs 的作用。

initramfs 是一个临时的早期用户空间环境。它会帮助内核加载必要驱动、识别磁盘、解密磁盘、组装 RAID 或 LVM,然后把真正的根文件系统挂载到 /。

根文件系统挂载完成后,系统才能继续启动:

/etc
/usr
/var
/home

这些目录才会逐步进入正常状态。


八、/etc/fstab:系统启动时自动挂载#

Linux 可以通过 /etc/fstab 配置自动挂载。

查看:

Terminal window
cat /etc/fstab

你可能会看到类似内容:

UUID=xxxx-xxxx / ext4 defaults 0 1
UUID=yyyy-yyyy /home ext4 defaults 0 2
UUID=zzzz-zzzz /data xfs defaults 0 2

每一行大致包含:

设备标识 挂载点 文件系统类型 挂载选项 dump fsck顺序

例如:

UUID=zzzz-zzzz /data xfs defaults 0 2

意思是:

开机时,把 UUID 为 zzzz-zzzz 的分区,以 xfs 文件系统形式挂载到 /data。

为什么推荐用 UUID,而不是 /dev/sdb1?

因为 /dev/sdb1 这种名称可能会变化。比如你增加一块硬盘后,原来的 /dev/sdb1 可能变成 /dev/sdc1。

UUID 是文件系统的唯一标识,更稳定。

查看 UUID:

Terminal window
blkid

或者:

Terminal window
lsblk -f

修改 /etc/fstab 后,可以用:

Terminal window
sudo mount -a

测试配置是否正确。这个命令会尝试挂载 fstab 中尚未挂载的文件系统。


九、常见挂载类型#

Linux 的挂载不只用于硬盘分区,还用于很多特殊场景。

1. 普通磁盘挂载#

例如挂载数据盘:

Terminal window
sudo mount /dev/sdb1 /data

这是最常见的挂载。

2. 临时内存文件系统 tmpfs#

tmpfs 是存在内存中的文件系统。

例如:

Terminal window
mount | grep tmpfs

你会看到很多 tmpfs:

tmpfs on /run type tmpfs
tmpfs on /dev/shm type tmpfs

它们不是传统硬盘,而是内存中的临时文件系统。重启后内容会消失。

3. proc、sysfs、devtmpfs#

Linux 中有些目录看起来像文件系统,但并不对应真实磁盘。

例如:

/proc
/sys
/dev

/proc 提供进程和内核信息:

Terminal window
cat /proc/cpuinfo
cat /proc/meminfo

/sys 提供设备和内核对象信息。

/dev 提供设备文件。

这些都是通过挂载特殊文件系统实现的。

所以 Linux 里的“文件”不一定真的在硬盘上,它可能是内核暴露出来的信息接口。

4. bind mount#

bind mount 可以把一个已有目录挂载到另一个位置。

例如:

Terminal window
sudo mount --bind /var/www /mnt/web

这样访问 /mnt/web,看到的就是 /var/www 的内容。

bind mount 常用于容器、chroot、服务隔离等场景。

5. loop 挂载镜像文件#

ISO 文件或磁盘镜像也可以挂载。

例如:

Terminal window
sudo mount -o loop ubuntu.iso /mnt/iso

这里的 ubuntu.iso 不是物理磁盘,而是一个文件。Linux 可以通过 loop 设备把它当成块设备来挂载。

6. 网络文件系统挂载#

Linux 还可以挂载远程文件系统,例如:

NFS
SMB/CIFS
SSHFS

例如挂载 Samba 共享:

Terminal window
sudo mount -t cifs //server/share /mnt/share -o username=user

这时 /mnt/share 里的文件实际存放在远程服务器上。


十、挂载、软链接和硬链接有什么区别?#

挂载容易和链接混淆,尤其是软链接。

1. 软链接#

软链接类似快捷方式:

Terminal window
ln -s /data/project /home/nemo/project

访问 /home/nemo/project 时,会跳转到 /data/project。

软链接只是一个路径引用。

2. 挂载#

挂载则是在 VFS 层面把一个文件系统接入目录树。

Terminal window
mount /dev/sdb1 /data

挂载点 /data 不只是跳转路径,而是成为另一个文件系统的入口。

简单区别:

软链接:路径指向另一个路径
挂载:目录成为另一个文件系统的入口

软链接依赖原路径存在;挂载则是改变目录树和文件系统之间的映射关系。


十一、如何查看当前挂载情况?#

常用命令有几个。

1. lsblk#

查看块设备和挂载点:

Terminal window
lsblk -f

输出类似:

NAME FSTYPE UUID MOUNTPOINTS
sda
├─sda1 vfat /boot/efi
├─sda2 ext4 /
└─sda3 ext4 /home
sdb
└─sdb1 ext4 /data

这是最直观的命令之一。

2. findmnt#

查看当前挂载树:

Terminal window
findmnt

查看某个挂载点:

Terminal window
findmnt /data

3. mount#

查看所有挂载:

Terminal window
mount

输出会比较多,但信息完整。

4. df#

查看磁盘空间使用情况:

Terminal window
df -h

它显示的是已经挂载的文件系统,而不是所有磁盘设备。


十二、为什么 umount 有时会失败?#

卸载时经常遇到:

target is busy

意思是这个挂载点正在被使用。

常见原因包括:

当前终端正处在该目录下
某个程序正在读取里面的文件
某个服务正在使用该目录
有进程的工作目录在挂载点内

例如你当前在 /mnt/usb 目录中:

Terminal window
cd /mnt/usb
sudo umount /mnt/usb

可能失败。

先退出目录:

Terminal window
cd ~
sudo umount /mnt/usb

如果还失败,可以查看谁在占用:

Terminal window
lsof +f -- /mnt/usb

或者:

Terminal window
fuser -vm /mnt/usb

不建议随便强制卸载,因为可能导致数据未写完,造成文件损坏。

如果是 U 盘或移动硬盘,卸载前最好执行:

Terminal window
sync

确保缓存数据写入磁盘。


十三、挂载选项:控制文件系统如何工作#

挂载时可以指定选项,例如:

Terminal window
sudo mount -o ro /dev/sdb1 /mnt/data

这里 ro 表示只读挂载。

常见选项包括:

rw 读写挂载
ro 只读挂载
noexec 不允许执行二进制程序
nosuid 禁用 suid 权限
nodev 不解释设备文件
relatime 减少访问时间更新
defaults 使用默认选项

例如,挂载一个不可信 U 盘时,可以更谨慎:

Terminal window
sudo mount -o ro,nosuid,nodev,noexec /dev/sdb1 /mnt/usb

这表示:

只读
不允许 suid
不允许设备文件
不允许执行程序

在服务器安全配置中,这些选项很常见。


十四、用一句话总结 Linux 挂载#

Linux 挂载的本质是:

把某个文件系统接入统一目录树中的某个目录,使用户可以通过普通路径访问其中的数据。

它涉及几个关键对象:

块设备:/dev/sdb、/dev/nvme0n1
分区:/dev/sdb1、/dev/nvme0n1p1
文件系统:ext4、xfs、btrfs、ntfs
挂载点:/mnt/data、/home、/boot
VFS:Linux 内核中的统一文件系统抽象层

完整关系可以这样理解:

硬盘
↓
分区
↓
文件系统
↓
挂载到某个目录
↓
通过路径访问文件

也可以更准确地表示为:

/dev/sdb1 上的 ext4 文件系统
↓ mount
/mnt/data 这个目录
↓
用户通过 /mnt/data/file.txt 访问其中的数据

所以,挂载不是复制文件,不是创建快捷方式,也不是简单识别硬盘。

它真正做的是:

在 Linux 的目录树中建立一个入口,让某个文件系统成为这棵树的一部分。

理解了这一点,再看 /etc/fstab、mount、umount、lsblk、findmnt、tmpfs、procfs、bind mount、容器挂载、网络挂载,都会清晰很多。

Linux 的挂载原理:为什么硬盘、U 盘、目录都能“挂”到文件树上?
https://karx.cn/posts/linux-mount-introduction/
作者
karx
发布于
2026-06-05
许可协议
CC BY-NC-SA 4.0