文章目录

  • 前言
  • 1. 简述 NFS 服务
  • 2. 安装配置 NFS Server 端
  • 3. 安装配置 NFS Client 端
  • 3.1. 使用 mount 配置自动挂载
  • 3.2. 使用 autofs 配置自动挂载
  • 4. 关于控制 NFS 共享目录权限
  • 总结



前言

最近一段时间在学习 NIS 相关的知识,其中一部分内容涉及到了 NFS 和 Autofs,正好借着这个机会把所做的实验记录下来。


1. 简述 NFS 服务

NFS(Network File System)即网络文件系统,通常我们习惯称之为 NFS 服务。NFS 是一种 C/S 架构,当在 Server 端安装配置了 NFS 并将指定的目录对外进行共享,此时被授权访问的 Client 端就可以通过 Mount 挂载或者 Autofs 自动挂载等方式,将 Server 端共享的目录作为 Client 端本地文件系统进行使用。

NFS 本身无法提供数据传输,而是借助了 RPC(Remote Procedure Call)即远程过程调用来实现的。因此,我们在安装配置 NFS Server 端时,不仅仅要安装 nfs-utils 包还需要安装 rpcbind 包。

NFS 既是主流异构平台共享文件系统之一,也是目前分布式文件系统的基础。

关于 NFS 不同版本的发行时间如下表所示

版本

时间

RFC 文档

NFSv2

1989年3月

RFC1094

NFSv3

1995年6月

RFC1813

NFSv4.0

2003年4月

RFC3530

NFSv4.1

2010年1月

RFC5661


2. 安装配置 NFS Server 端

NFS Server 端安装了标准的 CentOS 7.6 操作系统,并做了如下配置:

  • 主机名设置为:nfs-server;
  • 关闭系统 firewalld.service(有安全防护要求的在后续配置过程中需要开通相应的防火墙策略);
  • 关闭 selinux 模块;

NFS Server 端详细配置如下:

Step1:配置本地 hosts 解析。

[root@nfs-server ~]# echo "172.16.206.103   nfs-server" >> /etc/hosts
[root@nfs-server ~]# echo "172.16.206.104   client" >> /etc/hosts
[root@nfs-server ~]# tail -n2 /etc/hosts
172.16.206.103   nfs-server
172.16.206.104   client

Step2:安装 nfs 以及 rpc 所需要的包。

[root@nfs-server ~]# rpm -qa |grep -E "nfs-utils|rpcbind"
rpcbind-0.2.0-47.el7.x86_64
nfs-utils-1.3.0-0.61.el7.x86_64
[root@nfs-server ~]# yum -y install nfs-utils rpcbind   //若当前系统默认没有安装,使用 yum 进行安装即可。

Step3:编辑 “/etc/exports” 配置文件,设置要共享的目录以及对应的访问权限。

[root@nfs-server ~]# vim /etc/exports   //配置信息如下所示。
/home 172.16.206.0/24(rw,sync,no_root_squash)

关于 “/etc/exports” 配置文件有以下几点说明

  • 关于书写格式
  • 通用格式共享目录 + 允许访问的网段或地址 + (访问权限)
  • 格式说明:第一个 “+” 处一般以多个空格符作为间隔,第二个 “+” 处紧跟前面的网段或地址。
  • 关于权限说明
  • rw:读写权限。
  • ro:只读权限。
  • sync:同步模式,数据同时写入内存与硬盘。
  • async:异步模式,数据先写入内存,然后下刷落盘。
  • no_root_squash:客户端在挂载 nfs 的共享目录后,其 root 用户不受限制(一般不建议使用)。
  • root_squash:客户端在挂载 nfs 的共享目录后,其 root 用户受到限制,被映射为普通用户(nfsnobody)。
  • all_squash:客户端在挂载 nfs 的共享目录后,所有用户都被映射为普通用户。
  • anonuid/anongid:指定客户端用户的 UID 和 GID。

Step4:启动 rpc 和 nfs 服务并设置为开机自启动。

[root@nfs-server ~]# systemctl start rpcbind   //先启动 rpc 服务再启动 nfs 服务。
[root@nfs-server ~]# systemctl start nfs
[root@nfs-server ~]# systemctl enable rpcbind
[root@nfs-server ~]# systemctl enable nfs

Step5:查看 nfs server 端共享目录配置明细。

[root@nfs-server ~]# exportfs -v
/home             172.16.206.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

3. 安装配置 NFS Client 端

3.1. 使用 mount 配置自动挂载

Step1:配置本地 hosts 解析。

[root@client ~]# echo "172.16.206.103   nfs-server" >> /etc/hosts
[root@client ~]# echo "172.16.206.104   client" >> /etc/hosts
[root@client ~]# tail -n2 /etc/hosts
172.16.206.103   nfs-server
172.16.206.104   client

Step2:安装 nfs 所需要的包。

[root@client ~]# yum -y install nfs-utils

Step3:创建挂载目录并进行挂载。

[root@client ~]# mkdir /nfsdir
[root@client ~]# mount -t nfs nfs-server:/home /nfsdir
[root@client ~]# mount |grep nfs   //通过查询的结果不难看出默认使用 “4.1” 版本进行挂载。
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)
nfs-server:/home on /nfsdir type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.206.104,local_lock=none,addr=172.16.206.103)

设置成开机自动挂载:

[root@client ~]# echo "nfs-server:/home  /nfsdir  nfs  defaults  0 0" >> /etc/fstab
[root@client ~]# mount -a

Step4:测试 nfs 挂载。

[root@client ~]# cd /nfsdir/
[root@client nfsdir]# mkdir testdir   //可以新建文件夹。
[root@client nfsdir]# echo "hello nfs" > testfile   //可以新建文件并写入数据。
[root@client ~]# ls -lh /nfsdir/
total 4.0K
drwxr-xr-x 2 root root  6 Mar 16 03:15 testdir
-rw-r--r-- 1 root root 10 Mar 16 03:16 testfile

3.2. 使用 autofs 配置自动挂载

Step1:配置本地 hosts 解析。

[root@client ~]# echo "172.16.206.103   nfs-server" >> /etc/hosts
[root@client ~]# echo "172.16.206.104   client" >> /etc/hosts
[root@client ~]# tail -n2 /etc/hosts
172.16.206.103   nfs-server
172.16.206.104   client

Step2:安装 nfs 以及 autofs 所需要的包。

[root@client ~]# yum -y install nfs-utils autofs

Step3:创建 nfs 挂载所需的顶级目录。

[root@client ~]# mkdir /nfsdir

Step4:编辑 “/etc/auto.master” 主配置文件。

[root@client ~]# echo "/nfsdir /etc/auto.user" >> /etc/auto.master

Step5:编辑 “/etc/auto.user” 子配置文件。

子配置文件是可以自定义的,但是要与主配置文件里面写的子配置文件名保持一致

[root@client ~]# echo "users  -fstype=nfs,rw,sync,no_root_squash  nfs-server:/home" >> /etc/auto.user

Step6:启动 autofs 服务并设置为开机自启动。

[root@client ~]# systemctl start autofs
[root@client ~]# systemctl enable autofs

Step7:测试 autofs 自动挂载。

[root@client ~]# cd /nfsdir/
[root@client nfsdir]# ls -lh   //进入顶级目录下,此时无法查看到 users 目录。
total 0
[root@client nfsdir]# cd users   //只有当切换到 users 目录时才会触发 autofs 自动挂载。
[root@client users]# pwd
/nfsdir/users
[root@client users]# ls -lh /nfsdir/
total 0
drwxr-xr-x 2 root root 6 Mar 16 03:26 users

4. 关于控制 NFS 共享目录权限

在前面我们曾提及到使用 no_root_squash 是不安全的,因为此时客户端的 root 用户权限是不受限制的,即意味着在客户端 root 用户可以任意修改或者删除共享目录下的数据文件。本章节将使用 root_squash 来限制客户端 root 用户的权限,以此来进行测试。

首先我们需要修改 nfs server 端的 “/etc/exports” 配置文件来控制共享目录权限:

[root@nfs-server ~]# vim /etc/exports
/home 172.16.206.0/24(rw,sync,root_squash)

[root@nfs-server ~]# exportfs -ar   //使用如下命令使配置生效(等同于重启 nfs 服务)

此时 nfs 共享目录的权限已经得到控制,但是不要忘了我们在配置 autofs 自动挂载时 “/etc/auto.user” 子配置文件里面也写入了权限的配置信息,所以为了保持一致,将 “/etc/auto.user” 子配置文件也进行修改。

[root@client ~]# vim /etc/auto.user 
users  -fstype=nfs,rw,sync,root_squash  nfs-server:/home

[root@client ~]# systemctl restart autofs

现在,关于共享目录的权限设置已经完成,接下来就是基于现有的权限配置进行测试!

测试1:此时在 Client 端使用 root 用户登录,无法进行文件夹以及文件的创建。

[root@client users]# mkdir 111
mkdir: cannot create directory ‘111’: Permission denied
[root@client users]# touch 222
touch: cannot touch ‘222’: Permission denied

测试2:在 nfs server 端创建了文件夹和文件,在 Client 端只能读取文件,无法进行删除操作。

[root@nfs-server home]# mkdir testdir
[root@nfs-server home]# echo hello > /home/testdir/test.txt

[root@client users]# cat testdir/test.txt 
hello
[root@client users]# rm -rf testdir/test.txt 
rm: cannot remove ‘testdir/test.txt’: Permission denied
[root@client users]# rm -rf testdir
rm: cannot remove ‘testdir/test.txt’: Permission denied

经过上面两项测试不难发现,一旦将共享目录权限设置为 root_squash ,似乎在 Client 端以 root 用户的身份什么都干不了,那么在这种限制下该如何进行配置呢?

首先,我们在 nfs server 端的共享目录(即 “/home” 目录)下创建一个名为 demo 的文件夹,并赋予所有权限:

[root@nfs-server home]# mkdir demo
[root@nfs-server home]# chmod 777 demo/

此时登录到 Client 端,我们就可以发现 root 用户可以在 demo 目录下进行文件夹和文件的创建了。值得注意的是,此时以 root 用户在 demo 目录下创建的文件夹和文件其所属用户和所属组并不是 root 自身,而是被映射成了匿名的 nfsnobody 用户。

[root@client ~]# cd /nfsdir/users/
[root@client users]# ls -lh
total 0
drwxrwxrwx 2 root root  6 Mar 16 04:36 demo
drwxr-xr-x 2 root root 22 Mar 16 04:29 testdir
[root@client demo]# mkdir 111
[root@client demo]# touch 222
[root@client demo]# ls -lh
total 0
drwxr-xr-x 2 nfsnobody nfsnobody 6 Mar 16 04:36 111   //此时文件夹的所属用户和所属组为 nfsnobody 而不是 root。
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 16 04:36 222   //此时文件的所属用户和所属组为 nfsnobody 而不是 root。

同样的,user1 用户也可以在 demo 目录下进行文件夹和文件的创建了,但是其文件夹和文件所属用户和所属组均是 user1 默认的用户和用户组。

[root@client demo]# su - user1
Last login: Wed Mar 16 04:16:57 EDT 2022 on pts/0
[user1@client ~]$ cd /nfsdir/users/demo/
[user1@client demo]$ mkdir user1_111
[user1@client demo]$ touch user1_222
[user1@client demo]$ ls -lh
total 0
drwxr-xr-x 2 nfsnobody nfsnobody 6 Mar 16 04:36 111
-rw-r--r-- 1 nfsnobody nfsnobody 0 Mar 16 04:36 222
drwxrwxr-x 2 user1     user1     6 Mar 16 04:37 user1_111
-rw-rw-r-- 1 user1     user1     0 Mar 16 04:37 user1_222

总结

关于 NFS 与 Autofs 的内容就先写到这里。NFS 的常见配置还是比较简单的,可能在有些场景里面会配置的稍微复杂一些。由于博主自身所接触到的生产环境里面很少有直接配置 NFS 的,因此对于生产环境里面具体怎么去使用 NFS 以及如何维护还是缺乏经验的,也只能通过实验平台自己去做实验,难免会有点闭门造车的感觉,所以,以上如有不当之处,欢迎指正。