Linux CIFS 架构是内核级的 SMB/CIFS 客户端 VFS 实现(cifs.ko),完整对接 Linux VFS 层,向下封装 SMB 协议栈与网络 I/O,向上提供标准文件系统接口,支持 SMB1/CIFS、SMB2、SMB3(含 3.1.1)等。
CIFS 完整组件架构总图
┌─────────────────────────────────────────────────────────────────────┐
│ 用户态工具层 │
│ ┌─────────────┐ ┌─────────────┐ ┌─────────────────┐ │
│ │ mount.cifs │ │ cifs-utils │ │ cifs.upcall │ │
│ │ (挂载) │ │ (查询/ACL) │ │ (Kerberos/DFS) │ │
│ └─────────────┘ └─────────────┘ └─────────────────┘ │
└───────────────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────────────▼─────────────────────────────────┐
│ VFS 虚拟文件系统 │
│ open/read/write/stat/fsync… │
└───────────────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────────────▼─────────────────────────────────┐
│ 【 CIFS VFS 适配层 】 │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ Super Block │ │ Inode Operations│ │ File Operations │ │
│ │ cifs_sb_info │ │ lookup/create │ │ read/write/fsync│ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
│ ┌─────────────────┐ ┌─────────────────────────────────────────┐ │
│ │ Dentry Cache │ │ 语义转换模块 │ │
│ │ d_revalidate │ │ 编码/权限/时间戳/POSIX→Windows │ │
│ └─────────────────┘ └─────────────────────────────────────────┘ │
└───────────────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────────────▼─────────────────────────────────┐
│ CIFS 协议核心层 │
│ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │
│ │ 会话管理 │ │ 树连接管理 │ │ 请求调度队列 │ │
│ │ cifs_ses │ │ cifs_tcon │ │ mid_q_entry │ │
│ └─────────────────┘ └─────────────────┘ └─────────────────┘ │
│ │
│ ┌─────────────────────────────────────┐ ┌─────────────────────┐ │
│ │ SMB 协议引擎 │ │ 缓存 & Oplock/Lease │ │
│ │ SMB1/SMB2/SMB3 封包/解包 │ │ pagecache/inode缓存 │ │
│ └─────────────────────────────────────┘ └─────────────────────┘ │
└───────────────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────────────▼─────────────────────────────────┐
│ 网络传输层 │
│ TCP socket + 端口445 + 签名/加密(seal) │
└───────────────────────────────────┬─────────────────────────────────┘
│
┌───────────────────────────────────▼─────────────────────────────────┐
│ 远端:Windows / Samba Server │
└─────────────────────────────────────────────────────────────────────┘
用户态组件
- mount.cifs:发起挂载、解析参数、调用内核 mount
- cifs-utils:查看状态、设置 ACL
- cifs.upcall:处理 Kerberos 认证、DFS 路径解析
CIFS VFS 适配层(核心对接层)
- super block:管理整个挂载实例
- inode ops:lookup、create、mkdir、rmdir、setattr
- file ops:read、write、fsync、mmap
- dentry:目录项缓存,加速路径查找
- 语义转换:UTF8 ↔ UTF16、POSIX ↔ Windows 权限、时间戳转换
CIFS 协议核心层
- cifs_ses:用户会话(认证)
- cifs_tcon:共享树连接
- mid_q_entry:请求队列、异步发送、超时重试
- SMB 引擎:SMB2/SMB3 封包解包
- Oplock/Lease:缓存锁,保证多客户端一致性
网络层
- TCP 445
- 签名(sign)、加密(seal)
用户空间层
- 挂载工具:mount.cifs(cifs-utils),负责解析挂载参数、处理认证、调用内核 mount 接口。
- 管理工具:smbinfo、setcifsacl、cifs.upcall(Kerberos/DFS 解析)。
- 配置与调试:/proc/fs/cifs/(Stats、DebugData、cifsFYI)、/sys/module/cifs/parameters/。
VFS 适配层(核心对接层)
- 实现 Linux VFS 标准接口:super_operations、file_operations、inode_operations、dentry_operations。
- 职责:
- 管理 super_block、inode、dentry、file 等 VFS 对象。
- 处理权限、缓存、路径查找、文件锁、扩展属性(xattr)、ACL 等。
- 映射 POSIX 语义到 SMB 协议(如 chmod、symlink、hardlink)。
它位于:
用户进程
↓
VFS 虚拟文件系统(open/read/write/stat…)
↓
【 CIFS VFS 适配层 】← 你现在要看的核心
↓
CIFS 协议引擎(SMB2/SMB3 封包、会话、连接)
↓
TCP 网络
struct super_operations —— 超级块操作
文件系统级别的操作:
- 读索引节点 alloc_inode
- 释放索引节点 destroy_inode
- 同步文件系统 sync_fs
- 统计空间 statfs
CIFS 对应实现:
- cifs_super_operations
- 作用:
- 管理 CIFS 挂载实例 struct cifs_sb_info
- 管理与服务器的树连接 struct cifs_tcon
- 管理 UID/GID 映射、缓存参数
struct inode_operations —— inode 操作
文件 / 目录元数据操作:
- 创建文件 create
- 创建目录 mkdir
- 查找 lookup
- 链接 / 软链接 link、symlink
- 修改权限 / 属主 setattr
CIFS 实现:
- cifs_inode_operations
- cifs_dir_inode_operations核心函数:
- cifs_lookup: 路径查找 → 发 SMB Query/Find 指令
- cifs_create: 创建文件 → 发 SMB Create
- cifs_mkdir: 建目录 → SMB Create 目录
struct file_operations —— 文件 I/O 操作
用户最常调用的 read/write:
- read_iter
- write_iter
- mmap
- fsync
- lock
CIFS 实现:
- cifs_file_operations核心函数:
- cifs_file_read_iter
- cifs_file_write_iter
- cifs_fsync
struct dentry_operations —— 目录项缓存操作
主要是缓存策略:
- d_revalidate: 验证 dentry 是否还有效CIFS 实现:
- cifs_dentry_operations
- cifs_d_revalidate作用:判断本地缓存的目录项是否与服务端一致,避免过期。
struct cifs_sb_info
挂载超级块私有数据,每个 mount 一个:
- 指向 struct cifs_tcon(树连接)
- UID/GID 映射
- 缓存开关(oplock、目录缓存)
- SMB 版本、安全模式
struct cifs_inode_info
inode 私有数据:
- 服务端的 file ID /unique ID
- 缓存的属性(atime/mtime/ctime/size)
- 缓存标记(是否脏、是否需要重新获取)
- oplock/lease 状态
struct cifsFileInfo
file 结构体私有数据:
- 服务端的 FID /open 句柄
- oplock 状态
- 读 / 写偏移
CIFS 核心逻辑层(协议引擎)
- 会话与连接管理:struct cifs_ses(会话)、struct cifs_tcon(树连接 / 共享)、struct TCP_Server_Info(服务器连接)。
- 协议协商:自动 / 手动选择 SMB 方言(默认 SMB3.1.1)、协商能力(Unix 扩展、POSIX 扩展、加密、签名)。
- 请求调度:
- 异步请求队列、并发控制、重试与超时。
- 支持 multichannel(SMB3 多通道)、persistent handles 等高级特性。
- 缓存子系统:
- 页缓存(Page Cache):与本地文件系统一致,读写先经页缓存,提升性能。
- Oplock/Lease(机会锁 / 租约):服务器授予客户端缓存权限(独占 / 共享),减少网络往返。
- 目录 / Inode 缓存:LookupCache 加速路径查找。
- 安全子系统:
- 认证:NTLMv2、Kerberos(cifs.upcall)、匿名 / 访客。
- 安全:数据包签名(sign)、传输加密(seal,SMB3)。
网络传输层
- TCP 连接:默认端口 445(Direct Hosting),旧版 139(NBT)。
- I/O 模型:异步非阻塞、多路复用,支持大窗口与批量请求。
- 数据处理:SMB 报文封包 / 解包、Marshaling/Unmarshaling、Unicode 转换、校验和。
核心数据结构
| struct cifs_sb_info | 挂载点私有数据,关联 super_block、tcon、缓存参数 |
| struct cifs_tcon | 树连接(共享),对应一个 //server/share,含权限、UID/GID 映射 |
| struct cifs_ses | 用户会话,含认证信息、安全上下文、服务器能力 |
| struct TCP_Server_Info | 服务器连接,管理 socket、请求队列、多通道 |
| struct cifsFileInfo | 打开文件句柄,关联 file、FID、Oplock 状态 |
| struct mid_q_entry | 待响应的 SMB 请求,管理超时、回调、重试 |
I/O 路径(读写流程)
读流程
写流程
- 封装 SMB Write 请求 → 网络发送 → 等待确认。
- 若持有独占 Oplock,可批量写;否则需同步写并更新服务器状态。
CIFS 的调用链(以 read 为例)
user read()
↓
sys_read
↓
vfs_read
↓
cifs_file_read_iter 【VFS 适配层入口】
↓
1. 检查页缓存 page cache
命中 → 直接拷贝
不命中 → 下发 SMB READ
↓
cifs_send_recv_msg 【进入协议层】
↓
SMB2_READ 请求封包 → 网络 → 服务器
↓
填页缓存 → 返回用户
写流程同理:先写页缓存,再由回写线程下发 SMB2_WRITE。
CIFS 适配层的缓存机制
CIFS 大量依赖 VFS 缓存以提升性能:
dentry 缓存
- lookup 结果缓存
- 由 d_revalidate 保证一致性
inode 缓存
- 缓存文件大小、mtime、属性
- 减少 SMB Query Info
page cache
- 读写都走页缓存
- 由 oplock/lease 保证多客户端一致性
oplock/lease(机会锁)适配层通过:
- cifs_get_oplock
- cifs_release_oplock向服务端申请缓存权限。
CIFS VFS 层架构总图
┌─────────────────────────────────────────────────────────┐
│ 用户进程 & 系统调用 │
│ open/read/write/stat/mkdir/rmdir/rename/fsync… │
└───────────────────────────┬─────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────┐
│ VFS 虚拟文件系统层 │
│ 统一接口:syscall → vfs_open → vfs_read → … │
└───────────────────────────┬─────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────┐
│ 【CIFS VFS 适配层】 │ ← 你要的核心
│ ┌─────────────────────────────────────────────────┐ │
│ │ 文件系统注册 & 超级块管理 │ │
│ │ cifs_fs_type → cifs_mount → cifs_sb_info │ │
│ │ struct super_operations: cifs_super_ops │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Inode 操作层 │ │
│ │ struct inode_operations: cifs_inode_ops │ │
│ │ lookup/create/mkdir/rmdir/setattr/link │ │
│ │ struct cifs_inode_info │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ Dentry 缓存层 │ │
│ │ struct dentry_operations: cifs_dentry_ops │ │
│ │ d_revalidate: 校验缓存是否过期 │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ 文件 I/O 操作层 │ │
│ │ struct file_operations: cifs_file_ops │ │
│ │ read_iter / write_iter / fsync / mmap / lock │ │
│ │ struct cifsFileInfo │ │
│ └─────────────────────────────────────────────────┘ │
│ │
│ ┌─────────────────────────────────────────────────┐ │
│ │ POSIX ↔ SMB 语义转换层 │ │
│ │ 权限映射、时间戳转换、编码转换(UTF8↔UTF16) │ │
│ │ ACL 映射、路径大小写、符号链接适配 │ │
│ └─────────────────────────────────────────────────┘ │
└───────────────────────────┬─────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────┐
│ CIFS 协议引擎层 │
│ SMB2/SMB3 封包、会话管理、连接、请求队列、Oplock/Lease │
│ struct cifs_tcon / cifs_ses / TCP_Server_Info │
└───────────────────────────┬─────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────┐
│ 网络传输层 │
│ TCP socket、端口445、加密(seal) │
└───────────────────────────┬─────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────┐
│ Windows / Samba 服务器 │
└─────────────────────────────────────────────────────────┘
CIFS open () 完整调用栈流程图
这是从用户进程 → VFS → CIFS VFS 适配层 → 协议层 → 网络 → 服务器的完整、精准、内核源码级调用栈流程图,完全对应 Linux 内核 cifs.ko 真实执行路径。
┌─────────────────────────────────────────────────────────────────────┐
│ 用户进程空间 │
│ │
│ open("/mnt/cifs/file.txt", O_RDWR) │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ 系统调用层 (syscall) │
│ │
│ sys_open / do_sys_open │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ VFS 虚拟文件系统层 │
│ │
│ do_filp_open() │
│ path_openat() │
│ vfs_open() │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ 【CIFS VFS 适配层 – 核心入口】 │ ← 对接VFS
│ │
│ inode->i_fop->open() │
│ ╔═══════════════════════════════╗ │
│ ║ cifs_open() 【主函数】 ║ │
│ ╚═══════════════════════════════╝ │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ CIFS VFS 适配层 – 准备与校验 │
│ │
│ 1. 获取 cifs_sb_info (挂载私有数据) │
│ 2. 获取 cifs_tcon (树连接/共享) │
│ 3. 解析 flags (O_CREAT, O_TRUNC 等) │
│ 4. 权限检查 (uid/gid映射) │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ CIFS VFS 适配层 → 调用协议层接口 │
│ │
│ cifs_nt_open() / SMB2_open() │
│ ➜ 编码转换:UTF-8 → UTF-16LE 文件名 │
│ ➜ 封装 SMB2_CREATE 请求参数 │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ CIFS 协议引擎层 │
│ │
│ SMB2_create_send() 【发送SMB创建请求】 │
│ cifs_send_async_read() │
│ mid_q_entry 管理 (请求队列/超时) │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ 网络传输层 │
│ │
│ TCP Socket (端口 445) │
│ ➜ 发送 SMB2_CREATE 报文 │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ Windows / Samba 服务器 │
│ │
│ 处理文件创建/打开 → 返回 File ID (FID) │
│ 返回 Oplock/Lease (缓存授权) │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ 协议层 – 接收响应 │
│ │
│ SMB2_create_recv() │
│ 解析响应 → 获取 Server FID │
│ 解析 Oplock/Lease 状态 │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ CIFS VFS 适配层 – 收尾初始化 │
│ │
│ cifs_init_file_info() │
│ ➜ 分配 cifsFileInfo (绑定FID/Oplock) │
│ ➜ 关联 file->private_data │
│ ➜ 填充 inode 属性 (size, mtime) │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ VFS 层 – 返回 │
│ │
│ 返回 file 结构体 fd │
└───────────────────────────┬─────────────────────────────────────────┘
│
┌───────────────────────────▼─────────────────────────────────────────┐
│ 用户进程空间 │
│ │
│ open() 执行完成,返回 fd │
└─────────────────────────────────────────────────────────────────────┘
最核心的 3 个函数
VFS 适配层在 open 中的核心工作
- 把 POSIX open 标志(O_CREAT/O_RDWR)→ 翻译成 SMB Create 指令
- 把 Linux UID/GID → 映射成服务端权限
- 把 UTF-8 文件名 → 转成 SMB 协议要求的 UTF-16LE
- 申请 Oplock/Lease(缓存锁,提升后续读写性能)
- 绑定 file 结构体与服务端 FID



