在 Linux 系统中,mount 是一个极其核心的指令。与 Windows 自动分配盘符不同,Linux 将所有文件和目录组织成一个以根目录 / 开始的单一倒置树状结构。要访问新的存储设备,你需要手动将它"挂载"到这棵树上。
一、mount 的作用
简单来说,mount 的作用就是"挂载"。
当你将一块新硬盘、U 盘或网络存储连接到 Linux 系统时,系统不会自动分配盘符。你需要将这个存储设备连接到目录树中的某个空文件夹上,这个过程就叫"挂载",这个文件夹被称为挂载点(Mount Point)。
通过 mount,你告诉系统:"请把这个设备里的文件系统,展示在这个特定的目录下。"
二、mount 的参数
mount 的完整语法:
mount [-t 文件系统类型] [-o 挂载选项] <设备名称> <挂载点>核心参数
| 参数 | 含义 | 说明 |
|---|---|---|
-t | 文件系统类型 | 指定设备的文件系统类型,如 ext4、xfs、vfat、ntfs、nfs、iso9660 等。通常 Linux 能自动识别,可省略 |
-o | 挂载选项 | 用逗号分隔多个选项:ro(只读)、rw(读写)、remount(重新挂载)、loop(将普通文件当分区挂载) |
-a | 挂载所有 | 读取 /etc/fstab 配置文件,挂载所有尚未挂载的设备。系统开机时会自动执行 |
常见使用示例
mkdir /mnt/usb
mount /dev/sdb1 /mnt/usb
mount -t ext4 /dev/sdb1 /mnt/data
mount -o ro /dev/sdb1 /mnt/readonly
mount -o loop /path/to/image.iso /mnt/iso
mount --bind /home/data /var/www/html三、文件系统类型详解
-t 参数指定的文件系统类型,本质上是告诉内核这个设备使用了哪种"数据组织规则"。常见类型可分为四大类:
1. Linux 本地文件系统
| 文件系统 | 特点 | 适用场景 |
|---|---|---|
| ext4 | 最经典、最广泛,稳定成熟。Ubuntu/Debian 默认选择 | 通用服务器和个人电脑 |
| xfs | 高性能日志文件系统,擅长大文件和高并发。CentOS/RHEL 默认 | 数据库服务器、海量存储 |
| btrfs | 写时复制(CoW),原生支持快照、透明压缩和多设备管理 | 需要频繁备份和回滚的场景 |
2. 跨平台与移动设备文件系统
| 文件系统 | 特点 | 注意事项 |
|---|---|---|
| vfat (FAT32) | 兼容性最强,几乎所有设备都能读写 | 不支持大于 4GB 的单个文件 |
| exfat | FAT32 的升级版,突破 4GB 限制 | 大容量 U 盘和跨平台移动硬盘首选 |
| ntfs | Windows 默认格式 | Linux 默认只读,需 ntfs-3g 驱动实现读写 |
3. 网络文件系统
| 文件系统 | 特点 | 适用场景 |
|---|---|---|
| nfs | Linux 之间共享目录的标准协议 | Linux/Unix 服务器间文件共享 |
| cifs | 基于 SMB 协议 | 在 Linux 上挂载 Windows 共享文件夹 |
4. 特殊与内存文件系统
| 文件系统 | 特点 | 适用场景 |
|---|---|---|
| tmpfs | 基于内存,速度极快,重启后数据消失 | /tmp 临时目录、高速缓存 |
| overlay | 联合文件系统,将多个目录像图层一样叠加 | Docker 容器的核心存储技术 |
| iso9660 | CD/DVD 光盘文件系统 | 挂载 .iso 镜像文件 |
四、查看文件所在的文件系统
需要澄清一个概念:单个文件本身没有"文件系统",文件系统是针对磁盘分区或挂载点而言的。查看某个文件所在分区的文件系统类型,有以下几种方法:
df -T:最直观
$ df -T /var/log/syslog
Filesystem Type 1K-blocks Used Available Use% Mounted on
/dev/sda2 ext4 50212344 1234567 46000000 5% /Type 列即为文件系统类型,Mounted on 列为挂载点。
findmnt:最专业
$ findmnt --target /var/log/syslog
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda2 ext4 rw,relatime,errors=remount-rolsblk -f:全局总览
$ lsblk -f以树状结构展示所有磁盘、分区、文件系统类型和挂载点。
五、mount 背后的操作系统知识
1. 一切皆文件(Everything is a file)
Linux 中,硬件设备也被抽象为文件,存放在 /dev 目录下:
- 块设备(Block Device):硬盘
/dev/sda、U 盘/dev/sdb等,以数据块为单位读写。mount本质上是将块设备文件映射到目录上。 - 遮蔽效应:将设备挂载到非空目录时,原有文件会被"隐藏"(非删除),
umount卸载后恢复可见。
2. 虚拟文件系统(VFS)
Linux 内核实现了 VFS(Virtual File System)抽象层,对上层应用提供统一的系统调用接口(open()、read()、write())。无论底层是 ext4、NTFS 还是 NFS,VFS 都会调用对应的文件系统驱动,用户无需感知差异。
┌─────────────────────────────┐
│ 用户程序 (open/read) │
├─────────────────────────────┤
│ VFS 抽象层 │
├──────┬──────┬───────┬───────┤
│ ext4 │ xfs │ ntfs │ nfs │ ← 各文件系统驱动
├──────┴──────┴───────┴───────┤
│ 块设备 / 网络 │
└─────────────────────────────┘3. /etc/fstab:开机自动挂载
系统启动时通过 /etc/fstab(File System Table)配置文件决定挂载策略,开机时自动执行 mount -a:
UUID=xxxx-xxxx-xxxx / ext4 defaults 1 1
UUID=yyyy-yyyy-yyyy /home ext4 defaults 0 24. 内核状态追踪
执行 mount 时,实际上是向内核发送系统调用。内核将挂载状态记录在内存中,可通过以下方式查看:
cat /proc/mounts
mount六、进阶:换根操作与容器隔离
将一个文件夹"变成"根目录,是容器技术的核心操作之一。
chroot:经典换根
sudo chroot /home/user/my_new_root /bin/bash- 新
bash进程的/实际指向宿主机的/home/user/my_new_root - 前提:目标目录必须包含基本的 Linux 文件系统结构(
/bin/bash及其依赖的/lib动态链接库) - 安全缺陷:仅修改路径解析,未真正隔离,存在逃逸风险
pivot_root + Mount Namespace:真正的隔离
现代容器运行时(如 runc)采用的机制:
- Mount Namespace:创建隔离的挂载树,新空间内的挂载操作不影响宿主机
- pivot_root:将根挂载点替换为指定目录,旧根目录被"压"到临时位置后卸载
sudo unshare --mount --pid --fork --root=/home/user/my_new_root /bin/bash
mount -t proc proc /proc关于
unshare命令的详细用法,可以参考 Linux unshare 命令详解。
关键细节:伪文件系统不会自动创建
进入新的命名空间后,宿主机的 /proc、/sys 等伪文件系统不会自动出现,也不会被自动创建。原因:
--root将进程的"世界边界"锁定在新目录下,宿主机的/proc位于边界之外- 内核只提供隔离的"挂载账本",不会主动写入任何内容
- 如果只隔离了 Mount Namespace 而未隔离 PID Namespace,手动挂载的
/proc仍会显示宿主机的全部进程
要实现完整的容器级隔离(/proc 中只看到自己),需要同时隔离 Mount 和 PID 命名空间,并加上 --fork 参数。