H5板上有提供有线网卡接口,可以在内核启动进入内存文件系统后,再进入网络文件系统。这样比使用sd卡上的文件系统更便于调试开发.
// 在pc上准备好文件系统, 如我已把前面busybox编译得到并已配置好的_install整个目录复制并改名为"/disk3/h5fs"
在pc上配置共享nfs目录, 修改/etc/export文件,增加:
/disk3/h5fs *(rw,sync,insecure,no_root_squash)
//no_root_squash表示板子的用户使用root权限来访问网络文件系统
//insecure 允许跨网段来挂载
保存退出后,重启nfs服务:
service nfs restart //如果报没有nfs服务的错误, 则yum install nfs*
chkconfig nfs on //设开机自启动nfs服务, centOS7上执行需修改/etc/rc.local增加
systemctl start nfs.service
还需要关闭防火墙和selinux:
systemctl disable firewalld.service //关闭防火墙
//关闭selinux
vim /etc/selinux/config
修改第7行: SELINUX=disabled
保存退出
系统重启后生效
//在uboot上配置bootargs环境变量,使用网络文件系统. 如我pc的ip地址为192.168.1.10, 则:
setenv bootargs "root=/dev/nfs nfsroot=192.168.1.10:/disk3/h5fs rw ip=192.168.1.11:192.168.1.10:192.168.1.1:255.255.255.0:jk:eth0:off console=ttyS0,115200"
//ip=开发板ip:主机ip:网关:掩码:开发板的机器名:使用的网卡设备:off
//off表示不自动获取ip, 使用指定的ip地址
//console=ttyS0 通过开发板的第0个uart来调试, 115200波特率
//当板上内核版本较低而pc上的内核版本较高时(pc上系统一般都使用高版本的nfs协议版本了,而板上系统默认使用v2版本就会连不上pc上的nfs服务器),可能还需要在挂载的参数上指定使用nfs服务的第3/4版本通信协议:
nfsroot语句需改成: `nfsroot=192.168.1.10:/disk3/h5fs,proto=tcp,nfsvers=4 rw ...`
//nfs默认是使用udp, 改成tcp会稳定点
环境变量修改完成后, 执行"saveenv"保存环境变量.
重启uboot后应就可以进入网络文件系统了.
如果需要内核启动后不经过内存文件系统后,直接进入网络文件系统,可以设置不使用内存文件系统。在uboot上操作:
setenv bootcmd "fatload mmc 0:1 0x46000000 Image; fatload mmc 0:1 0x48000000 sun50i-h5-nanopi-neo2.dtb; booti 0x46000000 0:0 0x48000000"
setenv bootargs "root=/dev/nfs nfsroot=192.168.1.10:/disk3/h5fs,nfsvers=4,proto=tcp rw ip=192.168.1.11:192.168.1.10:192.168.1.1:255.255.255.0:jk:eth0:off console=ttyS0,115200"
saveenv //保存环境变量后,重启后就可以了
进入文件系统后, 还可以通过"cat /proc/cmdline"查看到内核使用bootargs的具体信息.
//其实板上的initramfs也是通过读取此信息,从而获知下一步是要进入网络文件系统还是进入sd上的文件系统.
当进入网络文件系统失败时需要注意的地方:
1. 确认pc的nfs共享服务是否配置好,可以在另一pc上挂载测试是否可以访问.
2. 确认uboot上的bootargs是否正确, 尤其ip地址这些不可以写错.
也可以在内核启动时的输出信息里,查看"Kernel command line ..."的语句是否正确.
3. 检查网线是否连接,内核启动后,rj45接口正确情况下应有灯亮起.
4. 实在不行,还可以用"wireshark"抓网络数据包来分析,确认是否接收到板的nfs访问的请求, 注意数据包里的错误信息. 为了减少其它网络数据的干扰,可以让板通网线直接连接pc.