Centos 下安装配置NFS服务器

一.安装 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

发表评论

电子邮件地址不会被公开。 必填项已用 * 标注