本帖最后由 kenson 于 2017-3-16 22:25 编辑 + V0 ?& S4 I; o
: B, m }2 [3 t. Y0 w# n9 ]8 e
1 U4 v5 m3 t& V
1.1 搭建NFS服务器0 P4 D9 n# K& p# Y9 F, o0 w5 y1 \
NFS(Network FileSystem,网络文件系统)是由SUN公司发展,并于1984年推出的技术,用于在不同机器,不同操作系统之间通过网络互相分享各自的文件。NFS设计之初就是为了在不同的系统间使用,所以它的通讯协议设计与主机及操作系统无关。
2 b' U6 m. J' q1 ~7 R8 QNFS分服务器和客户机,当使用远端文件时只要用mount命令就可把远端NFS服务器上的文件系统挂载在本地文件系统之下,操作远程文件与操作本地文件没有不同。NFS服务器所共享文件或目录记录在/etc/exports文件中。. c) r4 J- f; i- \8 o- r+ u. j( S
嵌入式Linux开发中,会经常使用NFS,目标系统通常作为NFS客户机使用,Linux主机作为NFS服务器。在目标系统上通过NFS,将服务器的NFS共享目录挂载到本地,可以直接运行服务器上的文件。在调试系统驱动模块以及应用程序,NFS都是十分必要的,并且Linux还支持NFS根文件系统,能直接从远程NFS root启动系统,这对嵌入式Linux根文件系统裁剪和集成也是十分有必要的。! U" {0 x" ~& R+ h% F
安装nfs-kernel-server:9 M" `) f! z G$ ^9 A! ]: Z
ky@ubuntu:~$ sudo apt-get install nfs-kernel-server 设置NFS-Server目录。修改/etc/exports文件,在其中增加NFS服务器目录。 一个NFS服务器可以共享多个NFS目录,在/etc/exports文件中,每个目录的设置独占一行,编写格式如下:9 W: L+ P; f$ ]1 Z1 ^8 e2 B4 d
NFS共享目录路径 客户机IP或者名称(参数1,参数2,...,参数n) 说明:4 H4 N. {- C: B" r1 p, v
q NFS共享目录可以是主机的任何一个目录,为了方便使用,最好将权限设置为777。 q 客户机指的是可以访问共享目录的客户机的IP或者主机名,可以是指定的IP或者主机名。如果使用IP,可以使用通配符。假如指定IP为192.168.1.x的客户机可以访问,可以写成192.168.1.*,如果设置为*,则表示任何客户机都可以访问。 q 访问参数可以是一个,也可以是多个,用逗号分开。可能的参数和说明如表 5.1所列。, F3 u$ _, a9 G, K3 v
NFS设置参数和说明
+ N# s8 j3 f6 {' C: k 参数 | 说明 | 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 | % |. A! Z$ _& @0 R& W) M: N+ `
假定NFS共享目录是/home/ky/nfs,允许所有客户机访问,/etc/exports文件可写为:, V2 N0 y- I* @$ B! J) {+ @6 F
/home/ky/nfs *(rw,sync,no_subtree_check, no_root_squash) 启动NFS服务器。启动portmap(如果有必要)和nfs-kernel-server服务:
8 u+ z% o; ]; n$ Y( p0 q5 `3 x( Mky@ubuntu:~$ sudo service portmap start ky@ubuntu:~$ sudo service nfs-kernel-server start 本地验证NFS服务器。将NFS服务器目录挂载到本机另外一个目录下,可以看到挂载点目录下可以看到NFS服务器目录中的文件。+ \/ a" z+ a& T [( e2 H- W
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服务器是否可用。启动开发板,进入系统,配置好开发板的IP地址后,用mount命令挂载NFS服务器的NFS目录:
7 G, Z) z: G1 K8 m; f; }target# mount -t nfs 192.168.1.3:/home/ky/nfs /mnt -o nolock target# ls /mnt kingyee target# umount /mnt/ 挂载成功后,可以在开发板的/mnt目录下看到NFS服务器上的文件。- |3 S+ x, v8 K- s) h9 b7 L
说明,使用开发板与虚拟机安装的客户系统进行NFS挂载,需要将虚拟网卡设置为Bridged模式,并建议使用静态IP地址。3 X _0 v9 F$ K/ q. `, [* X
如果在使用中需要增加新的NFS共享目录,直接修改/etc/exports文件即可。修改该文件后,可以不用重启NFS服务,用exportfs命令读取/etc/exports文件,重新共享输出。exportfs命令语法如下:5 J. e$ X. c* d e: b. _& y/ I" t8 W
exportfs [-aruv] 选项说明:
6 R) R# G8 V3 G Y3 K" k9 j. ?-a:全部挂载(或卸载) /etc/exports的设置;
1 P% D' W/ p8 Z* {% I' t-r:重新挂载/etc/exports的设置;
* Y$ ?2 H1 j$ E3 C/ b( O-u:卸载某一个目录;# r' \4 u3 c7 ^- h8 E
-v:在输出的时候,把共享目录显示出来。# e7 d- {1 ^7 q. A* ]/ e
如果NFS已经启动,修改了/etc/exports文件,执行如下命令,新的设置即可生效:
5 E9 f7 ~1 N8 ]# R+ Mky@ubuntu:~$ exportfs -ra 5 b! Z: q% S8 N; K3 \
6 S7 f' t9 I4 J% a4 r |