前两天收到JZ2440开发板,买了韦东山的几期视频做学习之用,由于windows7下的dnw不太好用,在尝试了tftp下载成功之后,想继续学习一下NFS的挂载功能,方便以后的开发。此次记录是在搭建好的NFS基础之上做的笔记,没有如何搭建NFS的流程。在熟悉NFS之后,自己手动搭建一个NFS,作为补充。
首先备注一下,什么是NFS?
NFS,是Network File System的简写,即网络文件系统。网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS. NFS允许一个系统在网络上与他人共享目录和文件。通过使用NFS,用户和程序可以像访问本地文件一样访问远端系统上的文件。
我的目的是什么?
便于开发,免去内核下载时间。直接从服务器上编写,编译代码,挂载到单板上执行,方便快捷。
废话不说了。
NFS有两种挂载方式
1.从flash上电之后手动挂载
2.从NFS启动挂载
先说第一种:上电之后从flash挂载。
首先要挂在一个根文件系统,那么首先服务器要允许那个目录可被别人挂载,这是权限问题,配置文件是/etc/exports/
设置允许挂载的目录为 /work/nfs_root/first_fs/
执行:
cd /work/nfs_root/first_fs/
sudo vi /etc/exports
添加如下代码
/work/nfs_root/first_fs *(rw,sync,no_root_squash) #允许挂载的目录 权限设置,同步
保存退出之后
重启NFS服务,执行:
sudo /etc/init.d/nfs-kernel-server restart
测试服务器是否能挂载,自己挂载自己 ,如下
sudo mount -t nfs 192.168.0.108:/work/nfs_root/first_fs /mnt #把目录挂载到mnt目录下
测试通过之后,说明服务器/work/nfs_root/first_fs 目录已经允许别人来挂载了
接下来继续测试 单板挂载,进入开发板,CRT终端。首先创建一个mnt目录,执行
mkdir /mnt #创建挂载目录
然后挂载
sudo mount -t nfs -o nfs 192.168.0.199:/work/nfs_root/first_fs /mnt #把服务器上的/work/nfs_root/first_fs 挂载到开发板的mnt目录下
ls #查看目录
此刻看到的就是服务器上的/work/nfs_root/first_fs 目录。
第二种从NFS启动,如下重启开发板
reboot
进入uboot之后,执行print,可看到如下代码:
bootargs=noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
其中root=/dev/mtdblock3就告诉我们系统从/dev/mtdblock3启动,
如果我们把该目录改成NFS,则可达到我们的要求,需要设置服务器IP,需要挂载的目录,自己的IP(通过它可以访问服务器)。
具体格式,通过查看源码,搜索内核关键字【 nfsroot 】或者查看Documentation/nfsroot.txt 可找到如下说明
nfsroot=[server-ip>:]<root-dir>,[<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf> init=/linuxrc console=ttySAC0
好了,中括号表示的可以省略,尖括号表示的不可省略,接下来按照格式填充需要的数据,如下:
nfsroot=192.168.0.108:/work/nfs_root/first_fs ip=192.168.0.199:192.168.0.108:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
在CRT终端执行:
set bootargs nfsroot=192.168.0.108:/work/nfs_root/first_fs ip=192.168.0.199:192.168.0.108:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
设置成功之后,启动,执行如下命令:
boot
可看到如下画面,ls 指令显示的就是服务器的目录
还没完呢,接下来,做一个简单的测试,在服务器的目录下写一个简单的hello.c文件,编译好生成一个hello可执行文件之后,
arm-linux-gcc -o hello hello.c
进入开发板的mnt目录下,执行ls命令,可以看到编译好的hello文件,直接./hello,可以看到文件被正确执行了
至此,告一段落,后续自行搭建一个开发环境再把NFS服务的安装流程补上。
补充一下从NFS启动的参数与格式:
#启动目录格式与参数
noinitrd root=/dev/mtdblock3 init=/linuxrc console=ttySAC0
#NFS设置格式
nfsroot=[server-ip>:]<root-dir>,[<nfs-options>] ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf> init=/linuxrc console=ttySAC0
#修改启动目录
noinitrd root=/dev/nfs init=/linuxrc console=ttySAC0
#设置NFS挂载参数
nfsroot=192.168.0.108:/work/nfs_root/first_fs ip=192.168.0.199:192.168.0.108:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0
#设置启动挂载NFS命令
set bootargs nfsroot=192.168.0.108:/work/nfs_root/first_fs ip=192.168.0.199:192.168.0.108:192.168.0.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC0