avatar🌌
TangentTangent Blog

技术博客 | Go & Kubernetes & Linux

技术博客 | Go & Kubernetes & Linux

Linux mount 指令详解:从基础挂载到容器存储

在 Linux 系统中,mount 是一个极其核心的指令。与 Windows 自动分配盘符不同,Linux 将所有文件和目录组织成一个以根目录 / 开始的单一倒置树状结构。要访问新的存储设备,你需要手动将它"挂载"到这棵树上。

一、mount 的作用 ​

简单来说,mount 的作用就是"挂载"。

当你将一块新硬盘、U 盘或网络存储连接到 Linux 系统时,系统不会自动分配盘符。你需要将这个存储设备连接到目录树中的某个空文件夹上,这个过程就叫"挂载",这个文件夹被称为挂载点(Mount Point)。

通过 mount,你告诉系统:"请把这个设备里的文件系统,展示在这个特定的目录下。"

二、mount 的参数 ​

mount 的完整语法:

bash
mount [-t 文件系统类型] [-o 挂载选项] <设备名称> <挂载点>

核心参数 ​

参数含义说明
-t文件系统类型指定设备的文件系统类型,如 ext4、xfs、vfat、ntfs、nfs、iso9660 等。通常 Linux 能自动识别,可省略
-o挂载选项用逗号分隔多个选项:ro(只读)、rw(读写)、remount(重新挂载)、loop(将普通文件当分区挂载)
-a挂载所有读取 /etc/fstab 配置文件,挂载所有尚未挂载的设备。系统开机时会自动执行

常见使用示例 ​

bash
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 的单个文件
exfatFAT32 的升级版,突破 4GB 限制大容量 U 盘和跨平台移动硬盘首选
ntfsWindows 默认格式Linux 默认只读,需 ntfs-3g 驱动实现读写

3. 网络文件系统 ​

文件系统特点适用场景
nfsLinux 之间共享目录的标准协议Linux/Unix 服务器间文件共享
cifs基于 SMB 协议在 Linux 上挂载 Windows 共享文件夹

4. 特殊与内存文件系统 ​

文件系统特点适用场景
tmpfs基于内存,速度极快,重启后数据消失/tmp 临时目录、高速缓存
overlay联合文件系统,将多个目录像图层一样叠加Docker 容器的核心存储技术
iso9660CD/DVD 光盘文件系统挂载 .iso 镜像文件

四、查看文件所在的文件系统 ​

需要澄清一个概念:单个文件本身没有"文件系统",文件系统是针对磁盘分区或挂载点而言的。查看某个文件所在分区的文件系统类型,有以下几种方法:

df -T:最直观 ​

bash
$ 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:最专业 ​

bash
$ findmnt --target /var/log/syslog
TARGET SOURCE    FSTYPE OPTIONS
/      /dev/sda2 ext4   rw,relatime,errors=remount-ro

lsblk -f:全局总览 ​

bash
$ 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      2

4. 内核状态追踪 ​

执行 mount 时,实际上是向内核发送系统调用。内核将挂载状态记录在内存中,可通过以下方式查看:

bash
cat /proc/mounts

mount

六、进阶:换根操作与容器隔离 ​

将一个文件夹"变成"根目录,是容器技术的核心操作之一。

chroot:经典换根 ​

bash
sudo chroot /home/user/my_new_root /bin/bash
  • 新 bash 进程的 / 实际指向宿主机的 /home/user/my_new_root
  • 前提:目标目录必须包含基本的 Linux 文件系统结构(/bin/bash 及其依赖的 /lib 动态链接库)
  • 安全缺陷:仅修改路径解析,未真正隔离,存在逃逸风险

pivot_root + Mount Namespace:真正的隔离 ​

现代容器运行时(如 runc)采用的机制:

  1. Mount Namespace:创建隔离的挂载树,新空间内的挂载操作不影响宿主机
  2. pivot_root:将根挂载点替换为指定目录,旧根目录被"压"到临时位置后卸载
bash
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 参数。

Linux mount Command Explained: From Basic Mounting to Container Storage
如何正确处理gRPC错误处理
由 Valaxy v1.2.2 驱动|主题-Yunv1.2.2