Multipass uses SSHFS by default for mounting host folders on instances. While it provides good compromise between performance, security and features, other methods can be used to manually accomplish this task.
We conducted thorough tests on many mount methods. Here, we briefly show how to create shares on each system and how to mount them in Multipass instances with the most performant methods we found.
- SMB/CIFS mounts
- virtio-fs mounts
- NFS mounts
In our tests, SMB was very performant in all the architectures supported by Multipass. Windows and MacOS provide a system SMB server, while in Linux it can be easily installed (newer versions of the kernel provide a system server, but we describe here a solution which works for older Linux versions too).
First, optionally and to increase speed, we can enable RDMA on the SMB server built into Windows. In the control panel, we can find the Turn Windows Features on or off icon. On that window, we need to enable SMB Direct. Windows may require a restart.
Then, to share a folder we can use PowerShell. Issuing the command
New-SmbShare -Name "share_name" -Path "C:\my_path"
will create a share named
\\hostname\share_name in the host. The command
New-SmbShare has multiple options to control access and encryption, but these are not the topic of this document.
This can be entirely done using the GUI, but some steps can easily be done from the command-line. We’ll show the latter when possible.
To enable sharing system wide, we need these commands:
sudo defaults write /Library/Preferences/SystemConfiguration/com.apple.smb.server.plist EnabledServices -array disk sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smbd.plist
Then, for sharing a specific folder:
sudo sharing -a /my_path/
Finally, we need to allow the user to access the shared folders via SMB. For this, we need to navigate the System Preferences, and find there the Sharing icon. In the Sharing menu, there is a button labeled Options. This button shows us a window, on which we can choose which users will be able to mount. There, we choose and enter the passwords of the users we want to authorize.
All these steps will create a mount point named
//hostname/my_path/ in the host.
In Ubuntu (or any other Debian-based distribution), the package samba-common contains a SMB server. We can install it with the command
sudo apt update && sudo apt install -y samba-common
Then, editing the file
/etc/samba/smb.conf lets us add shares, adding entries like the following:
[test_smb_mount] comment = smb mount test path = /my_path/ read only = no browsable = yes kernel oplocks = yes
Once the host operating system is sharing the folder, we need to mount it on the instance. For this, the package
cifs-tools is needed, which can be installed with
sudo apt update && sudo apt install -y cifs-utils
Mounting is finally done in the command line by
sudo mount -t cifs //hostname/my_path_or_share_name mount_folder/ -o user=my_name,uid=1000
my_name is the user sharing the folder on the host. The password will be asked in the terminal and after entering it, we are done.
Optionally, we can add a line to
/etc/fstab to make the operating system automatically mount the folder at boot, or at least not having the need to specify the mount name and options. The line should read:
//hostname/my_path_or_share_name mount_folder/ cifs user=my_name,uid=1000 0 0
Entries in this file are space or tab separated. The first one is the share name or path, the second one is the directory where to mount the folder, the third one is the mount type, the fourth one is the comma-separated list of options (add noauto to avoid mounting at boot) and the two last options better remain as zero.
noauto is specified in the options, the folder should be mounted with
sudo mount mount_folder/
If using the LXD backend on Linux, we can benefit from a performant file system mount, at the expense of not being able to mount it while the instance is running. A folder is mounted on an instance with the command
lxc --project multipass config device add lxdinstance mount_lxd disk source=/my_path path=//mount_folder
lxdinstance is the name of the instance,
mount_lxd is an arbitrary device name for the mount,
source specifies the path to share and
path specifies the directory where the source is to be mounted. With only this command, LXD takes care of everything: no need to run commands on the instance.
virtio-fs is also available in qemu and libvirt backends, though at an extra setup cost.
Linux and MacOS provide a NFS server on the system.
The NFS server included in MacOS is controlled with the
nfsd command and the file
/etc/exports. We need to add the folder we want to share to this file, with a line similar to
/my_path -mapall=host_user -network 192.168.0.0 -mask=255.255.0.0
-mask control the network from which the share can be accessed. Then, we start the server with the command
sudo nfsd start
restart if the server is already running).
In Ubuntu (or any other Debian-based distribution), the package
nfs-kernel-server contains the files to use the NFS server included in the kernel. We can install it with the command
sudo apt update && sudo apt install -y nfs-kernel-server
To share a folder, we use the following command:
sudo exportfs *:/my_path
* means “export to any host”; we can specify a host name or IP address there.
We would first need to install the NFS client in the instance, with the commands
sudo apt update && sudo apt install -y nfs-common
then, we can mount the shared folder with
sudo mount -t nfs HOST_IP:/my_path /mount_folder -o user=host_user,uid=instance_uid,gid=instance_gid