理解 Linux 挂载,最关键的是先抓住一句话:
挂载不是“把硬盘接到电脑上”,而是把某个文件系统接入 Linux 的目录树。
在 Windows 里,我们习惯看到 C:、D:、E: 这样的盘符;而在 Linux 里,所有文件都组织在一棵统一的目录树下:
/├── bin├── etc├── home├── root├── usr├── var└── mntLinux 没有“D 盘”这种概念。无论是系统盘、U 盘、移动硬盘、网络共享目录,还是内存文件系统,最终都要被接入这棵目录树的某个位置。这个“接入”的过程,就叫 挂载。
一、从一个简单例子理解挂载
假设你有一个 U 盘,它在系统中被识别为:
/dev/sdb1你想访问这个 U 盘里的文件,通常会这样做:
sudo mkdir -p /mnt/usbsudo mount /dev/sdb1 /mnt/usb执行之后,你进入:
cd /mnt/usbls就能看到 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/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一般来说,我们挂载的不是整块磁盘,而是某个分区,例如:
sudo mount /dev/sda1 /mnt/data3. 文件系统:数据在分区里的组织方式
光有分区还不够。一个分区里面必须有文件系统,Linux 才知道如何解释里面的数据。
常见文件系统包括:
ext4xfsbtrfsvfatexfatntfsiso9660文件系统决定了:
文件名怎么存目录结构怎么存权限怎么记录文件内容对应哪些磁盘块空闲空间怎么管理日志如何记录所以,一个分区如果没有格式化成文件系统,Linux 就无法像访问普通目录一样访问它。
格式化文件系统的命令类似:
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 使用统一目录树:
/├── home├── boot├── var├── mnt└── media不同的磁盘分区可以挂载到目录树的不同位置。
例如:
/ 挂载系统根分区/boot 挂载启动分区/home 挂载用户数据分区/data 挂载数据盘/mnt/usb 挂载 U 盘这样做的好处是,用户看到的是一棵统一的目录树,而不需要关心底层到底有几块硬盘、几个分区。
例如:
cd /home/nemo/Documents你不需要知道 /home 是不是单独一块盘,也不需要知道它具体来自哪个设备。只要它被挂载到 /home,就可以像普通目录一样使用。
四、挂载的核心原理:把文件系统接入 VFS
Linux 能统一管理 ext4、xfs、btrfs、ntfs、tmpfs 等不同文件系统,靠的是一个重要机制:
VFS,Virtual File System,虚拟文件系统。
VFS 可以理解为 Linux 内核中的“文件系统抽象层”。
用户程序访问文件时,通常使用的是统一接口:
open()read()write()close()比如你执行:
cat /mnt/data/a.txt从用户角度看,只是在读取一个文件。
但内核内部大致会经历:
用户程序↓系统调用 open/read↓VFS↓具体文件系统驱动 ext4/xfs/ntfs↓块设备层↓磁盘驱动↓真实硬件VFS 不直接关心 ext4 或 ntfs 的具体细节,它只定义统一的文件操作接口。真正解释磁盘上数据结构的,是具体文件系统驱动。
挂载时,Linux 大致做了几件事:
1. 找到要挂载的设备,例如 /dev/sdb12. 识别或指定文件系统类型,例如 ext43. 读取该文件系统的元数据4. 在内核中建立对应的挂载结构5. 把这个文件系统关联到某个目录,也就是挂载点挂载完成后,路径解析就会发生变化。
例如原来访问:
/mnt/data只是访问根文件系统里的一个普通目录。
挂载之后再访问:
/mnt/dataVFS 会发现这里是一个挂载点,于是跳转到新挂载的文件系统中查找内容。
这就是挂载的核心:
挂载改变的是路径和文件系统之间的映射关系。
五、数据读取时到底发生了什么?
假设你已经执行:
sudo mount /dev/sdb1 /mnt/data然后读取文件:
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 文件系统↓块设备层↓磁盘驱动↓硬盘 / SSD6. 数据返回给用户程序
磁盘数据被读入内核缓存,再返回给 cat,最后显示到终端上。
所以你看到的简单命令:
cat /mnt/data/hello.txt背后其实经过了:
路径解析挂载点判断文件系统解释块设备读取页缓存权限检查数据返回六、挂载会不会覆盖原目录内容?
一个常见问题是:
如果
/mnt/data原来里面有文件,挂载之后这些文件会怎样?
假设原来:
ls /mnt/data看到:
old.txt然后执行:
sudo mount /dev/sdb1 /mnt/data此时再执行:
ls /mnt/data你看到的是 /dev/sdb1 文件系统里的内容,而不是原来那个 old.txt。
这是不是说明 old.txt 被删除了?
不是。
它只是被“遮住”了。
挂载之后,/mnt/data 这个路径被新文件系统接管,原目录中的内容暂时不可见。卸载之后:
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 配置自动挂载。
查看:
cat /etc/fstab你可能会看到类似内容:
UUID=xxxx-xxxx / ext4 defaults 0 1UUID=yyyy-yyyy /home ext4 defaults 0 2UUID=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:
blkid或者:
lsblk -f修改 /etc/fstab 后,可以用:
sudo mount -a测试配置是否正确。这个命令会尝试挂载 fstab 中尚未挂载的文件系统。
九、常见挂载类型
Linux 的挂载不只用于硬盘分区,还用于很多特殊场景。
1. 普通磁盘挂载
例如挂载数据盘:
sudo mount /dev/sdb1 /data这是最常见的挂载。
2. 临时内存文件系统 tmpfs
tmpfs 是存在内存中的文件系统。
例如:
mount | grep tmpfs你会看到很多 tmpfs:
tmpfs on /run type tmpfstmpfs on /dev/shm type tmpfs它们不是传统硬盘,而是内存中的临时文件系统。重启后内容会消失。
3. proc、sysfs、devtmpfs
Linux 中有些目录看起来像文件系统,但并不对应真实磁盘。
例如:
/proc/sys/dev/proc 提供进程和内核信息:
cat /proc/cpuinfocat /proc/meminfo/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 还可以挂载远程文件系统,例如:
NFSSMB/CIFSSSHFS例如挂载 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 层面把一个文件系统接入目录树。
mount /dev/sdb1 /data挂载点 /data 不只是跳转路径,而是成为另一个文件系统的入口。
简单区别:
软链接:路径指向另一个路径挂载:目录成为另一个文件系统的入口软链接依赖原路径存在;挂载则是改变目录树和文件系统之间的映射关系。
十一、如何查看当前挂载情况?
常用命令有几个。
1. lsblk
查看块设备和挂载点:
lsblk -f输出类似:
NAME FSTYPE UUID MOUNTPOINTSsda├─sda1 vfat /boot/efi├─sda2 ext4 /└─sda3 ext4 /homesdb└─sdb1 ext4 /data这是最直观的命令之一。
2. findmnt
查看当前挂载树:
findmnt查看某个挂载点:
findmnt /data3. mount
查看所有挂载:
mount输出会比较多,但信息完整。
4. df
查看磁盘空间使用情况:
df -h它显示的是已经挂载的文件系统,而不是所有磁盘设备。
十二、为什么 umount 有时会失败?
卸载时经常遇到:
target is busy意思是这个挂载点正在被使用。
常见原因包括:
当前终端正处在该目录下某个程序正在读取里面的文件某个服务正在使用该目录有进程的工作目录在挂载点内例如你当前在 /mnt/usb 目录中:
cd /mnt/usbsudo umount /mnt/usb可能失败。
先退出目录:
cd ~sudo umount /mnt/usb如果还失败,可以查看谁在占用:
lsof +f -- /mnt/usb或者:
fuser -vm /mnt/usb不建议随便强制卸载,因为可能导致数据未写完,造成文件损坏。
如果是 U 盘或移动硬盘,卸载前最好执行:
sync确保缓存数据写入磁盘。
十三、挂载选项:控制文件系统如何工作
挂载时可以指定选项,例如:
sudo mount -o ro /dev/sdb1 /mnt/data这里 ro 表示只读挂载。
常见选项包括:
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/nvme0n1分区:/dev/sdb1、/dev/nvme0n1p1文件系统:ext4、xfs、btrfs、ntfs挂载点:/mnt/data、/home、/bootVFS:Linux 内核中的统一文件系统抽象层完整关系可以这样理解:
硬盘↓分区↓文件系统↓挂载到某个目录↓通过路径访问文件也可以更准确地表示为:
/dev/sdb1 上的 ext4 文件系统 ↓ mount/mnt/data 这个目录 ↓用户通过 /mnt/data/file.txt 访问其中的数据所以,挂载不是复制文件,不是创建快捷方式,也不是简单识别硬盘。
它真正做的是:
在 Linux 的目录树中建立一个入口,让某个文件系统成为这棵树的一部分。
理解了这一点,再看 /etc/fstab、mount、umount、lsblk、findmnt、tmpfs、procfs、bind mount、容器挂载、网络挂载,都会清晰很多。
