linux cifs架构
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 映射、缓存参数
- 管理 CIFS 挂载实例
struct inode_operations—— inode 操作
文件 / 目录元数据操作:
- 创建文件
create - 创建目录
mkdir - 查找
lookup - 链接 / 软链接
link、symlink - 修改权限 / 属主
setattr
CIFS 实现:
cifs_inode_operationscifs_dir_inode_operations核心函数:cifs_lookup: 路径查找 → 发 SMB Query/Find 指令cifs_create: 创建文件 → 发 SMB Createcifs_mkdir: 建目录 → SMB Create 目录
struct file_operations—— 文件 I/O 操作
用户最常调用的 read/write:
read_iterwrite_itermmapfsynclock
CIFS 实现:
cifs_file_operations核心函数:cifs_file_read_itercifs_file_write_itercifs_fsync
struct dentry_operations—— 目录项缓存操作
主要是缓存策略:
d_revalidate: 验证 dentry 是否还有效CIFS 实现:cifs_dentry_operationscifs_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)。
- 认证:NTLMv2、Kerberos(
网络传输层
- 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 路径(读写流程)
读流程
- 用户调用
read()→ VFS →cifs_file_read_iter()。 - 检查页缓存:命中则直接返回;未命中则发起 SMB
Read请求。 - 核心层封装
Read请求 → 网络层发送 → 等待服务器响应。 - 收到数据 → 填入页缓存 → 拷贝到用户空间 → 更新缓存状态(Oplock)。
写流程
- 用户调用
write()→ VFS →cifs_file_write_iter()。 - 数据写入页缓存(延迟写)。
- 脏页回写(
fsync/flush/ 内存压力):- 封装 SMB
Write请求 → 网络发送 → 等待确认。 - 若持有独占 Oplock,可批量写;否则需同步写并更新服务器状态。
- 封装 SMB
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_oplockcifs_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 个函数
cifs_open()CIFS VFS 适配层的open 入口,所有文件打开都走这里。SMB2_open()VFS 层 → 协议层的桥梁,负责把 Linux open 参数翻译成 SMB 协议。SMB2_create_send()真正发送网络请求到 Windows/Samba 服务器。
VFS 适配层在 open 中的核心工作
- 把POSIX open 标志(
O_CREAT/O_RDWR)→ 翻译成SMB Create 指令 - 把Linux UID/GID→ 映射成服务端权限
- 把UTF-8 文件名→ 转成 SMB 协议要求的UTF-16LE
- 申请Oplock/Lease(缓存锁,提升后续读写性能)
- 绑定
file结构体与服务端FID
