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是否关闭