NFS是Network File System的缩写。NFS最早由Sun公司开发,分2,3,4三个版本,2和3由Sun起草开发,4.0开始Netapp公司参与并主导开发,最新为4.1版本。NFS数据传输基于RPC协议,RPC为Remote Procedure Call的简写。NFS应用场景是:A,B,C三台机器上需要保证被访问到的文件是一样的,A共享数据出来,B和C分别去挂载A共享的数据目录,从而B和C访问到的数据和A上的一致.
nfs服务不监听端口,是通过rpcbind服务开放111端口进行通信的。在centos7上实现rpc协议的服务是rpcbind,之前的centos版本是portmap,这两都是rpc的软件实现。
14.2 NFS服务端安装配置
安装NFS:yum install -y nfs-utils rpcbind
客户端只需要安装: yum install nfs-utils
编辑服务端的配置文件vim /etc/exports,加入如下内容:
/home/nfstestdir 192.168.133.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
保存配置文件后,执行如下准备操作
mkdir /home/nfstestdir #创建共享目录
chmod 777 /home/nfstestdir #更多权限
systemctl start rpcbind #启动rpcbind服务
systemctl start nfs #启动nfs服务,其实启动nfs服务时rpc相关服务也会启动
systemctl enable rpcbind #设置开机启动rpcbind
systemctl enable nfs #设置开机启动nfs,服务端设置,客户端不需要
14.3 NFS配置选项
nfs配置文件很简单,第一列是共享的目录,第二列是允许访问的ip和权限。括号中列出了访问权限,具体的有:
rw 读写
ro 只读
sync 同步模式,内存数据实时写入磁盘
async 非同步模式
no_root_squash 客户端挂载NFS共享目录后,root用户不受约束,权限很大
root_squash 与上面选项相对,客户端上的root用户收到约束,被限定成某个普通用户
all_squash 客户端上所有用户在使用NFS共享目录时都被限定为一个普通用户
anonuid/anongid 和上面几个选项搭配使用,定义被限定用户的uid和gid
配置好后使用showmount -e 192.168.133.130查看服务端共享的目录,该ip为NFS服务端ip。如果不能显示,则可能是服务端rpcbind服务没有启动,也可能是防火墙、selinux的原因。测试时可以先把防火墙关掉。
mount -t nfs 192.168.133.130:/home/nfstestdir /mnt挂载共享目录。-t选项指定使用nfs格式,没有的可能出现读写错误。然后使用df -h查看是否挂载成功,touch /mnt/linux.txt试验能否读写。ls -l /mnt/linux.txt,可以看到文件的属主和属组都为1000。
14.4 exportfs命令
nfs投入使用后要更改服务端配置,例如增加共享目录等,这时要先卸载客户端目录。否则会客户端相关进程会挂起。但是如果客户端比较多,操作就会很麻烦。这时就用到了exportfs命令。在服务端重新编辑nfs配置文件后执行exportfs命令,不用在客户端操作。常用选项:
-a 全部挂载或者全部卸载
-r 重新挂载
-u 卸载某一个目录
-v 显示共享目录
以下操作在服务端上
vim /etc/exports,增加/tmp/ 192.168.133.0/24(rw,sync,no_root_squash)。然后服务端执行exportfs -arv ,不用重启nfs服务,配置文件就会生效。
以下操作在客户端
mkdir /alinux
mount -t nfs -onolock 192.168.133.130:/tmp /alinux
touch /aminglinux/test.txt
ls -l !$ #注意属主属组
14.5 NFS客户端问题
NFS 4版本会有该问题
客户端挂载共享目录后,不管是root用户还是普通用户,创建新文件时属主、属组为nobody。尤其是在centos6中会出现,解决方法有两个:
一是,客户端挂载时加上 -o nfsvers=3,如果客户端已经挂载,则使用-oremount,nfsvers=3重新挂载即可
二是,客户端和服务端都编辑idmapd.conf文件vim /etc/idmapd.conf,把“#Domain = local.domain.edu” 改为 “Domain = xxx.com” (这里的xxx.com,随意定义吧),然后再重启rpcidmapd服务。centos7上没有rpcidmapd服务,重启rpcbind即可