理解 Linux 挂载,最关键的是先抓住一句话:
挂载不是”把硬盘接到电脑上”,而是把某个文件系统接入 Linux 的目录树。
在 Windows 里,我们习惯看到 C:、D:、E: 这样的盘符;而在 Linux 里,所有文件都组织在一棵统一的目录树下:
/
├── bin
├── etc
├── home
├── root
├── usr
├── var
└── mnt
Linux 没有”D 盘”这种概念。无论是系统盘、U 盘、移动硬盘、网络共享目录,还是内存文件系统,最终都要被接入这棵目录树的某个位置。这个”接入”的过程,就叫挂载。
一、从一个简单例子理解挂载
假设你有一个 U 盘,它在系统中被识别为 /dev/sdb1。你想访问这个 U 盘里的文件,通常会这样做:
sudo mkdir -p /mnt/usb
sudo mount /dev/sdb1 /mnt/usb
执行之后,你进入 /mnt/usb 并执行 ls,就能看到 U 盘里的文件。
这里发生的事情不是”把文件复制到了 /mnt/usb”,而是:
Linux 把 /dev/sdb1 这个分区上的文件系统,接到了 /mnt/usb 这个目录位置。
所以 /mnt/usb 被称为挂载点。
卸载时执行:
sudo umount /mnt/usb
之后 /mnt/usb 目录仍然存在,但里面不再显示 U 盘内容。这说明一个重要事实:
挂载点本身只是一个普通目录,挂载之后,它变成了进入另一个文件系统的入口。
二、设备、分区、文件系统、挂载点分别是什么?
很多人刚学 Linux 挂载时,会把几个概念混在一起:硬盘、分区、文件系统、目录、挂载点。它们其实不是一回事。
1. 块设备:系统识别到的存储硬件
Linux 会把硬盘、U 盘、SSD 等存储设备抽象成设备文件,通常放在 /dev 目录下。常见形式有:
/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
一般来说,我们挂载的不是整块磁盘,而是某个分区,例如:
sudo mount /dev/sda1 /mnt/data
3. 文件系统:数据在分区里的组织方式
光有分区还不够。一个分区里面必须有文件系统,Linux 才知道如何解释里面的数据。常见文件系统包括:ext4、xfs、btrfs、vfat、exfat、ntfs、iso9660。
文件系统决定了:文件名怎么存、目录结构怎么存、权限怎么记录、文件内容对应哪些磁盘块、空闲空间怎么管理、日志如何记录。
格式化文件系统的命令类似:
sudo mkfs.ext4 /dev/sdb1
注意:格式化会清空原有数据,不能随便执行。
4. 挂载点:文件系统接入目录树的位置
挂载点就是一个目录,例如 /mnt/usb、/mnt/data、/media/user/disk、/home、/boot。
执行 sudo mount /dev/sdb1 /mnt/data 的意思是:把 /dev/sdb1 上的文件系统接入到 /mnt/data 这个目录。从此以后,访问 /mnt/data,看到的就是这个文件系统里的内容。
三、Linux 为什么需要挂载?
Linux 的文件系统组织方式和 Windows 不同。Windows 常用盘符区分不同文件系统(C:\、D:\、E:\),而 Linux 使用统一目录树。不同的磁盘分区可以挂载到目录树的不同位置。例如:
/挂载系统根分区/boot挂载启动分区/home挂载用户数据分区/data挂载数据盘/mnt/usb挂载 U 盘
这样做的好处是,用户看到的是一棵统一的目录树,而不需要关心底层到底有几块硬盘、几个分区。你不需要知道 /home 是不是单独一块盘,也不需要知道它具体来自哪个设备。只要它被挂载到 /home,就可以像普通目录一样使用。
四、挂载的核心原理:把文件系统接入 VFS
Linux 能统一管理 ext4、xfs、btrfs、ntfs、tmpfs 等不同文件系统,靠的是一个重要机制:VFS(Virtual File System,虚拟文件系统)。
VFS 可以理解为 Linux 内核中的”文件系统抽象层”。用户程序访问文件时,通常使用的是统一接口(open、read、write、close)。内核内部大致会经历:
用户程序
↓
系统调用 open/read
↓
VFS
↓
具体文件系统驱动 ext4/xfs/ntfs
↓
块设备层
↓
磁盘驱动
↓
真实硬件
VFS 不直接关心 ext4 或 ntfs 的具体细节,它只定义统一的文件操作接口。真正解释磁盘上数据结构的,是具体文件系统驱动。
挂载时,Linux 大致做了几件事:找到要挂载的设备 → 识别文件系统类型 → 读取该文件系统的元数据 → 在内核中建立对应的挂载结构 → 把这个文件系统关联到某个目录。
挂载完成后,路径解析就会发生变化。原来访问 /mnt/data 只是访问根文件系统里的一个普通目录。挂载之后再访问 /mnt/data,VFS 会发现这里是一个挂载点,于是跳转到新挂载的文件系统中查找内容。
挂载改变的是路径和文件系统之间的映射关系。
五、数据读取时到底发生了什么?
假设你已经执行 sudo mount /dev/sdb1 /mnt/data,然后读取文件 cat /mnt/data/hello.txt。这个过程可以这样理解:
1. Shell 启动 cat 程序:你输入命令后,Shell 启动 cat 程序,并把路径交给它。
2. 程序发起系统调用:cat 调用 open("/mnt/data/hello.txt") 和 read(...)。用户程序不能直接读硬盘,它必须通过内核。
3. VFS 解析路径:内核中的 VFS 开始逐级解析路径。当解析到 /mnt/data 时,VFS 发现这里是一个挂载点,于是不再继续在原来的根文件系统里找,而是进入 /dev/sdb1 对应的文件系统。
4. 文件系统驱动查找文件:ext4 驱动负责查找 hello.txt 的 inode、文件大小、文件内容分布在哪些磁盘块、权限是否允许读取。
5. 块设备层读取数据:文件系统驱动知道文件内容在哪些块之后,通过块设备层去读取磁盘数据。
6. 数据返回给用户程序:磁盘数据被读入内核缓存,再返回给 cat,最后显示到终端上。
所以你看到的简单命令 cat /mnt/data/hello.txt,背后其实经过了:路径解析 → 挂载点判断 → 文件系统解释 → 块设备读取 → 页缓存 → 权限检查 → 数据返回。
六、挂载会不会覆盖原目录内容?
一个常见问题是:如果 /mnt/data 原来里面有文件,挂载之后这些文件会怎样?
假设原来 /mnt/data 里有一个 old.txt,执行 sudo mount /dev/sdb1 /mnt/data 之后,你看到的是 /dev/sdb1 文件系统里的内容,而不是原来那个 old.txt。
这是不是说明 old.txt 被删除了?不是,它只是被”遮住”了。
挂载之后,/mnt/data 这个路径被新文件系统接管,原目录中的内容暂时不可见。卸载之后,原来的 old.txt 又会出现。
挂载不会自动删除挂载点原有内容,但会暂时遮蔽它们。实际使用中,通常建议挂载点使用空目录,避免混淆。
七、根文件系统是怎么挂载的?
前面讲的是手动挂载 U 盘或数据盘。但 Linux 系统启动时,根目录 / 本身也是一个被挂载的文件系统。启动过程可以简化为:
BIOS / UEFI
↓
Bootloader(如 GRUB)
↓
加载 Linux 内核
↓
加载 initramfs
↓
识别真正的根分区
↓
挂载根文件系统到 /
↓
启动 systemd 或 init
↓
继续挂载其他文件系统
这里有一个问题:根文件系统还没挂载时,系统怎么读取驱动和配置?这就是 initramfs 的作用。initramfs 是一个临时的早期用户空间环境。它会帮助内核加载必要驱动、识别磁盘、解密磁盘、组装 RAID 或 LVM,然后把真正的根文件系统挂载到 /。根文件系统挂载完成后,系统才能继续启动。
八、/etc/fstab:系统启动时自动挂载
Linux 可以通过 /etc/fstab 配置自动挂载。查看:
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,而不是 /dev/sdb1?因为 /dev/sdb1 这种名称可能会变化(比如增加一块硬盘后,原来的 sdb1 可能变成 sdc1)。UUID 是文件系统的唯一标识,更稳定。
查看 UUID:
blkid
# 或者
lsblk -f
修改 /etc/fstab 后,可以用 sudo mount -a 测试配置是否正确。这个命令会尝试挂载 fstab 中尚未挂载的文件系统。
九、常见挂载类型
Linux 的挂载不只用于硬盘分区,还用于很多特殊场景。
1. 普通磁盘挂载
例如挂载数据盘:sudo mount /dev/sdb1 /data,这是最常见的挂载。
2. 临时内存文件系统 tmpfs
tmpfs 是存在内存中的文件系统。执行 mount | grep tmpfs 会看到很多 tmpfs 挂载,它们不是传统硬盘,而是内存中的临时文件系统,重启后内容会消失。
3. proc、sysfs、devtmpfs
Linux 中有些目录看起来像文件系统,但并不对应真实磁盘,例如 /proc(进程和内核信息)、/sys(设备和内核对象信息)、/dev(设备文件)。这些都是通过挂载特殊文件系统实现的。所以 Linux 里的”文件”不一定真的在硬盘上,它可能是内核暴露出来的信息接口。
4. bind mount
bind mount 可以把一个已有目录挂载到另一个位置。例如:sudo mount --bind /var/www /mnt/web。这样访问 /mnt/web,看到的就是 /var/www 的内容。bind mount 常用于容器、chroot、服务隔离等场景。
5. loop 挂载镜像文件
ISO 文件或磁盘镜像也可以挂载。例如:sudo mount -o loop ubuntu.iso /mnt/iso。这里的 ubuntu.iso 不是物理磁盘,而是一个文件,Linux 通过 loop 设备把它当成块设备来挂载。
6. 网络文件系统挂载
Linux 还可以挂载远程文件系统,例如 NFS、SMB/CIFS、SSHFS。例如挂载 Samba 共享:sudo mount -t cifs //server/share /mnt/share -o username=user。这时 /mnt/share 里的文件实际存放在远程服务器上。
十、挂载、软链接和硬链接有什么区别?
挂载容易和链接混淆,尤其是软链接。
1. 软链接
软链接类似快捷方式:ln -s /data/project /home/nemo/project。访问 /home/nemo/project 时,会跳转到 /data/project。软链接只是一个路径引用。
2. 挂载
挂载则是在 VFS 层面把一个文件系统接入目录树。挂载点不只是跳转路径,而是成为另一个文件系统的入口。
简单区别:软链接是路径指向另一个路径;挂载是目录成为另一个文件系统的入口。软链接依赖原路径存在;挂载则是改变目录树和文件系统之间的映射关系。
十一、如何查看当前挂载情况?
1. lsblk
查看块设备和挂载点:lsblk -f。这是最直观的命令之一。
2. findmnt
查看当前挂载树:findmnt。查看某个挂载点:findmnt /data。
3. mount
查看所有挂载:mount。输出会比较多,但信息完整。
4. df
查看磁盘空间使用情况:df -h。它显示的是已经挂载的文件系统,而不是所有磁盘设备。
十二、为什么 umount 有时会失败?
卸载时经常遇到 target is busy,意思是这个挂载点正在被使用。常见原因包括:当前终端正处在该目录下、某个程序正在读取里面的文件、某个服务正在使用该目录、有进程的工作目录在挂载点内。
解决方法:先退出目录(cd ~),再卸载。如果还失败,可以查看谁在占用:lsof +f -- /mnt/usb 或 fuser -vm /mnt/usb。
注意:不建议随便强制卸载,因为可能导致数据未写完,造成文件损坏。如果是 U 盘或移动硬盘,卸载前最好执行
sync确保缓存数据写入磁盘。
十三、挂载选项:控制文件系统如何工作
挂载时可以指定选项,例如:sudo mount -o ro /dev/sdb1 /mnt/data。常见选项包括:
rw—— 读写挂载ro—— 只读挂载noexec—— 不允许执行二进制程序nosuid—— 禁用 suid 权限nodev—— 不解释设备文件relatime—— 减少访问时间更新defaults—— 使用默认选项
例如,挂载一个不可信 U 盘时,可以更谨慎:
sudo mount -o ro,nosuid,nodev,noexec /dev/sdb1 /mnt/usb
这表示:只读、不允许 suid、不允许设备文件、不允许执行程序。在服务器安全配置中,这些选项很常见。
十四、用一句话总结 Linux 挂载
Linux 挂载的本质是:把某个文件系统接入统一目录树中的某个目录,使用户可以通过普通路径访问其中的数据。
它涉及几个关键对象:块设备(/dev/sdb)、分区(/dev/sdb1)、文件系统(ext4、xfs)、挂载点(/mnt/data)、VFS(Linux 内核中的统一文件系统抽象层)。
完整关系可以这样理解:
硬盘 → 分区 → 文件系统 → 挂载到某个目录 → 通过路径访问文件
也可以更准确地表示为:
/dev/sdb1 上的 ext4 文件系统
↓ mount
/mnt/data 这个目录
↓
用户通过 /mnt/data/file.txt 访问其中的数据
所以,挂载不是复制文件,不是创建快捷方式,也不是简单识别硬盘。它真正做的是:在 Linux 的目录树中建立一个入口,让某个文件系统成为这棵树的一部分。
理解了这一点,再看 /etc/fstab、mount、umount、lsblk、findmnt、tmpfs、procfs、bind mount、容器挂载、网络挂载,都会清晰很多。












暂无评论内容