NFS挂载那些事

在第一期视频 : 第0课第7节_刚接触开发板之制作根文件系统及初试驱动.wmv ,因为要测试驱动,所以必须要把驱动程序弄到开发板里才行。 于是韦老师介绍了两种方式:

1、 仅用flash上的根文件系统启动后,手工MOUNT NFS

2、 使用NFS作为根文件系统来启动(nfs启动)

视频中只介绍了开发板端uboot参数的设置,并未介绍Ubuntu端 NFS服务器的设置,导致很多学员遇到难以逾越的问题:NFS挂载,从而影响学习进度和热情。此帖就是解决NFS相关的问题。


先介绍:1、仅用flash上的根文件系统启动后,手工MOUNT NFS前提条件

1. 开发板上烧写好文件系统

2. 能正常开机进入Linux系统

3. uboot中启动参数类似: bootargs=noinitrd root=/dev/mtdblock3
init=/linuxrc console=ttySAC0


大概步骤:

1.搭建(下载)、配置和重启NFS服务器

2.ping 通服务器

3.执行挂载命令


先科普2个小知识:NFS是什么?和NFS怎么用?

NFS是什么?

NFS:Network File
System(网络文件系统),NFS只是一种文件系统,本身并没有传输功能,是基于RPC协议实现的,为C/S架构。也就是说,NFS也只是文件系统而已,与jffs2,yaffs,ext4等是一类东西。但是NFS的特殊之处在于,它可以通过网络来挂载,而不用烧写到设备上。这就跟网吧里使用PXE启动来搭建无盘系统一样:每台电脑并没有安装硬盘,而是直接通过PXE启动服务器上的系统,看起来每台电脑都有硬盘,其实都是挂载服务器上的硬盘。


NFS怎么用? 前边已经介绍过,NFS是C/S架构,也就是说,使用NFS需要搭建服务器和客户端。客户端很简单,自带的uboot已经添加了对NFS客户端的支持,我们只需要管NFS服务器。这个服务器其实跟TFTP、Samba、 Ftp服务器是一类的东西,直接在Ubuntu上使用命令安装即可,


下面具体描述步骤:

①先下载NFS服务器(前提是ubuntu未安装NFS,有了只需要重启NFS)

sudo apt-get install nfs-kernel-server




很显然,我已经安装过了,在提供的Ubuntu9.10里也安装过了,继续往下走——–

配置NFS服务器 sudo vi /etc/exports




默认状态下是没有配置的,可以参考给出的例子或者百度决定配置信息 例如,配置成这样:



就是在文件里添加了:

/work/nfs *(rw,sync,no_root_squash)

/var/lib/tftpboot *(rw,sync,no_root_squash)


③然后保存,重启NFS服务器或者Ubuntu(如果不重启,配置不会生效),重启命令如下:

sudo /etc/init.d/nfs-kernel-server restart




简单解释/etc/exports各个参数意义

/work/nfs :允许客户端挂载的目录,可添加任意多个,如果不设置,服务器将不允许客户端挂载。



* :允许所有IP的主机挂载该目录 括号内的 :一些权限设置,比如是否能够读写

现在NFS服务器可以用了。

④. 查看开发板和Ubuntu的IP,设置开发板IP并ping通NFS服务器

开发板ip:

ubuntu ip:



⑤ 把想拷贝到开发板上的文件都复制到刚才设置的目录里,例如拷贝到 /work/nfs,然后在开发板上执行挂载命令

mount -t nfs -o nolock, vers=2 10.0.0.147:/work/nfs /mnt

解释一下:

mount :挂载命令

nfs :使用的协议

nolock :不阻塞

vers : 使用的NFS版本号

IP : NFS服务器的IP(NFS服务器运行在哪个系统上,就是哪个系统的IP)

/work/nfs: 要挂载的目录(Ubuntu的目录)

/mnt : 要挂载到的目录(开发板上的目录,注意挂载成功后,/mnt下原有数据将会被隐藏,无法找到)

现在进入开发板上的/mnt目录,就可以看到Ubuntu上要传输的文件了




测试驱动,测试应用程序都可以在/mnt目录下进行,并且这个/mnt目录也不会占用开发板的Flash空间,很方便。


1、仅用flash上的根文件系统启动,手工MOUNT NFS 介绍完毕 强烈推荐这种方式,因为简单。随时想挂载就挂载,Ubuntu系统即使不开机(前提是ubuntu ip没变)也不影响开发板的启动。而 2、使用NFS作为根文件系统来启动,若Ubuntu未启动或者文件系统有问题,开发板根本无法开机,严重影响体验。

可能遇到的问题



典型的网络不通,检查彼此的IP,保证网络通畅。 很多初学者以为,在uboot状态下设置完IP能ping通Ubuntu那么开发板进入linux后也一定能ping通Ubuntu,这是不对的。两种状态下的IP互不影响,也就是说uboot的IP不会传递给Linux,如果需要使用网络都需要分别设置IP。



解决方法: ①检查要挂载的目录/work/ nfs是否在/etc/exports中声明过,如果没有,没有挂载权限,参考前边的例子添加 在Ubuntu上执行命令 showmount -e 即可查看已经声明过的可被挂载的目录

②检查NFS服务器是否运行 在Ubuntu上执行命令 sudo /etc/init.d/nfs-kernel-server status 即可查看nfsd是否正在运行,如果没有则参考前面的命令使其运行


2、使用NFS作为根文件系统启动

如果仅仅是想要让开发板跟Ubuntu共享文件,那么强烈建议你用前面所提供的方式,因为 2 使用NFS作为根文件系统来启动 比较麻烦,这种启动方式主要用在制作文件系统上。下面详细说明!

视频一开始教大家怎么重烧整个系统,怎么编译uboot,怎么编译内核,就是没有讲怎么制作文件系统。制作文件系统属于进阶内容,被放到了第11节。但是视频中又提前介绍了NFS启动,这就导致很多紧跟视频操作不敢有丝毫遗漏的同学陷入深深苦恼,不可容忍无法在开发板上复现视频中的现象, 有些同学甚至因此放弃嵌入式,我们感到相当可惜。那么为什么需要使用NFS作为根文件系统启动?


开发板运行应用程序,文件系统必不可少,在JZ2440资料光盘里有提供文件系统



参考视频的烧写方法,很容易烧写成功。这个文件系统是怎么制作的?看第11节视频会发现步骤非常多。为避免出错,需要时时观察制作的效果。如果每做一步都用mkyaffs2image制作文件系统映像烧写到开发板上显然效率太低,此时NFS启动的优势就很明显了—–通过NFS启动的方式实时观察文件系统效果。

这就是NFS作为根文件系统启动(NFS启动)的由来和必要性!

NFS启动的前提条件 编译内核和制作文件系统所用的交叉编译器必须相同(如果你用2.6.22.6的内核去挂载毕业班、第三期视频的NFS文件系统,肯定无法挂载)

NFS启动步骤

1.将制作的文件系统放到/work/nfs/jz2440目录下



2. 添加目录/work/nfs/jz2440
到文件 /etc/exports 中,以保证开发板有挂载这个目录的权限



3.重启nfs服务器



4.再次确认刚才设置的目录是否生效



5.查看Ubuntu的IP和开发板的IP,等会设置uboot启动参数时会用到





6.设置uboot启动参数

set bootargs
noinitrd root=/dev/nfs nfsroot=10.0.0.147:/work/nfs/jz2440
ip=10.0.0.10:10.0.0.147:10.0.0.1:255.255.255.0::eth0:off init=/linuxrc
console=ttySAC0

save

常见问题

1.如果文件系统制作的没有问题,那么重启开发板后应当能够进入Linux系统。如果挂载失败,就用光盘里提供的文件系统试试



注意:光盘提供的文件系统中etc/init.d/rcS文件中已经默认添加了设置开发板IP的命令,如果你不需要这个IP或者跟你的网段不同,可以修改以符合自己的需要。光盘里提供的文件系统都是用arm-linux-gcc(3.4.5版本制作的),因此你必须使用2.6.22.6的内核来启动,否则无法挂载文件系统。



2.使用NFS启动你会发现一个问题,如果开发板跟Ubuntu之间的网络不通,那么你的开发板就启动不了。想想也很正常, 客户端跟服务器网络不通是无法登陆的。如果你制作的文件系统经过测试没有任何问题,那就可以制作成yaffs2文件系统烧写到开发板上,不用每次都得打开Ubuntu,插上网线,再启动开发板了。 在第一期视频第0课第7节03:40处有演示,

其实就是将NFS文件系统使用mkyaffs2image工具制作生成yaffs2格式的文件系统。

编辑于 2017-08-16

文章被以下专栏收录