解决Windows无法NFS启动imx6ull开发板的问题
问题:有时候我们需要将Linux虚拟机里的文件复制到Windows里,并在Windows上通过haneWIN NFS server启动imx6ull开发板。这时尽管在haneWIN NFS server里设置了exec权限,但仍然无法网络启动,并报Starting init: /sbin/init exists but couldn’t execute it (error -8)
的错误,这时我们只能使用必杀技,将环境变量设置为:
setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
并在本地启动的文件系统里mount要使用的文件夹,使用如下命令即可:
ifconfig eth0 172.168.40.47 netmask 255.255.255.0
mount -o nolock 172.168.40.85:/server/rootfs /FileDir/
另外需要说明的是,我使用的是网线直通电脑Windows10,也正是因为如此,才需要这么做。如果用USB转网口,可以将USB网口直接连接到虚拟机上,不会遇到上面的问题。
下面是详细的设置过程:
一、 遇到的问题:
使用如下uboot环境变量可以通过nfs把内核和设备树拉到开发板上,但文件系统会报错。
setenv ipaddr 172.168.40.47
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 172.168.40.1
setenv netmask 255.255.255.0
setenv serverip 172.168.40.85
setenv bootcmd ‘nfs 80800000 172.168.40.85:/server/zImage;nfs 83000000 172.168.40.85:/server/imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000’
setenv bootargs ‘console=ttymxc0,115200 root=/dev/nfs nfsroot=172.168.40.85:/server/rootfs,proto=tcp rw ip=172.168.40.47:172.168.40.85:172.168.40.1:255.255.255.0::eth0:off’
saveenv
文件系统报错如下:
VFS: Mounted root (nfs filesystem) on device 0:14.
[ 7.584425] devtmpfs: mounted
[ 7.588105] Freeing unused kernel memory: 520K (80b42000 - 80bc4000)
[ 7.597801] Starting init: /sbin/init exists but couldn’t execute it (error -8)
[ 7.610921] Starting init: /bin/sh exists but couldn’t execute it (error -8)
[ 7.618173] Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
[ 7.631317] —[ end Kernel panic - not syncing: No working init found. Try passing init= option to kernel. See Linux Documentation/init.txt for guidance.
问题似乎是文件系统里的文件无法执行,使用uboot的bootargs环境变量无法得到rootfs里面的文件的可执行权限,只能在本地启动的文件系统里使用mount命令。这样在mount上去的文件夹里的文件才具有可执行权限。详细解决过程如下:
二、 解决办法
1、
首先介绍haneWIN NFS server的设置过程,我使用的是1.2.64版本的,通过hane官网可下载。
设置都为默认值,除了exports。
HaneWIN NFS server运行时需要将360安全卫士完全关闭,Windows防火墙也要关闭,否则内核和设备树都拉不下来。
2、第二步:将uboot的环境变量设置为如下:
setenv ipaddr 172.168.40.47
setenv ethaddr 00:04:9f:04:d2:35
setenv gatewayip 172.168.40.1
setenv netmask 255.255.255.0
setenv serverip 172.168.40.85
setenv bootcmd ‘nfs 80800000 172.168.40.85:/server/zImage;nfs 83000000 172.168.40.85:/server/imx6ull-alientek-emmc.dtb;bootz 80800000 - 83000000’
setenv bootargs ‘console=ttymxc0,115200 root=/dev/mmcblk1p2 rootwait rw’
saveenv
也就是用nfs更新内核和设备树。文件系统不使用nfs,使用mount的方式将文件从虚拟机里的文件拷到Windows中,这样mount 后的文件夹中的文件才具有可执行权限。
3、第三步:mount的命令
ifconfig eth0 172.168.40.47 netmask 255.255.255.0
sleep 5
mount -o nolock 172.168.40.85:/server/rootfs /FileDir/
可以将上面三句话放到开机自启动的脚本里,开机自动mount。
可以从上图看到从Linux虚拟机里复制到Windows中的文件已经变绿了,可以执行。其中/FileDir/和Windows中的D:\linux\nfs\rootfs文件夹等价,要更新文件到开发板上执行,复制到D:\linux\nfs\rootfs文件夹中即可。在HaneWIN NFS中需要设置-exec权限才可以使mount到的文件夹中的文件具有可执行能力。如下:
D:\linux\nfs\rootfs -alldirs -public -range 172.168.40.1 172.168.40.250
D:\linux\nfs -name:server -alldirs -range -public -exec 172.168.40.1 172.168.40.250
三、 总结
这种方法适用于想要用开发板通过单根网线连接电脑的方式,当然完全可以使用USB转网口设备并将它连接到虚拟机中。对于想要只用网线插电脑的或许有些帮助,感兴趣的可以学学,挺有意思的。