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 systemsupport 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 thenetwork by utilizing SMB or CIFS protocol.

In order to mount, the network stack will also need to be set up byusing ‘ip=’ config option. For more details, seeMounting the root filesystem via NFS (nfsroot).

A CIFS root mount currently requires the use of SMB1+UNIX Extensionswhich is only supported by the Samba server. SMB1 is the olderdeprecated version of the protocol but it has been extended to supportPOSIX features (See [1]). The equivalent extensions for the newerrecommended version of the protocol (SMB3) have not been fullyimplemented yet which means SMB3 doesn’t support some required POSIXfile system objects (e.g. block devices, pipes, sockets).

As a result, a CIFS root will default to SMB1 for now but the versionto use can nonetheless be changed via the ‘vers=’ mount option. Thisdefault will change once the SMB3 POSIX extensions are fullyimplemented.

Server configuration

To enable SMB1+UNIX extensions you will need to set these globalsettings in Samba smb.conf:

[global]server min protocol = NT1unix extension = yes        # default

Kernel command line

root=/dev/cifs

This is just a virtual device that basically tells the kernel to mountthe root file system via SMB protocol.

cifsroot=//<server-ip>/<share>[,options]

Enables the kernel to mount the root file system via SMB that arelocated 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 andCONFIG_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