主机:win10 IP:192.168.1.10 开发板:九鼎X210BV3S IP:192.168.1.20 虚拟机:ubuntu16.04-x64 IP:192.168.1.30

本文目标是将开发板的内核通过nfs远程挂载到虚拟机ubuntu上的rootfs,nfs挂载方式主要用于开发阶段调试使用,真正的产品需要烧录rootfs镜像文件。


一、ubuntu配置NFS服务器


二、配置kernel

配置内核以支持nfs方式挂载rootfs。方法是在ubuntu中进入内核的根文件目录,执行 make menuconfig 命令,进行如下配置:
1、配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system on NFS选项。

Networking support 
	Networking options 
		TCP/IP networking
				IP: kernel level autoconfiguration
					[*] IP: DHCP support
					[*] IP: BOOTP support

2、配置开启nfs服务。

File systems  --->	
	Network File Systems  --->
		<*> NFS client support 
		[*] NFS client support for NFS version 3                                  
		[*] NFS client support for the NFSv3 ACL protocol extension 
		[*] NFS client support for NFS version 4 (EXPERIMENTAL) 
		[*] NFS client support for NFSv4.1 (DEVELOPER ONLY) 
		[*] Root file system on NFS

配置好之后,make编译,最后将生成的zImage镜像文件复制粘贴到tftp的传输目录。tftp要确保可以用才能做接下来的工作,tftp安装方法点这里。
我的命令是:cp /root/kernel_x210/arch/arm/boot/zImage /tftpboot/ -f


三、配置uboot启动参数

进入uboot之后,执行命令:

set bootargs root=/dev/nfs nfsroot=192.168.1.30:/root/rootfs_zht/rootfs ip=192.168.1.20:192.168.1.30:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
save # 保存到flash,否则断电后配置丢失

参数解释:

/dev/nfs:对应内核中配置,不需要更改
192.168.1.30:ubuntu的IP
/root/rootfs_zht/rootfs:nfs服务器的共享目录
192.168.1.20:开发板uboot的IP
eth0:以太网卡0,不需要更改
ttySAC2,115200:控制台对应串口2,波特率115200

一开始我以为eth0对应ubuntu的网卡接口,ubuntu16的以太网卡名称为ens33,我就改成了ens33,后来启动的时候根文件系统都挂载不上!后知后觉,uboot是给kernel传参,和ubuntu无关系的,ubuntu是通过nfs和kernel紧密联系的!所以uboot这里eth0不要改就完事了。


四、开发板挂载rootfs


win10没有nfs功能_win10没有nfs功能

开发板启动后进入uboot,tftp下载内核镜像到内存的30008000地址处,然后bootm启动内核,命令如下:

进入uboot后手动下载:
tftp 30008000 zImage
bootm 30008000

或者设置uboot中的环境变量,实现自动下载:
set bootcmd 'tftp 30008000 zImage; bootm 30008000'

或者制作成镜像烧录到emmc,省得每次都要从ubuntu中获取。

镜像格式用来烧录根文件系统 set bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
set bootcmd ‘movi read kernel 30008000; movi read rootfs 30B00000 300000; bootm 30008000 30B00000’
tftp-nfs方式启动bootargs和bootcmd set bootargs root=/dev/nfs nfsroot=192.168.1.30:/root/rootfs_zht/rootfs ip=192.168.1.20:192.168.1.30:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
set bootcmd ‘tftp 30008000 zImage; bootm 30008000’

可以看到rootfs已经成功挂载了并且可以运行,提示的一些警告信息属于rootfs的问题,rootfs是需要不断完善的。

win10没有nfs功能_busybox_02


参考资料:

  • 朱老师物联网大讲堂