一.安装 NFS 服务器
安装 NFS 服务器所需的软件包,CentOS6之后已经没有portmap这个包了,改为包rpcbind
# yum install nfs-utils nfs4-acl-tools portmap (centos5)
# yum install nfs-utils nfs4-acl-tools rpcbind (centos6)
二.配置 NFS 共享
和安装任何其他服务器软件一样,安装完 NFS 服务后就需要对 NFS 服务进行配置。输出服务器端的某个目录,以便 NFS 客户端能挂载和访问到这个目录:
#vi /etc/exports
/nfsfile 172.16.20.11(rw,sync,fsid=0) 172.16.20.12(rw,sync,fsid=0)
172.16.20.11 和 172.16.20.12 上面的用户可以挂载 NFS 服务器(172.16.20.1)上的 /nfsfile 目录到自己文件系统里;rw 在这里表示可读可写。
把 NFS 服务加入系统启动脚本并且手动启动 NFS 服务:
# chkconfig nfs on
# chkconfig rpcbind on
# service rpcbind restart
# service nfs restart
# service nfslock restart
确认 NFSv4 服务器成功运行:
# rpcinfo -p
program vers proto port
100000 2 tcp 111 portmapper
100000 2 udp 111 portmapper
100003 2 udp 2049 nfs
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
...
100005 3 tcp 750 mountd
检查 NFS 服务器是否输出我们想共享的目录 /nfsfile:
# exportfs
/nfsfile 172.16.20.11
/nfsfile 172.16.20.12
注意 NFS 使用 portmap,而且新版本的 portmap 使用 hosts.deny 和 hosts.allow 文件来控制访问源,修改这2个配置文件以便 NFS 客户端能正常连接到服务器:
# vi /etc/hosts.deny
portmap:ALL
# vi /etc/hosts.allow
portmap:172.16.38.0/255.255.254.0
配置防火墙
启动nfs服务时候会有很多rpc服务,nfs默认的端口是2049,在iptables中开启后并不管用,客户端没法挂载,原因是那些rpc服务的端口在iptables中没有开启。
启动nfs服务后,看看都有哪些rpc服务和端口
# /etc/init.d/nfs start
# rpcinfo -p 127.0.0.1
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 52050 status
100024 1 tcp 44363 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 45579 nlockmgr
100021 3 udp 45579 nlockmgr
100021 4 udp 45579 nlockmgr
100021 1 tcp 58850 nlockmgr
100021 3 tcp 58850 nlockmgr
100021 4 tcp 58850 nlockmgr
100005 1 udp 57056 mountd
100005 1 tcp 55732 mountd
100005 2 udp 52383 mountd
100005 2 tcp 40116 mountd
100005 3 udp 58190 mountd
100005 3 tcp 54163 mountd
一堆的服务和端口号,重启nfs服务后端口会随机生成,和前面vsftpd问题一样,那我们就固定一下这些端口
# vim /etc/sysconfig/nfs
添加:
RQUOTAD_PORT=3001
LOCKD_TCPPORT=3002
LOCKD_UDPPORT=3002
MOUNTD_PORT=3003
STATD_PORT=3004
重启nfs服务
# /etc/init.d/nfs restart
看端口有没有固定
# rpcinfo -p 127.0.0.1
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 52050 status
100024 1 tcp 44363 status
100011 1 udp 3001 rquotad
100011 2 udp 3001 rquotad
100011 1 tcp 3001 rquotad
100011 2 tcp 3001 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 3002 nlockmgr
100021 3 udp 3002 nlockmgr
100021 4 udp 3002 nlockmgr
100021 1 tcp 3002 nlockmgr
100021 3 tcp 3002 nlockmgr
100021 4 tcp 3002 nlockmgr
100005 1 udp 3003 mountd
100005 1 tcp 3003 mountd
100005 2 udp 3003 mountd
100005 2 tcp 3003 mountd
100005 3 udp 3003 mountd
100005 3 tcp 3003 mountd
已经改变,那就在iptables中开启端口
# iptables -I INPUT 1 -p tcp -m multiport --dport 111,2049,3001:3004 -j ACCEPT
# iptables -I INPUT 1 -p udp -m multiport --dport 111,2049,3001:3004 -j ACCEPT
好了,可以在客户端挂载了。
使用 NFS 客户端
注释掉PMAP_ARGS=-l
#vi /etc/sysconfig/portmap
首先启动 portmap:
# /etc/init.d/portmap restart
rpc.mountd
检查 NFS 服务器端是否有目录共享:
# showmount -e 172.16.20.1
Export list for 172.16.20.1:
/nfsfile 172.16.20.11,172.16.20.12
使用 mount 挂载服务器端的目录 /nfsfile 到客户端某个目录下:
# mkdir /home/nfsfile/
# mount -t nfs4 67.198.175.218:/ /home/nfsfile/
# df -H
Filesystem Size Used Avail Use% Mounted on
...
172.16.39.1:/ 232G 23G 198G 11% /home/nfsfile
umount /home/nfsfile/ #取消挂载
如果遇到mount: can't get address for server的问题,请修改/etc/hosts,添加主机名
在 /etc/fstab 中挂载 nfs 文件系统:
# vi /etc/fstab
67.198.175.218:/ /nfsfile nfs4 soft,intr,rsize=8192,wsize=8192,nosuid
# chkconfig netfs on
在成功挂载服务器端的 /nfsfile 后就可以在客户端里操作了,这时候写文件或者拷贝文件的时候会遇到一个权限问题报错 : Permission denied,这是因为上面我们在服务器端建立了 /nfsfile 但是 /nfsfile 的 owner 是 root:root,而客户端的正在访问 NFS 的用户是 vpsee,NFS 要求服务器端和客户端的 UID 和 GID 必须一致,所以要在 NFS 服务器端修改 /nfsfile 的权限和所属:
# chown -R vpsee:vpsee /nfsfile
注意使用 NFS 的时候,客户端的用户 UID 和 GID 必须和服务器端的 UID 和 GID 完全符合,否则会造成权限错误。在小规模用户的情况下,我们可以偷懒通过在客户和服务器两端同时建立相同的用户和组来解决这个问题,但是在大规模用户情况下最好的办法是利用 NIS 或者 OpenLDAP 来统一管理用户,做到一次登录,到处访问。
在XenServer 上挂载 NFS 服务器上的目录
xe-mount-iso-sr 67.198.175.218:/nfsfile
Troubleshooting
1、在上面的操作过程中,如果你不幸遇到下面这个问题的话,可以尝试更新 Linux kernel 或通过打开 IPv6 来解决这个问题,这是1个 bug:
# mount -t nfs4 172.16.20.1:/ /home/nfsfile
mount.nfs4: Cannot allocate memory
2、如果遇到如下问题,可能是因为你的 mount -t nfs 使用的是 nfsv3 协议,需要明确指出使用 nfsv4 协议挂载 mount -t nfs4:
# mount -t nfs 172.16.20.1:/ /home/nfsfile
mount: mount to NFS server '172.16.20.1' failed: RPC Error: Program not registered.
# mount -t nfs4 172.16.20.1:/ /home/nfsfile