欢迎光临
我们一直在努力

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 映射、缓存参数

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 路径(读写流程)

读流程
  • 用户调用 read() → VFS → cifs_file_read_iter()。
  • 检查页缓存:命中则直接返回;未命中则发起 SMB Read 请求。
  • 核心层封装 Read 请求 → 网络层发送 → 等待服务器响应。
  • 收到数据 → 填入页缓存 → 拷贝到用户空间 → 更新缓存状态(Oplock)。
  • 写流程
  • 用户调用 write() → VFS → cifs_file_write_iter()。
  • 数据写入页缓存(延迟写)。
  • 脏页回写(fsync/flush/ 内存压力):
    • 封装 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 个函数

  • 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
    赞(0)
    未经允许不得转载:171主机测评 » linux cifs架构
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址