| .. SPDX-License-Identifier: GPL-2.0 |
| |
| =========================================== |
| Mounting root file system via SMB (cifs.ko) |
| =========================================== |
| |
| Written 2019 by Paulo Alcantara <palcantara@suse.de> |
| |
| Written 2019 by Aurelien Aptel <aaptel@suse.com> |
| |
| The CONFIG_CIFS_ROOT option enables experimental root file system |
| support over the SMB protocol via cifs.ko. |
| |
| It introduces a new kernel command-line option called 'cifsroot=' |
| which will tell the kernel to mount the root file system over the |
| network by utilizing SMB or CIFS protocol. |
| |
| In order to mount, the network stack will also need to be set up by |
| using 'ip=' config option. For more details, see |
| Documentation/admin-guide/nfs/nfsroot.rst. |
| |
| A CIFS root mount currently requires the use of SMB1+UNIX Extensions |
| which is only supported by the Samba server. SMB1 is the older |
| deprecated version of the protocol but it has been extended to support |
| POSIX features (See [1]). The equivalent extensions for the newer |
| recommended version of the protocol (SMB3) have not been fully |
| implemented yet which means SMB3 doesn't support some required POSIX |
| file system objects (e.g. block devices, pipes, sockets). |
| |
| As a result, a CIFS root will default to SMB1 for now but the version |
| to use can nonetheless be changed via the 'vers=' mount option. This |
| default will change once the SMB3 POSIX extensions are fully |
| implemented. |
| |
| Server configuration |
| ==================== |
| |
| To enable SMB1+UNIX extensions you will need to set these global |
| settings in Samba smb.conf:: |
| |
| [global] |
| server min protocol = NT1 |
| unix extension = yes # default |
| |
| Kernel command line |
| =================== |
| |
| :: |
| |
| root=/dev/cifs |
| |
| This is just a virtual device that basically tells the kernel to mount |
| the root file system via SMB protocol. |
| |
| :: |
| |
| cifsroot=//<server-ip>/<share>[,options] |
| |
| Enables the kernel to mount the root file system via SMB that are |
| located in the <server-ip> and <share> specified in this option. |
| |
| The default mount options are set in fs/smb/client/cifsroot.c. |
| |
| server-ip |
| IPv4 address of the server. |
| |
| share |
| Path to SMB share (rootfs). |
| |
| options |
| Optional mount options. For more information, see mount.cifs(8). |
| |
| Examples |
| ======== |
| |
| Export root file system as a Samba share in smb.conf file:: |
| |
| ... |
| [linux] |
| path = /path/to/rootfs |
| read only = no |
| guest ok = yes |
| force user = root |
| force group = root |
| browseable = yes |
| writeable = yes |
| admin users = root |
| public = yes |
| create mask = 0777 |
| directory mask = 0777 |
| ... |
| |
| Restart smb service:: |
| |
| # systemctl restart smb |
| |
| Test it under QEMU on a kernel built with CONFIG_CIFS_ROOT and |
| CONFIG_IP_PNP options enabled:: |
| |
| # qemu-system-x86_64 -enable-kvm -cpu host -m 1024 \ |
| -kernel /path/to/linux/arch/x86/boot/bzImage -nographic \ |
| -append "root=/dev/cifs rw ip=dhcp cifsroot=//10.0.2.2/linux,username=foo,password=bar console=ttyS0 3" |
| |
| |
| 1: https://wiki.samba.org/index.php/UNIX_Extensions |