mount.cifs手册
名称
mount.cifs, mount.smb3 -使用 CIFS (Common Internet File System)挂载
概要
mount.cifs {service} {mount-point} [-o options]
该工具是cifs-utils套件的一部分。
mount.cifs
从Linux挂载cifs或SMB3文件系统。它通常由mount(8)
命令使用-t cifs
选项间接调用。此命令仅适用于Linux,并且内核必须支持cifs文件系统。SMB3协议是CIFS(SMB)协议的继任者,受大多数Windows服务器、Azure(云存储)、Mac和许多其他商业服务器、网络连接存储设备以及流行的开源服务器Samba的支持。
mount.smb3
仅挂载smb3文件系统。它通常由mount(8)
命令使用-t smb3
选项间接调用。smb3文件系统类型是在kernel-4.18及更高版本中添加的。它的工作方式与mount.cifs
类似,只是它将文件系统类型传递为smb3
。
mount.cifs
实用程序将指定为服务的UNC名称(导出的网络资源)(使用//server/share
语法,其中server
是服务器名称或IP地址,share
是共享的名称)连接到本地目录挂载点。
mount.cifs
的选项被指定为键=值对的逗号分隔列表。假设cifs文件系统内核模块(cifs.ko
)支持这些选项,则可以发送此处列出的选项之外的其他选项。传递给cifs vfs
内核代码的无法识别的cifs挂载选项将被记录到内核日志中。
mount.cifs
使cifs vfs启动一个名为cifsd
的线程。挂载后,它会一直运行,直到挂载的资源被卸载(通常通过umount
实用程序)。
mount.cifs -V
命令显示cifs mount helper的版本。
modinfo -cifs
命令显示cifs模块的版本。
选项
选项 | 描述 |
---|---|
username=arg|user=arg | 指定要连接的用户名。如果未给定,则使用环境变量USER 早期版本的 mount.cifs 还允许在user%password 或workgroup/user 或workgroup/user%password 中指定用户名,以允许将密码和工作组指定为用户名的一部分。对这些备用用户名格式的支持现在已被弃用,不应再使用。用户应该使用离散的password= 和domain= 来指定这些值。虽然cifs内核模块的某些版本接受user= 作为此选项的缩写,但使用它可能会混淆标准挂载程序,使其认为这是一个非超级用户挂载。因此,建议使用完整的username= 选项名称。 |
password=arg|pass=arg | 指定CIFS密码。如果未给出此选项,则使用环境变量PASSWD。如果没有通过要挂载的参数直接或间接指定密码,则除非指定了guest 选项,否则mount.cifs 将提示输入密码。请注意,包含分隔符(即逗号 , )的密码将无法在命令行上正确解析。但是,在PASSWD环境变量中定义的密码或通过凭证文件定义的密码(见下文)或在密码提示符处输入的密码将被正确读取。 |
credentials=filename|cred=filename | 指定包含用户名和/或密码以及工作组名称(可选)的文件。文件的格式为: username=value password=value domain=value 这比在共享文件(如 /etc/fstab )中以明文形式保存密码更可取。确保正确保护任何凭据文件。 |
uid=arg | 当服务器未提供所有权信息时,设置将拥有已装载文件系统上所有文件或目录的uid。它可以指定为用户名或数字uid。如果未指定,则默认为uid 0。mount t.cifs 帮助程序的版本必须为1.10或更高版本,才能支持以非数字形式指定uid。有关详细信息,请参阅下面关于文件和目录的属主和权限部分。 |
forceuid | 指示客户端忽略服务器为文件和目录提供的任何uid,并始终将所有者分配为uid= 选项的值。有关更多信息,请参阅下面的文件和目录的属主和权限部分。 |
cruid=arg | 设置凭据缓存所有者的uid。这主要对sec=krb5 有用。缺省值是执行挂载的进程的真实uid。设置此参数会指示upcall查找该用户拥有的凭据缓存。 |
gid=arg | 当服务器未提供所有者信息时,设置将拥有已装载文件系统上所有文件或目录的gid。它可以指定为组名或数字gid。如果未指定,则默认为gid 0 。mount t.cifs 帮助程序必须是1.10版或更高版本,才能支持以非数字形式指定gid。有关详细信息,请参阅下面关于文件和目录的属主和权限的部分。 |
forcegid | 指示客户端忽略服务器为文件和目录提供的任何gid,并始终将所有者分配为gid= 选项的值。有关更多信息,请参阅下面的文件和目录的属主和权限部分。 |
port=arg | 设置客户端连接CIFS服务器时使用的端口号。如果指定了此值,则查找与该端口的现有连接,如果存在则使用该连接。如果不存在,请尝试在该端口上创建一个新连接。如果连接失败,返回一个错误。如果未指定此值,则查找端口445或139上的现有连接。如果不存在这样的连接,尝试先连接端口445,如果连接失败,再连接端口139。如果两者都失败,则返回错误。 |
file_mode=arg | 如果服务器不支持CIFS Unix扩展,则会覆盖默认的文件模式。 |
dir_mode=arg | 如果服务器不支持CIFS Unix扩展,则会覆盖目录的默认模式。 |
guest | 不要提示输入密码。 |
perm | 客户端执行权限检查(根据模式和所需操作对文件的uid 和gid 进行vfs_permission 检查)。请注意,这是服务器软件在目标计算机上进行的正常ACL检查之外的检查。默认情况下,启用客户端权限检查。 |
noperm | 客户端不执行权限检查。这可以将此挂载上的文件公开给本地客户端系统上的其它用户访问。通常只有当服务器支持CIFS Unix Extensions,但客户端和服务器系统上的UIDs/GIDs匹配不够紧密,无法允许执行挂载的用户访问时才需要它。注意,这不会影响服务器软件在目标机器上执行的正常ACL检查(根据挂载时提供的用户名对服务器ACL进行检查)。 |
dynperm | 指示服务器在内存中维护的属主和权限,而不是将属主和权限存储在服务器。此信息随时可能消失(只要从缓存中刷新inode),因此尽管这可能有助于使某些应用程序工作,但其行为有些不可靠。有关详细信息,请参阅下面关于文件和目录的属主和权限的部分。 |
cache=arg | 缓存模式。有关详细信息,请参阅下面关于CACHE COHERENCY部分。允许的值为: • none - 根本不缓存文件数据 • strict - 严格遵循CIFS/SMB2协议 • loose - 允许宽松缓存语义 3.7之前的内核默认值是 loose 。从3.7内核开始,默认是strict 。 |
nobrl | 不要向服务器发送字节范围锁请求。这对于某些使用cifs风格的强制字节范围锁的应用程序是必要的(并且大多数cifs服务器还不支持请求咨询字节范围锁)。 |
forcemandatorylock | 即使通过Unix扩展提供POSIX锁,也不要使用POSIX锁。始终使用cifs风格的强制锁。 |
sfu | 如果未协商CIFS或SMB3 Unix扩展,请尝试以与Services for Unix(SFU)1兼容的格式创建设备文件和fifo。此外,通过SETFILEBITS扩展属性检索模式的位10-12(就像SFU所做的那样)。在未来,还将使用安全描述符(ACL)的查询来模拟mode模式的底部9位。[NB:需要1.39版或更高版本的CIFS VFS。要识别符号链接并能够以SFU互操作形式创建符号链接,需要1.40版或更新版本的CIFS VFS内核模块。 |
mfsymlinks | 启用对Minshall+French符号链接的支持(请参阅http://wiki.samba.org/index.php/UNIX_Extensions#Minshall.2BFrench_symlinks). 当与sfu 选项一起指定时,将忽略此选项。即使服务器支持CIFS Unix扩展,也会使用Minshall+French符号链接。 |
vers=arg | SMB协议版本。允许的值为: • 1.0 - 经典的CIFS/SMBv1协议。 • 2.0 - SMBv2.002协议。这最初是在Windows Vista Service Pack 1和Windows Server 2008中引入的。请注意,Windows Vista的初始发布版本使用的方言略有不同(2.000),不受支持。 • 2.1 - 在Microsoft Windows 7和Windows Server 2008R2中引入的SMBv2.1协议。 • 3.0 - 在Microsoft Windows 8和Windows Server 2012中引入的SMPv3.0协议。 • 3.02 或 3.0.2 - 在Microsoft Windows 8.1和Windows Server 2012R2中引入的SMBv3.0.2协议。 • 3.1.1或3.11 - 在Microsoft Windows 10和Windows Server 2016中引入的SMBv3.1.1协议。 • 3 - SMBv3.0协议版本及更高版本。 • default - 尝试协商客户端和服务器都支持的最高SMB2+版本。 如果未在 mount 上指定方言,则使用vers=default 。查看Dialect,请参考/proc/fs/cifs/DebugData 还要注意,虽然此选项控制所使用的协议版本,但并非每个版本的所有特性都可用。 自v4.13.5以来的默认设置是让客户端和服务器协商大于或等于2.1的最高可能版本。在v4.13之前的内核中,默认是1.0。对于v4.13和v4.13.5之间的内核,默认是3.0。 |
actimeo=arg | CIFS客户端在从服务器请求属性信息之前缓存文件或目录的属性的时间(以秒为单位)。在此期间,在客户端再次检查服务器之前,服务器上发生的更改一直未被检测到。 缺省情况下,属性缓存超时时间设置为1秒。这意味着需要更频繁地对服务器进行在线调用,以检查属性是否发生了可能影响性能的更改。使用此选项,用户可以根据工作负载需求在性能和缓存元数据正确性之间进行权衡。更短的超时意味着更好的缓存一致性,但对服务器的调用次数频繁增加。较长的超时意味着对服务器的调用次数减少,但缓存一致性较差。 actimeo 值是一个正整数,可以保存0到2^30 * HZ(定时器中断频率)设置的最大值。 |
noacl | 不允许进行POSIX ACL操作,即使服务器支持它们。 CIFS客户端可以获取和设置Samba服务器3.0.10及以后版本的POSIX acl ( getfacl 、setfacl )。设置POSIX acl需要在构建CIFS模块时在CIFS配置选项中同时启用CIFS_XATTR 和CIFS_POSIX 支持。通过在挂载时指定noacl ,可以在每次挂载的基础上禁用POSIX ACL支持。 |
cifsacl | 此选项用于将CIFS/NTFS ACL映射到Linux权限位/从Linux权限位映射,将SID映射到UID和GID/从UID和GID映射,以及获取和设置安全描述符。 有关更多信息,请参见CIFS/NTFS ACL、SID/UID/GID映射、安全描述符一节。 |
serverino | 使用服务器返回的inode号(唯一的持久文件标识符),而不是在客户端上自动生成临时inode号。虽然服务器inode号可以更容易地发现硬链接文件(因为它们将具有相同的inode号),并且inode号可能是持久的(这对某些软件很有用),但是如果在单个共享下导出多个服务器端挂载,服务器并不保证inode号是唯一的(因为如果在同一共享的更高级别目录下挂载多个文件系统,则服务器上的inode号可能不是唯一的)。请注意,并非所有服务器都支持返回服务器inode号,尽管那些支持CIFS Unix扩展的服务器和Windows 2000及更高版本的服务器通常都支持这一点(尽管不一定在每个本地服务器文件系统上)。参数在服务器不支持返回inode号或同等值时不起作用。默认情况下启用此行为。 |
noserverino | 客户端自己生成inode号,而不是使用服务器中的实际inode号。 有关更多信息,请参阅INODE NUMBERS一节。 |
posix|unix|linux | (默认)为此挂载启用Unix扩展。要求使用CIFS协议(vers=1.0)或SMB3.1.1协议(vers=3.1.1),并有相应no的服务器支持。 |
noposix|nounix|nolinux | 禁用此挂载的Unix扩展。这对于一次关闭多个设置非常有用。 这包括POSIX ACLs、POSIX锁、POSIX路径、符号链接支持以及从服务器检索uids/gids/模式。这对于解决支持Unix扩展的服务器中的错误也很有用。 有关更多信息,请参阅INODE NUMBERS一节。 |
服务格式和分隔符
通常更倾向于在服务名称中使用正斜杠(/)作为分隔符。它们被认为是“通用分隔符”,因为它们通常不允许嵌入到Windows机器的路径组件中,并且客户端可以无条件地将它们转换为反斜杠()。相反,POSIX允许反斜杠字符作为路径组件的一部分,并且不能以同样的方式自动转换。
mount.cifs
将尝试将反斜杠转换为正斜杠,但它不能在sharename
后面的任何路径组件中这样做。
INODE NUMBERS
当启用Unix Extensions时,我们使用服务器响应POSIX调用而提供的实际inode号作为inode号。
当Unix Extensions被禁用并且启用serverino
挂载选项时,无法获得服务器inode号。客户端通常将服务器分配的UniqueID映射到inode号。
注意,UniqueID的值与服务器inode号不同。UniqueID值在整个服务器范围内是唯一的,通常大于2的32次方。这个值通常使没有使用LFS(大文件支持)编译的程序触发glibc EOVERFLOW错误,因为它不适合目标结构字段。强烈建议使用LFS支持(即-D_FILE_OFFSET_BITS=64
)编译程序以防止此问题。还可以使用noserverino
挂载选项在客户机上生成小于2 ^ 32的inode号。但可能无法正确检测硬链接。
缓存一致性
对于像CIFS或NFS这样的网络文件系统,客户端必须应对这样一个事实,即其它客户端或服务器上的活动可能会在客户端不知道的情况下更改文件的内容或属性。处理此类问题的一种方法是强制所有文件访问都直接到服务器。然而,这是性能上的限制,所以大多数协议都有一些机制允许客户端在本地缓存数据。
CIFS协议规定(实际上)客户端不应缓存文件数据,除非它持有机会锁(也称为oplock
)或lease
。这两个实体都允许客户端保证对文件的某些类型的独占访问,这样它就可以访问文件的内容,而不需要不断地与服务器交互。当服务器需要撤销其中任何一个时,它会回调客户端,并允许客户端有一定的时间来刷新任何缓存的数据。
cifs客户端使用内核的pagecache
来缓存文件数据。通过pagecache
完成的任何I/O通常都是对齐页面的。当与字节范围锁结合使用时,这可能会出现问题,因为Windows的锁是强制性的,并且可能会阻止读取和写入的发生。
cache=none
意味着客户端从不将缓存用于正常的读取和写入。它总是直接访问服务器以满足读取或写入请求。
cache=strict
表示客户端将尝试严格遵循CIFS/SMB2协议。也就是说,只有当客户端持有锁时,缓存才受信任。当客户端不持有oplock
时,那么客户端绕过缓存并直接访问服务器以满足读或写请求。通过这样做,客户端避免了字节范围锁的问题。此外,当客户端持有oplock
时,字节范围锁被缓存在客户端上,并在该oplock
被召回时被“推送”到服务器。
cache =loose
允许客户端使用更宽松的协议语义,这有时可以在牺牲缓存一致性的情况下提供更好的性能。文件访问总是涉及pagecache
。如果未持有oplock
或lease
,则客户端将在写入文件后不久尝试刷新缓存。注意,在写系统调用返回之前,刷新不一定发生。
在不持有oplock
的情况下读取,客户端将尝试定期检查文件的属性,以确定它是否已更改及缓存是否不再有效。这种机制与NFSv2/3用于缓存一致性的机制非常相似,但是对于CIFS来说问题特别大。Windows在更新客户端用来验证的LastWriteTime
字段方面是相当“懒惰”的。其结果是,当多个读取程序和写入程序处理相同的文件时,cache=loose
可能导致数据损坏。
因此,当多个客户端访问同一组文件时,建议使用cache=strict
。这有助于通过更严格地遵循CIFS/SMB2协议来消除缓存一致性问题。
还要注意,无论使用什么缓存模型,客户机都将始终使用pagecache
来处理mmap’ed文件。只有在调用msync()
或close()
时,才保证将对mmap’ed文件的写入刷新到服务器。
3.7之前的内核默认值是loose
。从3.7开始,默认是strict
。
CIFS/NTFS ACL, SID/UID/GID映射, 安全描述符
此选项用于处理具有安全描述符和CIFS/NTFS ACL(而不是UID、GID、文件权限位和POSIX ACL作为用户身份验证模型)的文件对象。这是CIFS服务器最常见的身份验证模型,也是Windows使用的身份验证模式。
要支持此功能,需要在构建CIFS模块时在CIFS配置选项中同时支持CIFS_XATTR
和CIFS_ACL
。
CIFS/NTFS ACL通过以下Microsoft TechNet文档中的算法映射到文件权限位:
http://technet.microsoft.com/en-us/library/bb463216.aspx
为了将SID与UID和GID间互相映射,需要以下内容:
• 通过request-key.conf
(5)设置的对cifs.idmap实用程序的内核向上调用
• 通过nsswitch.conf
(5)和smb.conf
(5)配置winbind
支持
有关更多信息,请参阅cifs.idmap(8)
和winbindd(8)
各自的手册页。
可以使用名为system.cifs_acl的扩展属性直接检索和设置文件对象的安全描述符。通过该接口提供的安全描述符是“原始”数据块,需要用户空间实用程序来解析和格式化或对其进行组装,例如getcifsacl(1)
和setcifsacl(1)
。
使用此挂载选项时需要考虑的一些事项:
•在处理元数据时,由于有获取和设置安全描述符的额外请求,可能会增加延迟。
• CIFS/NFS-ACL和POSIX文件权限位之间的映射不完善,并且一些ACL信息可能在转换中丢失。
• 如果其中任何一个向上调用cifs.idmap
设置不正确,或者winbind
没有配置和运行,ID映射将失败。在这种情况下,uid
和gid
将默认为共享的值,或指定的uid
和/或gid
挂载选项的值。
文件和目录的属主和权限
核心CIFS协议不提供文件和目录的unix属主信息或模式。因此,文件和目录通常由uid=
或gid=
选项设置的任何值所拥有,并且将权限设置为挂载的默认file_mode
和dir_mode
。尝试通过chmod/chown
更改这些值将返回成功,但没有效果。
当客户端和服务器协商unix扩展时,将为文件和目录分配服务器提供的uid
、gid
和模式。由于CIFS挂载通常是单用户的,并且无论哪个用户访问挂载都使用相同的凭据,因此新创建的文件和目录通常会被赋予与用于挂载共享的凭据相对应的属主。
如果正在使用的uid
和gid
在客户端和服务器上不匹配,那么forcegid和forcegid选项可能会有所帮助。但是请注意,没有相应的选项来覆盖该模式。当forceid或forcegid生效时,分配给文件的权限可能不能反映实际权限。
如果没有协商unix扩展,也可以使用dynperm
挂载选项在服务器上本地模拟它们。当这个挂载选项生效时,新创建的文件和目录将获得适当的权限。但是,这些权限不存储在服务器上,并且可以在将来的任何时候消失(受内核刷新inode缓存的影响)。一般来说,不建议使用此挂载选项。
也可以通过noperm
选项完全覆盖客户端的权限检查。服务器端权限检查不能被覆盖。服务器执行的权限检查将始终与用于挂载共享的凭据相对应,而不一定与访问共享的用户相对应。
配置
对cifs vfs
进行配置更改和读取调试信息的主要机制是通过Linux /proc
文件系统。目录/proc/fs/cifs
中有各种配置文件和伪文件,它们可以显示调试信息和性能统计信息。还有其他启动选项,如最大缓冲区大小和缓冲区数量,只有在加载内核cifs vfs(cifs.ko
模块)时才能设置这些选项。可以通过对文件cifs.ko
运行modinfo
实用程序来查看这些信息,该文件将列出在模块安装(设备驱动程序加载)期间可能传递给cifs
的选项。有关更多信息,请参阅内核文件fs/cifs/README
。配置动态跟踪(trace-cmd)时,请注意,可以在以下位置看到可以启用的SMB3事件列表:/sys/kernel/debug/tracing/events/cifs/
。
安全
为了改进安全性,建议使用SMB2.1或更高版本(包括最新的方言SMB3.1.1),并且在挂载时默认不再请求SMB1。旧的方言,如CIFS (SMB1,即vers=1.0
)的安全性要弱得多。通过modprobe CIFS disable_legacy_dialect =y
可以禁用CIFS (SMB1)。
版本
本手册页适用于2.18版本的cifs vfs文件系统(大致为Linux内核5.0)。
Windows Services for UNIX(简称SFU)是已停止开发一个的微软提供的软件包,它能在Windows NT架构的操作系统上提供一套UNIX环境,用以实现Windows和Unix操作系统的兼容。已停止开发,退出市场。 ↩︎