NFS搭建与自动挂载
1、NFS文件共享服务器:
同步外网源,搭建共享服务,通过自动挂载实现挂载外网源,建立本地仓库
NFS是network file sytem的缩写,他最大的特点就是可以通过网络,让不同的机器,不同的系统实现文件共享。NFS客户端可以将NFS服务器共享的目录挂载在本地的文件系统中,访问目录就如同访问自己本地目录一样。

1.1 NFS工作原理:
1. 首先NFS服务器端开启rpcbind;
2. 然后服务端开启NFS服务,这时NFS的各项功能都需要向RPC服务注册,这时rpc会通知portmap模块将可用的端口分配给statd,rquotad等;
3. 然后NFS客户端RPC服务就会通过网络向NFS服务端的RPC服务的111端口发出NFS文件存取功能的
询问请求。
4. NFS服务端的RPC服务找到对应的已注册的NFSdaemon端口后,通知NFS客户端的RPC服务。
5. 此时NFS客户端就可获取到nfs服务端各个进程的正确端口,然后通过客户端rpc就直接与NFS服务
器的rpc进行存取数据了(rpc知道了nfs的具体端口,就可以实现远程调用,即传输)。

1.2 NFS安装部署:
服务器和客户端都关闭防火墙,装好nfs服务组件:

nfs服务端:192.168.112.6
nfs客户端:192.168.112.5
# 关闭防火墙:
systemctl stop firewalld && systemctl disable firewalld
iptables -L# 临时关闭selinux:
setenforce 0
getenforce 
# 永久关闭selinux:
sed -i 's/=enforcring/=disabled/' /etc/selinux/config# 安装nfs服务组件:
yum -y install nfs-utils
rpm -q nfs-utils1.2.1 配置服务端:
nfs服务端:192.168.112.6新建共享文件夹
mkdir -p /data/jfedu
编辑/etc/exports文件
/data/jfedu  192.168.75.0/24(rw,sync)
# 格式:
# /data/jfedu  要共享的目录,需要存在
# 192.168.75.0/24 谁能挂载使用,可以是网段,也可以指定具体ip
# (rw,sync) 挂载的一些参数,rw表示挂载为可读可写,sync表示同步1.2.2 配置客户端:
可用showmount搜索网络中可用的共享文件
showmount -e 192.168.112.6


创建目录,用于挂载
mkdir /data/nfs
挂载

mount -t nfs 192.168.75.130:/data/jfedu /data/nfs
#推荐使用:
mount -t nfs -o soft,timeo=1  192.168.112.6:/data/jfedu /data/nfs
soft: 软挂载,遇到报错会终止挂载,并返回信息,默认是硬挂载,一直尝试挂载。
timeo: 超时时间,如果不设置,一直链接,可以设置小点

挂载完成之后,进入目录,可能会发现无法对目录中的文件进行修改。
这主要是因为客户端访问服务器时,身份被压缩成nobody,相对服务器文件系统来说,就是其他用户。
所以要想编辑,需要在服务端对文件授权或者更改exports文件,设置no_root_squash(不压缩客户端root身份)。

1.3 解读exports文件:
/etc/exports文件内容格式:
<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]

[root@master ~]# vim /etc/exports
/data/jfedu 192.168.112.5(rw,no_root_squash,sync)
/data/jfedu 192.168.112.7(ro)

1.3.1 . 输出目录:
输出目录是指NFS系统中需要共享给客户机使用的目录;
1.3.2 . 客户端:
客户端是指网络中可以访问这个NFS输出目录的计算机
客户端常用的指定方式
• 指定ip地址的主机:192.168.0.200
• 指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
• 指定域名的主机:www.jfedu.com
• 指定域中的所有主机:*.jfedu.com
• 所有主机:*
1.3.3 . 选项:
选项用来设置输出目录的访问权限、用户映射等。

[root@localhost ~]# exportfs -v
/data/jfedu 
192.168.75.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squa
sh,no_all_squash)

NFS主要有3类选项:
访问权限选项

•	ro:设置输出目录只读
•	rw:设置输出目录读写
用户映射选项
•	all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody)不管访问者是什么身份,包括root,全部压缩至匿名用户。;
•	no_all_squash:与all_squash取反(默认设置),保留访问用户的身份uid以及gid,一般只能查看,不能修改,权限问题,但是可以强制保存。;
•	root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置)如果客户端用root身份访问,则被压缩成nobody,权限也将受到限制。;
•	no_root_squash:与rootsquash取反,也就是不压缩,客户端使用root身份登录,全有所有权限,很危险。;
•	anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
•	anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
其它选项
•	secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
•	insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
•	sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
•	async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
•	wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
•	no_wdelay:若有写操作则立即执行,应与sync配合使用;
•	subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
•	no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;1.4 NFS的常用目录
/etc/exports			NFS服务的主要配置文件
/usr/sbin/exportfs			NFS服务的管理命令
/usr/sbin/showmount		客户端的查看命令
/var/lib/nfs/etab			记录NFS分享出来的目录的完整权限设定值
/var/lib/nfs/xtab			记录曾经登录过的客户端信息1.5 NFS的共享权限和访问控制
1.5.1 NFS有很多默认的参数,打开/var/lib/nfs/etab 查看分享出来的/data/nfs/ 完整权限设定值。
[root@localhost nfs]# cat /var/lib/nfs/etab
/data/jfedu  192.168.112.5(ro,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,ro,secure,root_squash,no_all_squash)
/data/jfedu  192.168.112.7(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)
默认就有sync,wdelay,hide 等等,no_root_squash 是让root保持权限,root_squash 是把root映射成nobody,no_all_squash 不让所有用户保持在挂载目录中的权限。所以,root建立的文件所有者是nfsnobody。[root@localhost ~]# cd /data/nfs
[root@localhost nfs]# mkdir lyd
mkdir: cannot create directory ‘lyd’: Permission denied
[root@localhost nfs]# mkdir lyd
[root@localhost nfs]# touch 1.txt
[root@localhost nfs]# ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug  4 15:27 1.txt
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Aug  4 15:26 lyd[root@localhost nfs]# useradd bob
[root@localhost nfs]# passwd bob
[root@localhost nfs]# su - bob
[bob@localhost ~]$ cd /mnt/nfs
[bob@localhost nfs]$ ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug  4 15:27 1.txt
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Aug  4 15:26 lyd
[bob@localhost nfs]$ mkdir bob
[bob@localhost nfs]$ touch bob.txt
[bob@localhost nfs]$ ll
total 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 Aug  4 15:27 1.txt
drwxrwxr-x. 2 bob       bob       6 Aug  4 15:31 bob
-rw-rw-r--. 1 bob       bob       0 Aug  4 15:31 bob.txt
drwxr-xr-x. 2 nfsnobody nfsnobody 6 Aug  4 15:26 lyd1.5.2 关于权限的分析
  1. 客户端连接时候,对普通用户的检查
    a. 如果明确设定了普通用户被压缩的身份,那么此时客户端用户的身份转换为指定用户;
    b. 如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;
    c. 如果没有明确指定,也没有同名用户,那么此时 用户身份被压缩成nfsnobody;
  2. 客户端连接的时候,对root的检查
    a. 如果设置no_root_squash,那么此时root用户的身份被压缩为NFS server上面的root;
    b. 如果设置了all_squash、anonuid、anongid,此时root 身份被压缩为指定用户;
    c. 如果没有明确指定,此时root用户被压缩为nfsnobody;
    d. 如果同时指定no_root_squash与all_squash 用户将被压缩为 nfsnobody,如果设置了anonuid、anongid将被压缩到所指定的用户与组; 
1.6 报错处理:
1.6.1 客户端挂载时报错bad superblock:
[root@node2 ~]# mount 192.168.75.121:/data/jfedu /mnt
mount: wrong fs type, bad option, bad superblock on 192.168.75.121:/data/jfedu,
   missing codepage or helper program, or other error
   (for several filesystems (e.g. nfs, cifs) you might
   need a /sbin/mount.<type> helper program)
# 解决办法:
yum install nfs-utils -y1.6.2 客户端挂载时报错access denied:
[root@node2 ~]#mount 192.168.75.121:/data/jfedu /mnt
mount.nfs: access denied by server while mounting 192.168.75.121:/data/jfedu
ps: 客户端IP不在/etc/exports文件中,会报此错。1.6.3 卸载时报错:
umount.nfs4: /data/jfedu: device is busy
# 解决办法:
umount -l /data/jfedu  强行解除挂载
或者使用
fuser -m /data/jfedu 将会显示使用这个模块的pid
fuser -mk /data/jfedu 将会直接kill那个pid1.6.4 使用showmount -e ip检测服务端服务器情况的是,会出现clnt_create: RPC: Program not registered
#这个错误,表示rpc程序为注册成功,解决方案就是:
以此关闭nfs和rpcbind
[root@localhost nfs]# systemctl stop nfs
[root@localhost nfs]# systemctl stop rpcbing
再依次启动服务:(注意先启动rpc)
[root@localhost nfs]# systemctl start rpcbind
[root@localhost nfs]# systemctl start nfs

1.7相关命令
1.7.1 exportfs
如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:
  # exportfs [-aruv]
  -a 全部挂载或卸载 /etc/exports中的内容
  -r 重新读取/etc/exports 中的信息 ,并同步更新/etc/exports、/var/lib/nfs/xtab
  -u 卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
  -v 在export的时候,将详细的信息输出到屏幕上。
具体例子:
  # exportfs -au 卸载所有共享目录,在NFS 服务器上使用,客户端没有作用。服务端执行后,客户端会卸载共享目录,代表umount
  # exportfs -rv 重新共享所有目录,并输出详细信息NFS服务端使用重新挂载。服务端执行后,客户端会重新挂载共享目录。
1.7.2 nfsstat
查看NFS的运行状态,对于调整NFS的运行有很大帮助。
1.7.3 rpcinfo
查看rpc执行信息,可以用于检测rpc运行情况的工具,利用rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些。
1.7.4 showmount
  -a 显示已经于客户端连接上的目录信息
  -e IP或者hostname 显示此IP地址分享出来的目录
1.7.5 netstat
可以查看出nfs服务开启的端口,其中nfs 开启的是2049,portmap 开启的是111,其余则是rpc开启的。
最后注意两点,虽然通过权限设置可以让普通用户访问,但是挂载的时候默认情况下只有root可以去挂载,普通用户可以执行sudo。
NFS server 关机的时候一点要确保NFS服务关闭,没有客户端处于连接状态!通过showmount -a 可以查看,如果有的话用kill killall pkill 来结束,(-9 强制结束)

总结:

1、安装 NFS服务
yum install -y nfs-utils
2、编译nfs配置文件
vi /etc/exports
/data/jfedu  192.168.75.0/24(rw,sync)
3、创建共享目录
mkdir -p /data/jfedu
4、启动NFS服务,先启动rpcbind 在启动nfs服务(服务端操作)
systemctl start rpcbind.service
systemctl start nfs.service
5、创建挂载目录
mkdir -p /data/nfs
6、挂载(客户端操作)
mount -t nfs 128.196.126.142:/home/ap/nas_a /home/ap/nas_a

2、自动挂载

nfs自动挂载技术:
autofs服务程序与mount命令不同之处在于它是一种守护进程,只有检测到用户试图访问一个尚未挂载
的文件系统时才自动的检测并挂载该文件系统。
autofs非常方便,主要有两点:
1、设置开机不一定要挂载的目录,当用的时候才实现自动挂载。
2、用户不使用自动挂载的目录一段的时间,会自动卸载。(默认时间为5分钟),可以在autofs.conf设置

2.1 安装autofs服务:
# 在客户端执行以下命令:
yum install autofs -y2.2 编辑/etc/auto.master:
# 添加以下行:
vim /etc/auto.master:
/data   /etc/auto.nfs/data是总的访问目录(客户端的目录) /etc/auto.nfs是对总访问目录的描述,用于子目录的编辑,用户权限分离
2.3 编辑nfs.misc:
vim /etc/auto.nfs
nfs     -fstype=nfs,rw,sync             192.168.112.6:/data/jfedu2.4 启动auofs服务:
systemctl start autofs2.5 验证权限:
## 登录不同目录验证权限:
[root@localhost ~]# ls /data/nfs
[root@localhost ~]# df
Filesystem                1K-blocks    Used Available Use% Mounted on
devtmpfs                     485992       0    485992   0% /dev
tmpfs                        497836       0    497836   0% /dev/shm
tmpfs                        497836   13912    483924   3% /run
tmpfs                        497836       0    497836   0% /sys/fs/cgroup
/dev/sda3                  28833020 2391972  26441048   9% /
/dev/sda1                    508580  129696    378884  26% /boot
tmpfs                         99568       0     99568   0% /run/user/0
192.168.112.6:/data/jfedu  28833024 2248832  26584192   8% /data/nfs