分类: 嵌入式
2015-09-01 11:24:51
NFS分服务器和客户机,当使用远端文件时只要用mount命令就可把远端NFS服务器上的文件系统挂载在本地文件系统之下,操作远程文件与操作本地文件没有不同。NFS服务器所共享文件或目录记录在/etc/exports文件中。(服务器和目标机都运行linux系统)
嵌入式Linux开发中,会经常使用NFS,目标系统通常作为NFS客户机使用,Linux主机作为NFS服务器。在目标系统上通过 NFS,将服务器的NFS共享目录挂载到本地,可以直接运行服务器上的文件。在调试系统驱动模块以及应用程序,NFS都是十分必要的,并且Linux还支 持NFS根文件系统,能直接从远程NFS root启动系统,这对嵌入式Linux根文件系统裁剪和集成也是十分有必要的。
安装nfs-kernel-server:
ky@ubuntu:~$ sudo apt-get install nfs-kernel-server
设置NFS-Server目录。修改/etc/exports文件,在其中增加NFS服务器目录。 一个NFS服务器可以共享多个NFS目录,在/etc/exports文件中,每个目录的设置独占一行,编写格式如下:
NFS共享目录路径 客户机IP或者名称(参数1,参数2,...,参数n)
说明:
q NFS共享目录可以是主机的任何一个目录,为了方便使用,最好将权限设置为777。
q 客户机指的是可以访问共享目录的客户机的IP或者主机名,可以是指定的IP或者主机名。如果使用IP,可以使用通配符。假如指定IP为192.168.1.x的客户机可以访问,可以写成192.168.1.*,如果设置为*,则表示任何客户机都可以访问。
q 访问参数可以是一个,也可以是多个,用逗号分开。(最下面表格列出所有可选参数)
假定NFS共享目录是/home/ky/nfs,允许所有客户机访问,/etc/exports文件可写为:
/home/ky/nfs *(rw,sync,no_subtree_check, no_root_squash)
启动NFS服务器。启动portmap(如果有必要)和nfs-kernel-server服务:
ky@ubuntu:~$ sudo service portmap start
ky@ubuntu:~$ sudo service nfs-kernel-server start
本地验证NFS服务器。将NFS服务器目录挂载到本机另外一个目录下,可以看到挂载点目录下可以看到NFS服务器目录中的文件。
ky@ubuntu:~$ ls /home/ky/nfs/
aaaa
ky@ubuntu:~$ sudo mount -t nfs 127.0.0.1:/home/ky/nfs /mnt
ke@ubuntu:~$ ls /mnt
aaaa
ky@ubuntu:~$ sudo umount /mnt/
用开发板验证NFS服务器是否可用。
1. 开发板上已经安装有linux内核的情况
启动开发板,进入系统,配置好开发板的IP地址后,用mount命令挂载NFS服务器的NFS目录:
target# mount -t nfs 192.168.1.3:/home/ky/nfs /mnt -o nolock
target# ls /mnt
kingyee
target# umount /mnt/
挂载成功后,可以在开发板的/mnt目录下看到NFS服务器上的文件。
说明,使用开发板与虚拟机安装的客户系统进行NFS挂载,需要将虚拟网卡设置为Bridged模式,并建议使用静态IP地址。
2. 开发板的nandflash中只有bootloader(uboot)
mount 命令在此时是没有用的,因为uboot提供的命令比较少, 所以必须先在开发板上烧写linux内核(uImage),才能运行mount ,然而linux内核必须运行在文件系统之下。由于我们之前已经构建了NFS服务器,因此可以构建一个linux无盘工作站,将linux内核运行在主机中建立的文件系统之下。
开发板在没有挂载主机文件的时候,可以使用tftp传输文件到SDRAM中(关于tftp服务器构建,可参考: http://blog.chinaunix.net/uid-30379893-id-5174755.html)。
对于6410开发板,输入:
tftp 50008000 uImage 将文件放入到内存中
然后设置环境变量bootargs
setenv bootargs console=ttySAC0 root=/dev/nfs nfsroot=192.168.1.30:/arm/rootfs ip=192.168.1.130
接着就可以烧写内核到nand flash 中
bootm 5008000 uImage
烧写成功后,开发板上就有了linux系统,接下来的操作同步骤1相同。
如果在使用中需要增加新的NFS共享目录,直接修改/etc/exports文件即可。修改该文件后,可以不用重启NFS服务,用exportfs命令读取/etc/exports文件,重新共享输出。exportfs命令语法如下:
exportfs [-aruv]
选项说明:
-a:全部挂载(或卸载) /etc/exports的设置;
-r:重新挂载/etc/exports的设置;
-u:卸载某一个目录;
-v:在输出的时候,把共享目录显示出来。
如果NFS已经启动,修改了/etc/exports文件,执行如下命令,新的设置即可生效:
ky@ubuntu:~$ exportfs -ra
参数 |
说明 |
ro |
只读访问 |
rw |
读写访问 |
sync |
所有数据在请求时写入共享 |
async |
nfs在写入数据前可以响应请求 |
secure |
nfs通过1024以下的安全TCP/IP端口发送 |
insecure |
nfs通过1024以上的端口发送 |
wdelay |
如果多个用户要写入nfs目录,则归组写入(默认) |
no_wdelay |
如果多个用户要写入nfs目录,则立即写入,当使用async时,无需此设置 |
hide |
在nfs共享目录中不共享其子目录 |
no_hide |
共享nfs目录的子目录 |
subtree_check |
如果共享/usr/bin之类的子目录时,强制nfs检查父目录的权限(默认) |
no_subtree_check |
不检查父目录权限 |
all_squash |
共享文件的UID和GID映射匿名用户anonymous,适合公用目录 |
no_all_squash |
保留共享文件的UID和GID(默认) |
root_squash |
root用户的所有请求映射成如anonymous用户一样的权限(默认) |
no_root_squash |
root用户具有根目录的完全管理访问权限 |
anonuid=xxx |
指定nfs服务器/etc/passwd文件中匿名用户的UID |
anongid=xxx |
指定nfs服务器/etc/passwd文件中匿名用户的GID |