Linux 笔记 - 第二十一章 配置 NFS 服务

一、前言

NFS(Network File System,网络文件系统),主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS 客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将 NFS 服务器端共享的数据目录挂载到 NFS 客户端本地系统中(就是某一个挂载点下)。从客户端本地看,NFS 服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的 NFS 服务器的目录。

NFS 网络文件系统很像 Windows 系统网络驱动器映射,这也和 Linux 系统里的 samba 服务类似。只不过一般情况下,Windows 网络共享服务或 samba 服务用于办公局域网共享,而互联网中小型网站集群架构后端常用 NFS 进行数据共享。

在企业集群架构的工作场景中,NFS 网络文件系统一般被用来存储共享视频,图片,附件等静态资源文件,通常网站用户上传的文件都会放到 NFS 共享里,例如:BBS 产品的图片,附件,头像(注意网站 BBS 程序不要放 NFS 共享里),然后前端所有的节点访问这些静态资源时都会读取 NFS 存储上的资源。NFS 是当前互联网系统架构中最常用的数据存储服务之一,前面说过,中小型网站公司应用频率更高,大公司或门户除了使用 NFS 外,还可能会使用更为复杂的分布式文件系统,比如 Moosefs(mfs),GlusterFS,FastDFS 等。

举例来说,A 用户上传图片到 Web1 服务器,然后让 B 用户访问这张图片,结果B用户访问的请求分发到了 Web2,因为 Web2 上没有这张图片,这就导致它无法看到 A 用户上传的图片,如果此时有一个共享存储,A 用户上传图片的请求无论是分发到 Web1 还是 Web2上,最终都会存储到共享存储上,而在 B 用户访问图片时,无论请求分发到 Web1 还是 Web2 上,最终也都会去共享存储上找,这样就可以访问到需要的资源了。这个共享存储的位置可以通过开源软件和商业硬件实现,互联网中小型集群架构会用普通 PC 服务器配置 NFS 网络文件系统实现。

企业生产集群没有 NFS 共享存储访问示意图,如下:

企业生产集群有 NFS 共享存储访问示意图,如下:

NFS 系统原理示意图,如下:

在 NFS 服务器端设置好一个共享目录 /test 后,其他有权限访问 NFS 服务器端的客户端都可以将这个共享目录 /test 挂载到客户端本地的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定),图中两个 NFS 客户端本地挂载点分别为 /mnt 和 /tmp,不同客户端的挂载点可以不相同。

客户端正确挂载完毕后,就可以通过 NFS 客户端的挂载点所在的 /mnt 或 /tmp 目录查看到 NFS 服务器端 /test 共享出来的目录下的所有数据。在客户端上查看时,NFS 服务端的 /test 目录就相当于客户端本地的磁盘分区或目录,几乎感觉不到使用上的区别,根据 NFS 服务器端授予的 NFS 共享权限以及共享目录的本地系统权限,只要在指定的 NFS 客户端上操作挂载 /mnt 或 /tmp 的目录,就可以将数据轻松的存取到 NFS 服务器端上的 /test 目录中了。

以下准备两台 Linux 主机用来配置 NFS 服务:

NFS 服务端:主机名为 masternode,IP 地址为 192.168.150.140

NFS 客户端:主机名为 backupnode,IP 地址为 192.168.150.139

二、服务端配置 NFS

在 CentOS 上使用 NFS 服务需要安装两个包(ufs-utils 和 rpcbind),不过当使用 yum 工具安装 nfs-utils 时会一同安装 rpcbind,在 CentOS 6 之前是需要安装  portmap,从 CentOS 开始,就改为安装 rpcbind 了,如下:

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

首先编辑配置文件,该文件默认为空,如下:

[root@masternode ~]# vim /etc/exports
/data/nfs_share 192.168.150.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)

添加了一行内容,该行内容分为三部分。第一部分是本地要共享出去的目录,第二部分是允许访问的主机(可以是一个 IP,或者是一个 IP 网段),第三部分就是小括号里面的一些权限。注意:地址和权限之间没有空格。关于第三部分有以下权限:

rw:表示读/写。

ro:表示只读。

sync:同步模式,表示内存中的数据实时写入磁盘。

async:非同步模式,表示内存中的数据定期写入磁盘。

no_root_squash:当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的 root 管理员。

root_squash:当 NFS 客户端以 root 管理员访问时,映射为 NFS 服务器的匿名用户。

all_squash:无论 NFS 客户端使用什么账号访问,均映射为 NFS 服务器的匿名用户。

anonuid/anongid:要和 root_squash 以及 all_squash 选项一同使用,用于指定使用 NFS 的用户被限定后的 uid 和 gid。

编辑好配置文件后创建好相关目录并启动 NFS 服务,还有将其设置为开机启动,如下:

[root@masternode ~]# systemctl start rpcbind
[root@masternode ~]# systemctl start nfs
[root@masternode ~]# systemctl enable rpcbind
[root@masternode ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

在启动 NFS 服务之前,需要先启动 rpcbind 服务。由于在使用 NFS 服务进行文件共享之前,需要使用 RPC(Remote Procedure Call,远程过程调用)服务将 NFS 服务器的 IP 地址和端口号等信息发送给客户端。

三、客户端挂载 NFS

同样,在客户端机器上也安装 nfs-utils 包,如下:

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

在客户端挂载 NFS 之前,我们可以使用 showmount 查看服务端共享了哪些目录,如下:

[root@backupnode ~]# showmount -e 192.168.150.140
Export list for 192.168.150.140:
/data/nfs_share 192.168.150.0/24

其中 -e 选项表示 --exports,Show the NFS server's export list

挂载服务端共享的目录,如下:

[root@backupnode ~]# mount 192.168.150.140:/data/nfs_share /data/nfs_archive
mount.nfs: mount point /data/nfs_archive does not exist
[root@backupnode ~]# mkdir -p /data/nfs_archive
[root@backupnode ~]# mount 192.168.150.140:/data/nfs_share /data/nfs_archive
[root@backupnode ~]# df -hT /data/nfs_archive
Filesystem                      Type  Size  Used Avail Use% Mounted on
192.168.150.140:/data/nfs_share nfs4   18G  1.4G   17G   8% /data/nfs_archive

可以发现在挂载前,必须首先创建挂载点。

[root@backupnode ~]# ls -ld /data/nfs_archive
drwxr-xr-x 2 root root 6 Sep  9 22:07 /data/nfs_archive
[root@backupnode ~]# cd /data/nfs_archive
[root@backupnode nfs_archive]# touch /data/nfs_archive/test1.txt
touch: cannot touch ‘test1.txt’: Permission denied

在客户端的挂载点中创建文件,发现权限不足,这是因为虽然你在客户端使用的是 root 用户,但是挂载后在新的挂载点中相当于被限制为 uid 为 1000 的用户,而该用户是没有权限在 /data/nfs_archive 中创建文件的,该目录所有者为 root:root,权限为 rwxr-xr-x

所以,我们现在服务端修改共享点权限,如下:

[root@masternode ~]# chmod 777 /data/nfs_share
[root@masternode ~]# ls -ld /data/nfs_share
drwxrwxrwx 2 root root 6 Sep  9 22:07 /data/nfs_share

然后再在客户端中创建测试文件,如下:

[root@backupnode ~]# ls -ld /data/nfs_archive
drwxrwxrwx 2 root root 6 Sep  9 22:07 /data/nfs_archive
[root@backupnode nfs_archive]# touch /data/nfs_archive/test1.txt
[root@backupnode nfs_archive]# ls -l
total 0
-rw-r--r-- 1 1000 1000 0 Sep  9 23:00 test1.txt
[root@backupnode nfs_archive]# useradd ryan
[root@backupnode nfs_archive]# id ryan
uid=1000(ryan) gid=1000(ryan) groups=1000(ryan)
[root@backupnode nfs_archive]# ls -l
total 0
-rw-r--r-- 1 ryan ryan 0 Sep  9 23:00 test1.txt

可以发现,当在服务端修改共享点的权限后,在客户端也会相应的自动更新对应挂载点的权限。

四、exportfs 命令

当在服务端改变 /etc/exports 配置文件后,使用 exportfs 命令挂载不需要重启 NFS 服务,如下:

[root@masternode ~]# vim /etc/exports
/data/nfs_share 192.168.150.0/24(rw,sync,all_squash,anonuid=1000,anongid=1000)
/data/nfs_common_share *(rw,sync,no_root_squash)

[root@backupnode nfs_archive]# showmount -e 192.168.150.140
Export list for 192.168.150.140:
/data/nfs_share 192.168.150.0/24

在服务端添加新的共享点之后,在客户端使用 showmount 查询不到。

然后在服务端使用 exportfs 命令后再查看,如下:

[root@masternode ~]# exportfs -arv
exporting 192.168.150.0/24:/data/nfs_share
exporting *:/data/nfs_common_share

[root@backupnode nfs_archive]# showmount -e 192.168.150.140
Export list for 192.168.150.140:
/data/nfs_common_share *
/data/nfs_share        192.168.150.0/24

其中 exportfs 常用选项有:

-a:表示全部挂载或者卸载。

-r:表示重新挂载。

-u:表示卸载某一个目录。

-v:表示显示共享的目录。

五、启动挂载和自动挂载

我们将挂载信息写入到 /etc/fstab 中,这样远程共享资源就会自动随服务器开机而进行挂载,加入如下信息:

[root@backupnode ~]# vim /etc/fstab
192.168.150.140:/data/nfs_share /data/nfs_archive                 nfs     defaults,nolock 0 0

但是,将挂载信息填入 /etc/fstab 之后,无论该资源是否使用,系统在每次开机时都会自动将其挂载,如果资源挂载后长期不使用,也会造成服务器硬件资源的浪费。为了解决这个问题,我们可以安装 autofs 自动挂载服务,该程序是在用户需要使用该文件系统时才去动态挂载,从而节约了网络资源和服务器的硬件资源。

posted on 2019-09-15 12:47  沐小悠  阅读(891)  评论(0编辑  收藏  举报