Chinaunix首页 | 论坛 | 博客
  • 博客访问: 9268503
  • 博文数量: 1669
  • 博客积分: 16831
  • 博客等级: 上将
  • 技术积分: 12594
  • 用 户 组: 普通用户
  • 注册时间: 2011-02-25 07:23
个人简介

柔中带刚,刚中带柔,淫荡中富含柔和,刚猛中荡漾风骚,无坚不摧,无孔不入!

文章分类

全部博文(1669)

文章存档

2023年(4)

2022年(1)

2021年(10)

2020年(24)

2019年(4)

2018年(19)

2017年(66)

2016年(60)

2015年(49)

2014年(201)

2013年(221)

2012年(638)

2011年(372)

分类: 服务器与存储

2014-05-30 15:59:13

Ubuntu上nfs的安装配置

 (2012-03-12 21:23:43)
分类: linux
NFS用于Linux主机访问网络中其他Linux主机上的共享资源。NFS的原理是在客户端上通过网络将远程主机共享文件系统以挂载(Mount)的方式加入本机的文件系统,之后的操作就如同在本机上一样。

NFS服务器(宿主机)

1.安装NFS

Ubuntu上默认是没有安装NFS服务器的,首先要安装NFS服务程序:

                      $ sudo apt-get install nfs-kernel-server
     $ sudo apt-get install nfs-common

(安装nfs-kernel-server时,apt会自动安装nfs-common和portmap)

这样,宿主机就相当于NFS Server。

2. 配置NFS

1)配置portmap
蓝色部分可以不需要

etc/hosts.deny***

portmap:ALL

lockd:ALL

mountd:ALL

rquotad:ALL

statd:ALL

***/etc/hosts.allow***

portmap:192.168.1.101

lockd:192.168.1.101

mountd:192.168.1.101

rquotad:192.168.1.101

statd:192.168.1.101

     
      同时使用这两个文件就会使得只有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。不然修改无效。

$ sudo /etc/init.d/portmap restart*/


5)配置/etc/exports

NFS挂载目录及权限由/etc/exports文件定义。

$sudo gedit /etc/exports

比如我要将将我的home目录中的/home/lin/NFSshare目录让192.168.1.*的IP共享, 则在该文件末尾添加下列语句:

  /home/lin/NFSshare  192.168.1.*(rw,sync,no_root_squash) //在挂载到主机的时候有问题
/home/guyuehan *(rw,sync,no_subtree_check) 这个可以挂载到主机

然后保存退出。

/home/lin/NFSshare就表示共享目录,当然,你可以随便换成自己喜欢的目录。

192.168.1.*:前面三位是你主机(NFS客户端)的ip地址(本机终端ifconfig命令就可以获得本机的ip地址)。

rw:读/写权限,只读权限的参数为ro;

sync:数据同步写入内存和硬盘,也可以使用async,此时数据会先暂存于内存中,而不立即写入硬盘。

no_root_squash:NFS 服务器共享目录用户的属性,如果用户是 root,那么对于这个共享目录来说就具有 root 的权限。

共享的NFS目录在/etc/exports中列出,这个文件控制对目录的共享(NFS挂载目录及权限由该文件定义),书写规则是每个共享为一行)。

格式:[共享目录] [主机名或IP](参数,参数...)
第一个参数是要让客户机访问的目录,第二个是你允许的主机IP,最后的()内是访问控制方式。

注意:客户端可以使用主机名或者IP地址指定,在主机名中可以使用通配符(*),IP地址后也可以跟掩码段(/24),但出于安全原因这种情况应该尽量避免。客户端的说明后可在圆括号中加入一系列参数。很重要的一点,不要在最后一个客户端声明的后面留下任何空白或者没关闭括号,因为空白都被解释成客户端的分隔符。

例如我要将/opt/FriendlyARM/mini2440/root_nfs目录让用户的IP共享,则在该文件末尾添加下列语句:
/opt/FriendlyARM/mini2440/root_nfs *(rw,sync,no_root_squash)

其中:
/opt/FriendlyARM/mini2440/root_nfs 表示NFS共享目录,它可以作为开发板的根文件系统通过NFS挂接;
* 表示所有的客户机都可以挂接此目录;
rw 表示挂接此目录的客户机对该目录有读写的权力;
sync 表示所有数据在请求时写入共享,即数据同步写入内存和硬盘;
no_root_squash 表示允许挂接此目录的客户机享有该主机的root身份。

注意:可以用主机名来代替*,尽量指定主机名以便使那些不想其访问的系统不能访问NFS挂载的资源。另外,最好加上sync, 否则$ sudo exportfs -r时会给出警告,sync是NFS的默认选项。

(2)下面是一些NFS共享的常用参数:
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

6)重启nfs服务

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

执行这个命令的时候可能会提示一些错误,如下:

* Stopping NFS kernel daemon                                            [ OK ]


* Unexporting directories for NFS kernel daemon...                      [ OK ]


* Exporting directories for NFS kernel daemon...                               exportfs: /etc/exports [1]: Neither 'subtree_check' or 'no_subtree_check' specified for export "192.168.1.*:/home/lin/NFSshare".


Assuming default behaviour ('no_subtree_check').


NOTE: this default has changed since nfs-utils version 1.0.x

[ OK ]

* Starting NFS kernel daemon                                             [ OK ]


因为没有添加no_subtree_check


注意:每次对/etc/exports文件的修改,都要重启一下nfs服务。


7)nfs服务器端测试

由于nfs服务器端默认是安装了nfs客户端(nfs-common)的,所以可以在服务器端挂载共享文件夹作测试。

$sudo mount 192.168.1.160:/home/lin/NFSshare /mnt

192.168.1.160是nfs服务器端IP地址,可以在服务器端终端通过命令ifconfig获得。


有可能会出现错误

$mount 192.168.1.160:/home/lin/NFSshare /mnt

mount.nfs: access denied by server while mounting 192.168.1.160:/home/lin/NFSshare

在nfs客户端执行上述命令,出现同样的错误。这个错误的意思是客户端地址不在NFS所允许的地址范围之内,但无论服务器端还是客户端IP都是192.168.1.*啊!

解决办法

重新$sudo gedit /etc/exports,将“ 192.168.1.* ”改为“*”.

192.168.1.0/24(rw,nohide,insecure,no_wdelay,no_root_squash,no_subtree_check,sync)
    #特别要注意上面的IP的形式,以前是形如192.168.1.*,现在是IP/掩码为数的形式。用旧的格式可能会出问题
    #具体的说明,建议看man手册 : man exports

修改完之后不要忘了重启一下nfs服务
$ sudo /etc/init.d/nfs-kernel-server restart
 这样修改之后,就可以看到/mnt文件下共享了/home/lin/NFSshare文件夹里的内容。测试完毕,要卸载nfs的挂载

                               $sudo umount /mnt




开发板测试

#mount -t nfs -o nolock 192.168.1.160:/home/wjd/work /mnt/nfs


若出现错误为:
portmap: server localhost not responding, timed out 
解决办法:
mount -t nfs -o nolock node1:/public /public
即增加-o nolock参数,原因:
Unfsd doesn't support NLM locking, and it's causing the lockd daemon to be started (which again requires the portmapper to be installed etc.)





NFS客户端

1.安装NFS

客户端需要安装nfs客户端程序(nfs-common)

$ sudo apt-get install nfs-commmon


2.nfs挂载

挂载服务器端共享文件夹(假设服务器端IP地址为:192.168.1.160,将/home/lin/NFSshare挂载到/mnt)

$ sudo mount 192.168.1.160:/home/lin/NFSshare /mnt


查看NFS server的export list

$ showmount -e 192.168.1.160

Export list for 192.168.1.160:

/home/lin/NFSshare 192.168.1.139



$ df 看看结果


打开文件夹/mnt,可以看到实际访问到了服务器端的/home/lin/NFSshare文件夹


使用完NFS后可以卸载NFS挂载。

$ sudo umount /mnt


与NFS相关的几个文件

1, /sbin/exportfs

维护NFS的资源共享. 可以通过它重新设定 /etc/exports 的共享目录, 卸载NFS Server共享的目录或者重新共享等.

$ sudo   exportfs -r 

2, /usr/sbin/showmount

用在 NFS Server 端,而 showmount 则主要用在 Client 端. showmount 可以用來查看 NFS 共享的目录资源.

sudo showmount -e

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服务器的核心配置文件了. 鸟哥的Linux私房菜列举了一些exports文件的写法。

   

 调试监控
 察看NFS 运行状态:
 #nfsstat
 察看RPC运行信息:
 #rpcinfo -p IP
 #rpcinfo -u hostname

 exportfs [-aruv]
 -a:全部挂载(或卸载) /etc/exports文件设定
 -r:重新挂载 /etc/exports设定,也可以同步更新/etc/exports设定
 -u:卸载某一目录
 -v:在export时,将共享目录显示在屏幕上

 在NFS Server上重新挂载exports内容(一般用在及时更改过exports但又不想重新启动机器的时候) 
 #exportfs -rv

 卸载全部mount 目录 exportfs -au,这样在NFS Client上将看不到原来mount的目录
 # exportfs -au

 在NFS Server上显示已经mount上本机NFS目录的Client机器。
 # showmount -a
 All mount points on test:
 172.17.196.11:/share

 显示被mount出来的目录
 # showmount -e 172.17.196.10
 Export list for 172.17.196.10:
 /share 172.17.196.11

5.会发生的问题
 //使用者权限不符:
 # mount -t nfs 172.17.196.10:/home/test /mnt/share
 mount: 172.17.196.10:/home/test failed, reason given by server: Permission denied

 //portmap服务未启动
 # mount -t nfs localhost:/home/test /home/nfs 
 mount: RPC: Port mapper failure - RPC: Unable to receive
 或mount: RPC: Program not registered

注意:如果有客户端连接,nfs服务器是不能关机的。想要解决这个问题。要在关机之前先关闭portmap服务及nfs服务。

阅读(1171) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~