NFS==network file system 网络文件系统
nfs它允许一个系统在网络上与他人共享目录和文件,通过使用nfs,用户和程序可以像访问本地的文件一样去访问远程的文件
比如我们有三台机器A B C,它们需要访问同一个目录,而这个目录中都是图片,传统的做法呢把这些图片分别放到 A B C上,如果一旦某一个,A上发生了改变,那你需要把改变的东西同步到B C上,这样做,非常非常地繁琐,也比较浪费磁盘空间,更浪费带宽资源,那么,我们有一种方法:我们可以在比如A上去搭建一个NFS服务,把A上的一个目录同时共享给B 和 C,那么B和C把A共享的目录放在自己的本地上,那这个动作叫做挂载,那这个时候,在用户看来,A B C它们会同时存在一个一样的目录,里面的文件也是一样的,去改动任何一个服务器上的该目录下的文件,那么其他两个服务器都会跟着改,这就是NFS的优势。
服务端
## 安装nfs
[root@wy ~]# yum install -y nfs-utils rpcbind
解释说明:
rpcbind 是用来进行通信,也就是你想使用nfs这个服务,要想客户端和服务端通信,必须要有rpcbind
## 配置共享目录
[root@wy ~]# vim /etc/exports
/mnt 192.168.219.128(rw,sync,all_squash)
共享目录使用绝对路径 可以访问者ip、网段或域名访问客户端的操作权限(参数1,参数2)
注意:共享目录注意本地目录权限,默认客户端访问NFS通过nfsnobody用户操作共享目录,设置共享目录的属主为nfsnobody用户;
解释说明:
NFS服务端配置参数
rw:读写;
ro:只读;
async:异步,数据写入内存返回成功,速度快,多并发时放入队列中
sync:同步,写入磁盘返回成功;
anonuid:指定UID 如anonuid=65534;
anongid:指定GID 如anongid=65534;
all_squash:共享目录身份统一拥有相同权限。UID、GID统一为nfsnobody,对多客户端同是共享很重要;
root_squash:root访问映射成匿名用户(uid=0映射uid=naonymus uid);
no_all_squash:关闭all_squash;
no_root_squash:关闭,过时不用;
## 启动rpcbind
[root@wy ~]# /etc/init.d/rpcbind start
## 启动nfs
[root@wy ~]# /etc/init.d/nfs start
启动 NFS 服务: [确定]
关掉 NFS 配额: [确定]
启动 NFS mountd: [确定]
启动 NFS 守护进程: [确定]
正在启动 RPC idmapd: [确定]
## 修改/mnt权限为777
[root@wy ~]# chmod 777 /mnt
解释说明:
不修改的话,客户端那边没有权限写入
客户端
## 安装nfs-utils
[root@y2 ~]# yum install -y nfs-utils
## 查看NFS共享挂载信息
[root@y2 ~]# showmount -e 192.168.219.129
Export list for 192.168.219.129:
/mnt 192.168.219.128
## 挂载到/opt下
[root@y2 ~]# mount -t nfs -o nfsvers=3 192.168.219.129:/mnt /opt
## 查看挂载
[root@y2 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_wy-lv_root 18G 3.7G 13G 23% /
tmpfs 242M 0 242M 0% /dev/shm
/dev/sda1 485M 34M 426M 8% /boot
192.168.219.129:/mnt 18G 3.7G 13G 23% /opt
## 创建文件
[root@y2 opt]# touch 1.txt
touch: 无法创建"1.txt": 权限不够
解释说明:
是因为刚开始服务端/mnt没有写入权限
[root@y2 opt]# touch 1.txt
[root@y2 opt]# ls -l
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 11月 12 22:38 1.txt
解释说明:
生成的文件的属主、属组是nfsnobody
客户端看到挂载目录下的属主、属主都是nfsbody,在实际的应用当中,并不是要映射到这个用户的,可以是其他的用户,怎么去指定用户呢?
服务端
## 编辑配置文件
[root@wy ~]# vim /etc/exports
/mnt 192.168.219.128(rw,sync,all_squash,anonuid=501,anongid=501)
解释说明:
限制所有用户,指定501用户(本机的是php-fpm)
## 重启nfs
[root@wy ~]# /etc/init.d/nfs restart
解释说明:
还有一种更快捷重启nfs的方法:exportfs -arv
客户端
## 卸载
[root@y2 ~]# umount /opt
## 挂载
[root@y2 ~]# mount -t nfs -onolock,nfsvers=3 192.168.219.129:/mnt /opt
解释说明:
由于nfs与centos6可能有点不兼容,在/opt里创建时总是卡住,就使用了-onolock,nfsvers=3指定3版本,默认4版本
也可以mount -t nfs4 192.168.219.129:/mnt /opt,它会把所有用户映射到nfsnobody。
## 创建文件并查看所指定的用户
[root@y2 ~]# cd /opt
[root@y2 opt]# touch c.txt
[root@y2 opt]# ls -l
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 11月 13 15:03 b.txt
-rw-r--r-- 1 php-fpm php-fpm 0 11月 13 16:01 c.txt
配置NFS生产环境重要思想
1、确保所有服务器对NFS共享目录具有相同权限
a. all_squash将所有客户端都统一为匿名用户;
b. anonuid、anongid指定uid、gid;
2、所有客户端与服务端都需有一个相同的uid和gid的用户即nfsnobody(uid必须相同)
NFS排错思路
1、服务端开启/etc/init.d/rpcbind
2、服务端在rpcbind开启后启动/etc/init.d/nfs
3、挂载没有反应
a. ping通
b. telnet ip 111
如果不通,服务端telnet自己ip如果通说明客户端无法访问,检查iptables;
或 服务端showmount -e localhost;
或 本地挂载mount -t nfs ip:share_dir mount_dir,检查本地服务是否正常;
c. /etc/init.d/iptables是否关闭