温馨提示×

linux mount原理是什么

小樊
59
2026-09-23 14:36:37
栏目: 智能运维

在 Linux 中,**mount(挂载)**的本质是:把一个文件系统(file system)关联到目录树的某个目录上,使得用户可以通过这个目录访问该文件系统中的内容。

下面从原理 → 内核机制 → 关键概念 → 示例逐步说明。


一、mount 的本质(一句话版)

mount 不是“把磁盘放到目录里”,而是把“文件系统的根”挂到目录树的某个节点上。

挂载前:

/ (根文件系统)
└── mnt/

挂载后(例如挂载 /dev/sdb1 到 /mnt):

/ 
└── mnt/  ← 现在是 /dev/sdb1 的根

此后对 /mnt 的访问,实际访问的是 /dev/sdb1 里的数据。


二、Linux 文件系统层次结构(VFS)

Linux 支持很多文件系统(ext4、xfs、ntfs、tmpfs…),但用户态看到的是统一的目录树。

核心是 VFS(Virtual File System):

用户程序
   ↓
系统调用 (open/read/write)
   ↓
VFS(统一接口)
   ↓
具体文件系统 (ext4 / xfs / fat ...)
   ↓
块设备 / 内存 / 网络

mount 的作用就是:在 VFS 中建立“目录 → 文件系统”的映射关系。


三、mount 在内核中做了什么

当你执行:

mount /dev/sdb1 /mnt

内核主要做几件事:

1. 解析设备 & 文件系统类型

  • 读取 /dev/sdb1
  • 识别文件系统类型(ext4 / xfs / vfat…)
  • 如果没有指定,会尝试 blkid / superblock 自动识别

2. 读取 superblock

  • 文件系统的“元数据入口”
  • 包含:
    • 块大小
    • inode 数量
    • 根 inode

3. 创建“挂载点对象”

内核中关键结构:

  • struct super_block:文件系统实例
  • struct mount:一次挂载关系
  • struct dentry:目录项
  • struct inode:文件元数据

4. 把 mount 挂到目录树

  • 原 /mnt 的 dentry 被“覆盖”
  • 访问 /mnt → 实际走到新文件系统的 root dentry

四、关键概念(非常重要)

1. 挂载点必须是一个目录

mount /dev/sdb1 /mnt
  • /mnt 是目录
  • 挂载后,原目录内容被隐藏(不是删除)

2. 原目录内容被“遮蔽”

/mnt/
  a.txt  ← 原来就有

mount 后访问 /mnt → 看不到 a.txt

卸载后恢复。


3. 可以多次挂载(嵌套)

mount /dev/sdb1 /mnt
mount /dev/sdb2 /mnt/data

4. 根文件系统(/)也是 mount 来的

启动流程:

initramfs
  ↓
mount rootfs
  ↓
switch_root

/ 本身也是某个设备的文件系统。


五、mount 的类型

1. 块设备挂载

mount /dev/sdb1 /mnt

2. 虚拟文件系统

mount -t tmpfs tmpfs /tmp
mount -t proc proc /proc
mount -t sysfs sysfs /sys

这些没有真实磁盘。


3. 绑定挂载(bind mount)

mount --bind /home /mnt

同一个目录树,挂到另一个地方


4. 网络挂载

mount -t nfs server:/data /mnt

六、umount 做了什么

umount /mnt

内核:

  • 断开 mount 关系
  • 刷新缓存(writeback)
  • 恢复原目录内容

如果设备忙:

device is busy

说明还有进程在使用。


七、用一句话总结原理

Linux 的 mount 本质是在 VFS 中建立“目录节点 → 文件系统实例”的映射,让用户通过统一目录树访问不同存储系统。

如果你愿意,我也可以:

  • 画一张 mount 内核结构图
  • 讲 容器里的 mount namespace
  • 或结合 源码(fs/namespace.c) 讲底层实现

0 踩