Wandboard 的 NFS rootfs

NFS rootfs for Wandboard

第一次接触Uboot和串口。我正在尝试将我的 /nfsroot 从我的 ubuntu 主机挂载到 wandboard 目标,以便我可以在内核中使用 TFTP 和 NFS 作为 rootfs 启动该板。

时常出现错误,但不知道它们是什么意思。

请指教

这是完整的Error Log,root=/dev/nfs

这是我在尝试将 nfs 挂载到我的 SDCard 分区之一 (mmcblk2p2) 时遇到的错误。根=/dev/mmcblk2p2

已挂载但随后出现 devtmpfs return 挂载错误 -2。

EXT3-fs (mmcblk2p2): error: couldn't mount because of unsupported optional features (240)
EXT2-fs (mmcblk2p2): error: couldn't mount because of unsupported optional features (244)
EXT4-fs (mmcblk2p2): recovery complete
EXT4-fs (mmcblk2p2): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) on device 179:2.
devtmpfs: error mounting -2
Freeing unused kernel memory: 328K (80d22000 - 80d74000)
Failed to execute /sbin/init (error -2).  Attempting defaults...
Kernel panic - not syncing: No working init found.  Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
CPU1: stopping

这是我的 printenv

=> printenv
baudrate=115200
boot_fdt=try
bootargs=console=ttymxc0,115200 root=/dev/mmcblk0p2 rw nfsroot=192.168.0.227:/nfsroot,v3,tcp
bootcmd=mmc dev ${mmcdev}; if mmc rescan; then if run loadbootscript; then run bootscript; else if run loadimage; then run mmcboot; else run netboot; fi; fi; else run netboot; fi
bootdelay=5
bootfile=zImage-wandboard-quad.bin
bootscript=echo Running bootscript from mmc ...; source
console=ttymxc0
ethact=FEC
ethaddr=00:1f:7b:b4:14:ce
ethprime=FEC
fdt_addr=0x18000000
fdt_file=zImage-imx6q-wandboard.dtb
fdt_high=0xffffffff
get_cmd=dhcp
image=zImage-wandboard-quad.bin
initrd_high=0xffffffff
ip_dyn=yes
loadaddr=0x12000000
loadbootscript=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${script};
loadfdt=fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr} ${fdt_file}
loadimage=fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image}
mmcargs=setenv bootargs console=${console},${baudrate} root=${mmcroot}; run videoargs
mmcboot=echo Booting from mmc ...; run mmcargs; if test ${boot_fdt} = yes || test ${boot_fdt} = try; then if run loadfdt; then bootz ${loadaddr} - ${fdt_addr}; else if test ${boot_fdt} = try; then bootz; e;
mmcdev=0
mmcpart=1
mmcroot=/dev/mmcblk2p2 rootwait rw
netargs=setenv bootargs console=${console},${baudrate} ${smp} root=/dev/mmcblk2p2 rw ip={ipaddr} nfsroot=${serverip}:${nfsroot},v3,tcp init=/sbin/init
netboot=echo Booting from net ...; run netargs; if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; ${get_cmd} ${image}; if test ${boot_fdt} = yes || test ${boot_fdt} = try; th;
nfsroot=/nfsroot
script=boot.scr
serverip=192.168.0.227
splashpos=m,m
update_sd_firmware=if test ${ip_dyn} = yes; then setenv get_cmd dhcp; else setenv get_cmd tftp; fi; if mmc dev ${mmcdev}; then if ${get_cmd} ${update_sd_firmware_filename}; then setexpr fw_sz ${filesize} /i
update_sd_firmware_filename=u-boot.imx
videoargs=setenv nextcon 0; if hdmidet; then setenv bootargs ${bootargs} video=mxcfb${nextcon}:dev=hdmi,1280x720M@60,if=RGB24; setenv fbmen fbmem=28M; setexpr nextcon ${nextcon} + 1; else echo - no HDMI mo}

Environment size: 2810/8188 bytes

在主机上(Ubuntu):

  • sudo apt-get install nfs-kernel-server
  • sudo mkdir /nfsroot
  • /nfsroot目录添加到/etc/exports文件中:

    /nfsroot    *(rw,sync,no_root_squash)
    
  • sudo /etc/init.d/nfs-common startsudo /etc/init.d/nfs-kernel-server start

在目标上(魔杖板):

  • Root filesystem on NFS 必须在编译内核时启用(希望是,否则你需要重新编译 Linux 内核)
  • root=/dev/nfs rw ip=target_IP nfsroot=NFS_server_IP>:/nfsroot/添加到U-Boot的bootargs变量,其中target_IP是目标的静态IP地址,NFS_server_IP是主机IP地址。

原来是我从DHCP获取IP后需要设置客户端IP参数。我以为 DHCP 会处理网络启动参数的所有 IP 配置,但我错了;

setenv ip 192.168.0.172:192.168.0.227::::eth0:on

setenv ipaddr 192.168.0.172

setenv netargs 'setenv bootargs console=${console},${baudrate} ${smp} root=/dev/nfs ip=${ipaddr} nfsroot=${serverip}:${nfsroot},v3,tcp'