MOUNT.CIFS(8)
โจ NAME โจ
okay so bestie, welcome to mount.cifs(8) and mount.smb3(8) โ System Manager's Manual, section 8 ๐
โจ
mount.cifs, mount.smb3 โ mount using the Common Internet File System (CIFS) ๐ฆ
โจ SYNOPSIS โจ
mount.cifs {service} {mount-point} [-o options]
โจ DESCRIPTION โจ
This tool is part of the cifs-utils suite ๐
mount.cifs mounts a CIFS or SMB3 filesystem from Linux. It is usually invoked indirectly by the mount(8) command when using the -t cifs option. This command only works in Linux, and the kernel must support the cifs filesystem. The SMB3 protocol is the successor to the CIFS (SMB) protocol and is supported by most Windows servers, Azure (cloud storage), Macs and many other commercial servers and Network Attached Storage appliances as well as by the popular Open Source server Samba. ๐
mount.smb3 mounts only SMB3 filesystem. It is usually invoked indirectly by the mount(8) command when using the -t smb3 option. The smb3 filesystem type was added in kernel-4.18 and above. It works in a similar fashion as mount.cifs except it passes filesystem type as smb3. โจ
mount.cifs utility attaches the UNC name (exported network resource) specified as service (using //server/share syntax, where server is the server name or IP address and share is the name of the share) to the local directory mount-point. ๐
Options to mount.cifs are specified as a comma-separated list of key=value pairs. It is possible to send options other than those listed here, assuming that the cifs filesystem kernel module (cifs.ko) supports them. Unrecognized cifs mount options passed to the cifs vfs kernel code will be logged to the kernel log. ๐
mount.cifs causes the cifs vfs to launch a thread named cifsd. After mounting it keeps running until the mounted resource is unmounted (usually via the umount utility). ๐ง
mount.cifs -V command displays the version of cifs mount helper. โญ
modinfo cifs command displays the version of cifs module. ๐ฅ
โจ OPTIONS โจ
Options are a comma-separated list of key=value pairs, bestie. Here we go! ๐
username=arg,user=argโ specifies the username to connect as. If this is not given, then the environment variableUSERis used. ๐
Users must use the discretepassword=anddomain=options to specify relevant values. Including these in theusername=option is no longer supported. ๐ซ
While some versions of the cifs kernel module accept user= as an abbreviation for this option, its use can confuse the standard mount program into thinking that this is a non-superuser mount. It is therefore recommended to use the full username= option name. ๐
password=arg,pass=argโ specifies the CIFS password. If this option is not given then the environment variablePASSWDis used. If the password is not specified directly or indirectly via an argument to mount,mount.cifswill prompt for a password, unless theguestoption is specified. ๐
Note that a password which contains the delimiter character (i.e. a comma,) will fail to be parsed correctly on the command line. However, the same password defined in thePASSWDenvironment variable or via a credentials file or entered at the password prompt will be read correctly. ๐ญ
password2=arg,pass2=argโ specifies an alternate password to help with password rotation. If this option is not given, then the environment variablePASSWD2is used. Ifpassword2is not specified directly or indirectly via an argument to mount,mount.cifswill NOT prompt forpassword2. ๐
Note that apassword2which contains the delimiter character (i.e. a comma,) will fail to be parsed correctly on the command line. However, the samepassword2defined in thePASSWD2environment variable or via a credentials file (see below) will be read correctly. ๐
credentials=filename,cred=filenameโ specifies a file that contains a username and/or password and optionally an alternate password and/or the name of the workgroup. The format of the file is:
username=value
password=value
password2=value
domain=value
This is preferred over having passwords in plaintext in a shared file, such as /etc/fstab. Be sure to protect any credentials file properly. ๐ก๏ธ
uid=argโ sets the uid that will own all files or directories on the mounted filesystem when the server does not provide ownership information. It may be specified as either a username or a numeric uid. When not specified, the default isuid 0. Themount.cifshelper must be at version1.10or higher to support specifying the uid in non-numeric form. See the section on FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS below for more information. ๐forceuidโ instructs the client to ignore any uid provided by the server for files and directories and to always assign the owner to be the value of theuid=option. See the section on FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS below for more information. ๐ฅcruid=argโ sets the uid of the owner of the credentials cache. This is primarily useful withsec=krb5. The default is the real uid of the process performing the mount. Setting this parameter directs the upcall to look for a credentials cache owned by that user. ๐ซgid=argโ sets the gid that will own all files or directories on the mounted filesystem when the server does not provide ownership information. It may be specified as either a groupname or a numeric gid. When not specified, the default isgid 0. Themount.cifshelper must be at version1.10or higher to support specifying the gid in non-numeric form. See the section on FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS below for more information. ๐ฏforcegidโ instructs the client to ignore any gid provided by the server for files and directories and to always assign the owner to be the value of thegid=option. See the section on FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS below for more information. ๐ฅidsfromsidโ Extract uid/gid from special SID instead of mapping it. See the section on FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS below for more information. ๐port=argโ sets the port number on which the client will attempt to contact the CIFS server. If this value is specified, look for an existing connection with this port, and use that if one exists. If one doesn't exist, try to create a new connection on that port. If that connection fails, return an error. If this value isn't specified, look for an existing connection on port445or139. If no such connection exists, try to connect on port445first and then port139if that fails. Return an error if both fail. ๐netbiosname=argโ When mounting to servers via port139, specifies the RFC1001 source name to use to represent the client netbios machine during the netbios session initialization. ๐กservern=argโ Similar tonetbiosnameexcept it specifies the netbios name of the server instead of the client. Although rarely needed for mounting to newer servers, this option is needed for mounting to some older servers (such as OS/2 or Windows 98 and Windows ME) since when connecting over port139they, unlike most newer servers, do not support a default server name. A server name can be up to15characters long and is usually uppercased. ๐ฅ๏ธfile_mode=argโ If the server does not support the CIFS Unix extensions this overrides the default file mode. ๐dir_mode=argโ If the server does not support the CIFS Unix extensions this overrides the default mode for directories. ๐ip=arg,addr=argโ sets the destination IP address. This option is set automatically if the server name portion of the requested UNC name can be resolved so rarely needs to be specified by the user. ๐domain=arg,dom=arg,workgroup=argโ Sets the domain (workgroup) of the user. If no domains are given, the empty domain will be used. Usedomainautoto automatically guess the domain of the server you are connecting to. ๐ฐdomainautoโ When using NTLM authentication and not providing a domain viadomain, guess the domain from the server NTLM challenge. This behavior used to be the default on kernels older than2.6.36. ๐ฎguestโ don't prompt for a password. ๐iocharsetโ Charset used to convert local path names to and from Unicode. Unicode is used by default for network path names if the server supports it. Ifiocharsetis not specified then thenls_defaultspecified during the local client kernel build will be used. If server does not support Unicode, this parameter is unused. ๐คroโ mount read-only. ๐ซโ๏ธrwโ mount read-write. โ๏ธsetuidsโ If the CIFS Unix extensions are negotiated with the server the client will attempt to set the effective uid and gid of the local process on newly created files, directories, and devices (create,mkdir,mknod). If the CIFS Unix Extensions are not negotiated, for newly created files and directories instead of using the default uid and gid specified on the mount, cache the new file's uid and gid locally which means that the uid for the file can change when the inode is reloaded (or the user remounts the share). ๐ ๏ธnosetuidsโ The client will not attempt to set the uid and gid on newly created files, directories, and devices (create,mkdir,mknod) which will result in the server setting the uid and gid to the default (usually the server uid of the user who mounted the share). Letting the server (rather than the client) set the uid and gid is the default. If the CIFS Unix Extensions are not negotiated then the uid and gid for new files will appear to be the uid (gid) of the mounter or the uid (gid) parameter specified on the mount. ๐permโ Client does permission checks (vfs_permissioncheck of uid and gid of the file against the mode and desired operation), Note that this is in addition to the normal ACL check on the target machine done by the server software. Client permission checking is enabled by default. โnopermโ okay so this one means the client justโฆ doesn't do permission checks at all ๐ which means files on this mount can be accessed by other users on the local client system. Like, hi, security? It's usually only needed when the server supports the CIFS Unix Extensions but the UIDs/GIDs on the client and server don't match closely enough for the user doing the mount to get in. Important tho: this does not affect the normal ACL check on the target machine that the server software does (that's the server ACL against the user name you gave at mount time). So the server still vibes checks, your local client just stops.dynpermโ tells the server to keep ownership and permissions in memory when they literally can't be stored on the server. Bestie, this info can disappear at any time (whenever the inode gets flushed from the cache), so while it might make some apps work, its behavior is lowkey unreliable. Peep the FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS section below for the full tea.cache=argโ cache mode, bestie. Details live in the CACHE COHERENCY section below. Allowed values are:noneโ do not cache file data at all, like at all at allstrictโ follow the CIFS/SMB2 protocol strictly, no shortcutslooseโ allow loose caching semantics, we're being chill about it
The default in kernels before 3.7 was loose. As of kernel 3.7 the default is strict. โจ
nostrictsyncโ do not ask the server to flush onfsync(). Some servers do non-buffered writes by default, so flushing is just redundant work. In workloads where the client is doing a ton of tiny write + fsync combos and the network latency is way higher than server latency, this brings a 2x performance improvement. Also a great pick when you want performance over consistency. ๐handlecacheโ (default) in SMB2 and above, the client often has to open the root of the share (empty path) in various places during mount, path revalidation, and thestatfs(2)system call. This option cuts redundant round trip traffic (opens and closes) by just keeping that root directory handle around once it's opened. Efficient queen.nohandlecacheโ disable caching of the share root directory handle. Simple as that.max_cached_dirs=argโ the maximum number of cached directories per share. Directories get cached locally when a lease is granted by the server, which improves performance by reducing network traffic. By default,max_cached_dirsis set to16and can hold values between0and a maximum value of2^32 - 1. Big numbers energy.handletimeout=argโ the time (in milliseconds) for which the server should reserve the handle after a failover, waiting for the client to reconnect. When you mount withresilienthandlesorpersistenthandles, or when the server requests their use (continuous availability shares), this parameter overrides the server default handle timeout โ which for most servers is 120 seconds.rwpidforwardโ forward the pid of the process that opened a file to any read or write operation on that file. This keeps apps likewine(1)from failing on read and write when we're using mandatory brlock style. ๐ทmapcharsโ translates six of the seven reserved characters (not backslash, but including the colon, question mark, pipe, asterisk, greater than and less than) to the remap range (above0xF000), which also lets the CIFS client recognize files created with those characters by Windows's Services for Unix. Also handy when mounting to most versions of Samba (which also forbids creating and opening files whose names contain any of those seven characters). This does nothing if the server doesn't support Unicode on the wire. And heads up: files created with themapcharsmount option may not be accessible if the share is mounted without that option. ๐ซnomapcharsโ (default) do not translate any of those seven characters. Leaving them as-is.mapposixโ translates reserved characters similarly tomapcharsbut uses the mapping from Microsoft "Services For Mac". This additionally remaps the double quote and a trailing period or space. โจintrโ currently unimplemented. That's it, that's the whole thing. ๐nointrโ (default) currently unimplemented. Also just vibes.hardโ the program accessing a file on the cifs mounted file system will hang when the server crashes. Not for the faint of heart.softโ (default) the program accessing a file on the cifs mounted file system will not hang when the server crashes, and will return errors to the user application. Much more forgiving.noaclโ do not allow POSIX ACL operations even if the server would support them. The CIFS client can get and set POSIX ACLs (getfacl,setfacl) to Samba servers version 3.0.10 and later. Setting POSIX ACLs requires enabling bothCONFIG_CIFS_XATTRand thenCONFIG_CIFS_POSIXsupport in the CIFS configuration options when building the cifs module. POSIX ACL support can be disabled per-mount by specifyingnoaclon mount. ๐cifsaclโ this option maps CIFS/NTFS ACLs to/from Linux permission bits, maps SIDs to/from UIDs and GIDs, and gets and sets Security Descriptors. See the section on CIFS/NTFS ACL, SID/UID/GID MAPPING, SECURITY DESCRIPTORS for more. ๐ฅbackupuid=argโ file access by this user shall be done with the backup intent flag set. You must provide either a name or an id as the argument; there are no default values. See ACCESSING FILES WITH BACKUP INTENT for the details.backupgid=argโ file access by users who are members of this group shall be done with the backup intent flag set. Either a name or an id must be provided as an argument; again, no default values. See ACCESSING FILES WITH BACKUP INTENT for more.nocaseโ request case insensitive path name matching (case sensitive is the default if the server supports it). ๐คignorecaseโ synonym fornocase. Same thing, different name, slay.sec=argโ security mode. Allowed values are:noneโ attempt to connect as a null user (no name)krb5โ use Kerberos version 5 authenticationkrb5iโ use Kerberos authentication and forcibly enable packet signingntlmโ use NTLM password hashingntlmiโ use NTLM password hashing and force packet signingntlmv2โ use NTLMv2 password hashingntlmv2iโ use NTLMv2 password hashing and force packet signingntlmsspโ use NTLMv2 password hashing encapsulated in Raw NTLMSSP messagentlmsspiโ use NTLMv2 password hashing encapsulated in Raw NTLMSSP message, and force packet signing
The default in mainline kernel versions before v3.8 was sec=ntlm. In v3.8, the default was changed to sec=ntlmssp. If the server requires signing during protocol negotiation, it may be enabled automatically. Packet signing may also be enabled automatically if it's enabled in /proc/fs/cifs/SecurityFlags. ๐
sealโ request encryption at the SMB layer. The encryption algorithm used isAES-128-CCM. Requires SMB3 or above (seevers). ๐esize=argโ the minimum size (in bytes) of an encrypted read response at which the client will offload decryption to a separate worker thread. This works when the number of in-flight requests is greater than 1. Decrypting large encrypted read responses can be computationally expensive, and when multiple reads are in flight, offloading that work can improve performance. The default isesize=0, which means all encrypted read responses are decrypted without offload โ and it can be set up to the maximum buffer size, which can range from8192to130048bytes, and defaults to16384bytes. โ๏ธrdmaโ connect directly to the server using SMB Direct via a RDMA adapter. Requires SMB3 or above (seevers). Speedy networking โจresilienthandlesโ enable resilient handles. If the server supports it, keep opened files across reconnections. Requires SMB2.1 (seevers).noresilienthandlesโ (default) disable resilient handles.persistenthandlesโ enable persistent handles. If the server supports it, keep opened files across reconnections. Persistent handles are also valid across servers in a cluster and have stronger guarantees than resilient handles. Requires SMB3 or above (seevers). ๐ชnopersistenthandlesโ (default) disable persistent handles.snapshot=timeโ mount a specific snapshot of the remote share.timemust be a positive integer identifying the snapshot requested (in 100-nanosecond units that have elapsed since January 1, 1601, or alternatively it can be specified in GMT format, e.g.@GMT-2019.03.27-20.52.19). Supported in the Linux kernel starting fromv4.19. ๐ฐ๏ธnobrlโ do not send byte range lock requests to the server. This is necessary for certain applications that break with cifs style mandatory byte range locks (and most cifs servers don't yet support requesting advisory byte range locks). ๐ซ๐forcemandatorylockโ do not use POSIX locks even when available via unix extensions. Always use cifs style mandatory locks.localleaseโ check cached leases locally instead of querying the server.noleaseโ do not request lease/oplock when opening a file on the server. This turns off local caching of IO, byte-range lock and read metadata operations (seeactimeofor more details about metadata caching). Requires SMB2 and above (seevers).sfuโ when the CIFS or SMB3 Unix Extensions are not negotiated, attempt to create device files and fifos in a format compatible with Services for Unix (SFU). In addition, retrieve bits 10-12 of the mode via theSETFILEBITSextended attribute (as SFU does). In the future the bottom 9 bits of the mode also will be emulated using queries of the security descriptor (ACL). [NB: requires version 1.39 or later of the CIFS VFS. To recognize symlinks and be able to create symlinks in an SFU interoperable form requires version 1.40 or later of the CIFS VFS kernel module. ๐งmfsymlinksโ bestie, this turns on support for Minshall+French symlinks (the whole vibe is at<http://wiki.samba.org/index.php/UNIX_Extensions#Minshall.2BFrench_symlinks>). But heads up: this option is ignored when you specify it together with thesfuoption. And these symlinks get used even if the server is out here supporting the CIFS Unix Extensions. So yeah, it's giving "we do what we want". ๐echo_interval=nโ sets the interval at which echo requests are sent to the server on an idling connection. This setting also affects the time required for a connection to an unresponsive server to timeout. Herenis the echo interval in seconds. The reconnection happens at three times the value of theecho_intervalset for an unresponsive server. If this option is not given then the default value of 60 seconds is used. The minimum tunable value is 1 second and maximum can go up to 600 seconds. โฐserverinoโ use inode numbers (unique persistent file identifiers) returned by the server instead of automatically generating temporary inode numbers on the client. Although server inode numbers make it easier to spot hardlinked files (as they will have the same inode numbers) and inode numbers may be persistent (which is useful for some software), the server does not guarantee that the inode numbers are unique if multiple server side mounts are exported under a single share (since inode numbers on the servers might not be unique if multiple filesystems are mounted under the same shared higher level directory). Note that not all servers support returning server inode numbers, although those that support the CIFS Unix Extensions, and Windows 2000 and later servers typically do support this (although not necessarily on every local server filesystem). Parameter has no effect if the server lacks support for returning inode numbers or equivalent. This behavior is enabled by default. ๐งnoserverinoโ the client generates inode numbers itself rather than using the actual ones from the server. See section INODE NUMBERS for more information. ๐ขposix,unix,linuxโ (default) enable Unix Extensions for this mount. Requires CIFS (vers=1.0) or SMB3.1.1 (vers=3.1.1) and a server supporting them. โจnoposix,nounix,nolinuxโ disable the Unix Extensions for this mount. This can be useful in order to turn off multiple settings at once. This includes POSIX acls, POSIX locks, POSIX paths, symlink support and retrieving uids/gids/mode from the server. This can also be useful to work around a bug in a server that supports Unix Extensions. See section INODE NUMBERS for more information. ๐ซnouser_xattrโ do not allowgetfattr/setfattrto get/set xattrs, even if server would support it otherwise. The default is for xattr support to be enabled. ๐ โโ๏ธnodfsโ do not follow Distributed FileSystem referrals. IO on a file not stored on the server will fail instead of connecting to the target server transparently. ๐noautotuneโ use fixed size for kernel recv/send socket buffers. ๐ฆnosharesockโ do not try to reuse sockets if the system is already connected to the server via an existing mount point. This will make the client always make a new connection to the server no matter what it is already connected to. This can be useful in simulating multiple clients connecting to the same server, as each mount point will use a different TCP socket. ๐noblocksendโ send data on the socket using non blocking operations (MSG_DONTWAITflag). ๐โโ๏ธrsize=bytesโ maximum amount of data that the kernel will request in a read request in bytes. Maximum size that servers will accept is typically 8MB for SMB3 or later dialects. Default requested during mount is 4MB. Prior to the 4.20 kernel the default requested was 1MB. Prior to the SMB2.1 dialect the maximum was usually 64K. ๐ฅwsize=bytesโ maximum amount of data that the kernel will send in a write request in bytes. Maximum size that servers will accept is typically 8MB for SMB3 or later dialects. Default requested during mount is 4MB. Prior to the 4.20 kernel the default requested was 1MB. Prior to the SMB2.1 dialect the maximum was usually 64K. ๐คbsize=bytesโ override the default blocksize (1MB) reported on SMB3 files (requires kernel version of 5.1 or later). Prior to kernel version 5.1, the blocksize was always reported as 16K instead of 1MB (and was not configurable) which can hurt the performance of tools likecpandscp(especially for uncached I/O) which decide on the read and write size to use for file copies based on the inode blocksize.bsizemay not be less than 16K or greater than 16M. ๐งฑmax_credits=nโ maximum credits the SMB2 client can have. Default is 32000. Must be set to a number between 20 and 60000. ๐๏ธfscโ enable local disk caching using FS-Cache for CIFS. This option could be useful to improve performance on a slow link, heavily loaded server and/or network where reading from the disk is faster than reading from the server (over the network). This could also impact the scalability positively as the number of calls to the server are reduced. But, be warned that local caching is not suitable for all workloads, for e.g., read-once type workloads. So, you need to consider carefully the situation/workload before using this option. Currently, local disk caching is enabled for CIFS files opened as read-only. > NOTE: This feature is available only in the recent kernels that have been built with the kernel config optionCONFIG_CIFS_FSCACHE. You also need to havecachefilesddaemon installed and running to make the cache operational. ๐พmultiuserโ map user accesses to individual credentials when accessing the server. By default, CIFS mounts only use a single set of user credentials (the mount credentials) when accessing a share. With this option, the client instead creates a new session with the server using the user's credentials whenever a new user accesses the mount. Further accesses by that user will also use those credentials. Because the kernel cannot prompt for passwords, multiuser mounts are limited to mounts usingsec=options that don't require passwords. With this change, it's feasible for the server to handle permissions enforcement, so this option also impliesnoperm. Furthermore, when unix extensions aren't in use and the administrator has not overridden ownership using theuid=orgid=options, ownership of files is presented as the current user accessing the share. ๐ฅactimeo=argโ the time (in seconds) that the CIFS client caches attributes of a file or directory before it requests attribute information from a server. During this period the changes that occur on the server remain undetected until the client checks the server again. By default, the attribute cache timeout is set to 1 second. This means more frequent on-the-wire calls to the server to check whether attributes have changed which could impact performance. With this option users can make a tradeoff between performance and cache metadata correctness, depending on workload needs. Shorter timeouts mean better cache coherency, but frequent increased number of calls to the server. Longer timeouts mean a reduced number of calls to the server but looser cache coherency. Theactimeovalue is a positive integer that can hold values between 0 and a maximum value of 2^30 * HZ (frequency of timer interrupt) setting. Setting it to 0 disables caching. โณacregmax=argโ the maximum time (in seconds) that the CIFS client caches attributes of a regular file before it requests fresh attribute information from a server. If this option is not specified, thenacregmaxvalue will be set toactimeovalue, seeactimeofor more details. ๐acdirmax=argโ the maximum time (in seconds) that the CIFS client caches attributes of a directory before it requests fresh attribute information from a server. If this option is not specified, thenacdirmaxvalue will be set toactimeovalue, seeactimeofor more details. ๐upcall_target=argโ determines the namespace in which upcalls from the SMB filesystem should be handled. Allowed values are:mountโ resolve upcalls to the host namespace.appโ resolve upcalls in the namespace of the calling thread (application). Default value isapp. This option is useful in environments like Kubernetes, where the mount may be performed by a driver pod on behalf of an application running in a separate container. It ensures that Kerberos credentials and other user-specific data are accessed in the correct namespace. By specifyingapp, upcalls can be resolved in the application's namespace, ensuring the correct credentials are used.mountallows resolution in the host namespace, which may be necessary when credentials or configurations are managed outside the container. โธ๏ธ
multichannelโ this option enables the multichannel feature. Multichannel is an SMB3 protocol feature that allows client to establish multiple transport connections to an SMB server and bind them into a single authenticated SMB session. This feature enhances fault tolerance and increases throughput by distributing traffic across several connections. With this mount option default is to use two channels if the server supports multichannel. Themax_channelsparameter can be specified if you desire to use more than two channels. ๐max_channels=argโ this option is applicable while using the multichannel feature.max_channelsoption allows the user to specify the number of transport connections that should be establised between client and server up to a limit of 16. Using this option implicitly enables the multichannel feature. Ifmax_channelsoption not specified, multichannel feature defaults to using 2 connections. ๐closetimeo=argโ the max time (in seconds) that the CIFS client will put off sending that final SMB3 close when it's holding a handle lease on the file. ๐ค By defaultclosetimeois 1 second, and it can go anywhere from0all the way up to a max of2^30 * HZ. yes bestie, that's a big number.noposixpathsโ so if unix extensions are enabled on a share, the client will normally let filenames contain literally any character except/in a pathname component, and it'll use forward slashes as the pathname delimiter. This option stops the client from even trying to negotiate posix-style pathnames with the server. ๐ โ๏ธposixpathsโ the inverse ofnoposixpaths. that's it. that's the tweet.compressโ EXPERIMENTAL FEATURE โ ๏ธ turns on over-the-wire message compression for SMB 3.1.1 or higher mounts. and like, the mount will straight up fail ifcompressis on andversis set to anything lower than 3.1.1. no cap.vers=argโ the SMB protocol version, babes. allowed values are:1.0โ the classic CIFS/SMBv1 protocol.2.0โ the SMBv2.002 protocol. this one was first introduced in Windows Vista Service Pack 1, and Windows Server 2008. ๐ heads up tho: the initial release version of Windows Vista spoke a slightly different dialect (2.000) that is not supported.2.1โ the SMBv2.1 protocol, introduced in Microsoft Windows 7 and Windows Server 2008R2.3.0โ the SMBv3.0 protocol, introduced in Microsoft Windows 8 and Windows Server 2012.3.02or3.0.2โ the SMBv3.0.2 protocol, introduced in Microsoft Windows 8.1 and Windows Server 2012R2.3.1.1or3.11โ the SMBv3.1.1 protocol, introduced in Microsoft Windows 10 and Windows Server 2016.3โ the SMBv3.0 protocol version and above.defaultโ tries to negotiate the highest SMB2+ version that both the client and the server support. ๐ค
If no dialect is specified on mount, vers=default is used. and if you wanna check the Dialect, go look at /proc/fs/cifs/DebugData. ๐
Also note (real talk) that even though this option governs the protocol version being used, not all features of each version are available. ๐
The default since v4.13.5 is for the client and server to negotiate the highest possible version greater than or equal to 2.1. In kernels prior to v4.13, the default was 1.0. And for kernels between v4.13 and v4.13.5, the default is 3.0. history lesson over bestie, you're welcome. ๐
sloppyโ lets the system ignore any unrecognized mount options that follow this option, instead of just failing to mount entirely. chaotic but forgiving energy. โจ--verboseโ prints extra debugging info for the mount. ๐ IMPORTANT: this parameter has to be specified before the-o. like so:
mount -t cifs //server/share /mnt --verbose -o user=username
๐ SERVICE FORMATTING AND DELIMITERS ๐
okay so, it's generally preferred to use forward slashes (/) as a delimiter in service names. they're considered the "universal delimiter" because they're generally not allowed to be embedded inside path components on Windows machines, and the client can convert them to backslashes (\) unconditionally. ๐
Meanwhile, backslash characters are allowed by POSIX to be part of a path component, so they can't be automatically converted in the same way. tragic, honestly.
mount.cifs will attempt to convert backslashes to forward slashes wherever it's able to do so, but it cannot do so in any path component following the sharename. ๐ญ
๐ง INODE NUMBERS ๐ง
When Unix Extensions are enabled, we use the actual inode number that the server provides in response to the POSIX calls, as an inode number. simple, clean, slay.
When Unix Extensions are disabled and the serverino mount option is enabled, there's no way to get the server inode number. so the client typically maps the server-assigned UniqueID onto an inode number. ๐
Note that theUniqueIDis a different value from the server inode number. TheUniqueIDvalue is unique over the scope of the entire server, and it's often greater than 2 power 32. This value often makes programs that are not compiled with LFS (Large File Support) trigger a glibcEOVERFLOWerror, because it won't fit in the target structure field. ๐
It is strongly recommended to compile your programs with LFS support (i.e. with -D_FILE_OFFSET_BITS=64) to prevent this problem. You can also use the noserverino mount option to generate inode numbers smaller than 2 power 32 on the client โ but then you may not be able to detect hardlinks properly. pick your struggle, bestie. ๐
๐ CACHE COHERENCY ๐
With a network filesystem such as CIFS or NFS, the client has to contend with the fact that activity on other clients, or on the server, could change the contents or attributes of a file without the client even being aware of it. ๐ณ One way to deal with that is to mandate that all file accesses go to the server directly. but that's performance-prohibitive, so most protocols have some mechanism that lets the client cache data locally.
The CIFS protocol mandates (in effect) that the client should not cache file data unless it holds an opportunistic lock (aka an oplock) or a lease. Both of these entities let the client guarantee certain types of exclusive access to a file, so it can access its contents without needing to constantly interact with the server. The server will call back the client when it needs to revoke either of them, and it gives the client a certain amount of time to flush any cached data. โณ
The cifs client uses the kernel's pagecache to cache file data. Any I/O that's done through the pagecache is generally page-aligned. This can be problematic when it's combined with byte-range locks, since Windows' locking is mandatory and can block reads and writes from happening. ๐ฌ
cache=noneโ means the client never uses the cache for normal reads and writes. It always accesses the server directly to satisfy a read or write request.cache=strictโ means the client will attempt to follow the CIFS/SMB2 protocol strictly. i.e. the cache is only trusted when the client holds an oplock. When the client doesn't hold an oplock, the client bypasses the cache and accesses the server directly to satisfy a read or write request. By doing this, the client avoids problems with byte range locks. Plus, byte range locks are cached on the client when it holds an oplock, and are "pushed" to the server when that oplock is recalled.cache=looseโ lets the client use looser protocol semantics, which can sometimes give better performance at the expense of cache coherency. File access always involves the pagecache. When an oplock or lease isn't held, the client will attempt to flush the cache soon after a write to a file. Note that that flush does not necessarily occur before a write system call returns. ๐
In the case of a read without holding an oplock, the client will attempt to periodically check the attributes of the file to figure out whether it's changed and the cache might no longer be valid. This mechanism is a lot like the one NFSv2/3 use for cache coherency, but it's particularly problematic with CIFS. Windows is quite "lazy" with respect to updating the LastWriteTime field that the client uses to verify this. The effect is that cache=loose can cause data corruption when multiple readers and writers are working on the same files. ๐ not the vibe.
Because of this, when multiple clients are accessing the same set of files, cache=strict is recommended. ๐ That helps eliminate problems with cache coherency by following the CIFS/SMB2 protocols more strictly.
Note too that no matter what caching model is used, the client will always use the pagecache to handlemmap'ed files. Writes tommap'ed files are only guaranteed to be flushed to the server whenmsync()is called, or onclose().
The default in kernels prior to 3.7 was loose. As of 3.7, the default is strict. ๐
๐ฅ CIFS/NTFS ACL, SID/UID/GID MAPPING, SECURITY DESCRIPTORS ๐ฅ
This option is used to work with file objects that possess Security Descriptors and CIFS/NTFS ACL instead of UID, GID, file permission bits, and POSIX ACL as the user authentication model. This is the most common authentication model for CIFS servers, and it's the one Windows uses. ๐ช
Support for this requires the cifs kernel module to be built with both CONFIG_CIFS_XATTR and CONFIG_CIFS_ACL options enabled. Since Linux 5.3, the CONFIG_CIFS_ACL option no longer exists, because CIFS/NTFS ACL support is always built into the cifs kernel module. ๐
Most distribution kernels will already have those options enabled by default, but you can still check if they're enabled with:
cat /lib/modules/$(uname -r)/build/.config
Alternatively, if the kernel is configured with CONFIG_IKCONFIG_PROC:
zcat /proc/config.gz
A CIFS/NTFS ACL is mapped to file permission bits using an algorithm specified in the following Microsoft TechNet document:
<http://technet.microsoft.com/en-us/library/bb463216.aspx>
In order to map SIDs to/from UIDs and GIDs, the following is required:
- a kernel upcall to the
cifs.idmaputility set up viarequest-key.conf(5) winbindorsssdsupport configured viansswitch.conf(5)
Please refer to the respective manpages of cifs.idmap(8), winbindd(8) and sssd(8) for more information. ๐
Security descriptors for a file object can be retrieved and set directly using the extended attribute named system.cifs_acl. The security descriptors presented via this interface are "raw" blobs of data, and they need a userspace utility to either parse and format them, or to assemble them โ such as getcifsacl(1) and setcifsacl(1) respectively. ๐งฐ
Some of the things to consider while using this mount option:
- There may be increased latency when handling metadata, due to the additional requests needed to get and set security descriptors. ๐
- The mapping between a CIFS/NTFS ACL and POSIX file permission bits is imperfect, and some ACL information may be lost in the translation. ๐ญ
- If either the upcall to
cifs.idmapisn't set up correctly, orwinbindorsssdisn't configured and running, ID mapping will fail. In that case,uidandgidwill default to either those values of the share, or to the values of theuidand/orgidmount options if they're specified. ๐
โจ ACCESSING FILES WITH BACKUP INTENT โจ
okay bestie so picture this ๐ญ โ when you're a user on the server, what you're allowed to do with a file is decided by the permissions and rights that file is carrying around. usually that's handled with ownership and ACL, the classic duo ๐
but here's the twist ๐ โ even if you have zero access rights to a file, you can still get in there for a specific or targeted purpose by being granted special rights. and one of those specific purposes? accessing a file with the intent to either backup or restore โ aka the backup intent. slay.
the right to access a file with backup intent can typically be granted by making that user part of the built-in group Backup Operators ๐ so when this user tries to open a file with backup intent, the open request goes out with the bit FILE_OPEN_FOR_BACKUP_INTENT set as one of the CreateOptions.
so like, example time โจ โ on a Windows server, a user named testuser cannot open a file with a security descriptor like this:
REVISION:0x1
CONTROL:0x9404
OWNER:Administrator
GROUP:Domain Users
ACL:Administrator:ALLOWED/0x0/FULL
but testuser, if it becomes part of the Backup Operators group, can open that file with the backup intent. main character upgrade fr fr ๐ฆ
and like, any user on the client side who can authenticate as such a user on the server can access files with backup intent. but โ and this is the important part โ for security reasons amongst many, it's desirable and preferable to restrict this special right ๐
the mount option backupuid is what restricts this special right to a user, specified by either a name or an id. and the mount option backupgid restricts it to the users in a group, also specified by either a name or an id. only users matching either backupuid or backupgid shall attempt to access files with backup intent. these two mount options can be used together ๐ซถ
๐ธ FILE AND DIRECTORY OWNERSHIP AND PERMISSIONS ๐ธ
ngl the core CIFS protocol simply does not provide unix ownership info or mode for files and directories. it's giving "we forgot that part" ๐ญ because of this, files and directories will generally appear to be owned by whatever values the uid= or gid= options are set to, and will have permissions set to the default file_mode and dir_mode for the mount. and if you try to change these values via chmod/chown? it will return success but have no effect. fake success, we hate to see it ๐
when the client and server negotiate unix extensions, files and directories get assigned the uid, gid, and mode provided by the server โจ because CIFS mounts are generally single-user, and the same credentials are used no matter what user accesses the mount, newly created files and directories will generally be given ownership corresponding to whatever credentials were used to mount the share.
if the uid's and gid's being used don't match on the client and server, the forceuid and forcegid options may be helpful ๐ note however that there is no corresponding option to override the mode. and permissions assigned to a file when forceuid or forcegid are in effect may not reflect the the real permissions. (yes, "the the" โ we're keeping it, it's iconic)
when unix extensions are not negotiated, it's also possible to emulate them locally on the server using the dynperm mount option ๐ when this mount option is in effect, newly created files and directories will receive what appear to be proper permissions. these permissions are not stored on the server however, and can disappear at any time in the future (subject to the whims of the kernel flushing out the inode cache ๐ต๐ซ). in general, this mount option is discouraged.
it's also possible to override permission checking on the client altogether via the noperm option. but โ server-side permission checks cannot be overridden. the permission checks done by the server will always correspond to the credentials used to mount the share, and not necessarily to the user who is accessing the share. periodt ๐
๐ฆ ENVIRONMENT VARIABLES ๐ฆ
- the variable
USERmay contain the username of the person to be used to authenticate to the server. the variable can be used to set both username and password by using the formatusername%passwordโจ - the variables
PASSWDandPASSWD2may contain the password and the alternate password of the person using the client, respectively ๐ - the variables
PASSWD_FILEandPASSWD2_FILEmay contain the pathname of the file to readpasswordorpassword2from, respectively. a single line of input is read and used as the password in each case ๐
๐ NOTES ๐
this command may be used only by root, unless installed setuid ๐ in which case the noexec and nosuid mount flags are enabled. when installed as a setuid program, the program follows the conventions set forth by the mount program for user mounts, with the added restriction that users must be able to chdir() into the mountpoint prior to the mount in order to be able to mount onto it.
some samba client tools like smbclient(8) honour client-side configuration parameters present in smb.conf ๐ unlike those client tools, mount.cifs ignores smb.conf completely. not me, not my config file, we don't know her ๐
โญ CONFIGURATION โญ
the primary mechanism for making configuration changes and for reading debug information for the cifs vfs is via the Linux /proc filesystem ๐ in the directory /proc/fs/cifs are various configuration files and pseudo files which can display debug information and performance statistics.
there are additional startup options such as maximum buffer size and number of buffers which only may be set when the kernel cifs vfs (cifs.ko module) is loaded ๐ง these can be seen by running the modinfo utility against the file cifs.ko, which will list the options that may be passed to cifs during module installation (device driver load). for more information see the kernel file fs/cifs/README.
when configuring dynamic tracing (trace-cmd) note that the list of SMB3 events which can be enabled can be seen at: /sys/kernel/debug/tracing/events/cifs/ ๐
๐ SECURITY ๐
the use of SMB2.1 or later (including the latest dialect SMB3.1.1) is recommended for improved security, and SMB1 is no longer requested by default at mount time. slay ๐
old dialects such as CIFS (SMB1, ievers=1.0) have much weaker security. use of CIFS (SMB1) can be disabled bymodprobe cifs disable_legacy_dialects=y.
๐ BUGS ๐
- mounting using the CIFS URL specification is currently not supported ๐
- the credentials file does not handle usernames or passwords with leading space.
- note that the typical response to a bug report is a suggestion to try the latest version first. so please try doing that first ๐ญ and always include which versions you use of relevant software when reporting bugs (minimum:
mount.cifs(trymount.cifs -V), kernel (see/proc/version) and server type you are trying to contact. iykyk ๐ซถ
๐ VERSION ๐
this man page is correct for version 2.18 of the cifs vfs filesystem (roughly Linux kernel 5.0) โจ
๐ SEE ALSO ๐
Documentation/filesystems/cifs.txt and fs/cifs/README in the Linux kernel source tree may contain additional options and information ๐
๐ AUTHOR ๐
Steve French
the maintainer of the Linux CIFS VFS is Paulo Alcantara. the maintainer of the cifs-utils suite of user space tools is Pavel Shilovsky. the Linux CIFS Mailing list is the preferred place to ask questions regarding these programs ๐
okay that's literally the whole thing bestie, you ate that ๐๐
this page lives under the name mount.cifs, mount.smb3(8) โ so go forth and mount responsibly, mwah ๐ง๐
๐ฆ where this page comes from
- fedora 44: cifs-utils 7.8-2.fc44
- fedora 44: cifs-utils 7.9-2.fc44 ยท GPL-3.0-only
- ๐ girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms