1.1nfs:网络文件系统(NFS)协议是由Sun MicroSystem在20世纪80年代为了提供对共享文件的远程访问而设计和实现的。该协议采用Client/Server模型, 通过使用Sun开发的远程过程调用协议(RPC Protocol)来实现运行在一台计算机上的程序来调用在另一台远程机器上运行的子程序.
1.2 NFS包含3个版本:NFSv2、NFSv3、NFSv4
CentOS6是以NFSv4作为默认版本,NFSv4使用TCP协议(端口号是2049)和NFS服务器建立连接,而老版本的NFS可以在TCP协议或者是UDP协议上运行。
1.3 工作原理:
1)客户端首先会向nfs服务器的RPC(端口111)发出NFS文件存取的询问请求
2)服务器找到对应的已经注册的NFS守护进程的端口后会回报给客户端
3)客户端收到正确的端口之后,直接与NFS守护进程来联机通信
所以,根据工作原理可知,NFS服务器依赖RPC机制,所以,在启动nfs服务的时候需要先启动rpcbind服务,然后NFS在启动的时候会向RPC注册自己的端口号。同时,客户端连接NFS服务器的时候也用的是NFS服务,所以也需要启动rpcbind服务
2.1了解NFS网络文件的系统结构
/etc/exports 这是NFS的主配置文件,不过系统没有默认值,需要自己创建
/usr/sbin/exportfs 这是维护NFS共享的命令,当修改了NFS的配置文件之后,用此命令可以不重启nfs服务即可刷新
/usr/sbin/showmount 主要用于客户端,用来查看NFS服务器共享的目录
/var/lib/nfs/*tab 存放NFS服务器的登录文件。其中:etab主要记录了NFS共享出来的目录的完整权限设定值;xtab 记录曾经连接到此的NFS主机的相关客户端数据
2.2安装nfs服务
1)Nfs由nfs-utils软件包提供,但是在安装nfs-utils时候,需要同时安装rpcbind
[root@NFS-Server~]# yum install nfs-utils rpcbind -y
2)配置/etc/exports文件
格式:共享目录 允许连接的客户机(选项)
例如:
[root@NFS-Server~]# cat /etc/exports
/share192.168.254.0/24(rw,no_root_squash)
注意:
共享的目录的路径必须是绝对路径,不能使用符号链接
设置客户端访问的时需要遵循下面格式
客户端指定方式 | 示例 |
使用IP地址指定单一主机 | 10.20.30.40 |
使用IP地址指定范围主机 | 172.16.0.0/16 |
使用IP地址指定范围主机 | 192.168.1.* |
使用域名指定单一主机 | Test.ice.apple |
使用域名指定范围主机 | *.ice.apple |
使用通配符指定所有主机 | * |
设置“选项”中一些常见的选项
参数 | 说明 |
ro | 设置共享权限为只读 |
rw | 设置共享权限为读写 |
root_squash | 当使用NFS服务器共享目录的使用者是root时,将被映射为匿名账号。即:NFS 主机使用共享目录的使用者如果是 root 时,那么这个使用者的权限将被压缩成为匿名使用者,通常他的 UID 与 GID 都会变成 nobody 那个系统账号的身份 |
no_root_squash | 当使用NFS服务器共享目录的使用者是root时,将不被映射为匿名账号。即:NFS 主机使用共享目录的使用者,如果是 root 的话,那么对于这个共享的目录来说,他就具有 root 的权限!这个项目极不安全,不建议使用! |
all_squash | 将所有使用NFS服务器共享目录的使用者都映射为匿名账号 |
anonuid | 设置匿名账号的UID |
anongid | 设置匿名账号的GID |
sync | 保持数据同步,也就是将数据同步写入内存和硬盘。这可能导致效率降低 |
async | 数据会先暂存内存中,而不直接写入硬盘 |
3)以上面为例,设置好之后,启动NFS服务
[root@NFS-Server ~]# servicerpcbind start
Starting rpcbind: [ OK ]
[root@NFS-Server ~]# servicenfs start
Starting NFS services: [ OK ]
Starting NFS quotas: [ OK ]
Starting NFS mountd: [ OK ]
Starting NFS daemon: [ OK ]
注意必须是先启动rpcbind再启动nfs。否则会报错,nfs无法启动过
[root@NFS-Server ~]# service rpcbindstop
Stopping rpcbind: [ OK ]
[root@NFS-Server ~]# service nfs restart
Shutting down NFS daemon: [ OK ]
Shutting down NFS mountd: [ OK ]
Shutting down NFS quotas: [ OK ]
Shutting down NFS services: [ OK ]
Starting NFS services: [ OK ]
Starting NFS quotas: Cannot registerservice: RPC: Unable to receive; errno = Connection refused
rpc.rquotad: unable to register(RQUOTAPROG, RQUOTAVERS, udp).
[FAILED]
Starting NFS mountd: [FAILED]
Starting NFS daemon: rpc.nfsd: writing fdto kernel failed: errno 111 (Connection refused)
rpc.nfsd: unable to set any sockets for nfsd
[FAILED]
4)在客户机上只需要安装nfs-utils即可,否则无法查看和挂载
[root@NFS-Client ~]# yum install nfs-utils�Cy
[root@NFS-Client ~]# showmount -e192.168.254.20
Export list for 192.168.254.20:
/share 192.168.254.0/24
[root@NFS-Client ~]# mount -t nfs192.168.254.20:/share /fuzj/
此时,客户端已经能正常使用挂载过来的共享目录,其中的权限问题可以根据实际要求进行设置。
但是,本次的挂载重启之后就失效了,需要设置开机自动挂载:
[root@NFS-Client ~]# echo"192.168.254.20:/share /fuzj nfs defaults 0 0" >> /etc/fstab
[root@NFS-Client ~]# tail -1 /etc/fstab
192.168.254.20:/share /fuzj nfs defaults 00
或者写入开机启动脚本中
[root@NFS-Client ~]# echo "mount -tnfs 192.168.254.20:/share /fuzj/" >> /etc/rc.local
[root@NFS-Client ~]# tail -1 /etc/rc.local
mount -t nfs 192.168.254.20:/share /fuzj/
5)Exportfs的用法:
exportfs命令:用于维护当前主机中NFS服务器的输出目录列表
exportfs �Crv使NFS服务器重新读取exports文件的设置,而不需重启NFS服务器
exportfs �Cauv 用于停止当前主机中NFS服务器的所有目录输出
exportfs �Cav 用于输出NFS服务器的所有共享目录
exportfs �Cv 显示输出列表同时,显示导出的设定参数
6) Mount挂载的用法:
命令格式:mount [-t vfstype][-o options] device dir
-t vfstype指定文件系统的类型,通常不必指定。mount 会自动选择正确的类型。常用类型有:
光盘或光盘镜像:iso9660
DOS fat16文件系统:msdos
Windows 9x fat32文件系统:vfat
Windows NT ntfs文件系统:ntfs
Mount Windows文件网络共享:smbfs
UNIX(LINUX) 文件网络共享:nfs
-o options 主要用来描述设备或档案的挂接方式。常用的参数有:
loop:用来把一个文件当成硬盘分区挂接上系统
ro:采用只读方式挂接设备
rw:采用读写方式挂接设备
iocharset:指定访问文件系统所用字符集
device 要挂接(mount)的设备。
dir设备在系统上的挂接点(mount point)。
6)NFS服务的端口
NFS 用到的服务有 portmapper,nfs,rquotad,nlockmgr,mountd 通过命令 rpcinfo -p 可查看nfs使用的端口:
[root@NFS-Server ~]# rpcinfo-p
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
100011 1 udp 875 rquotad
100011 2 udp 875 rquotad
100011 1 tcp 875 rquotad
100011 2 tcp 875 rquotad
100005 1 udp 56539 mountd
100005 1 tcp 53349 mountd
100005 2 udp 53899 mountd
100005 2 tcp 59989 mountd
100005 3 udp 47966 mountd
100005 3 tcp 55849 mountd
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 47039 nlockmgr
100021 3 udp 47039 nlockmgr
100021 4 udp 47039 nlockmgr
100021 1 tcp 35091 nlockmgr
100021 3 tcp 35091 nlockmgr
100021 4 tcp 35091 nlockmgr
其中 portmapper,nfs 服务端口是固定的分别是 111和2049;
另外 rquotad,nlockmgr,mountd 服务端口是随机的。由于端口是随机的,这导致防火墙无法设置
这时需要配置/etc/sysconfig/nfs 使 rquotad,nlockmgr,mountd的端口固定。
RQUOTAD_PORT=800
LOCKD_TCPPORT=30000
LOCKD_UDPPORT=30001
MOUNTD_PORT=900
注意填写的端口不要和系统其他的服务端口冲突
改完之后,重启nfs服务,继续查看,发现端口已经改变,而且已经固定。
[root@NFS-Server ~]# rpcinfo-p
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
100011 1 udp 800 rquotad
100011 2 udp 800 rquotad
100011 1 tcp 800 rquotad
100011 2 tcp 800 rquotad
100005 1 udp 900 mountd
100005 1 tcp 900 mountd
100005 2 udp 900 mountd
100005 2 tcp 900 mountd
100005 3 udp 900 mountd
100005 3 tcp 900 mountd
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 30001 nlockmgr
100021 3 udp 30001 nlockmgr
100021 4 udp 30001 nlockmgr
100021 1 tcp 30000 nlockmgr
100021 3 tcp 30000 nlockmgr
100021 4 tcp 30000 nlockmgr
输入一下防火墙规则,允许nfs通过防火墙
iptables -I INPUT -p tcp --dport 111 -jACCEPT
iptables -I INPUT -p udp --dport 111 -jACCEPT
iptables -I INPUT -p tcp --dport 2049 -jACCEPT
iptables -I INPUT -p udp --dport 2049 -jACCEPT
iptables -I INPUT -p tcp --dport 900 -jACCEPT
iptables -I INPUT -p udp --dport 900 -jACCEPT
iptables -I INPUT -p tcp --dport 800 -jACCEPT
iptables -I INPUT -p udp --dport 800 -jACCEPT
iptables -I INPUT -p tcp --dport 30000 -jACCEPT
iptables -I INPUT -p udp --dport 30001 -jACCEPT
iptables -I INPUT -p tcp --dport 662 -jACCEPT
iptables -I INPUT -p udp --dport 662 -jACCEPT
NFS服务器必须开启的2个服务:nfs、rpcbind
NFS客户端要实现开机自动挂载,必须开启netfs服务
如果要实现开机自动启动,建议别把防火墙启动添加到/etc/rc.local中,否则在启动的时候由于防火墙的限制,依然会卡在守护进程那里,导致无法进入系统。切记。解决方法我在进一步研究中!
NFS关于selinux的设置
Setsebool�CP allow_gssd_read_tmp 1
Setsebool�CP allow_nfsd_anon_write 1
Setsebool�CP nfs_export_all_ro 1
Setsebool�CP nfs_export_all_rw 1
Setsebool�CP use_nfs_home_dirs 1