Boot

NFS 根文件系統不會在啟動時掛載

  • September 3, 2015

這是一個帶有自定義核心的嵌入式設備(相關配置見下文)。這是一台 x86-32 機器,像這樣引導:coreboot->uboot->linux。如果我為 rootfs 使用板載儲存,我可以在 linux 中掛載 NFS 共享。我很確定 linux 在啟動時正確地自動配置網路使用ip=dhcp(注意:這是使用網路的 DHCP 伺服器;它只是分發 IP 地址,與 BOOTP 或類似的東西無關)。我也試過用 顯式設置參數ip=,結果和 for 一樣ip=dhcp

以下是在 uboot 中執行的內容:

set ethaddr 02:00:00:10:00:43; set serverip 204.54.80.195; set ipaddr 204.54.80.37
set bootargs rootwait raid=noautodetect rw console=ttyS0,115200 root=/dev/nfs nfsroot=$serverip:/yukon ip=dhcp
ext4load mmc 0 ${kernel_addr} ${kernel_path} ; ext4load mmc 0 ${initrd_addr} ${initrd_path} ; zboot ${kernel_addr} 0 ${initrd_addr}

這是linux中出現的網路:

Sending DHCP requests ., OK
IP-Config: Got DHCP answer from 204.54.80.10, my address is 204.54.80.37
IP-Config: Complete:
    device=eth0, hwaddr=02:00:00:10:00:43, ipaddr=204.54.80.37, mask=255.255.255.0, gw=204.54.80.1
    host=204.54.80.37, domain=jdnet.deere.com, nis-domain=(none)
    bootserver=0.0.0.0, rootserver=204.54.80.195, rootpath=
    nameserver0=204.54.84.14, nameserver1=164.121.15.220

Linux 在無法掛載 rootfs 時出現恐慌:

VFS: Unable to mount root fs via NFS, trying floppy.
VFS: Cannot open root device "nfs" or unknown-block(2,0): error -6

相關核心配置:

root@localhost:~# zgrep -E NFS\|IP_PNP /proc/config.gz
CONFIG_IP_PNP=y
CONFIG_IP_PNP_DHCP=y
CONFIG_IP_PNP_BOOTP=y
CONFIG_IP_PNP_RARP=y
CONFIG_NFS_FS=y
CONFIG_NFS_V2=y
CONFIG_NFS_DEF_FILE_IO_SIZE=4096
CONFIG_NFS_V3=y
# CONFIG_NFS_V3_ACL is not set
CONFIG_NFS_V4=y
# CONFIG_NFS_SWAP is not set
# CONFIG_NFS_V4_1 is not set
CONFIG_ROOT_NFS=y
# CONFIG_NFS_USE_LEGACY_DNS is not set
CONFIG_NFS_USE_KERNEL_DNS=y
# CONFIG_NFSD is not set
CONFIG_NFS_COMMON=y

NFS 可以安裝在 linux 中

mount.nfs 204.54.80.195:/yukon /mnt

我可能遺漏了一些明顯的東西。我正在尋找想法和常見錯誤。


更新:

  • nfsrootdebug 核心參數沒有任何作用。
  • 雖然有一個 initrd,但它沒有被使用。絕對不需要使用板載儲存引導。所有必要的驅動程序都編譯到核心中,而不是作為模組。

旁白:我已經確定在 uboot 中使用乙太網會使其在 linux 中無法使用;這是我要解決的另一個錯誤,但我可以避免在 uboot 中使用網路,所以這應該不是問題。

我真的很親近。我需要在 /etc/exports 中啟用 no_root_squash:

/srv/nfs       204.54.0.0/16(rw,fsid=0,insecure,no_subtree_check,async,no_root_squash)
/srv/nfs/yukon 204.54.0.0/16(rw,nohide,insecure,no_subtree_check,async,no_root_squash)

儘管兩者都mount.nfs $serverip:/yukon /mnt有效mount.nfs $serverip:/srv/nfs/yukon /mnt,但我需要 Linux cmdline 的完整路徑:

console=ttyS0,115200 rootwait rw nfsroot=$serverip:/srv/nfs/yukon ip=dhcp root=/dev/nfs

我建議檢查伺服器上的 /etc/exports、/etc/hosts.deny、/etc/hosts.allow 是否允許 dhcp 分配的地址 (204.54.80.37)。

引用自:https://unix.stackexchange.com/questions/204872