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 为何使用NFSNFS的目标是使计算机共享资源,在其发展过程中(即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协议在1993年发布,图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.47NFS client: 192.168.102.15NFS client: 192.168.102.61软件版本nfs-common 5-20nfs-kernel-server 1.0.9-5portmap 1.0.9-53.2 安装:服务器端安装在Debian系统下安装NFS是相当简单的,在NFS服务器上执行下面的命令即可# aptitude install nfs-common nfs-kernel-server portmap在客户端则需要安装:# aptitude install nfs-common portmap3.3 服务的启动与停止启动服务# /etc/init.d/nfs-kernel-server start停止服务# /etc/init.d/nfs-kernel-server stop重启服务# /etc/init.d/nfs-kernel-server restart4. 服务器端配置4.1 创建共享目录# mkdir /home/share# chown nobody.nogroup /home/share4.2 创建或修改/etc/exports 配置文件这个文件的内容非常简单,每一行由抛出路径,客户名列表以及每个客户名后紧跟的访问选项构成:[共享的目录] [主机名或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文件中匿名用户的UIDanongid=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 重启NFS服务# /etc/init.d/nfs-kernel-server restart4.4 在客户机上查看NFS的资源共享情况# showmount -e 192.168.102.47Export list for 192.168.102.47:/home/share (everyone)4.5 使用mount命令即可挂栽共享资源在客户机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# ls123# touch 321touch: 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中文的手册说明可以查看这里:exportfs联机手册当完成资源共享,我们如何知道发布了哪些权限呢?这时我们可以查看/var/lib/nfs/etab 文件,它是有exportfs 命令根据/etc/exports 生成的。
# cat /var/lib/nfs/etab/home/share192.168.102.15(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,subtree_check,secure_locks,acl,ma pping=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 rpcportmap 1931 daemon 3u IPv4 4289 UDP *:sunrpcportmap 1931 daemon 4u IPv4 4290 TCP *:sunrpc (LISTEN)rpc.statd 3206 statd 3u IPv4 7081 UDP *:1029rpc.statd 3206 statd 6u IPv4 7072 UDP *:838rpc.statd 3206 statd 7u IPv4 7085 TCP *:1031 (LISTEN)rpc.mount 3483 root 6u IPv4 7934 UDP *:691rpc.mount 3483 root 7u IPv4 7937 TCP *:694 (LISTEN)5. 安全问题:5.1 Iptables 防火墙如果我们的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 ACCEPT5.2 使用/etc/hosts.allow和/etc/hosts.deny 控制客户端的访问/etc/hosts.allow和/etc/hosts.deny这两个文件是tcpd服务器的配置文件,tcpd服务器可以控制外部IP对本机服务的访问。