通常linux内核是从EMMC/NAND中获取根文件系统并加载,但是在调试NFS更加方便。自己动手做了一遍,分享方法给大家。
感性思维:
修改uboot的环境变量中的启动参数,在linux内核启动时,告诉内核根文件系统在NFS上,让去NFS上找,并且设置好了IP地址。
而虚拟机的NFS服务器上,放着解压好的根文件系统,这样linux就可以从NFS上获取到根文件系统了
一、材料和环境准备:
MIR IMX6ULL IOT硬件开发板。
core-image-base-mys6ull14x14.rootfs.tar.bz2------这个是MIR提供的根文件系统,已经做好,如果想学习如何制作请看官方文档。
MYS-6ULX-LinuxDevelopmentGuide_zh.pdf-------这个是MIR提供的文档,烧写方式很详细,需要烧写的文件是何种配置也有解释。
首先
1、根据官方的教程,用从NAND启动的方式,启动linux系统。
2、保证虚拟机-物理机-开发板三者之间能够ping通
3、在Ubuntu上搭建NFS服务器,测试Ubuntu本地挂载NFS服务器
4、第3步成功后,测试在开发板上,挂载NFS文件系统。注意这一步不是挂载根文件系统,是一种类似winodws下访问本地网盘的操作。将Ubuntu上NFS文件夹挂载到开发板的文件目录下,让开发板可以直接访问Ubuntu上的文件。
5、将core-image-base-mys6ull14x14.rootfs.tar.bz2 解压后的文件放置在NFS的目录下。
到这一步,就先确保了:
硬件网络没问题—ping通
NFS服务器没问题—能访问
根文件系统准备完成
二、内核配置
内核配置
首先加载MIR的配置
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- mys_imx6_defconfig
然后对其进行小修改
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
“Networking support”→
“Networking options”→
[*] “IP: kernel level autoconfiguration”
“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 version4”
[*]“NFS client support for NFSv4.1”
[*]“Root file system on NFS”
<*> Packet socket
< > Packet: sockets monitoring interface
<*> Unix domain sockets
< > UNIX: socket monitoring interface
< > Transformation user configuration interface
[ ] Transformation sub policy support
[ ] Transformation migrate database
[ ] Transformation statistics
< > PF_KEY sockets
[*] TCP/IP networking
[*] IP: multicasting
[ ] IP: advanced router
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
[*] IP: RARP support
配置好内核后编译
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j4 zImage dtbs modules
烧写方式按照MIR官方的MSFtool方式进行,用此次编译出的内核,dtb替换掉原文件即可。文件名对照见官方文档。
三、uboot配置
setenv ipaddr 192.168.0.4 //设置开发板本地IP地址
setenv ethaddr 9e:d6:2c:ba:5e:b2
setenv gatewayip 192.168.0.1
setenv netmask 255.255.255.0
setenv serverip 192.168.0.2 //装好NFS的虚拟机的IP地址
setenv nfsroot /NFS
setenv bootargs noinitrd root=/dev/nfs rw nfsroot=192.168.0.2:/NFS_Folder rw,proto=tcp ip=192.168.0.4:192.168.0.2:192.168.0.1:255.255.255.0::eth0:off console=ttymxc0,115200
saveenv //根据自定义的本地IP地址和NFS虚拟机地址修改这条中的IP即可,注意格式保持一致。
硬件重启或软件重启即可。
KEY LOG:
VFS: Mounted root (nfs filesystem) on device 0:14. //注意nfs filesystem,如果不是这个,可能是从nand启动了
devtmpfs: mounted
Freeing unused kernel memory: 432K (80b3a000 - 80ba6000)
INIT: version 2.88 booting
nfs: server 192.168.0.2 not responding, still trying
nfs: server 192.168.0.2 OK
错误问题
Kernel panic - not syncing: Requested init /linuxrc failed (error -2).-----------------这个是我受到其他教程的干扰,写错指令造成的,查看自己的uboot设置,有没有这个配置项init /linuxrc,删去
一定先测试好NFS服务器本身没问题,能够挂载文件系统,再尝试挂载根文件系统。