用法

此模块支持 SMB3 系列高级网络协议(以及较旧的方言,最初称为“CIFS”或 SMB1)。

Linux 的 CIFS VFS 模块支持许多高级网络文件系统功能,例如分层 DFS 命名空间、硬链接、锁定等。它旨在符合 SNIA CIFS 技术参考(该参考取代了 1992 年 X/Open SMB 标准),并与 Windows 2000、Windows XP、Samba 及同等服务器实现最佳实践的实际互操作性。此代码是与协议自由信息基金会合作开发的。CIFS 和现在的 SMB3 已成为 Mac、Windows 和主要 NAS 设备之间互操作的事实标准。

有关更多详细信息,请参阅 MS-SMB2(用于详细的 SMB2/SMB3/SMB3.1.1 协议规范)或 https://samba.org/samba/PFIF/

如有问题或错误报告,请联系

请访问项目页面:https://wiki.samba.org/index.php/LinuxCIFS_utils

构建说明

对于 Linux

  1. 下载内核(例如从 https://linuxkernel.org.cn),并进入内核目录树的顶部(例如 /usr/src/linux-2.5.73)

  2. make menuconfig(或 make xconfig)

  3. 从网络文件系统选项中选择 cifs

  4. 保存并退出

  5. make

安装说明

如果您已成功将 CIFS VFS 构建为模块,只需键入 make modules_install(或者,如果您愿意,手动将文件复制到模块目录,例如 /lib/modules/6.3.0-060300-generic/kernel/fs/smb/client/cifs.ko)。

如果您已将 CIFS VFS 构建到内核本身中,请按照您的发行版说明安装新内核(通常只需键入 make install)。

如果您没有实用程序 mount.cifs(在 Samba 4.x 源代码树和 CIFS VFS 网站上),请将其复制到 mount 助手所在的目录(通常是 /sbin)。尽管不是必需的,但建议使用 mount.cifs 辅助软件。大多数发行版都包含一个 cifs-utils 软件包,其中包含此实用程序,因此建议安装此软件包。

请注意,在所有 Linux 客户端上运行 Winbind pam/nss 模块(登录服务)有助于在整个域中将 Uid 和 Gid 一致地映射到适当的网络用户。mount.cifs 挂载助手可在 git.samba.org 上的 cifs-utils.git 中找到。

如果 cifs 作为模块构建,则可以配置网络缓冲区的大小和数量以及对单个服务器的最大并发请求数。不建议更改这些默认值。通过执行 modinfo

modinfo <path to cifs.ko>

在 kernel/fs/smb/client/cifs.ko 上可以看到模块初始化时(通过运行 insmod cifs.ko)可以进行的配置更改列表。

建议

为了提高安全性,SMB2.1 或更高版本(通常是 SMB3.1.1)现在是新的默认方言。要使用旧方言(例如挂载 Windows XP),请在挂载时使用“vers=1.0”(或对于 Windows Vista 使用 vers=2.0)。请注意,CIFS (vers=1.0) 比默认方言 SMB3 旧得多且安全性较低,SMB3 包含许多高级安全功能,例如降级攻击检测、加密共享以及更强的签名和身份验证算法。还有其他挂载选项可能有助于 SMB3 获得改进的 POSIX 行为(注意:可以使用 vers=3 强制使用 SMB3 或更高版本,绝不能使用 2.1)。

mfsymlinkscifsaclmodefromsid(通常与 idsfromsid 一起使用)

允许用户挂载

使用 CIFS VFS 允许用户在其拥有的目录上进行挂载和卸载是可能的。启用此类挂载的一种方法是将 mount.cifs 实用程序标记为 suid(例如 chmod +s /sbin/mount.cifs)。要使用户能够卸载他们挂载的共享,需要

  1. mount.cifs 1.4 或更高版本

  2. 在 /etc/fstab 中为共享添加一个条目,指示用户可以卸载它,例如

    //server/usersharename  /mnt/username cifs user 0 0
    

请注意,当 mount.cifs 实用程序以 suid 方式运行(允许用户挂载)时,为了降低风险,在挂载时会传入 nosuid 挂载标志,以禁止执行远程目标上挂载的 suid 程序。当以 root 身份执行 mount 时,默认情况下不会传入 nosuid,并且默认情况下将允许执行远程目标上的 suid 程序。这可以像 nfs 和其他文件系统一样进行更改,只需在挂载选项中指定 nosuid 即可。但对于用户挂载,要能够将 suid 标志传递给 mount,需要使用以下标志重新构建 mount.cifs:CIFS_ALLOW_USR_SUID

Samba 3.0 及更高版本的源代码树中的 docs/manpages/mount.cifs.8 中有关于 cifs 挂载的相应手册页。

允许用户卸载

为了允许用户卸载他们用户挂载的目录(见上文),可以使用实用程序 umount.cifs。它可以直接调用,或者如果 umount.cifs 放在 /sbin 中,umount 可以调用 cifs 卸载助手(至少对于大多数版本的 umount 实用程序)来卸载 cifs 挂载,除非 umount 使用 -i 调用(这将避免调用卸载助手)。与 mount.cifs 类似,要启用用户卸载,umount.cifs 必须标记为 suid(例如 chmod +s /sbin/umount.cifs)或等效设置(某些发行版允许将条目添加到 /etc/permissions 文件以实现等效的 suid 效果)。为了此实用程序成功,目标路径必须是 cifs 挂载,并且当前用户的 uid 必须与挂载资源的用户的 uid 匹配。

另请注意,允许用户挂载和卸载的通常方式是(而不是将 mount.cifs 和 unmount.cifs 用作 suid)为每个您希望挂载的 //server/share 在 /etc/fstab 文件中添加一行,但是当潜在的挂载目标包含许多或不可预测的 UNC 名称时,这可能会变得难以管理。

Samba 考量

大多数当前服务器支持更安全的 SMB2.1 和 SMB3,但对于较旧、安全性较低的 CIFS 方言,存在有用的协议扩展。因此,如果使用旧方言(CIFS/SMB1)挂载以获得最大收益,我们建议使用支持 SNIA CIFS Unix Extensions 标准的服务器(例如,几乎任何版本的 Samba,即 2.2.5 或更高版本),但 CIFS VFS 能够与各种 CIFS 服务器良好运行。请注意,如果您没有支持 CIFS Unix 扩展的服务器(例如 Samba 2.2.5 或更高版本),则 uid、gid 和文件权限将显示默认值。要在 Samba 服务器中启用 Unix CIFS Extensions,请添加以下行

unix extensions = yes

到服务器上的 smb.conf 文件中。请注意,当大多数客户端是 Unix 或 Linux 时,以下 smb.conf 设置(在 Samba 服务器上)也很有用

case sensitive = yes
delete readonly = yes
ea support = yes

请注意,要从 Linux cifs 客户端支持 xattrs,需要服务器 EA 支持,并且 EA 支持存在于较新版本的 Samba 中(例如 3.0.6 及更高版本,EA 支持在所有版本的 Windows 中也有效,至少对于 NTFS 文件系统上的共享)。扩展属性 (xattr) 支持是大多数 Linux 文件系统的一个可选功能,可能需要通过 make menuconfig 启用。客户端对扩展属性 (user xattr) 的支持可以通过在挂载时指定 nouser_xattr 来按挂载禁用。

CIFS 客户端可以获取和设置 POSIX ACL(getfacl、setfacl)到 Samba 3.10 及更高版本服务器。设置 POSIX ACL 需要在构建 CIFS 模块时在 CIFS 配置选项中同时启用 XATTR 和 POSIX 支持。POSIX ACL 支持可以通过在挂载时指定 noacl 来按挂载禁用。

一些管理员可能希望更改 Samba 的 smb.conf 中的 map archivecreate mask 参数的默认值。除非更改创建掩码,否则新创建的文件可能会以不必要的严格默认模式结束,这可能不是您想要的,尽管如果在服务器和客户端上启用了 CIFS Unix 扩展,后续的 setattr 调用(例如 chmod)可以修复模式。请注意,如果不是使用 Samba 3.0.6 或更高版本,则远程创建特殊设备 (mknod) 可能需要向 Samba 指定 mkdev 函数。有关这些的更多信息,请参阅 Samba 服务器系统上的手册页(man smb.conf)。请注意,与 smbfs vfs 不同,cifs vfs 不读取客户端系统上的 smb.conf 文件(少数可选设置通过 -o 参数在挂载时传入)。请注意,Samba 2.2.7 或更高版本包含一个修复,允许 CIFS VFS 删除打开的文件(严格符合 POSIX 所需)。Windows 服务器已经支持此功能。Samba 服务器不允许引用共享外部文件的符号链接,因此在 Samba 3.0.6 之前的版本中,大多数指向带有绝对路径(即以斜杠开头)的文件的符号链接,例如

ln -s /mnt/foo bar

将被禁止。Samba 3.0.6 或更高版本的服务器包括安全创建此类符号链接的能力,方法是将不安全的符号链接(即指向共享外部服务器文件的符号链接)转换为服务器上的 Samba 特定格式,该格式被本地服务器应用程序和非 CIFS 客户端忽略,并且不会被 Samba 服务器遍历。这对于使用 CIFS VFS 的 Linux 客户端应用程序是透明的。绝对符号链接将适用于 Samba 3.0.5 或更高版本,但仅限于使用 CIFS Unix 扩展的远程客户端,并且对 Windows 客户端将不可见,通常不会影响在同一台 Samba 服务器上运行的本地应用程序。

使用说明

一旦 CIFS VFS 支持被构建到内核中或作为模块 (cifs.ko) 安装,您可以使用以下挂载语法来访问 Samba、Mac 或 Windows 服务器

mount -t cifs //9.53.216.11/e$ /mnt -o username=myname,password=mypassword

在 -o 之前可以指定选项 -v,使 mount.cifs 挂载助手更详细地显示挂载步骤。在 -o 之后,支持以下常用的 cifs vfs 特定选项

username=<username>
password=<password>
domain=<domain name>

其他 cifs 挂载选项将在下面描述。如果安装了挂载助手 (mount.cifs),则可以使用 TCP 名称(除了 IP 地址)。如果您不信任要挂载的服务器,或者如果未启用 cifs 签名(并且物理网络不安全),请考虑使用标准挂载选项 noexecnosuid,以降低在本地系统上运行修改过的二进制文件(从恶意服务器下载或被恶意路由器修改)的风险。

尽管 mount.cifs 尚不支持使用与 CIFS URL 规范相对应的格式进行挂载,但可以使用服务器和共享名的替代格式(与 NFS 风格的挂载语法有些相似),而不是更广泛使用的 UNC 格式(即 \servershare)

mount -t cifs tcp_name_of_server:share_name /mnt -o user=myname,pass=mypasswd

当使用挂载助手 mount.cifs 时,可以通过替代机制指定密码,而不是在命令行上使用正常的 pass= 语法在 -o 之后指定:1) 通过将其包含在凭据文件中。将 credentials=filename 指定为挂载选项之一。凭据文件包含两行

username=someuser
password=your_password
  1. 通过在 PASSWD 环境变量中指定密码(类似地,用户名可以从 USER 环境变量中获取)。

  2. 通过 PASSWD_FILE 在文件中按名称指定密码

  3. 通过 PASSWD_FD 在文件中通过文件描述符指定密码

如果未提供密码,mount.cifs 将提示输入密码

限制

服务器必须支持“纯 TCP”(端口 445 TCP/IP CIFS 连接)或 RFC 1001/1002 对“Netbios-Over-TCP/IP”的支持。这不太可能成为问题,因为大多数服务器都支持此功能。

Windows 和 Linux 之间有效文件名存在差异。Windows 通常限制包含某些保留字符的文件名(例如字符 `:`,Windows 用它来分隔流名的开头),而 Linux 允许文件名中使用更广泛的有效字符集。当在服务器注册表中指定显式映射时,Windows 服务器可以重新映射此类字符。从 3.10 版开始的 Samba 将允许此类文件名(即包含有效 Linux 字符,通常 Windows/CIFS 语义会禁止的那些),只要服务器配置了 Unix 扩展(并且客户端未禁用 /proc/fs/cifs/LinuxExtensionsEnabled)。此外,在 CIFS (vers=1.0) 上可以使用挂载选项 mapposix 来强制将非法 Windows/NTFS/SMB 字符映射到重新映射范围(此挂载参数是 SMB3 的默认值)。此重新映射 (mapposix) 范围也与 Mac(以及某些旧版 Windows 上的“Mac 服务”)兼容。当协商 SMB 3.1.1 的 POSIX 扩展时,重新映射将自动禁用。

CIFS VFS 挂载选项

下面列出了支持的挂载选项的部分列表

username (用户名)

尝试建立 CIFS 会话时使用的用户名。

password (密码)

用户密码。如果安装了挂载助手,如果未提供密码,则会提示用户输入密码。

ip (IP 地址)

目标服务器的 IP 地址

unc (UNC 路径)

要挂载的目标服务器通用网络名称(导出)。

domain (域)

在 CIFS 会话建立期间,设置添加到用户名前的 SMB/CIFS 工作组名称

forceuid (强制用户ID)

将 inode 的默认 uid 设置为挂载时传入的 uid。对于支持 CIFS Unix 扩展的服务器(例如正确配置的 Samba 服务器)的挂载,服务器提供 uid、gid 和模式,因此除非服务器和客户端的 uid 和 gid 编号不同,否则不应指定此参数。如果服务器和客户端在同一域中(例如运行 winbind 或 nss_ldap)并且服务器支持 Unix 扩展,则可以从服务器检索 uid 和 gid(并且无需在挂载时指定 uid 和 gid)。对于不支持 CIFS Unix 扩展的服务器,查找现有文件时返回的默认 uid(和 gid)将是执行挂载的人的 uid(gid)(root,除非 mount.cifs 配置为用户挂载的 setuid),除非指定了 uid= (gid) 挂载选项。另请注意,对文件的访问权限检查(授权检查)发生在服务器端,但在某些情况下,管理员也可能希望在客户端进行限制。对于不报告 uid/gid 所有者(例如 Windows)的服务器,也可以在客户端检查权限,并且可以通过在客户端指定 file_mode 和 dir_mode 来启用一种粗略的客户端权限检查形式。(默认)

forcegid (强制组ID)

(与上述类似,但针对 groupid 而不是 uid)(默认)

noforceuid (不强制用户ID)

如果可能,通过从服务器请求来填充文件所有者信息 (uid)。使用此选项,仅当服务器不支持在 inode 上返回 uid 时,才会使用 uid= 选项中(在挂载时)给定的值。

noforcegid (不强制组ID)

(与上述类似,但针对组所有者 gid 而不是 uid)

uid (用户ID)

设置 inode 的默认 uid,并向 cifs 内核驱动程序指示哪个本地用户进行了挂载。如果服务器支持 unix 扩展,则默认 uid 不用于填充 inode(文件)的所有者字段,除非指定了 forceuid 参数。

gid (组ID)

设置 inode 的默认 gid(与上述类似)。

file_mode (文件模式)

如果服务器不支持 CIFS Unix 扩展,此选项将覆盖文件 inode 的默认模式。

fsc (FS-缓存)

使用 FS-Cache 启用本地磁盘缓存(默认关闭)。此选项有助于提高慢速链接、重负载服务器和/或网络上的性能,因为从磁盘读取比通过网络从服务器读取更快。这也可以通过减少对服务器的调用次数来积极影响可伸缩性。然而,本地缓存不适用于所有工作负载,例如一次性读取类型的工作负载。因此,在使用此选项之前,您需要仔细考虑您的工作负载/场景。目前,本地磁盘缓存对于以只读方式打开的 CIFS 文件是有效的。

dir_mode (目录模式)

如果服务器不支持 CIFS Unix 扩展,此选项将覆盖目录 inode 的默认模式。

port (端口)

尝试在此 TCP 端口上联系服务器,然后尝试常用端口(端口 445,然后是 139)。

iocharset (I/O 字符集)

用于在本地路径名和 Unicode 之间进行转换的码页。如果服务器支持,则默认使用 Unicode 进行网络路径名。如果未指定 iocharset,则将使用本地客户端内核构建期间指定的 nls_default。如果服务器不支持 Unicode,则此参数将不使用。

rsize (读取大小)

默认读取大小(通常为 16K)。客户端目前不能使用大于 CIFSMaxBufSize 的 rsize。CIFSMaxBufSize 默认为 16K,可以在 cifs.ko 模块安装时更改(从 8K 到内核允许的最大 kmalloc 大小)。将 CIFSMaxBufSize 设置为非常大的值将导致 cifs 使用更多内存,在某些情况下可能会降低性能。要使用大于 127K(原始 cifs 协议最大值)的 rsize,还需要服务器支持一个新的 Unix Capability 标志(用于非常大的读取),一些较新的服务器(例如 Samba 3.0.26 或更高版本)支持此功能。rsize 可以设置为最小 2048 到最大 130048(127K 或 CIFSMaxBufSize,取较小者)

wsize (写入大小)

默认写入大小(默认 57344),CIFS 目前允许的最大 wsize 是 57344(十四个 4096 字节页)

actimeo=n (属性缓存超时)

属性缓存超时(以秒为单位,默认 1 秒)。超时后,cifs 客户端会向服务器请求新的属性信息。此选项允许根据工作负载需求调整属性缓存超时。更短的超时意味着更好的缓存一致性,但会增加对服务器的调用次数。更长的超时意味着减少对服务器的调用次数,但代价是缓存一致性检查不够严格(即短时间内属性缓存不正确)。

rw (读写)

以读写方式挂载网络共享(请注意,服务器可能仍将共享视为只读)

ro (只读)

以只读方式挂载网络共享

version (版本)

用于区分不同版本的挂载助手实用程序(通常不需要)

sep (分隔符)

如果作为第一个挂载选项(在 -o 之后),则覆盖逗号作为挂载参数之间的分隔符。例如

-o user=myname,password=mypassword,domain=mydom

可以通过句点作为分隔符传入

-o sep=.user=myname.password=mypassword.domain=mydom

当用户名、密码或域中包含逗号时,这可能很有用。当使用 cifs 挂载助手 cifs.mount(版本 1.1 或更高版本)时,此选项的重要性较低。

nosuid (禁用 suid)

不允许执行具有 suid 位程序的远程可执行文件。这仅适用于挂载到支持 CIFS Unix 扩展的服务器(如 Samba)。如果您不信任网络中的服务器(您的挂载目标),建议您指定此选项以提高安全性。

exec (允许执行)

允许在挂载点上执行二进制文件。

noexec (禁止执行)

不允许在挂载点上执行二进制文件。

dev (允许设备)

识别远程挂载点上的块设备。

nodev (禁止设备)

不识别远程挂载点上的设备。

suid (启用 suid)

允许在此挂载点上执行已启用 suid 的远程文件(以 root 身份执行挂载时为默认值,用户挂载时 nosuid 为默认值)。

credentials (凭据)

尽管 cifs 内核组件会忽略它,但挂载助手 mount.cifs 会使用它。安装 mount.cifs 后,它会打开并读取指定的凭据文件,以获取传递给 cifs vfs 的用户 ID 和密码参数。

guest (访客)

尽管内核组件会忽略它,但如果在挂载选项中指定了 guest,mount.cifs 挂载助手将不会提示用户输入密码。如果未指定密码,将使用空密码。

perm (权限检查)

客户端执行权限检查(vfs_permission 检查文件的 uid 和 gid 是否与模式和所需操作匹配)。请注意,这是在服务器软件在目标机器上执行的正常 ACL 检查之外的额外检查。客户端权限检查默认启用。

noperm (不进行权限检查)

客户端不执行权限检查。这可能导致此挂载上的文件被本地客户端系统上的其他用户访问。通常,仅当服务器支持 CIFS Unix 扩展,但客户端和服务器系统上的 UID/GID 不够匹配以允许挂载用户访问时才需要它。但在非 CIFS Unix 扩展挂载的情况下,如果挂载时指定了默认模式但不在客户端强制执行(例如,可能在启用 MultiUserMount 时),这可能很有用。请注意,这不影响服务器软件在目标机器上执行的正常 ACL 检查(服务器 ACL 与挂载时提供的用户名之间的检查)。

serverino (使用服务器 inode 号)

使用服务器的 inode 号,而不是在客户端自动生成递增的 inode 号。尽管这将使识别硬链接文件更容易(因为它们将具有相同的 inode 号),并且 inode 号可能是持久的,但请注意,如果多个服务器端挂载在单个共享下导出,服务器不保证 inode 号是唯一的(因为如果多个文件系统挂载在同一个共享高级目录中,服务器上的 inode 号可能不是唯一的)。请注意,一些较旧的服务器(例如 Windows 2000 之前)不支持返回 UniqueIDs 或 CIFS Unix Extensions 的等效功能,对于这些服务器,此挂载选项将无效。在 nfsd 下导出 cifs 挂载需要此 cifs 挂载选项。如果服务器支持所需的网络操作,这现在是默认设置。

noserverino (不使用服务器 inode 号)

客户端生成 inode 号(而不是使用服务器的实际 inode 号)。这些 inode 号在卸载或重启后会发生变化,这可能会混淆某些应用程序,但并非所有服务器文件系统都支持唯一的 inode 号。

setuids (设置用户/组ID)

如果与服务器协商了 CIFS Unix 扩展,客户端将尝试在新创建的文件、目录和设备(create、mkdir、mknod)上设置本地进程的有效 uid 和 gid。如果 CIFS Unix 扩展未协商,则对于新创建的文件和目录,将本地缓存新文件的 uid 和 gid,而不是使用挂载时指定的默认 uid 和 gid,这意味着当 inode 重新加载(或用户重新挂载共享)时,文件的 uid 可能会更改。

nosetuids (不设置用户/组ID)

客户端不会尝试在新创建的文件、目录和设备(create、mkdir、mknod)上设置 uid 和 gid,这将导致服务器将 uid 和 gid 设置为默认值(通常是挂载共享的用户在服务器上的 uid)。默认情况下,允许服务器(而不是客户端)设置 uid 和 gid。如果未协商 CIFS Unix 扩展,则新文件的 uid 和 gid 将显示为挂载者的 uid (gid) 或挂载时指定的 uid (gid) 参数。

netbiosname (NetBIOS 名称)

通过端口 139 挂载到服务器时,指定用于在执行 RFC1001 NetBIOS 会话初始化时表示客户端 NetBIOS 机器名的 RFC1001 源名称。

direct (直接模式)

不要对此挂载点上打开的文件进行 inode 数据缓存。这排除了在此挂载点上进行文件内存映射。在某些情况下,当网络速度快且客户端缓存收益很少或没有时(例如,当应用程序进行大于页面大小的连续大读取而没有重复读取相同数据时),这可以提供比默认行为更好的性能,默认行为是在授予和持有 oplock(缓存令牌)时通过本地 Linux 客户端页缓存缓存读取(预读)和写入(回写)。请注意,直接模式允许将大于页面大小的写入操作发送到服务器。

strictcache (严格缓存模式)

用于开启严格缓存模式。在此模式下,客户端在拥有 Oplock Level II 时始终从缓存中读取,否则从服务器读取。所有写入的数据都存储在缓存中,但如果客户端没有独占 Oplock,则会将数据写入服务器。

rwpidforward (读写PID转发)

将打开文件的进程的 PID 转发到该文件的任何读写操作。如果我们使用强制 brlock 样式,这可以防止像 WINE 这样的应用程序在读写时失败。

acl (访问控制列表)

如果服务器支持 POSIX ACL,则允许 setfacl 和 getfacl 管理它们。(默认)

noacl (禁用ACL)

不允许在此挂载上进行 setfacl 和 getfacl 调用

user_xattr (用户扩展属性)

允许将用户 xattrs(名称以 user.os2. 开头的属性)作为 OS/2 EA(扩展属性)获取和设置到服务器。这允许支持 setfattr 和 getfattr 实用程序。(默认)

nouser_xattr (禁用用户扩展属性)

不允许 getfattr/setfattr 获取/设置/列出 xattrs

mapchars (字符映射)

将七个保留字符中的六个(不包括反斜杠)

*?<>|:

转换为重新映射范围(高于 0xF000),这也允许 CIFS 客户端识别 Windows 的 POSIX 仿真创建的包含此类字符的文件。当挂载到大多数版本的 Samba 时(Samba 也禁止创建和打开名称包含这七个字符中任何一个的文件),这可能也很有用。如果服务器不支持网络上的 Unicode,则此操作无效。

nomapchars (不映射字符)

不翻译这七个字符中的任何一个(默认)。

nocase (不区分大小写)

请求路径名匹配不区分大小写(如果服务器支持,则默认区分大小写)。(挂载选项 ignorecasenocase 相同)

posixpaths (POSIX 路径)

如果支持 CIFS Unix 扩展,则尝试协商 POSIX 路径名支持,该支持允许在典型 CIFS 文件名中禁止的某些字符,而无需重新映射。(默认)

noposixpaths (不使用POSIX路径)

如果支持 CIFS Unix 扩展,则不请求 POSIX 路径名支持(这可能会导致服务器拒绝创建包含某些保留字符的文件)。

nounix (禁用 Unix 扩展)

为此挂载(树连接)禁用 CIFS Unix 扩展。这很少需要,但一次性关闭多个设置(即 POSIX ACL、POSIX 锁、POSIX 路径、符号链接支持以及从服务器检索 uid/gid/模式)或解决实现 Unix 扩展的服务器中的错误时可能很有用。

nobrl (禁用字节范围锁)

不向服务器发送字节范围锁请求。这对于某些由于 cifs 样式强制字节范围锁而中断的应用程序是必需的(并且大多数 cifs 服务器尚不支持请求咨询字节范围锁)。

forcemandatorylock (强制强制锁)

即使服务器支持 POSIX(咨询)字节范围锁定,也只发送强制锁定请求。对于某些(可能是罕见的)最初为 DOS/Windows 编写的、需要 Windows 样式强制字节范围锁定的应用程序,它们可能可以利用此选项,强制 CIFS 客户端仅发送强制锁定,即使 CIFS 服务器支持 POSIX 咨询锁定。forcemand 是此挂载选项的缩写形式。

nostrictsync (非严格同步)

如果设置了此挂载选项,当应用程序执行 fsync 调用时,CIFS 客户端不会向服务器发送 SMB Flush(以强制服务器立即将此文件的所有脏数据写入磁盘),尽管 CIFS 仍会将所有脏(缓存的)文件数据发送到服务器并等待服务器响应写入。由于 SMB Flush 可能非常慢,并且某些服务器可能足够可靠(承担稍有延迟将数据刷新到服务器磁盘的风险),因此启用此选项可能有助于提高频繁 fsync 的应用程序的性能,但服务器崩溃的风险很小。如果未设置此挂载选项,默认情况下 CIFS 将在每次 fsync 调用时发送 SMB flush 请求(并等待响应)。

nodfs (禁用DFS)

即使服务器声称支持 DFS(全局命名空间支持),也禁用它。这有助于解决 Samba 服务器 3.0.24 和 3.0.25 版本解析 DFS 路径的问题。

remount (重新挂载)

重新挂载共享(通常用于将只读挂载更改为读写挂载,反之亦然)

cifsacl (CIFS ACL)

根据文件的 Windows ACL 报告模式位(例如在 stat 上)。(实验性)

servern (服务器名称)

指定尝试与服务器建立会话时使用的服务器 NetBIOS 名称(RFC1001 名称)。这对于挂载到某些旧服务器(例如 OS/2 或 Windows 98 和 Windows ME)是必需的,因为它们不支持默认服务器名称。服务器名称最长可达 15 个字符,通常为大写。

sfu (Unix 服务)

当未协商 CIFS Unix 扩展时,尝试以与 Services for Unix (SFU) 兼容的格式创建设备文件和 FIFO。此外,通过 SETFILEBITS 扩展属性(如 SFU 所做)检索模式的第 10-12 位。将来,模式的最低 9 位也将使用安全描述符 (ACL) 的查询进行模拟。

mfsymlinks (M+F 符号链接)

启用对 Minshall+French 符号链接的支持(请参阅 http://wiki.samba.org/index.php/UNIX_Extensions#Minshall.2BFrench_symlinks)。当与“sfu”选项一起指定时,此选项将被忽略。即使服务器支持 CIFS Unix 扩展,也会使用 Minshall+French 符号链接。

sign (签名)

必须使用数据包签名(有助于避免路由中间系统进行不必要的数据修改)。请注意,签名不适用于 lanman 或明文身份验证。

seal (密封/加密)

在网络上传输之前,必须对此挂载共享上的所有数据进行密封(加密)。需要支持 Unix 扩展。请注意,这与签名挂载选项不同,它会导致通过此挂载共享发送的数据加密,但挂载到同一服务器的其他共享不受影响。

locallease (本地租约)

此选项很少需要。Fcntl F_SETLEASE 被某些应用程序(如 Samba 和 NFSv4 服务器)用于检查文件是否可缓存。CIFS 无法明确请求租约,但可以检查文件是否可缓存(已锁定)。不幸的是,即使文件未锁定,它仍然可能是可缓存的(即,如果没有其他本地进程正在使用该文件,CIFS 客户端可以授予 fcntl 租约),例如当服务器不支持 oplocks 并且用户确定对文件的唯一更新将来自此客户端时。指定此挂载选项将允许 CIFS 客户端对未锁定的文件(仅)进行本地租约检查,而不是在这种情况下拒绝租约。(实验性)

sec (安全模式)

安全模式。允许的值为

none (无)

尝试以空用户(无名称)连接

krb5 (Kerberos 5)

使用 Kerberos 版本 5 身份验证

krb5i (Kerberos 5i)

使用 Kerberos 身份验证和数据包签名

ntlm (NTLM)

使用 NTLM 密码哈希(默认)

ntlmi (NTLM i)

使用带签名的 NTLM 密码哈希(如果 /proc/fs/cifs/PacketSigningEnabled 启用或服务器要求签名,也可以是默认值)

ntlmv2 (NTLMv2)

使用 NTLMv2 密码哈希

ntlmv2i (NTLMv2 i)

使用带数据包签名的 NTLMv2 密码哈希

lanman (Lanman)

(如果在内核配置中配置)使用较旧的 lanman 哈希

hard (硬挂载)

如果服务器无响应,则重试文件操作

soft (软挂载)

限制对无响应服务器的重试次数(通常只重试一次),然后返回错误。(默认)

mount.cifs 挂载助手在 -o 之前也接受一些挂载选项,包括

-S

从 stdin 获取密码(等同于设置环境变量 PASSWD_FD=0

-V

打印 mount.cifs 版本

-?

显示简单的用法信息

对于大多数 2.6 内核版本的 modutils,cifs 内核模块的版本可以通过 modinfo 显示。

杂项 /proc/fs/cifs 标志和调试信息

信息性伪文件

DebugData

显示有关活动 CIFS 会话和共享、已启用的功能以及 cifs.ko 版本的信息。

Stats

列出摘要资源使用信息以及每个共享的统计信息。

open_files

列出所有活动 SMB 会话上的所有打开文件句柄。

mount_params

模块可用的所有挂载参数列表

配置伪文件

SecurityFlags

控制安全协商和数据包签名的标志。身份验证(可能/必须)标志(例如 NTLMv2)可以与签名标志结合使用。另一方面,指定两种不同的密码哈希机制(作为“必须使用”)并没有多大意义。默认标志是

0x00C5

(允许 NTLMv2 和数据包签名)。某些 SecurityFlags 可能需要启用相应的 menuconfig 选项。

可以使用数据包签名 0x00001 必须使用数据包签名 0x01001 可以使用 NTLMv2 0x00004 必须使用 NTLMv2 0x04004 可以使用 Kerberos 安全(krb5) 0x00008 必须使用 Kerberos 0x08008 可以使用 NTLMSSP 0x00080 必须使用 NTLMSSP 0x80080 密封(数据包加密) 0x00040 必须密封 0x40040

cifsFYI

如果设置为非零值,额外的调试信息将记录到系统错误日志中。此字段包含三个标志,控制不同类别的调试条目。可设置的最大值为 7,这将启用所有调试点(默认 0)。除非在内核配置中启用了 CONFIG_CIFS_DEBUG2,否则某些调试语句不会编译到 cifs 内核中。cifsFYI 可以设置为以下一个或多个标志(7 表示全部设置)

+-----------------------------------------------+------+
| log cifs informational messages               | 0x01 |
+-----------------------------------------------+------+
| log return codes from cifs entry points       | 0x02 |
+-----------------------------------------------+------+
| log slow responses                            | 0x04 |
| (ie which take longer than 1 second)          |      |
|                                               |      |
| CONFIG_CIFS_STATS2 must be enabled in .config |      |
+-----------------------------------------------+------+

traceSMB

如果设置为 1,则调试信息将随着 SMB 请求和响应的开始记录到系统错误日志中(默认 0)

LookupCacheEnable

如果设置为 1,inode 信息将缓存一秒钟,从而提高查找性能(默认 1)

LinuxExtensionsEnabled

如果设置为 1,则客户端将尝试使用 CIFS“UNIX”扩展,这些扩展是可选的协议增强,允许 CIFS 服务器返回准确的 UID/GID 信息并支持符号链接。如果您使用的服务器(例如 Samba)支持 CIFS Unix 扩展,但不想使用符号链接支持,并且希望将 uid 和 gid 字段映射到挂载时提供的值(而不是实际值),则将其设置为零。(默认 1)

dfscache

列出 DFS 缓存的内容。如果设置为 0,客户端将清除缓存。

这些实验性功能和跟踪可以通过更改 /proc/fs/cifs 中的标志来启用(在 cifs 模块安装或构建到内核中之后,例如 insmod cifs)。要启用某项功能,请将其设置为 1,例如要启用内核消息日志跟踪,键入

echo 7 > /proc/fs/cifs/cifsFYI

cifsFYI 作为位掩码运行。将其设置为 1 可启用各种信息性消息的额外内核日志记录。2 启用非零 SMB 返回代码的日志记录,而 4 启用完成时间超过一秒的请求(字节范围锁定请求除外)的日志记录。将其设置为 4 需要在内核配置 (.config) 中设置 CONFIG_CIFS_STATS2。将其设置为七可启用所有三个功能。最后,可以通过以下方式启用 SMB 请求和响应开始的跟踪:

echo 1 > /proc/fs/cifs/traceSMB

每个共享(每个客户端挂载)的统计信息可在 /proc/fs/cifs/Stats 中找到。如果在内核配置 (.config) 中启用了 CONFIG_CIFS_STATS2,则可获得更多信息。返回的统计信息包括计数器,这些计数器表示按请求类型(读取、写入、关闭等)分组的尝试和失败(即服务器返回非零代码)的 SMB3(或 cifs)请求数量。还记录了该共享的总读取字节数和写入服务器的字节数。请注意,由于客户端缓存效应,这可能少于客户端上运行的应用程序读取和写入的字节数。统计信息可以通过 echo 0 > /proc/fs/cifs/Stats 重置为零,这在比较两种不同场景的性能时可能很有用。

另请注意,cat /proc/fs/cifs/DebugData 将显示有关活动会话和已挂载共享的信息。

启用 Kerberos(扩展安全)是可行的,但需要存在 1.2 或更高版本的辅助程序 cifs.upcall,并将其配置在 /etc/request-key.conf 文件中。cifs.upcall 辅助程序来自 Samba 项目 (https://www.samba.org)。NTLM、NTLMv2 和 LANMAN 支持不需要此辅助程序。请注意,NTLMv2 安全(不需要 cifs.upcall 辅助程序)在某些用例中足以替代 Kerberos。

DFS 支持允许透明重定向到 MS-DFS 命名空间中的共享。此外,对于指定为以主机名(而不是 IP 地址)开头的 UNC 名称的目标共享,DFS 支持需要存在一个用户空间助手(例如 cifs.upcall)来将主机名转换为 IP 地址,并且用户空间助手也必须在 /etc/request-key.conf 文件中进行配置。Samba、Windows 服务器和许多 NAS 设备都支持 DFS 作为构建全局命名空间的方式,以简化网络配置并提高可靠性。

要使用 cifs Kerberos 和 DFS 支持,应安装 Linux keyutils 软件包,并向 /etc/request-key.conf 文件添加类似以下几行内容

create cifs.spnego * * /usr/local/sbin/cifs.upcall %k
create dns_resolver * * /usr/local/sbin/cifs.upcall %k

CIFS 内核模块参数

这些模块参数可以在模块加载时或运行时使用以下接口指定或修改

/sys/module/cifs/parameters/<param>

echo "value" > /sys/module/cifs/parameters/<param>

可以通过以下方式查看可用模块参数及其值的更详细描述

modinfo cifs(或 modinfo smb3)

  1. enable_oplocks (启用 oplock)

启用或禁用 oplock。Oplock 默认启用。[Y/y/1]。要禁用,请使用 [N/n/0] 中的任意一个。