Linux 的 mount(挂载)原理本质上是:把一个文件系统(file system)关联到目录树的某一个目录上,使得用户可以通过这个目录访问该文件系统中的内容。
下面从概念 → 内核机制 → 关键数据结构 → mount 过程 → 示例逐步说明。
在 Linux 中:
mount /dev/sdb1 /mnt/data
含义:
把设备
/dev/sdb1上的文件系统,挂到/mnt/data目录
之后:
/mnt/data 不再是普通目录/mnt/data/xxx 实际访问的是 /dev/sdb1 中的文件Linux 使用 统一的目录树(VFS):
/
├── bin
├── etc
├── home
├── mnt
│ └── data <-- mount point
不同设备 / 分区 / 网络存储:
都需要通过 mount 统一接入 VFS
VFS(Virtual File System) 是 Linux 内核的抽象层:
用户程序
↓
系统调用 (open/read/write)
↓
VFS
↓
具体文件系统 (ext4/xfs/nfs...)
VFS 不关心:
只提供统一接口:
openreadwritelookup1. 用户执行 mount()
2. 内核解析:
- 设备 / 镜像
- 文件系统类型
3. 调用对应文件系统的 mount 函数
4. 创建 super_block
5. 将文件系统 root 目录关联到 mount point
6. 更新 VFS 目录树
super_block表示一个已挂载的文件系统
struct super_block {
struct file_system_type *s_type;
struct dentry *s_root;
...
};
inode文件的元数据
dentry(目录项)路径解析缓存
/ -> mnt -> data
vfsmount表示一个 mount 实例
struct vfsmount {
struct dentry *mnt_root;
struct super_block *mnt_sb;
...
};
mount 后:
ls /mnt/data # 原来内容
mount /dev/sdb1 /mnt/data
ls /mnt/data # 新文件系统内容
umount 后:
把一个目录挂到另一个目录
mount --bind /a /b
原理:
upperdir
lowerdir
merged
写时复制(COW)
# 磁盘
mount /dev/sda1 /mnt
# 镜像
mount iso.img /mnt -o loop
# 内存
mount -t tmpfs tmpfs /mnt
# 网络
mount -t nfs server:/path /mnt
Linux mount 的本质是:通过 VFS,把具体文件系统的根目录“嫁接”到目录树的某个节点上,从而统一访问不同存储设备。
如果你愿意,我也可以: