米尔IMX6UL-IOT 从NFS加载根文件系统启动

通常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服务器本身没问题,能够挂载文件系统,再尝试挂载根文件系统。

你可能感兴趣的:(uboot,内核,文件系统)