NFS 用于 Linux 主机访问网络中其他 Linux 主机上的共享资源。 NFS 的原理是在客户端上通过网络将远程主机共享文件系统以挂载 (Mount) 的方式加入本机的文件系统,之后的操作就如同在本机上一样。
NFS 服务器 ( 宿主机 )
1. 安装NFS
Ubuntu 上默认是没有安装 NFS 服务器的,首先要安装 NFS 服务程序:
1
2 1$ sudo apt-get install nfs-kernel-server
2
( 安装 nfs-kernel-server 时, apt 会自动安装 nfs-common 和 portmap )
这样,宿主机就相当于 NFS Server 。
2. 配置 NFS
1) 配置 portmap
方法 1:
编辑 /etc/default/portmap, 将 -i 127.0.0.1 去掉 .
方法 2:
1
2 1$ sudo dpkg-reconfigure portmap
2
对 Should portmap be bound to the loopback address? 选 N.
2) 配置 /etc/hosts.deny
1
2 1$ sudo gedit /etc/hosts.deny
2
(禁止任何 host (主机)能和你的 NFS 服务器进行 NFS 连接 ) ,加入:
1
2
3
4
5
6
7 1### NFS DAEMONS
2portmap:ALL
3lockd:ALL
4mountd:ALL
5rquotad:ALL
6statd:ALL
7
3) 配置 /etc/hosts.allow
1
2 1$ sudo gedit /etc/hosts.allow
2
允许那些你想要的主机和你的 NFS 服务器建立连接。下列步骤将允许任何 IP 地址以 192.168.1 开头的主机(连接到 NFS 服务器上),也可以指定特定的 IP 地址。
1
2
3
4
5
6
7
8
9
10
11
12 1\#\#\# NFS DAEMONS
2
3portmap: 192.168.1.
4
5lockd: 192.168.1.
6
7rquotad: 192.168.1.
8
9mountd: 192.168.1.
10
11statd: 192.168.1.
12
上面设置了只要在 192.168.1.*这个网段的所有 IP
地址用户都可以访问共享目录,但我只想让一个 IP 地址访问,比如 192.168.1.101 那么就可以这样设置了。
可以通过设定 /etc/hosts.deny 和 /etc/hosts.allow 文件来限制网络服务的存取权限。
1
2
3
4
5
6
7
8 1***/etc/hosts.deny**
2
3portmap:ALL
4lockd:ALL
5mountd:ALL
6rquotad:ALL
7statd:ALL
8
1
2
3
4
5
6
7
8 1***/etc/hosts.allow***
2
3portmap:192.168.1.101
4lockd:192.168.1.101
5mountd:192.168.1.101
6rquotad:192.168.1.101
7statd:192.168.1.101
8
同时使用这两个文件就会使得只有 ip 为 192.168.1.101 的机器使用 NFS 服务。你的 target board 的 ip 地址设定为 192.168.1.101 ,这样就可以了。
/etc/hosts.deny 和 /etc/hosts.allow 设置对 portmap 的访问 . 采用这两个配置文件有点类似 "mask" 的意思 . 现在 /etc/hosts.deny 中禁止所有用户对 portmap 的访问 . 再在 /etc/hosts.allow 中允许某些用户对 portmap 的访问。
4 )重启 portmap daemon
每次对 /etc/hosts.deny 和 /etc/hosts.allow 两文件的修改后都要重启 portmap daemon 。不然修改无效。
1
2 1$ sudo /etc/init.d/portmap restart
2
5 )配置 /etc/exports
NFS 挂载目录及权限由 /etc/exports 文件定义。
1
2 1$sudo gedit /etc/exports
2
比如我要将将我的 home 目录中的 /home/lin/NFSshare 目录让 192.168.1.* 的 IP 共享 , 则在该文件末尾添加下列语句:
1
2 1/home/lin/NFSshare 192.168.1.*(rw,sync,no_root_squash)
2
然后保存退出。
/home/lin/NFSshare 就表示共享目录,当然,你可以随便换成自己喜欢的目录。
192.168.1. * : 前面三位是你主机( NFS 客户端)的 ip 地址(本机终端 ifconfig 命令就可以获得本机的 ip 地址)。
rw : 读 / 写权限,只读权限的参数为 ro ;
sync :数据同步写入内存和硬盘,也可以使用 async ,此时数据会先暂存于内存中,而不立即写入硬盘。
no_root_squash : NFS 服务器共享目录用户的属性,如果用户是 root ,那么对于这个共享目录来说就具有 root 的权限。
6) 重启 nfs 服务
1
2 1$ sudo /etc/init.d/nfs-kernel-server restart
2
执行这个命令的时候可能会提示一些错误,如下:
1
2
3
4
5
6
7
8
9 1 * Stopping NFS kernel daemon [ OK ]
2 * Unexporting directories for NFS kernel daemon... [ OK ]
3 * Exporting directories for NFS kernel daemon...
4
5exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "192.168.1.\*:/home/lin/NFSshare".
6 Assuming default behaviour ('no_subtree_check').
7 NOTE: this default has changed since nfs-utils version 1.0.x [ OK ]
8 * Starting NFS kernel daemon [ OK ]
9
我不知道具体原因,不用管,不影响后面的使用。
注意: 每次对 /etc/exports 文件的修改,都要重启一下 nfs 服务。
7 )nfs 服务器端测试
由于 nfs 服务器端默认是安装了 nfs 客户端 (nfs-common) 的,所以可以在服务器端挂载共享文件夹作测试。
1
2 1 $sudo mount 192.168.1.160:/home/lin/NFSshare /mnt
2
192.168.1.160 是 nfs 服务器端 IP 地址,可以在服务器端终端通过命令 ifconfig 获得。
有可能会出现错误
1
2
3 1$mount 192.168.1.160:/home/lin/NFSshare /mnt
2mount.nfs: access denied by server while mounting 192.168.1.160:/home/lin/NFSshare
3
在 nfs 客户端执行上述命令,出现同样的错误。这个错误的意思是客户端地址不在 NFS 所允许的地址范围之内,但无论服务器端还是客户端 IP 都是 192.168.1.* 啊!
解决办法
重新
1
2 1$sudo gedit /etc/exports
2
,将 “ 192.168.1.* ” 换成 “*” ,要注意就这一个星星哦!修改完之后不要忘了重启一下 nfs 服务
1
2 1$ sudo /etc/init.d/nfs-kernel-server restart
2
这样修改之后,就可以看到 /mnt 文件下共享了 /home/lin/NFSshare 文件夹里的内容。测试完毕,要卸载 nfs 的挂载
1
2 1$sudo umount /umt
2
NFS 客户端
1. 安装 NFS *
客户端需要安装 n fs 客户端程序 (nfs-common)
1
2 1$ sudo apt-get install nfs-common
2
2.nfs 挂载
挂载服务器端共享文件夹 ( 假设服务器端 IP 地址为: 192.168.1.160 ,将 /home/lin/NFSshare 挂载到 /mnt)
1
2 1$ sudo mount 192.168.1.160:/home/lin/NFSshare /mnt
2
查看 NFS server 的 export list
1
2
3
4
5
6 1$ showmount -e 192.168.1.160
2
3Export list for 192.168.1.160:
4
5/home/lin/NFSshare 192.168.1.139
6
$ df 看看结果
打开文件夹 /mnt ,可以看到实际访问到了服务器端的 /home/lin/NFSshare 文件夹
使用完 NFS 后可以卸载 NFS 挂载。
1
2 1$ sudo umount /mnt
2
与 NFS 相关的几个文件
1, /sbin/exportfs
维护 NFS 的资源共享 . 可以通过它重新设定 /etc/exports 的共享目录 , 卸载 NFS Server 共享的目录或者重新共享等 .
2, /usr/sbin/showmount
用在 NFS Server 端,而 showmount 则主要用在 Client 端 . showmount 可以用來查看 NFS 共享的目录资源 .
3, /var/lib/nfs/xtab
NFS 的记录文档 : 通过它可以查看有哪些 Client 连接到 NFS 主机的记录 .
下面这几个并不直接负责 NFS, 实际上它们负责所有的 RPC
4, /etc/default/portmap
实际上 , portmap 负责映射所有的 RPC 服务端口 , 它的内容非常非常之简单 ( 后面详述 )
5, /etc/hosts.deny
设定拒绝 portmap 服务的主机
6, /etc/hosts.allow
设定允许 portmap 服务的主机
7 , /etc/exports
对 NFS 卷的访问是由 exports 来批准 , 它枚举了若干有权访问 NFS 服务器上文件系统的主机名。 /etc/exports 实际上就是 nfs 服务器的核心配置文件了 . 列举了一些 exports 文件的写法。
除了编辑 /etc/exports 文件这种方法外, Ubuntu 还提供图形管理工具 ——“ 共享的文件件 ” ,可以用它来进行 NFS 服务器的维护和设置工作。
( 1 ) 打开 “ 共享的文件件 ”
第一种方法: “ 系统 ”——“ 系统管理 ”——“ 共享的文件夹 ”
(我的 Ubuntu8.10 没有)
第二种方法:终端 $ shares-admin
( 2 )要想修改,首先就要 “ 解锁 ” 。
( 3 )可以看到之前 /home/lin/NFSshare 在列表内,其实 “ 共享的文件夹 ” 不过是 /etc/exports 图形化。
(4) 点 “ 添加 ” 添加一个新的共享文件夹
选择 “Unix 网络 (NFS)“ 。因为这是 Linux 之间的共享;如果是 Linux 和 Windows 之间的共享,选择 “Windows 网络 (SMB)” 。
( 5 )再点 “ 添加 “ ,可以设置 ” 指定主机名 ”,“ 指定 IP 地址 ” , “ 指定网络 ” 。
(6) 设置完毕之后就可以关闭 “ 共享的文件夹 ” ,打开 /etc/exports 可以看到,相应的语句加入到了文件里。