当前位置: 首页 > news >正文

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.cifscifs-utils),负责解析挂载参数、处理认证、调用内核mount接口。
  • 管理工具smbinfosetcifsaclcifs.upcall(Kerberos/DFS 解析)。
  • 配置与调试/proc/fs/cifs/StatsDebugDatacifsFYI)、/sys/module/cifs/parameters/

VFS 适配层(核心对接层)

  • 实现 Linux VFS 标准接口:super_operationsfile_operationsinode_operationsdentry_operations
  • 职责:
    • 管理super_blockinodedentryfile等 VFS 对象。
    • 处理权限、缓存、路径查找、文件锁、扩展属性(xattr)、ACL 等。
    • 映射 POSIX 语义到 SMB 协议(如chmodsymlinkhardlink)。

它位于:

用户进程 ↓ 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
  • 链接 / 软链接linksymlink
  • 修改权限 / 属主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_blocktcon、缓存参数
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 路径(读写流程)

读流程
  1. 用户调用read()→ VFS →cifs_file_read_iter()
  2. 检查页缓存:命中则直接返回;未命中则发起 SMBRead请求。
  3. 核心层封装Read请求 → 网络层发送 → 等待服务器响应。
  4. 收到数据 → 填入页缓存 → 拷贝到用户空间 → 更新缓存状态(Oplock)。
写流程
  1. 用户调用write()→ VFS →cifs_file_write_iter()
  2. 数据写入页缓存(延迟写)。
  3. 脏页回写(fsync/flush/ 内存压力):
    • 封装 SMBWrite请求 → 网络发送 → 等待确认。
    • 若持有独占 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 缓存以提升性能:

  1. dentry 缓存

    • lookup结果缓存
    • d_revalidate保证一致性
  2. inode 缓存

    • 缓存文件大小、mtime、属性
    • 减少 SMB Query Info
  3. page cache

    • 读写都走页缓存
    • 由 oplock/lease 保证多客户端一致性
  4. 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 个函数

  1. cifs_open()CIFS VFS 适配层的open 入口,所有文件打开都走这里。
  2. SMB2_open()VFS 层 → 协议层的桥梁,负责把 Linux open 参数翻译成 SMB 协议。
  3. 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
http://www.cnnetsun.cn/news/1323374.html

相关文章:

  • gemini使用命令
  • 星图AI算力平台训练PETRV2-BEV模型:保姆级教程,5步搞定自动驾驶感知
  • 电商智能客服数据存储方案:关系型数据库 vs 向量数据库的技术选型与实战
  • 02 今日内容大纲
  • 振温传感器特征值及其作用
  • 告别数据残留:微信聊天记录与图片文件永久销毁的正确操作指南
  • 选型指南:一文解锁和芯星通GNSS芯片模块产品选型
  • PowerPaint-V1 Gradio与SpringBoot整合实战:企业级图像处理平台搭建
  • 发财运势计算器,简易程序!
  • 语音分离新突破:MossFormer模型在ICASSP 2023上的表现与实战调优指南
  • AnythingtoRealCharacters2511惊艳效果展示:日漫风→写实光影→电影级质感全流程案例
  • 【Skills实战1】:自动生成报告(包括配图)-附skill文件
  • Golang实现AI智能体权限最小化与动态沙箱系统
  • Asian Beauty Z-Image Turbo镜像免配置:内置TensorRT加速选项与ONNX导出工具链
  • Qwen3-ASR-0.6B语音识别入门必看:自动语言检测+多格式音频支持详解
  • 西门子1200使用信号板(CB 1241 RS485)实现ModbusRTU源码分享
  • 2026年亲测:合肥系统门窗厂家真实案例分享
  • MarkItDown:多格式文档转换解决方案的实战指南
  • InstructPix2Pix效果展示集:油画风、复古胶片感,指令生成惊艳作品
  • GLM-OCR在MATLAB中的调用:打通深度学习模型与科学计算环境
  • 2026年实测3款矩阵管理工具,它凭AI+全链路能力破解企业运营痛点
  • MogFace人脸检测模型CSDN技术博客写作:如何展示你的部署与应用成果
  • translategemma-27b-it效果展示:电商主图中文文案→12国语言本地化翻译作品集
  • 使用 `srvany.exe` 创建 Windows 系统服务的详细教程
  • 鸿蒙应用开发全流程指南
  • M-LLM视频帧选择技术解析
  • FreeModbus 移植实战- 1-从零搭建嵌入式Modbus通信框架
  • SAP HANA 2.0升级实战全记录
  • [C#] 解决jsencrypt RSA加密后C#解密长度异常问题
  • LingBot-Depth在VSCode中的开发插件:提升3D编程效率