CentOS下搭建NFS服务器总结
环境介绍:
- 服务器: 192.168.0.100
- 客户机: 192.168.0.101
安装软件包:
- 服务器和客户机都要安装nfs 和 rpcbind 软件包:
yum -y install nfs-utils rpcbind
- 可用以下命令查看,是否已经安装了nfs-uitls rpcbind这两个软件包:如果查询结果如下面所示,说明已经安装过了:
[root@Server1 ~]# rpm -qa|grep nfs
nfs-utils-1.2.3-39.el6.x86_64
nfs4-acl-tools-debuginfo-0.3.3-6.el6.x86_64
nfs-utils-debuginfo-1.2.3-39.el6.x86_64
nfs-utils-lib-devel-1.1.5-6.el6.x86_64
nfs-utils-lib-1.1.5-6.el6.x86_64
nfs-utils-lib-debuginfo-1.1.5-6.el6.x86_64
nfs4-acl-tools-0.3.3-6.el6.x86_64
[root@Server1 ~]# rpm -qa|grep rpcbind
rpcbind-0.2.0-11.el6.x86_64
服务器端配置:
在服务器上创建NFS共享目录:mkdir /usr/local/test
设置共享目录的读写权限: chmod 666 /usr/local/test
编辑export文件: vi /etc/exports
/usr/local/test/ 192.168.0.101(rw,no_root_squash,no_all_squash,sync)
或/usr/local/test/ *(rw,sync,anonuid=0,anongid=0)
注意地址和参数表之间没有空格。如果下面设置的mountd端口大于1024,需要在参数表里加入参数:insecure
- 使配置生效:
exportfs -r
注:配置文件说明:
/usr/local/test/ 为共享的目录,使用绝对路径。
192.168.0.101(rw,no_root_squash,no_all_squash,sync) 为客户端的地址及权限,地址可以是一个网段(如:192.168.0.0/24),一个IP地址或者是一个域名,域名支持通配符,如:*.hpce.cn,地址与权限中间没有空格。
权限说明:
rw:read-write,可读写;
ro:read-only,只读;
sync:文件同时写入硬盘和内存;由于我们的日志需要同步写,所有用sync选项。
async:文件暂存于内存,而不是直接写入内存;
no_root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,也拥有root权限。显然开启这项是不安全的。
root_squash:NFS客户端连接服务端时如果使用的是root的话,那么对服务端分享的目录来说,拥有匿名用户权限,通常他将使用nobody或nfsnobody身份;
all_squash:不论NFS客户端连接服务端时使用什么用户,对服务端分享的目录来说都是拥有匿名用户权限;
anonuid:匿名用户的UID值,通常是nobody或nfsnobody,可以在此处自行设定;
anongid:匿名用户的GID值。
- 启动服务rpcbind、nfs服务:
service rpcbind start
service nfs start
服务器端防火墙设置(NFS 开启防墙配置):
修改/etc/services文件:
配置rpc,nfsd,rquotad,mountd使用的端口。配置之前先检查一下是否已经配置过了,已经配过的就不用配置了。没有配置的,要分配一个在此文件中未被使用的端口号。我的机器默认配置了:rpc、nfsd、rquotad
mountd: 没有配置。手工加上:
mountd 48620/tcp #rpc.mountd
mountd 48620/udp #rpc.mountd
如果mountd占用端口大于 1024,在文件 /etc/exports里需要加入参数insecure。如: 192.168.0.100(insecure,rw,async,root_squash,no_all_squash)
重启NFS服务:
service nfs restart
在防火墙配置文件里开放上面配置的端口:
打开文件:vim /etc/sysconfig/iptables
加入红色部分的内容:
-A INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
#rpc
-A INPUT -m state –state NEW -m tcp -p tcp –dport 121 -j ACCEPT
-A INPUT -m state –state NEW -m udp -p udp –dport 121 -j ACCEPT
#nfsd
-A INPUT -m state –state NEW -m tcp -p tcp –dport 2049 -j ACCEPT
-A INPUT -m state –state NEW -m udp -p udp –dport 2049 -j ACCEPT
#rquotad
-A INPUT -m state –state NEW -m tcp -p tcp –dport 875 -j ACCEPT
-A INPUT -m state –state NEW -m udp -p udp –dport 875 -j ACCEPT
#mountd
-A INPUT -m state –state NEW -m tcp -p tcp –dport 48620 -j ACCEPT
-A INPUT -m state –state NEW -m udp -p udp –dport 48620 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
客户端挂载:
创建挂载目录: mkdir /usr/local/test
查看服务器抛出的共享目录信息:
showmount -e 192.168.0.100
Export list for 192.168.0.100:
/usr/local/test 192.168.0.101
如果显示:rpc mount export: RPC: Unable to receive; errno = No route to host,则需要在服务端关闭防火墙。
为了提高NFS的稳定性,使用TCP协议挂载,NFS默认用UDP协议:
mount -t nfs 192.168.0.100:/usr/local/test /usr/local/test -o proto=tcp -o nolock
挂载成功后即可访问共享的NFS文件系统了。
卸载已挂在的NFS
umount /usr/local/test
查看挂载目录的信息:
fuser -m -v /usr/local/test
rpcinfo –p ip /// 查看主机的rpc服务和端口
showmount –e ip /// 查看主机抛出的nfs列表
nfs其它功能:
- service nfslock start 允许NFS客户端在服务器上对文件加锁.这个进程对应于nfslock服务
遇到的问题:
- clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
2.rpcinfo: can’t contact portmapper: RPC: Remote system error - No route to host
解决办法:服务器上执行: rpcinfo -p 192.168.0.100
把列出来的端口添加到 /etc/sysconfig/iptables 文件,然后重启防火墙就可以了
下面配置nfs所有不同权限,表示如下:
ro:表示只读权限
rw:读写权限
sync:数据同步写内存硬盘
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
all_squash:不管你访问共享目录的用户是谁,都必须压缩为nfsnobody用户的权限;
no_all_squash(默认):访问用户先与本机用户匹配,匹配失败后再映射为匿名用户或用户组;
root_squash: 如果访问共享目录是root的权限用户,对共享目录的权限会被压缩为nfsnobody用户的权
no_root_squash:来访的root用户保持root帐号权限;
no_squash:访问共享目录时,用户如果是root权限,对共享目录也具有root权限(最好不要设置,增加服务安全隐患,稍后再提)
anonuid=
anongid=
【anonuid/anongid :要和root_squash 以及 all_squash一同使用,用于指定使用NFS的用户限定后的uid和gid,前提是本机的/etc/passwd中存在这个uid和gid】
secure(默认):限制客户端只能从小于1024的tcp/ip端口连接服务器;
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
wdelay(默认):检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率;
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree_check(默认) :若输出目录是一个子目录,则nfs服务器将检查其父目录的权限;
no_subtree_check :即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
nfs开机自动挂载
#系统服务未完全启动,挂载会失败,在系统启动以后,再挂载
[root@app adam]# vi /etc/rc.local
#添加
sleep 30
mount -t nfs 192.168.0.1:/home/adam/static /home/adam/static
#赋予可执行权限
[root@app adam]# chmod +x /etc/rc.local
或设置客户端开机自动挂载服务端NFS服务(这种方式可能失败,使用7.nfs开机自动挂载方法)
[root@app adam]# vi /etc/fstab
192.168.0.1:/home/adam/static /home/adam/static nfs defaults 0 0