安装 NFS 服务器
安装 NFS 服务器所需的软件包:
# yum install nfs-utils nfs4-acl-tools portmap
配置 NFS 共享
和安装任何其他服务器软件一样,安装完 NFS 服务后就需要对 NFS 服务进行配置。输出服务器端的某个目录,以便 NFS 客户端能挂载和访问到这个目录:
# vi /etc/exports /bak 172.16.20.11(rw,sync,fsid=0) 172.16.20.12(rw,sync,fsid=0)
/bak1 192.168.1.1(rw,root_squash,anonuid=99,anongid=99,no_all_squash,sync) /bak2 192.168.1.2(rw,root_squash,no_all_squash,sync)
172.16.20.11 和 172.16.20.12 上面的用户可以挂载 NFS 服务器(172.16.20.1)上的 /bak 目录到自己文件系统里;rw 在这里表示可读可写。
把 NFS 服务加入系统启动脚本并且手动启动 NFS 服务:
# chkconfig nfs on # chkconfig portmap on # /etc/init.d/portmap start # /etc/init.d/nfs start
确认 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 服务器是否输出我们想共享的目录 /bak:
# exportfs /bak 172.16.20.11 /bak 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 客户端
首先启动 portmap:
# /etc/init.d/portmap start
检查 NFS 服务器端是否有目录共享:
# showmount -e 172.16.20.1 Export list for 172.16.20.1: /bak 172.16.20.11,172.16.20.12
使用 mount 挂载服务器端的目录 /bak 到客户端某个目录下:
# mkdir /home/vpsee/bak # mount -t nfs4 172.16.20.1:/ /home/vpsee/bak/ # df -H Filesystem Size Used Avail Use% Mounted on ... 172.16.39.1:/ 232G 23G 198G 11% /home/vpsee/bak
在 /etc/fstab 中挂载 nfs 文件系统:
# vi /etc/fstab 172.16.20.1:/ /bak nfs4 soft,intr,rsize=8192,wsize=8192,nosuid # chkconfig netfs on
在成功挂载服务器端的 /bak 后就可以在客户端里操作了,这时候写文件或者拷贝文件的时候会遇到一个权限问题报错 : Permission denied,这是因为上面我们在服务器端建立了 /bak 但是 /bak 的 owner 是 root:root,而客户端的正在访问 NFS 的用户是 vpsee,NFS 要求服务器端和客户端的 UID 和 GID 必须一致,所以要在 NFS 服务器端修改 /bak 的权限和所属:
# chown -R vpsee:vpsee /bak
注:如果报权限不够,还需要将NFS服务器上共享出来的目录设为777
注意使用 NFS 的时候,客户端的用户 UID 和 GID 必须和服务器端的 UID 和 GID 完全符合,否则会造成权限错误。在小规模用户的情况下,我们可以偷懒通过在客户和服务器两端同时建立相同的用户和组来解决这个问题,但是在大规模用户情况下最好的办法是利用 NIS 或者 OpenLDAP 来统一管理用户,做到一次登录,到处访问。
Troubleshooting
1、在上面的操作过程中,如果你不幸遇到下面这个问题的话,可以尝试更新 Linux kernel 或通过打开 IPv6 来解决这个问题,这是1个 bug:
# mount -t nfs4 172.16.20.1:/ /home/vpsee/bak/ mount.nfs4: Cannot allocate memory
2、如果遇到如下问题,可能是因为你的 mount -t nfs 使用的是 nfsv3 协议,需要明确指出使用 nfsv4 协议挂载 mount -t nfs4:
# mount -t nfs 172.16.20.1:/ /home/vpsee/bak/ mount: mount to NFS server '172.16.20.1' failed: RPC Error: Program not registered. # mount -t nfs4 172.16.20.1:/ /home/vpsee/bak/
3、是使用autofs自动挂载NFS分区:
# vi /etc/auto.master /bak /etc/auto.nfs # vi /etc/auto.nfs bak -rw,bg,soft,rsize=32768,wsize=32768 192.168.1.1:/bak/bak1