以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。
一、NFS简介
网络文件系统(NFS,network file system),是一种网络通讯协议,由服务器和客户端构成。利用NFS协议可以做出很多直接性应用,但这里使用NFS主要是做rootfs挂载。
关于NFS的更多内容,见博客Linux中NFS服务器的配置。
我们在虚拟机ubuntu中搭建NFS服务器,在开发板中运行kernel作NFS客户端(kernel要配置成支持NFS客户端),然后将文件夹形式的rootfs复制到NFS服务器的NFS共享目录(指定的共享目录由bootargs这个环境变量中的nfsroot指定),在客户端中挂载rootfs,进而启动系统。
二、以NFS方式挂载rootfs的步骤
步骤1:在虚拟机上搭建nfs服务器、tftp服务器。
搭建方法见环境搭建文档。这里假定tftp服务器的工作目录是/tftp。
步骤2:设置uboot的相关环境变量。
【1】在uboot控制台中修改bootargs这个环境变量并保存,如下所示:
set bootargs 'root=/dev/nfs nfsroot=192.168.1.141:/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh ip=192.168.1.88:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200'
save
【2】在uboot控制台中修改bootcmd这个环境变量并保存,如下所示:
set bootcmd 'tftp 30008000 zImage;bootm 30008000'
save
步骤3:配置内核以支持NFS启动方式。
此时启动开发板,会提示如下错误并导致重新启动,因为没有配置内核以支持NFS启动方式。
[ 2.955474] VFS: Cannot open root device "nfs" or unknown-block(0,255)
[ 2.960598] Please append a correct "root=" boot option; here are the available partitions:
[ 2.968943] b300 3817472 mmcblk0 driver: mmcblk
[ 2.974101] b301 264759 mmcblk0p1
[ 2.978347] b302 264759 mmcblk0p2
[ 2.982610] b303 104412 mmcblk0p3
[ 2.986838] b304 3158463 mmcblk0p4
[ 2.991086] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,255)
【1】在内核配置阶段,即“make menuconfig”时配置支持nfs启动方式。
#配置网络部分(使能CONFIG_IP_PNP,使得出现“Root file system on NFS”选项)
Networking support
Networking options
[*] TCP/IP networking
[*] IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
#配置开启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
【2】重新编译,将生成的arch/arm/boot/zImage拷贝到/tftp目录,重启开发板。
如果提示下面问题:
[ 4.548616] Root-NFS: Server returned error -13 while mounting
/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh
[ 4.557099] VFS: Unable to mount root fs via NFS, trying floppy.
[ 4.563317] VFS: Cannot open root device "nfs" or unknown-block(2,0)
则在虚拟机的配置文件/etc/exports中追加如下内容:
#NFS服务器里你想分享的目录的路径 可接入NFS服务器的主机名字或者IP(参数1,,2,3…)
/home/xjh/iot/embedded_basic/rootfs/rootfs_xjh *(rw,sync,no_root_squash,no_subtree_check)
然后重启NFS服务:
sudo /etc/init.d/nfs-kernel-server restart
步骤4:重启开发板,则会到tftp服务器中下载内核,然后再到nfs服务器中下载rootfs。
如果rootfs是可用的,那么就会启动成功;如果rootfs是不可用的,那么会提示下面的错误。
由上可知,NFS方式启动,相当于开发板上的内核远程挂载主机上的rootfs。另外NFS方式启动不用制作rootfs镜像,但NFS不适合真正的产品,一般作为产品开发阶段调试使用。