基本上NFS这个服务的端口开在2049,但是由于 文件系统非常的复杂,因此NFS还有其他的程序去启动额外的端口,默认NFS用来传输的端口是随机选择小于1024的端口。RPC最主要的功能就是指定每个NFS功能所对应的Port Number,并且通告给客户端。当服务器在启动NFS时会随机选取数个端口,并主动向RPC注册,因此RPC可以知道每个端口对应的NFS功能。

    启动NFS之前,RPC就要先启动。否则NFS会无法向RPC注册。RPC重新启动后,原来的注册的数据会消失。不论是客户端还是服务器端,要使用NFS时,两者都需要启动RPC才行。
 
    NFS服务器启动时至少需要两个daemons。一个管理客户端是否能够登录的问题(rpc.nfsd),一个管理客户端能够取得的权限(rpc.mountd)。
rpc.lockd:文件锁,也数据库的锁相同,必须要在Client和Server端同时启动
rpc.statd:检查文件系统的一致性,必须要在Client和Server端同时启动
 
    上述这几个RPC所需要的程序,其实都已经写入到两个基本的服务启动脚本中了,那就是nfs和nfslock
/etc/init.d/nfs
/etc/init.d/nfslock
 
因为NFS本身的服务并没有进行用户身份验证,服务器会以客户端的用户UID与GID等身份来尝试读取服务器端的文件系统。
1.NFS Server没有501这个UID,则访问的用户的权限会被压缩为nobody
2.用户身份为root,在默认情况下,root的身份会被主动压缩成为nobody
 
NFS权限问题:
1./etc/exports有相关权限;
2.文件本身的权限;
 
因为上面的问题,所以NFS通常与NIS这个可以确认客户端与服务器端身份一致的服务搭配使用,以避免身份的错乱。
 
 
配置好NFS服务器,必须要有如下两个软件:
1.RPC主程序:rpcbind(在Centos前加portmap)
2.NFS主程序:nfs-utils
 
NFS用到的文件:
NFS主配置文件:/etc/exports
NFS命令:/usr/sbin/exportfs
日志文件:/var/lib/nfs/*tab
客户端命令:/usr/sbin/showmount
 
    NFS会直接使用到内核功能,所以内核必须要支持NFS才行。自己编译的内核记得选择NFS的内核支持。
 
[root@Centosszm ~]# cat /etc/exports
/tmp    192.168.179.0/24(rw)localhost(rw)*.test.com(ro,sync)
也支持255.255.255.0
 
 
 rw,ro,sync,async,no_root_squash(默认不挤压),root_squash(挤压root权限),all_squash(所有的都挤压),nonouid(anonymous uid),nonogid(anonymous)
man exports查看更多权限
 
[root@Centosszm ~]# cat /etc/exports
/tmp    *(rw,ro,no_root_squash)-----------让共享出去的文件可以有Root权限。
/home/szm       192.168.179.0/24(rw)    *(ro)
/home/linux     *.centos.vbird(rw,all_squash,anonuid=45,anongid=45)
 
 IP网段不能用192.168.100.*的形式;
客户端的UID在服务器端没有时,/tmp下会以数字方式来显示文件拥有者。
 
NFS服务启动:
[root@Centosszm ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@Centosszm ~]# /etc/init.d/nfs start
Starting NFS services:  exportfs: Warning: /home/linux does not exist
                                                           [  OK  ]
Starting NFS quotas:                                       [  OK  ]
Starting NFS daemon:                                       [  OK  ]
Starting NFS mountd:                                       [  OK  ]
Starting RPC idmapd:                                       [  OK  ]
 
[root@Centosszm ~]# /etc/init.d/nfslock start
Starting NFS statd:                                        [  OK  ]
查看是否正确启动:
[root@Centosszm ~]# tailf /var/log/messages
Mar 30 17:34:15 Centosszm kernel: NFSD: Using /var/lib/nfs/v4recovery as the NFSv4 state recovery directory
Mar 30 17:34:15 Centosszm kernel: NFSD: starting 90-second grace period
Mar 30 17:35:18 Centosszm nmbd[2190]: [2013/03/30 17:35:18.286224,  0] libsmb/nmblib.c:839(send_udp)
Mar 30 17:35:18 Centosszm nmbd[2190]:   Packet send failed to 192.168.111.255(138) ERRNO=Invalid argument
Mar 30 17:35:18 Centosszm nmbd[2190]: [2013/03/30 17:35:18.289620,  0] libsmb/nmblib.c:839(send_udp)
Mar 30 17:35:18 Centosszm nmbd[2190]:   Packet send failed to 192.168.111.255(138) ERRNO=Invalid argument
Mar 30 17:35:52 Centosszm dhcpd: DHCPREQUEST for 192.168.179.88 from 00:0c:29:e2:84:0d via eth0
Mar 30 17:35:52 Centosszm dhcpd: DHCPACK on 192.168.179.88 to 00:0c:29:e2:84:0d via eth0
Mar 30 17:37:04 Centosszm rpc.statd[25950]: Version 1.2.2 starting
Mar 30 17:37:04 Centosszm sm-notify[25952]: Version 1.2.2 starting
 
[root@Centosszm ~]# netstat -tulnp | grep -E '(rpc|nfs)'
tcp        0      0 0.0.0.0:51039               0.0.0.0:*                   LISTEN      25864/rpc.mountd
tcp        0      0 0.0.0.0:875                 0.0.0.0:*                   LISTEN      25847/rpc.rquotad
tcp        0      0 0.0.0.0:111                 0.0.0.0:*                   LISTEN      25812/rpcbind
tcp        0      0 0.0.0.0:37909               0.0.0.0:*                   LISTEN      25950/rpc.statd
tcp        0      0 :::45517                    :::*                        LISTEN      25950/rpc.statd
tcp        0      0 :::111                      :::*                        LISTEN      25812/rpcbind
udp        0      0 0.0.0.0:686                 0.0.0.0:*                               25950/rpc.statd
udp        0      0 0.0.0.0:971                 0.0.0.0:*                               25812/rpcbind
udp        0      0 0.0.0.0:39648               0.0.0.0:*                               25950/rpc.statd
udp        0      0 0.0.0.0:60644               0.0.0.0:*                               25864/rpc.mountd
udp        0      0 0.0.0.0:875                 0.0.0.0:*                               25847/rpc.rquotad
udp        0      0 0.0.0.0:111                 0.0.0.0:*                               25812/rpcbind
udp        0      0 :::34611                    :::*                                    25950/rpc.statd
udp        0      0 :::971                      :::*                                    25812/rpcbind
udp        0      0 :::111                      :::*                                    25812/rpcbind
 
[root@Centosszm ~]# netstat -tulnp | grep 2049
tcp        0      0 0.0.0.0:2049                0.0.0.0:*                   LISTEN      -
udp        0      0 0.0.0.0:2049                0.0.0.0:*                               -
 
1.rpcbind启动在port111,rpc.*服务启动的Port是随机产生的,向Port111注册。
2.NFS本身服务启动在:2049上;
 
[root@Centosszm ~]# rpcinfo -p localhost
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  39648  status
    100024    1   tcp  37909  status
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100003    2   tcp   2049  nfs
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    2   tcp   2049  nfs_acl
    100227    3   tcp   2049  nfs_acl
    100003    2   udp   2049  nfs
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    2   udp   2049  nfs_acl
    100227    3   udp   2049  nfs_acl
    100021    1   udp  50156  nlockmgr
    100021    3   udp  50156  nlockmgr
    100021    4   udp  50156  nlockmgr
    100021    1   tcp  33792  nlockmgr
    100021    3   tcp  33792  nlockmgr
    100021    4   tcp  33792  nlockmgr
    100005    1   udp  36919  mountd
    100005    1   tcp  60705  mountd
    100005    2   udp  36919  mountd
    100005    2   tcp  60705  mountd
    100005    3   udp  36919  mountd
    100005    3   tcp  60705  mountd
 
[root@Centosszm ~]# rpcinfo -t localhost nfs
program 100003 version 2 ready and waiting
program 100003 version 3 ready and waiting
program 100003 version 4 ready and waiting
 
p:IP
t:针对某台主机的某个程序检查其TCP数据包所在的软件版本
u:针对某台主机的某个程序检查其UDP数据包所在的软件版本
 
服务器自己测试共享的目录:
[root@Centosszm ~]# showmount -e localhost
Export list for localhost:
/tmp        *
/home/linux *.centos.vbird
/home/szm   (everyone)
 
显示当前主机与客户端的NFS连接共享的状态
[root@Centosszm ~]# showmount -a
All mount points on Centosszm.test.com:
 
[root@Centosszm ~]# cat /var/lib/nfs/etab
/home/szm       192.168.179.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
/home/linux     *.centos.vbird(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,anonuid=45,anongid=45)
/home/szm       *(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
/tmp    *(ro,sync,wdelay,hide,nocrossmnt,secure,no_root_squash,no_all_squash,no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
 
 如果有其他客户端挂载了你的NFS文件系统,那么该客户端文件系统信息会被记录到/var/lib/nfs/xtab
 
 
重新设置完/etc/exports后不需要重新启动NFS,可以用exportfs这个命令。这样NFS就不用向RPC注册了。
[root@Centosszm ~]# exportfs -arv
exporting 192.168.179.0/24:/home/szm
exporting *.centos.vbird:/home/linux
exportfs: Warning: /home/linux does not exist
exporting *:/home/szm
exporting *:/tmp
-a:全部挂载
-r:重新挂载,同步/etc/exports和/var/lib/nfs/xtab的内容
-u:卸载某一目录
-v:显示
[root@Centosszm ~]# exportfs -auv
 
NFS防火墙设置:
记NFS设置固定端口:
[root@Centosszm ~]# grep -v '^[#]' /etc/sysconfig/nfs
RQUOTAD_PORT=875
LOCKD_TCPPORT=32803
LOCKD_UDPPORT=32769
MOUNTD_PORT=892
 
[root@Centosszm ~]# /etc/init.d/nfs restart
 
[root@Centosszm ~]# rpcinfo -p | grep -E '(rquota|mount|nlock)'
    100011    1   udp    875  rquotad
    100011    2   udp    875  rquotad
    100011    1   tcp    875  rquotad
    100011    2   tcp    875  rquotad
    100021    1   udp  32769  nlockmgr
    100021    3   udp  32769  nlockmgr
    100021    4   udp  32769  nlockmgr
    100021    1   tcp  32803  nlockmgr
    100021    3   tcp  32803  nlockmgr
    100021    4   tcp  32803  nlockmgr
    100005    1   udp    892  mountd
    100005    1   tcp    892  mountd
    100005    2   udp    892  mountd
    100005    2   tcp    892  mountd
    100005    3   udp    892  mountd
    100005    3   tcp    892  mountd
 
[root@Centosszm ~]# iptables -A INPUT -p tcp -s 192.168.179.0/24 -m multiport --dport 111,2049,875,32769,32803,892 -j ACCEPT
[root@Centosszm ~]# iptables -A INPUT -p udp -s 192.168.179.0/24 -m multiport --dport 111,2049,875,32769,32803,892 -j ACCEPT
 
[root@Centosszm ~]# /etc/init.d/iptables save
 
安全的NFS设置----Partition(分区挂载)
 
需要注意的是,当NFS使用的这个RPC服务在客户端连上服务器时,那么服务器想要关机,那可就会成为“不可能的任务”,关机速度会非常的慢。所以建议在想要关机时,先关掉rpcbind与nfs这两个daemon,可能会用到这些命令:netstat -utlnp,kill,showmount -a localhost,/var/lib/nfs/rmtab,xtab
 
NFS客户端设置:
1.启动了rpcbind
2.showmount
3.mkdir
4.mount
 
[root@szm ~]# /etc/init.d/rpcbind start
Starting rpcbind:                                          [  OK  ]
[root@szm ~]# /etc/init.d/nfslock start
Starting NFS statd:                                        [  OK  ]
 
[root@szm ~]# showmount -e 192.168.179.7
Export list for 192.168.179.7:
/tmp         *
/home/linux  *.centos.vbird
/home/public (everyone)
 
 
[root@szm ~]# mount -t nfs 192.168.179.7:/home/szm /home/nfs/public/
 
客户端自动挂载:
分析开机流程,发现网络启动是在本机挂载(/etc/fstab)之后的,由于NFS需要网络支持,所以挂载NFS应该写入/etc/rc.d/rc.local中
[root@szm ~]# cat /etc/rc.d/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.
 
touch /var/lock/subsys/local
mount -t nfs -o nosuid,noexec,rw,bg,soft,rsize=32768,wsize=32768 192.168.179.7:/home/public /home/nfs/public
#感觉这里如果服务器关闭了服务,那不是会一直等待。
 
客户端挂载Debug:
[root@szm ~]# mount -t nfs 192.168.179.7:/home/szm /home/nfs/public/
mount.nfs: rpc.statd is not running but is required for remote locking.
mount.nfs: Either use '-o nolock' to keep locks local, or start statd.
mount.nfs: an incorrect mount option was specified
 
Autofs:
Linux文件系统的自动挂载autofs,解决等待问题,5分钟超时卸载挂载
主配置文件:/etc/auto.master
 
这个nfsfile不要存在为好,autofs会创建
[root@szm ~]# vim /etc/auto.master
home/nfsfile   /etc/auto.nfs
 
[root@szm ~]# vi /etc/auto.nfs
public  -rw,bg,soft,rsize=32768,wsize=32768     192.168.179.7:/home/public
testing -rw,bg,soft,rsize=23768,wsize=32768     192.168.179.7:/home/test
temp    -rw,bg,soft,rsize=23768,wsize=32768     192.168.179.7:/tmp
 
suid,nosuid    rw,ro   dev,nodev     exec,noexec    user,nouser
auto,noauto    fg,bg(mount)   soft,hard(呼叫)     intr(呼叫可中断)   rsize,wsize(读写缓冲大小)
 
 
[root@szm ~]# /etc/init.d/autofs stop
Stopping automount:                                        [  OK  ]
[root@szm ~]# /etc/init.d/autofs start
Starting automount:                                        [  OK  ]
 
[root@szm public]# ll /home/nfsfile/public/
total 0
-rw-r--r--. 1 root root 0 Mar 30 20:36 file