NFS 服务器配置 1.1.1 NFS简介
NFS由SUN公司开发,目前已经成为文件服务的一种标准(RFC1904,RFC1813)。其最大功能是可以通过网络让不同操作系统的计算机可以共享数据,所以也可以将其看做是一台文件服务器,如图1-1所示。NFS提供了除Samba之外,Windows与Linux及UNIX与Linux之间通信的方法。
客户端PC可以挂载NFS服务器所提供的目录并且挂载之后这个目录看起来如同本地的磁盘分区一样,可以使用cp、cd、mv、rm及df等与磁盘相关的命令。NFS有属于自己的协议与使用的端口号,但是在传送资料或者其他相关信息时候,NFS服务器使用一个称为"远程过程调用"(Remote Procedure Call,RPC)的协议来协助NFS服务器本身的运行。
1.1.2 为何使用NFS
NFS的目标是使计算机共享资源,在其发展过程中(即20世纪80年代),计算机工业飞速发展,廉价CPU及客户端/服务器技术促进了分布式计算环境的发展。然而当处理器价格下降时,大容量的存储系统相对而言价格仍居高不下。因此必须采用某种机制在充分发挥单个处理器性能的同时使计算机可共享存储资源和数据,于是NFS应运而生。
1.1.3 NFS协议
使用NFS,客户端可以透明地访问服务器中的文件系统,这不同于提供文件传输的FTP协议。FTP会产生文件一个完整的副本;NFS只访问一个进程引用文件部分,并且一个目的就是使得这种访问透明。这就意味着任何能够访问一个本地文件的客户端程序不需要做任何修改,就应该能够访问一个NFS文件。
NFS是一个使用SunRPC构造的客户端/服务器应用程序,其客户端通过向一台NFS服务器发送RPC请求来访问其中的文件。尽管这一工作可以使用一般的用户进程来实现,即NFS客户端可以是一个用户进程,对服务器进行显式调用,而服务器也可以是一个用户进程。因为两个理由,NFS一般不这样实现。首先访问一个NFS文件必须对客户端透明,因此NFS的客户端调用是由客户端操作系统代表用户进程来完成的;其次,出于效率的考虑,NFS服务器在服务器操作系统中实现。如果NFS服务器是一个用户进程,每个客户端请求和服务器应答(包括读和写的数据)将不得不在内核和用户进程之间进行切换,这个代价太大。第3版的NFS协议在19xx年发布,图1-2所示为一个NFS客户端和一台NFS服务器的典型结构。
(1)访问一个本地文件还是一个NFS文件对于客户端来说是透明的,当文件被打开时,由内核决定这一点。文件被打开之后,内核将本地文件的所有引用传递给名为"本地文件访问"的框中,而将一个NFS文件的所有引用传递给名为"NFS客户端"的框中。
(2)NFS客户端通过其TCP/IP模块向NFS服务器发送RPC请求,NFS主要使用UDP,最新的实现也可以使用TCP。
(3)NFS服务器在端口2049接收作为UDP数据包的客户端请求,尽管NFS可以被实现为使用端口映射器,允许服务器使用一个临时端口,但是大多数实现都是直接指定UDP端口2049。
(4)当NFS服务器收到一个客户端请求时,它将这个请求传递给本地文件访问例程,然后访问服务器主机上的一个本地的磁盘文件。
(5)NFS服务器需要花一定的时间来处理一个客户端的请求,访问本地文件系统一般也需要一部分时间。在这段时间间隔内,服务器不应该阻止其他客户端请求。为了实现这一功能,大多数的NFS服务器都是多线程的--服务器的内核中实际上有多个NFS服务器在NFS本身的加锁管理程序中运行,具体实现依赖于不同的操作系统。既然大多数UNIX内核不是多线程的,一个共同的技术就是启动一个用户进程(常被称为"nfsd")的多个实例。这个实例执行一个系统调用,使其作为一个内核进程保留在操作系统的内核中。
(6)在客户端主机上,NFS客户端需要花一定的时间来处理一个用户进程的请求。NFS客户端向服务器主机发出一个RPC调用,然后等待服务器的应答。为了给使用NFS的客户端主机上的用户进程提供更多的并发性,在客户端内核中一般运行着多个NFS客户端,同样具体实现也依赖于操作系统。
3.
3.1
网络环境:
NFS server: 192.168.102.47
NFS client: 192.168.102.15
NFS client: 192.168.102.61
软件版本
nfs-common 5-20
nfs-kernel-server 1.0.9-5
portmap 1.0.9-5
3.2
服务器端安装
在Debian系统下安装NFS是相当简单的,在NFS服务器上执行下面的命令即可
# aptitude install nfs-common nfs-kernel-server portmap
在客户端则需要安装:
# aptitude install nfs-common portmap
3.3
启动服务
# /etc/init.d/nfs-kernel-server start
停止服务
# /etc/init.d/nfs-kernel-server stop
重启服务
# /etc/init.d/nfs-kernel-server restart
4.
4.1
# mkdir /home/share
# chown nobody.nogroup /home/share
4.2
这个文件的内容非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成:
[共享的目录] [主机名或IP(参数,参数)]
其中参数是可选的,当不指定参数时,nfs将使用默认选项。默认的共享选项是 sync,ro,root_squash,no_delay。 当主机名或IP地址为空时,则代表共享给任意客户机提供服务。
当将同一目录共享给多个客户机,但对每个客户机提供的权限不同时,可以这样:
[共享的目录] [主机名1或IP1(参数1,参数2)] [主机名2或IP2(参数3,参数4)]
下面是一些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_squas root用户具有根目录的完全管理访问权限
anonuid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx 指定NFS服务器/etc/passwd文件中匿名用户的GID
配置文件/etc/exports内容如下:
$ cat /etc/exports
/home/share 192.168.102.15(rw,sync) *(ro)
配置说明: 对192.168.102.15赋予读写权限,其他机器仅有只读权限。
4.3
# /etc/init.d/nfs-kernel-server restart
4.4
# showmount -e 192.168.102.47
Export list for 192.168.102.47:
/home/share (everyone)
4.5
在客户机 192.168.102.15 上加载共享资源
# mount 192.168.102.47:/home/share /mnt
# cd /mnt
# echo '12345'> 123
即可发现对服务器共享目录可写
# umount /mnt
在客户机 192.168.102.61 上加载共享资源
# mount 192.168.102.47:/home/share /mnt
# cd /mnt
# ls
123
# touch 321
touch: cannot touch `321': Permission denied
# echo '123455' >123
-bash: 123: Permission denied
即可发现对服务器共享目录只有读取权限,
这与我们在服务器端的权限设置是相符的。
是不是我们每次修改了配置文件都需要重启nfs服务呢? 这个时候我们就可以用exportfs命令重新扫描/etc/exports文件,来使改动立刻生效。
比如:
# exportfs -au 卸载所有共享目录
# exportfs -rv 重新共享所有目录并输出详细信息
exportfs 命令有软件包 nfs-kernel-server 提供,详细的 exportfs 命令说明请查看:
man exportfs
中文的手册说明可以查看这里:
当完成资源共享, 我们如何知道发布了哪些权限呢?这时我们可以查看 /var/lib/nfs/etab 文件,它是有 exportfs 命令根据 /etc/exports 生成的。
# cat /var/lib/nfs/etab
/home/share
192.168.102.15(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
/home/share
*(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,subtree_check,secure_locks,acl,mapping=identity,anonuid=65534,anongid=65534)
现在我们来查看服务器上有关NFS服务器启动了哪些端口:
tonybox:/home/share# lsof -i|grep rpc
portmap 1931 daemon 3u IPv4 4289 UDP *:sunrpc
portmap 1931 daemon 4u IPv4 4290 TCP *:sunrpc (LISTEN)
rpc.statd 3206 statd 3u IPv4 7081 UDP *:1029
rpc.statd 3206 statd 6u IPv4 7072 UDP *:838
rpc.statd 3206 statd 7u IPv4 7085 TCP *:1031 (LISTEN)
rpc.mount 3483 root 6u IPv4 7934 UDP *:691
rpc.mount 3483 root 7u IPv4 7937 TCP *:694 (LISTEN)
5.
5.1
如果我们的NFS服务器在防火墙后边,则需要在防火强策略中加入如下策略:
-A INPUT -p tcp -m state --state NEW -m multiport --dport 111,2049,4001,32764:32767 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m multiport --dport 111,2049,4001,32764:32767 -j ACCEPT
5.2
/etc/hosts.allow和/etc/hosts.deny这两个文件是tcpd服务器的配置文件,tcpd服务器可以控制外部IP对本机服务的访问。这两个配置文件的格式如下:
#服务进程名:主机列表:当规则匹配时可选的命令操作
server_name:hosts-list[:command]
/etc/hosts.allow控制可以访问本机的IP地址,/etc/hosts.deny控制禁止访问本机的IP。如果两个文件的配置有冲突,以 /etc/hosts.deny为准。下面是一个/etc/hosts.allow的示例:
ALL:127.0.0.1 #允许本机访问本机所有服务进程
smbd:192.168.0.0/255.255.255.0 #允许192.168.0.网段的IP访问smbd服务
ALL关键字匹配所有情况,EXCEPT匹配除了某些项之外的情况,PARANOID匹配你想控制的IP地址和它的域名不匹配时(域名伪装)的情况。
比如,在服务器的 /etc/hosts.deny 文件作如下设置:
# cat /etc/hosts.deny
portmap:192.168.102.15
然后在客户机192.168.102.15上加载共享目录
# mount 192.168.102.47:/home/share /mnt
mount to NFS server '192.168.102.47' failed.
我们发现现在已经无法加载共享目录的。
6.
除了使用mount的命令手动挂栽共享资源,还可以使用其他方法实现共享资源的自动挂栽:
6.1
修改客户机的 /etc/fstab文件,加入类似如下行:
192.168.102.47:/home/share /mnt nfs rsize=8192,wsize=8192,timeo=14,intr
重启客户机,即可实现系统启动时自动挂栽共享资源
6.2
autofs 使用 automount 守护进程来管理你的挂载点,它只在文件系统被访问时才动态地挂载它们。 autofs 查询主配置文件 /etc/auto.master 来决定要定义哪些挂载点。然后,它使用适用于各个挂载点的参数来启动 automount 进程。主配置中的每一行都定义一个挂载点,然后用单独的配置文件定义在该挂载点下要挂载的文件系统。
安装 autofs
# aptitude install autofs
修改/etc/auto.master文件, 加入如下内容:
/mnt /etc/auto.nfs
创建 /etc/auto.nfs 文件内容如下:
nfs -rw,soft,intr,rsize=8192,wsize=8192 192.168.102.47:/home/share
这样,每当您进入 /mnt/nfs 目录时,系统都会尝试将服务器的共享资源挂栽到该目录上。应当注意nfs目录是由 automount 动态地创建的,它不应该在客户机器上实际存在。
tonybox2:/# cd /mnt
tonybox2:/mnt# ls
tonybox2:/mnt# cd nfs
tonybox2:/mnt/nfs# ls
123
tonybox2:/mnt/nfs# ls -l
total 4
-rw-r--r-- 1 nobody nogroup 6 2006-08-22 07:50 123
tonybox2:/mnt/nfs#
如果修改了/etc/auto.master主配置文件,则需要运行
#/etc/init.d/autofs reload
对其进行重新加载
下面介绍NFS的安装与配置(版本2):
1.以root的身份在控制台输入setup,在系统服务选项中选中
? nfs
? portmap 服务选项
portmap服务对NFS 是必须的,因为它是NFS 的动态端口分配守护进程,如果portmap不启动,NFS就启动不了的。如果Linux上系统服务上没有这个配置选项,可以到网上搜索一些相关的软件包。
2.编辑 /etc/exports 文件
exports文件是NFS的共享目录配置文件,主要是指定共享目录和共享策略。使用vi命令编辑,在文件中加入类似下面的内容:
/ *(rw,sync) # ‘/’ 和 ‘*’ 之间要有一个空格
/home 10.13.9.19(rw,sync) *(ro,sync)
第一条规则 / 表示整个根目录进行共享,* 表示对于所有用户共享,rw 可读写,sync 文件同步
第一条规则 /home 表示共享目录,当然你还可以类似的添加其他目录进行共享。后面的内容表示对ip为10.13.9.19的主机赋予读写权限,其他机器 * 仅有读写权限。
还有其他一些设置方法,如:
/ bluefish(rw,no_root_squash) #对主机名为bluefish 的用户共享
/share 172.29.0.0/255.255.0.0(ro)
/share/private (noaccess)
选项说明:
ro read only
rw read write
no_root_squash 信任客户端,对应 UID
noaccess 客户端不能使用
3.然后在控制台分别执行以下两条命令
[root]# service portmap restart
[root]# service nfs restart
如果看到一连串的[ok]时,表示已经启动成功了。如果第一次启动,nfs ,又使用restart命令,可能开始会出现一些[FAILED],那是在停止nfs服务,而nfs服务还没有启动所以会FAILED。
Linux NFS安装与配置
当然你还可以使用其它命令来启动或关闭nfs服务:
start 启动 NFS 服务 stop 停止 NFS 服务 restart 停止并重新启动 NFS 服务 reload 重新载入 NFS 设定值 4.测试NFS服务 要测试NFS是否真正配置的成功,只要进行以下测试: [root]# mout -t nfs 10.13.9.19:/{cwd} /mnt #{cwd}是NFS共享的目录,/mnt 是挂载到本地的服务 如果你在/mnt 下可以看到NFS共享目录的内容,表示你NFS设置成功了。使用#umount /mnt 取消挂载。 5.另外还可以使用一些命令查看NFS的各种状态: showmount -e 可看有分享哪些目录 # showmount -a 可看出所有的 mount 检查NFS的运行级别: # chkconfig --list portmap # chkconfig --list nfs
根据需要设置在相应的运行级别自动启动NFS:
# chkconfig --level 235 portmap on
# chkconfig --level 235 nfs on
Linux系统NFS服务器的配置方法(版本3)
一、NFS服务器的安装
检查linux系统中是否安装了nfs-utils和portmap两个软件包(RHEL4系统默认已经安装了这两个软件包) 命令#rpm –q nfs-utils portmap
二、查看NFS服务器是否启动
命令#service nfs starus
#service portmap status
三、如果服务器没有启动,则开启服务(默认服务下nfs没有完全开启)
命令#service nfs start
#service portmap start
四、指定NFS服务器的配置文件
NFS服务器的配置文件保存“/etc/”目录中,文件名称是“exports”,该文件用于被指NFS服务器提供的目录共享 命令#vi /etc/exports
配置“exports”文件格式如下
/home *(sync,ro)
Home:共享目录名
*:表示所有主机
(sync,ro):设置选项
exports文件中的“配置选项”字段放置在括号对(“( )”)中 ,多个选项间用逗号分隔
sync:设置NFS服务器同步写磁盘,这样不会轻易丢失数据,建议所有的NFS共享目录都使用该选项 ro:设置输出的共享目录只读,与rw不能共同使用
rw:设置输出的共享目录可读写,与ro不能共同使用
exports文件中“客户端主机地址”字段可以使用多种形式表示主机地址
192.168.152.13 指定IP地址的主机
指定域名的主机
192.168.1.0/24 指定网段中的所有主机
*.test.com 指定域下的所有主机
* 所有主机
五、重新输出共享目录
Exportfs管理工具可以对“exports”文件进行管理
命令#exportfs –rv 可以让新设置的“exports”文件内容生效
六、显示NFS服务器的输出目录列表
显示当前主机中NFS服务器的输出列表
# showmount -e
七、显示NFS服务器中被挂载的共享目录
显示当前主机NFS服务器中已经被NFS客户机挂载使用的共享目录
# showmount -d
八、在另外一个linux系统中挂在共享目录
显示NFS服务器的输出
# showmount -e 172.16.75.1
挂载NFS服务器中的共享目录
# mount -t nfs 172.16.75.1:/software /mnt/
九、查看mnt目录中的内容
Cd /mnt |ll
十、卸载系统中已挂载的NFS共享目录
命令# umount /mnt/
总结:
1、在配置NFS服务器之前用ping命令确保两个linux系统正常连接,如果无法连接关闭图形界面中的防火墙#service iptables stop
2、在配置中确保输入的命令是正确的
3、更改完“exports”文件后要输入exportfs –rv ,使得“exports”文件生效。
4、检查nfs服务是否开启,默认是关闭的。
5、卸载的时候不能在/mnt目录中卸载,必须注销系统后卸载。
在设置了防火墙的环境中使用NFS,需要在防火墙上打开如下端口:
1. portmap 端口 111 udp/tcp;
2. nfsd 端口 2049 udp/tcp;
3. mountd 端口 "xxx" udp/tcp
系统 RPC服务在 nfs服务启动时默认会为 mountd动态选取一个随机端口(32768--65535)来进行通讯,我们可以通过编辑/etc/services 文件为 mountd指定一个固定端口:
# vi /etc/services
在末尾添加
mountd 1011/udp
mountd 1011/tcp
保存该文件
# stopsrc -s rpc.mountd
# startsrc -s rpc.mountd
# exportfs -a
# rpcinfo -p Hostname
现在我们会发现 mountd已经和端口 1011绑定了。
另外,nfs中需要通讯的服务还有 rpc.lockd和 rpc.statd,其中对lockd我们可以用类似的方法来指定固定端口, # vi /etc/services
添加
lockd 35000/ucp
lockd 35000/tdp
# stopsrc -s rpc.lockd
# startsrc -s rpc.lockd
# exportfs -a
nfs客户端mount文件系统
# rpcinfo -p Hostname
但 rpc.statd无法通过该方法来指定端口,它只能使用随机端口,如有必要,在防火墙上要根据下面命令的显示来开放随机端口:
# no -a |grep ephemeral
tcp_ephemeral_high = 65535
tcpp_ephemeral_low = 32768
udp_ephemeral_high = 65535
udp_ephemeral_low = 32768
当然也可以不开放 rpc.statd需要的随机端口,带来的影响就是如果 nfs连接中断(比如server或client宕掉了),系统将无法通过statd来恢复连接中断前的状态,而必须重新 mount该nfs文件系统。
查看linux目标服务器NFS是出现以下提示信息的解决办法
mount clntudp_create: RPC: Port mapper failure - RPC: Unable to receive
关掉服务端的防火墙。
service iptables stop