透過 SMB (cifs.ko) 掛載根檔案系統

由 Paulo Alcantara 於 2019 年編寫 <palcantara@suse.de>

由 Aurelien Aptel 於 2019 年編寫 <aaptel@suse.com>

CONFIG_CIFS_ROOT 選項透過 cifs.ko 啟用透過 SMB 協議對根檔案系統的實驗性支援。

它引入了一個新的核心命令列選項,名為 ‘cifsroot=’,它將告訴核心透過使用 SMB 或 CIFS 協議掛載網路上的根檔案系統。

為了進行掛載,還需要使用 ‘ip=’ 配置選項設定網路棧。有關更多詳細資訊,請參見 透過 NFS 掛載根檔案系統 (nfsroot)

CIFS 根掛載當前需要使用 SMB1+UNIX 擴充套件,該擴充套件僅受 Samba 伺服器支援。 SMB1 是較舊的已棄用的協議版本,但已對其進行了擴充套件以支援 POSIX 功能(請參見 [1])。較新推薦的協議版本 (SMB3) 的等效擴充套件尚未完全實現,這意味著 SMB3 不支援某些必需的 POSIX 檔案系統物件(例如,塊裝置、管道、套接字)。

因此,CIFS 根現在將預設為 SMB1,但仍可以透過 ‘vers=’ 掛載選項更改要使用的版本。一旦 SMB3 POSIX 擴充套件完全實現,此預設設定將更改。

伺服器配置

要啟用 SMB1+UNIX 擴充套件,您需要在 Samba smb.conf 中設定這些全域性設定

[global]
server min protocol = NT1
unix extension = yes        # default

核心命令列

root=/dev/cifs

這只是一個虛擬裝置,基本上告訴核心透過 SMB 協議掛載根檔案系統。

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

使核心能夠透過 SMB 掛載位於此選項中指定的 <server-ip> 和 <share> 中的根檔案系統。

預設掛載選項在 fs/smb/client/cifsroot.c 中設定。

server-ip

伺服器的 IPv4 地址。

share

SMB 共享(rootfs)的路徑。

options

可選的掛載選項。有關更多資訊,請參見 mount.cifs(8)。

示例

將根檔案系統作為 Samba 共享匯出到 smb.conf 檔案中

...
[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
...

重啟 smb 服務

# systemctl restart smb

在啟用了 CONFIG_CIFS_ROOT 和 CONFIG_IP_PNP 選項的核心下的 QEMU 中對其進行測試

# 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