这是一个具有自定义内核的嵌入式设备(相关配置见下文)。这是一台 x86-32 机器,启动方式如下:coreboot->uboot->linux。如果我使用板载存储作为 rootfs,我可以在 Linux 中挂载 NFS 共享。我非常确定 linux 在启动时正确地自动配置网络ip=dhcp
(注意:这是使用网络的 DHCP 服务器;它只是分发 IP 地址,与 BOOTP 或类似的东西无关)。我还尝试使用 明确设置参数ip=
,结果与 相同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 中使用网络,所以这不应该成为问题。
答案1
我真的很接近。我需要在 /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
答案2
我建议检查服务器上的 /etc/exports、/etc/hosts.deny、/etc/hosts.allow 以查看是否允许 dhcp 分配的地址 (204.54.80.37)。