This guide covers the Server Message Block (SMB) protocol. Specifically, it discusses using the SMB protocol to mount a Windows SMB share (a shared directory) to a Linux system. By following this guide, you will be able to access all of your files within a Windows folder (such as C:\My_Files
) on your Linux system at whichever directory you choose as a mount point (such as /mnt/my_files
). This method of file sharing is appropriate when you need to access entire Windows directories remotely as if they were local resources. In most cases, SMB is a native (or easily installed) file sharing solution for users that need access to the same directory and is commonly shared through a corporate intranet or the same private network.
Note
Network File System (NFS) is another distributed file system protocol that’s similar to SMB. While SMB is more commonly used in primarily Windows environments and NFS is used in primary Linux environments, both have cross-platform support. This guide does not cover NFS, but you can learn more about it by reading through our NFS guides. If you are not in a Windows environment and are looking to share directories between Linux systems, consider using NFS.
Warning
While security and performance of the SMB protocol has improved over time, it is often still a concern when connecting to an SMB share over the internet. This is typically not recommended unless you are using SMB over QUIC (recently introduced on Windows 11 and Windows Server 2022), intend to always use the latest protocol version (3.1.1 as of this writing), or are connected through a personal or corporate VPN. If you are not able to implement these recommendations and still wish to share files over the internet, consider if the SFTP protocol would work for you instead.
Linux SMB Support
- Samba: Unix support for the SMB protocol was initially provided by Samba. Since Microsoft initially did not release public specifications for their proprietary protocol, the developers of Samba had to reverse engineer it. Future versions of Samba were able to use the public specifications of later SMB protocols. Samba includes support for SMB3 (3.1.1) and is actively updated. Samba provides extensive support for all features of the SMB protocol and acts as a stand-alone file and print server. For more background information, see the Samba Wikipedia entry.
- LinuxCIFS utils: This in-kernel software acts as an SMB client and is the preferred method of mounting existing SMB shares on Linux. It was originally included as part of the Samba software, but is now available on its own. LinuxCIFS utils, available as the cifs_utils package in most Linux distributions, is used within this guide.
- ksmbd: Developed as an in-kernel SMB server in cooperation with the Samba project, ksmbd is designed to be a more performant fileserver. It doesn’t implement all of Samba’s extensive features (beyond file sharing).
Before You Begin
- Obtain the necessary information required to access an existing SMB share, including the IP address of the SMB server and the path of the share. If you do not have a share, you can create a local directory using the
mkdir
command and then create a Samba share for that location. Access to an existing SMB share on a Windows or Linux machine. Creating an SMB share is beyond the scope of this tutorial. - Have access to an Ubuntu or Debian Linux system where you intend to access your SMB share.
Installation
The LinuxCIFS utils package provides the tools needed to connect to a share and manage mounts on a Linux system. You use it to help create and manage a connection to a Windows, macOS, or Linux share.
- Update the list of available packages using the below command:
sudo apt update && sudo apt upgrade
- Install the both the LinuxCIFS utils package (needed to mount SMB shares) and the psmisc package (needed to gain access to the
fuser
command, which shows you which users are using the various mounts on your server).sudo apt install cifs-utils psmisc
- Verify that LinuxCIFS is available using the following command:
mount -t cifs
No error or output message is expected as there are no CIFS connections set up yet. - Verify that you have access to the
fuser
command.fuser
This command shows a list of the various command line switches that can be used with thefuser
utility.Usage: fuser [-fMuvw] [-a|-s] [-4|-6] [-c|-m|-n space] [-k [-i] [-s sig] | -SIGNAL] NAME...
Mount an SMB Share
All files in Linux are accessible on a single giant hierarchical directory tree, which starts at the root (/
). The mount command (used in this tutorial) enables you to access other storage devices or file systems from that same tree. These other storage resources do not have to be physical disks and they do not have to be using the same file system.
The following sections detail how to mount an SMB share on Ubuntu, but the essential process is the same for other Linux distributions.
- Create an empty directory to be used as the mount point. This directory can be located wherever you wish, though it’s common to use the
/mnt
directory.mkdir /mnt/smb_share
- Enter the following command to mount the SMB share, replacing [server-ip] with the IP address of your SMB server, [share-path] with the file path to your SMB share on that server, and [mount-point] with the new directory you just created.
mount -t cifs //[server-ip]/[share-path] /[mount-point]
In the example below, the SMB server’s IP is 192.0.2.17, the share’s path is SharedFiles, and the mount point is/mnt/smb_share
.mount -t cifs //192.0.2.17/SharedFiles /mnt/smb_share
- When prompted, enter the password to connect to the remote share.
- If the connection is successful, you should see the remote share mounted on the mount point directory you created. To verify this, type the following command:
mount -t cifs
The command above lists all mounted SMB shares. Among this list, you should see the share you just mounted. - You should now be able to access the files as if they were on a local drive. In the command below, replace [mount-point] with the directory you have created (such as
/mnt/smb_share
).cd [mount-point]
From here, you can run thels
command to view your files and you can interact with the files as you would any other files on your system.
Create a Credentials File
You don’t want to have to type in your credentials every time you access a share. On the other hand, putting the credentials where everyone can see is not a good idea. The following steps help you create a credentials file to automate the process of logging in.
- Use your preferred text editor such as vi or nano to create a file to store the credentials. You can name the file anything you want, but using a period before the filename will hide it from view. For example, you can create a file named
.credentials
using the following command:nano ~/.credentials
- Add the necessary credentials to the file in the following format:
File: .credentials
1 username=target_user_name
2 password=target_user_password
3 domain=domain
If thedomain
is not required (except on Windows systems), you can omit that entry. Replace thetarget_user_name
andtarget_user_password
with the actual credentials you need to use to access the SMB share. Save and close the file. - Set ownership of the credentials file to the current user by running the following command:
sudo chown <User Name>:<Credentials Filename>
Replace<User Name>
with your username and<Credentials Filename>
with the name of your credentials file. - Set the file permissions to
600
to ensure that only the owner has read and write access:sudo chmod 600 <Credentials Filename>
- To mount the share using the credentials file, run the following command:
sudo mount -t cifs -o credentials=<Credentials Filename> //<IP Address of Server>/<Share on Server> /<Mount Point>
Replace<IP Address of Server>
with the IP address of the server hosting the share,<Share on Server>
with the name of the share you want to mount, and<Mount Point>
with the local mount point where you want to access the share. You aren’t asked for credentials this time because mount uses the credentials file instead. - Verify that the share has been successfully mounted using the following command:
mount -t cifs
This should show you the share information as output, confirming that the share has been successfully mounted using the credentials file.
Mount a Share Automatically At Boot
Remounting the SMB share every time you restart the server can be tedious. You can instead set your server up to automatically remount the share every time you restart it using the following steps. Before starting these steps, make sure that the share is currently unmounted.
- Open the
/etc/fstab
file in your preferred text editor. This file contains configurations that the server uses on reboot to reconnect to shares (among other things). There are columns for the file system, mount point, type, and options. - Enter the information below in each of the columns:
File: /etc/fstab
1 <file system>: //<IP Address of Server>/<Share on Server>
2 <mount point>: <Mount Point>
3
<type>: cifs
4 <options>: credentials=<Credentials Filename>
From the file above, replace<IP Address of Server>
with the IP address of the server hosting the share,<Share on Server>
with the name of the share you want to mount,<Mount Point>
with the local mount point where you want to access the share,<Credentials Filename>
with the name of your credentials file. - Save the file so the share is available next time you reboot the server.
- Verify that the share is mounted correctly using the
<Mount Point>
as an identifier because the mount is reading the/etc/fstab
file.
Practical example of an fstab file:
# smb share permanent mounts for plex – by Nacho
# //<IPaddress>/<ShareName> /<mountPoint> cifs user=<userName>,pass=<passwd> 0 0
//190.135.22.70/MOVIES /mnt/drobo-movies cifs credentials=/home/ignacio/.credentials 0 0
//190.135.22.70/TV-SERIES /mnt/drobo-tvseries cifs credentials=/home/ignacio/.credentals 0 0
Unmount a Share
You may need to unmount a share at some point. To unmount an SMB share that has been mounted using the mount
command, you can use the umount
command followed by the mount point of the share. The correct command is umount
, not unmount
.
So to unmount an SMB share at the mount point <Mount Point>
, run the following command:umount -t cifs /<Mount Point>
The share should not appear in the output of this command.
Conclusion
You now have an understanding of SMB (and CIFS), what an SMB share is, and what a mount point is. These pieces of information allow you to share remote data in a way that’s transparent to users. From the user’s perspective, the resource is local to the server that they’re accessing. This guide also shows you how to use the mount and umount commands in a basic way to create and delete shares, how to create and use a credentials file to automate the sharing process to some extent, and how to automatically remount the share after a reboot.