使用¶
此模块支持 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
下载内核(例如,从 https://linuxkernel.org.cn)并将目录更改到内核目录树的顶部(例如 /usr/src/linux-2.5.73)
make menuconfig(或 make xconfig)
从网络文件系统选项中选择 cifs
保存并退出
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 mount 助手可以在 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 有帮助以获得改进的 POSIX 行为(注意:可以使用 vers=3 来强制使用 SMB3 或更高版本,绝不用 2.1)
mfsymlinks
和cifsacl
或modefromsid
(通常与idsfromsid
一起使用)
允许用户挂载¶
允许用户在其拥有的目录上挂载和卸载是使用 cifs vfs 可以实现的。启用此类挂载的一种方法是将 mount.cifs 实用程序标记为 suid(例如 chmod +s /sbin/mount.cifs
)。要使用户能够卸载他们挂载的共享,需要
mount.cifs 版本 1.4 或更高版本
在 /etc/fstab 中为共享输入一个条目,指示用户可以卸载它,例如
//server/usersharename /mnt/username cifs user 0 0
请注意,当 mount.cifs 实用程序作为 suid 运行时(允许用户挂载),为了降低风险,nosuid
挂载标志会在挂载时传入,以禁止执行挂载在远程目标上的 suid 程序。当以 root 身份执行 mount 时,默认情况下不会传入 nosuid,并且默认情况下会启用在远程目标上执行 suid 程序。可以更改此设置,就像使用 nfs 和其他文件系统一样,只需在挂载选项中指定 nosuid
即可。但是,要使用户挂载能够将 suid 标志传递给挂载,需要使用以下标志重建 mount.cifs:CIFS_ALLOW_USR_SUID
Samba 3.0 及更高版本源代码树中的 docs/manpages/mount.cifs.8 中有一个对应的 cifs 挂载手册页
允许用户卸载¶
要允许用户卸载他们已用户挂载的目录(请参阅上文),可以使用实用程序 umount.cifs。可以直接调用它,或者如果将 umount.cifs 放置在 /sbin 中,则 umount 可以为 cifs 挂载调用 cifs umount 助手(至少对于大多数版本的 umount 实用程序),除非使用 -i 调用 umount(这将避免调用 umount 助手)。与 mount.cifs 一样,要启用用户卸载,必须将 umount.cifs 标记为 suid(例如 chmod +s /sbin/umount.cifs
)或等效项(某些发行版允许将条目添加到 /etc/permissions 文件中以实现等效的 suid 效果)。要使此实用程序成功,目标路径必须是 cifs 挂载,并且当前用户的 uid 必须与挂载资源的用户 uid 匹配。
另请注意,允许用户挂载和卸载的习惯方式(而不是将 mount.cifs 和 umount.cifs 用作 suid)是为每个您希望挂载的 //server/share 向文件 /etc/fstab 添加一行,但是当潜在的挂载目标包括许多或不可预测的 UNC 名称时,这可能会变得笨拙。
Samba 注意事项¶
大多数当前服务器支持 SMB2.1 和 SMB3,它们更安全,但是对于较旧的安全性较低的 CIFS 方言,有一些有用的协议扩展,因此,如果使用较旧的方言(CIFS/SMB1)进行挂载,为了获得最大好处,我们建议使用支持 SNIA CIFS Unix 扩展标准的服务器(例如几乎任何版本的 Samba,即 2.2.5 或更高版本),但 CIFS vfs 可以与各种 CIFS 服务器正常工作。请注意,如果您没有支持 CIFS Unix 扩展的服务器(例如 Samba 2.2.5 或更高版本),则 uid、gid 和文件权限将显示默认值。要在 Samba 服务器中启用 Unix CIFS 扩展,请添加以下行
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 启用。可以通过在挂载时指定 nouser_xattr
来在每次挂载时禁用对扩展属性(用户 xattr)的客户端支持。
CIFS 客户端可以获取和设置 POSIX ACL(getfacl、setfacl)到 Samba 服务器版本 3.10 和更高版本。设置 POSIX ACL 需要在构建 cifs 模块时启用 CIFS 配置选项中的 XATTR 和 POSIX 支持。可以通过在挂载时指定 noacl
来在每次挂载时禁用 POSIX ACL 支持。
一些管理员可能希望更改 Samba 的 smb.conf 中的 map archive
和 create 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 服务器不允许指向共享外部文件的符号链接,因此在 3.0.6 之前的 Samba 版本中,大多数带有绝对路径(即以斜杠开头)的文件符号链接(例如
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 签名(并且物理网络不安全),请考虑使用标准挂载选项 noexec
和 nosuid
以降低在本地系统上运行更改后的二进制文件的风险(从恶意服务器下载或被恶意路由器更改)。
尽管在 mount.cifs 中尚无法使用与 CIFS URL 规范对应的格式进行挂载,但可以使用服务器和共享名称的替代格式(与 NFS 风格的挂载语法有点相似)而不是更广泛使用的 UNC 格式(即 \\servershare)
mount -t cifs tcp_name_of_server:share_name /mnt -o user=myname,pass=mypasswd
使用挂载助手 mount.cifs 时,可以通过替代机制指定密码,而不是在命令行上使用 -o 后的正常 pass=
语法:1) 将其包含在凭据文件中。将 credentials=filename 指定为挂载选项之一。凭据文件包含两行
username=someuser
password=your_password
通过在 PASSWD 环境变量中指定密码(类似地,用户名可以从 USER 环境变量中获取)。
通过在文件中通过名称指定密码(通过 PASSWD_FILE)。
通过在文件中通过文件描述符指定密码(通过 PASSWD_FD)。
如果未提供密码,mount.cifs 将提示输入密码
限制¶
服务器必须支持“纯 TCP”(端口 445 TCP/IP CIFS 连接)或 RFC 1001/1002 对“Netbios-Over-TCP/IP”的支持。这不太可能成为问题,因为大多数服务器都支持此功能。
Windows 和 Linux 之间的有效文件名有所不同。Windows 通常会限制包含某些保留字符的文件名(例如,字符 :,Windows 使用该字符来分隔流名称的开头),而 Linux 允许文件名中使用稍微更广泛的有效字符集。当在服务器的注册表中指定显式映射时,Windows 服务器可以重新映射此类字符。Samba 从 3.10 版本开始将允许此类文件名(即包含有效的 Linux 字符,这些字符通常会被 Windows/CIFS 语义禁止),只要服务器配置为使用 Unix 扩展(并且客户端没有禁用 /proc/fs/cifs/LinuxExtensionsEnabled)。此外,可以在 CIFS (vers=1.0) 上使用挂载选项 mapposix
来强制将非法的 Windows/NTFS/SMB 字符映射到重新映射范围(此挂载参数是 SMB3 的默认参数)。此重新映射 (mapposix
) 范围也与 Mac(以及某些旧 Windows 上的“Mac 服务”)兼容。
CIFS VFS 挂载选项¶
以下是支持的挂载选项的部分列表
- username
尝试建立 CIFS 会话时使用的用户名。
- password
用户密码。如果安装了挂载助手,则在未提供密码的情况下,将提示用户输入密码。
- ip
目标服务器的 IP 地址
- unc
要挂载的目标服务器通用网络名称(导出)。
- domain
设置 CIFS 会话建立期间附加到用户名的 SMB/CIFS 工作组名称
- forceuid
将 inode 的默认 uid 设置为在挂载时传递的 uid。对于挂载到支持 CIFS Unix 扩展的服务器(例如正确配置的 Samba 服务器),服务器提供 uid、gid 和模式,因此除非服务器和客户端的 uid 和 gid 编号不同,否则不应指定此参数。如果服务器和客户端位于同一域中(例如,运行 winbind 或 nss_ldap),并且服务器支持 Unix 扩展,则可以从服务器检索 uid 和 gid(并且不必在挂载时指定 uid 和 gid)。对于不支持 CIFS Unix 扩展的服务器,除非指定了
uid=
(gid) 挂载选项,否则在查找现有文件时返回的默认 uid(和 gid)将是执行挂载的人员的 uid (gid)(root,除非 mount.cifs 配置为用于用户挂载的 setuid)。另请注意,对文件访问的权限检查(授权检查)发生在服务器端,但在某些情况下,管理员可能希望在客户端也进行限制。对于不报告 uid/gid 所有者的服务器(例如 Windows),也可以在客户端检查权限,并且可以通过在客户端上指定 file_mode 和 dir_mode 来启用一种粗略形式的客户端权限检查。(默认)- forcegid
(类似于上面的内容,但针对组 ID 而不是 uid)(默认)
- noforceuid
如果可能,通过从服务器请求来填写文件所有者信息 (uid)。使用此选项,仅当服务器不支持在 inode 上返回 uid 时,才会使用 uid= 选项(在挂载时)中给出的值。
- noforcegid
(类似于上面的内容,但针对组所有者,gid,而不是 uid)
- uid
设置 inode 的默认 uid,并向 cifs 内核驱动程序指示哪个本地用户进行了挂载。如果服务器支持 unix 扩展,则除非指定了
forceuid
参数,否则默认 uid 不会用于填充 inode(文件)的所有者字段。- gid
设置 inode 的默认 gid(类似于上面的内容)。
- file_mode
如果服务器不支持 CIFS Unix 扩展,则此选项会覆盖文件 inode 的默认模式。
- fsc
使用 FS-Cache 启用本地磁盘缓存(默认情况下禁用)。此选项可用于提高在慢速链接、负载很重的服务器和/或网络上的性能,在这种情况下,从磁盘读取比从服务器(通过网络)读取更快。由于减少了对服务器的调用次数,这也会对可伸缩性产生积极影响。但是,本地缓存不适合所有工作负载,例如,只读一次类型的工作负载。因此,在使用此选项之前,您需要仔细考虑您的工作负载/场景。目前,本地磁盘缓存对于以只读方式打开的 CIFS 文件有效。
- dir_mode
如果服务器不支持 CIFS Unix 扩展,则此选项会覆盖目录 inode 的默认模式。
- port
在尝试常用端口(端口 445,然后是 139)之前,尝试在此 TCP 端口上联系服务器。
- iocharset
用于将本地路径名转换为 Unicode 以及从 Unicode 转换为本地路径名的代码页。如果服务器支持,则默认情况下使用 Unicode 用于网络路径名。如果未指定 iocharset,则将使用本地客户端内核构建期间指定的 nls_default。如果服务器不支持 Unicode,则此参数未使用。
- rsize
默认读取大小(通常为 16K)。客户端当前不能使用大于 CIFSMaxBufSize 的 rsize。CIFSMaxBufSize 默认为 16K,并且可以在 cifs.ko 的模块安装时更改(从 8K 到内核允许的最大 kmalloc 大小)。将 CIFSMaxBufSize 设置为非常大的值会导致 cifs 使用更多内存,并且在某些情况下可能会降低性能。要使用大于 127K 的 rsize(原始 cifs 协议的最大值),还需要服务器支持一个新的 Unix 功能标志(用于非常大的读取),某些较新的服务器(例如 Samba 3.0.26 或更高版本)支持此标志。rsize 可以设置为从最小 2048 到最大 130048 (127K 或 CIFSMaxBufSize,以较小者为准)
- wsize
默认写入大小(默认为 57344)。当前 CIFS 允许的最大 wsize 为 57344(14 个 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 位程序。这仅对挂载到支持 CIFS Unix 扩展的服务器(如 Samba)有意义。如果您不信任网络中的服务器(您的挂载目标),建议您指定此选项以提高安全性。
- exec
允许在该挂载点上执行二进制文件。
- noexec
不允许在该挂载点上执行二进制文件。
- dev
识别远程挂载上的块设备。
- nodev
不识别远程挂载上的设备。
- suid
允许执行此挂载点上启用 suid 的远程文件(以 root 身份执行挂载时的默认值,用户挂载的默认值为 nosuid)。
- credentials
虽然 cifs 内核组件会忽略它,但它被挂载辅助工具 mount.cifs 使用。安装 mount.cifs 时,它会打开并读取指定的凭据文件,以便获取传递给 cifs vfs 的 userid 和 password 参数。
- guest
虽然内核组件会忽略它,但如果挂载选项中指定了 guest,mount.cifs 挂载辅助工具不会提示用户输入密码。如果未指定密码,则将使用空密码。
- perm
客户端执行权限检查(针对文件的模式和所需的操作进行 uid 和 gid 的 vfs_permission 检查)。请注意,这是对服务器软件在目标计算机上完成的正常 ACL 检查的补充。默认情况下启用客户端权限检查。
- noperm
客户端不执行权限检查。这可能会使此挂载上的文件暴露给本地客户端系统上的其他用户访问。通常仅当服务器支持 CIFS Unix 扩展时才需要此选项,但客户端和服务器系统上的 UID/GID 不够匹配,无法允许执行挂载的用户访问,但对于非 CIFS Unix 扩展挂载,在挂载上指定默认模式但不强制在客户端上执行的情况下可能很有用(例如,当启用 MultiUserMount 时)。请注意,这不会影响服务器软件在目标计算机上执行的正常 ACL 检查(服务器 ACL 与挂载时提供的用户名进行比较)。
- serverino
使用服务器的 inode 编号,而不是在客户端上自动生成递增的 inode 编号。虽然这将更容易发现硬链接文件(因为它们将具有相同的 inode 编号),并且 inode 编号可能是持久的,但请注意,如果将多个服务器端挂载导出到单个共享下(因为如果多个文件系统挂载在同一共享的高级目录下面,则服务器上的 inode 编号可能不是唯一的),则服务器不保证 inode 编号是唯一的。请注意,一些较旧的(例如 Windows 2000 之前的)版本不支持返回 UniqueID 或 CIFS Unix 扩展等效项,对于这些版本,此挂载选项将不起作用。在 nfsd 下导出 cifs 挂载需要在 cifs 挂载上使用此挂载选项。如果服务器支持所需的网络操作,则现在这是默认值。
- noserverino
客户端生成 inode 编号(而不是使用服务器的实际编号)。这些 inode 编号在卸载或重新启动后会发生变化,这可能会使某些应用程序感到困惑,但并非所有服务器文件系统都支持唯一的 inode 编号。
- setuids
如果与服务器协商了 CIFS Unix 扩展,则客户端会尝试在新创建的文件、目录和设备(创建、mkdir、mknod)上设置本地进程的有效 uid 和 gid。如果未协商 CIFS Unix 扩展,对于新创建的文件和目录,而不是使用挂载上指定的默认 uid 和 gid,则本地缓存新文件的 uid 和 gid,这意味着当重新加载 inode(或用户重新挂载共享)时,该文件的 uid 可能会更改。
- nosetuids
客户端不会尝试在新创建的文件、目录和设备(创建、mkdir、mknod)上设置 uid 和 gid,这将导致服务器将 uid 和 gid 设置为默认值(通常是挂载共享的用户的服务器 uid)。让服务器(而不是客户端)设置 uid 和 gid 是默认值。如果未协商 CIFS Unix 扩展,则新文件的 uid 和 gid 将显示为挂载者的 uid (gid) 或挂载上指定的 uid (gid) 参数。
- netbiosname
通过端口 139 挂载到服务器时,指定 RFC1001 源名称,用于在执行 RFC1001 netbios 会话初始化时表示客户端 netbios 机器名称。
- direct
不对在此挂载上打开的文件进行 inode 数据缓存。这会阻止在此挂载上 mmap 文件。在某些情况下,对于快速网络和客户端上几乎没有缓存好处的情况(例如,当应用程序执行大于页面大小的大型顺序读取而无需重新读取相同数据时),这可以提供比默认行为更好的性能,默认行为是在 oplock(缓存令牌)被授予和保持时通过本地 Linux 客户端页面缓存缓存读取(预读)和写入(后写)。请注意,direct 允许将大于页面大小的写入操作发送到服务器。
- strictcache
用于打开严格缓存模式。在此模式下,客户端始终从拥有 Oplock Level II 的缓存中读取,否则从服务器读取。所有写入的数据都存储在缓存中,但如果客户端没有独占 Oplock,则会将数据写入服务器。
- rwpidforward
将打开文件的进程的 pid 转发到该文件上的任何读取或写入操作。如果我们使用强制 brlock 样式,这可以防止 WINE 等应用程序在读取和写入时失败。
- acl
如果服务器支持,允许 setfacl 和 getfacl 管理 posix ACL。(默认)
- noacl
不允许在此挂载上调用 setfacl 和 getfacl
- user_xattr
允许将用户 xattr(名称以
user.
或os2.
开头的属性)作为 OS/2 EA(扩展属性)获取和设置到服务器。这允许支持 setfattr 和 getfattr 实用程序。(默认)- nouser_xattr
不允许 getfattr/setfattr 获取/设置/列出 xattr
- mapchars
将七个保留字符中的六个(不包括反斜杠)
*?<>|:转换为重新映射范围(高于 0xF000),这也允许 CIFS 客户端识别 Windows POSIX 模拟创建的包含此类字符的文件。当挂载到大多数版本的 Samba 时(它也禁止创建和打开名称包含这七个字符中的任何一个的文件),这可能也很有用。如果服务器不支持线路上的 Unicode,则此选项无效。
- nomapchars
不转换这七个字符中的任何一个(默认)。
- nocase
请求不区分大小写的路径名匹配(如果服务器支持,则默认区分大小写)。(挂载选项
ignorecase
与nocase
相同)- posixpaths
如果支持 CIFS Unix 扩展,则尝试协商 posix 路径名支持,这允许某些在典型的 CIFS 文件名中禁止的字符,而无需重新映射。(默认)
- noposixpaths
如果支持 CIFS Unix 扩展,则不请求 posix 路径名支持(这可能会导致服务器拒绝创建具有某些保留字符的文件)。
- nounix
为此挂载(树连接)禁用 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(全局命名空间支持),即使服务器声称支持它。这可以帮助解决 Samba 服务器版本 3.0.24 和 3.0.25 解析 DFS 路径的问题。
- remount
重新挂载共享(通常用于将挂载从 ro 更改为 rw,反之亦然)
- cifsacl
根据文件的 Windows ACL 报告模式位(例如在 stat 上)。(实验性)
- servern
指定尝试建立到服务器会话时使用的服务器 NetBIOS 名称 (RFC1001 名称)。 对于挂载到某些旧服务器(如 OS/2 或 Windows 98 和 Windows ME),这是必需的,因为它们不支持默认服务器名称。 服务器名称最多可以包含 15 个字符,并且通常为大写。
- sfu
当未协商 CIFS Unix 扩展时,尝试以与 Unix 服务 (SFU) 兼容的格式创建设备文件和 FIFO。此外,通过 SETFILEBITS 扩展属性检索模式的第 10-12 位(如 SFU 所做的那样)。将来,还将使用安全描述符 (ACL) 查询来模拟模式的底部 9 位。
- mfsymlinks
启用对 Minshall+French 符号链接的支持(请参阅http://wiki.samba.org/index.php/UNIX_Extensions#Minshall.2BFrench_symlinks)。当与“sfu”选项一起指定时,此选项将被忽略。即使服务器支持 CIFS Unix 扩展,也会使用 Minshall+French 符号链接。
- sign
必须使用数据包签名(有助于避免路由中中间系统对数据进行不必要的修改)。请注意,签名不适用于 lanman 或明文身份验证。
- seal
必须在此挂载的共享上加密(加密)所有数据,然后再在网络上发送。需要对 Unix 扩展的支持。请注意,这与 sign 挂载选项不同,因为它会导致对此挂载的共享发送的数据进行加密,但挂载到同一服务器的其他共享不受影响。
- locallease
此选项很少需要。某些应用程序(如 Samba 和 NFSv4 服务器)使用 Fcntl F_SETLEASE 来检查文件是否可缓存。 CIFS 没有明确请求租约的方法,但可以检查文件是否可缓存(oplocked)。遗憾的是,即使文件未被 oplocked,它仍然可以是可缓存的(即,如果其他本地进程未使用该文件,则 cifs 客户端可以授予 fcntl 租约),例如当服务器不支持 oplocks 并且用户确信对文件的唯一更新将来自此客户端时。指定此挂载选项将允许 cifs 客户端仅在本地检查未被 oplocked 的文件的租约,而不是在这种情况下拒绝租约。(实验性)
- sec
安全模式。允许的值为
- none
尝试以空用户(无名称)连接
- krb5
使用 Kerberos 版本 5 身份验证
- krb5i
使用 Kerberos 身份验证和数据包签名
- ntlm
使用 NTLM 密码哈希(默认)
- ntlmi
使用带有签名功能的 NTLM 密码哈希(如果 /proc/fs/cifs/PacketSigningEnabled 为 on 或服务器要求签名,则也可以是默认值)
- ntlmv2
使用 NTLMv2 密码哈希
- ntlmv2i
使用带有数据包签名功能的 NTLMv2 密码哈希
- lanman
(如果在内核配置中配置)使用旧的 lanman 哈希
- hard
如果服务器未响应,则重试文件操作
- soft
将重试限制为无响应的服务器(通常只有一个重试),然后再返回错误。(默认)
mount.cifs 挂载助手还在 -o 之前接受一些挂载选项,包括
-S |
从 stdin 获取密码(等效于设置环境变量 |
-V |
打印 mount.cifs 版本 |
-? |
显示简单的用法信息 |
对于大多数 2.6 内核版本的 modutils,可以通过 modinfo 显示 cifs 内核模块的版本。
其他 /proc/fs/cifs 标志和调试信息¶
信息性伪文件
DebugData |
显示有关活动的 CIFS 会话和共享、已启用的功能以及 cifs.ko 版本的信息。 |
Stats |
列出摘要资源使用信息以及每个共享的统计信息。 |
open_files |
列出所有活动的 SMB 会话上的所有打开的文件句柄。 |
mount_params |
可用于该模块的所有挂载参数的列表 |
配置伪文件
SecurityFlags |
控制安全协商和数据包签名的标志。身份验证(可能/必须)标志(例如,用于 NTLMv2)可以与签名标志组合。另一方面,指定两种不同的密码哈希机制(如“必须使用”)没有多大意义。默认标志为 0x00C5
(允许 NTLMv2 和数据包签名)。某些 SecurityFlags 可能需要启用相应的 menuconfig 选项。
|
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 信息以及支持符号链接。 如果您使用支持 CIFS Unix 扩展的服务器(如 Samba),但不希望使用符号链接支持,并且希望将 uid 和 gid 字段映射到挂载时提供的值(而不是实际值),则将其设置为零。(默认值 1) |
dfscache |
列出 DFS 缓存的内容。如果设置为 0,客户端将清除缓存。 |
这些实验性功能和跟踪可以通过更改 /proc/fs/cifs 中的标志来启用(在 cifs 模块安装或构建到内核中之后,例如 insmod cifs)。要启用某个功能,请将其设置为 1,例如,要启用对内核消息日志的跟踪,请键入
echo 7 > /proc/fs/cifs/cifsFYI
cifsFYI 用作位掩码。将其设置为 1 可启用对各种信息性消息的额外内核日志记录。2 启用非零 SMB 返回代码的日志记录,而 4 启用完成时间超过 1 秒的请求的日志记录(字节范围锁请求除外)。将其设置为 4 需要在内核配置 (.config) 中设置 CONFIG_CIFS_STATS2。将其设置为 7 会启用所有三个。最后,可以通过以下方式启用跟踪 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)
|
启用或禁用 oplocks。默认情况下启用 Oplocks。[Y/y/1]。要禁用,请使用 [N/n/0] 中的任何一个。 |