一、前言

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/(rw,sync,all_squash,anonuid=,anongid=)

添加了一行内容,该行内容分为三部分。第一部分是本地要共享出去的目录,第二部分是允许访问的主机(可以是一个 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/

其中 -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 .4G 17G % /data/nfs_archive

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

[root@backupnode ~]# ls -ld /data/nfs_archive
drwxr-xr-x root root Sep : /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  /data/nfs_share
[root@masternode ~]# ls -ld /data/nfs_share
drwxrwxrwx root root Sep : /data/nfs_share

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

[root@backupnode ~]# ls -ld /data/nfs_archive
drwxrwxrwx root root Sep : /data/nfs_archive
[root@backupnode nfs_archive]# touch /data/nfs_archive/test1.txt
[root@backupnode nfs_archive]# ls -l
total
-rw-r--r-- Sep : test1.txt
[root@backupnode nfs_archive]# useradd ryan
[root@backupnode nfs_archive]# id ryan
uid=(ryan) gid=(ryan) groups=(ryan)
[root@backupnode nfs_archive]# ls -l
total
-rw-r--r-- ryan ryan Sep : test1.txt

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

四、exportfs 命令

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

[root@masternode ~]# vim /etc/exports
/data/nfs_share 192.168.150.0/(rw,sync,all_squash,anonuid=,anongid=)
/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/

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

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

[root@masternode ~]# exportfs -arv
exporting 192.168.150.0/:/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/

其中 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

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

Linux 笔记 - 第二十一章 配置 NFS 服务的更多相关文章

  1. Linux 笔记 - 第二十三章 MySQL 主从复制配置

    一.前言 MySQL Replication,也被称为主从复制.AB 复制.简单来说就是 A 和 B 两台服务器做主从后,在 A 服务器上写入数据,B 服务器上也会跟着写入输入,两者之间的数据是实时同 ...

  2. 《Java编程思想》笔记 第二十一章 并发

    1.定义任务 实现Runnable 接口的类就是任务类(任务类不一定是实现Runnable接口的类). 实现Runnable 接口,重写run()方法,run方法的返回值只能是 void 任务类就是表 ...

  3. Linux 笔记 - 第十一章 正则表达式

    博客地址:http://www.moonxy.com 一.前言 正则表达式(英语为 Regular Expression,在代码中常简写为 regex.regexp 或 RE),是使用单个字符串来描述 ...

  4. 《Linux内核设计与实现》第五周读书笔记——第十一章

    <Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ...

  5. Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION)

    原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION) 学习目标 ...

  6. Flask 教程 第二十一章:用户通知

    本文翻译自The Flask Mega-Tutorial Part XXI: User Notifications 这是Flask Mega-Tutorial系列的第二十一章,我将添加一个私有消息功能 ...

  7. RHEL5.8配置NFS服务

    机器配置:4C+16GB 操作系统:RedHat Enterprise Linux 5.8 NFS基础 NFS(Network File System)是Linux系统之间使用最为广泛的文件共享协议, ...

  8. Gradle 1.12用户指南翻译——第二十一章. Gradle 插件

    昨天晚上只顾着和女朋友看<匆匆那年>电视剧的最后几集,所以说好的Android文档<Gradle 插件用户指南>第五章自然也没翻译多少.所以今天也发不了第五章的翻译了,就发几个 ...

  9. [转]Ubuntu下配置NFS服务

    [转]Ubuntu下配置NFS服务  http://blog.163.com/liu8821031%40126/blog/static/111782570200921021253516/ Table ...

随机推荐

  1. linux之用户和用户组管理详解

    #############用户和用户组管理###################linux只认识UID和GID #可在/etc/passwd 和/etc/group中找到 ##/etc/passwd ...

  2. ggplot2: how to check the color and coreponding value pairs

    The way to check the color and coreponding value pairs in ggplot2 To see what colors are used to mak ...

  3. EF获取DataTable的扩展方法GetDataSet

    微软的EF至今已到了EF6版本了,但是,不知道微软咋想的,至今也不支持直接从数据库获取一张数据表DataTable,但这个DataTable在许多情况下还是比确定的实体化类更方便好使,这里,我仿照微软 ...

  4. 2019牛客暑期多校训练营(第十场)J - Wood Processing (斜率优化DP)

    >传送门< 题意 $n$个宽度为$w_{i}$,高为$h_{i}$ 的 木块,要求分成$k$组,对于每组内的所有木块,高度都变为组内最低木块的高度,宽度保持不变,求变化的最小面积. 分析 ...

  5. 使用Mybatis-Generator 自动生成代码

    前提:已经有SpringBoot的工程,且在上面实现了MyBatis的应用,只不过全是以手动方式创建mapper.xml映射文件.pojo类等. 在POM中添加MyBatis.generator依赖 ...

  6. windows下 ionic 打包app --以安卓版本为例

    环境安装 1.nodejs 安装版本5.7,尽量不要安装太新的版本,因为可能会出现兼容性问题,一开始本人安装的是6.+的版本,后来出现问题的,马上换回5.7的,问题就不会出现了. 安装教程网上教程很多 ...

  7. Azure Devops: COPY failed: stat /var/lib/docker/tmp/docker-builder268095359/xxxxxxx.csproj no such file or directory

    在Azure Devops中部署docker镜像时,  出现COPY failed: stat /var/lib/docker/tmp/docker-builder268095359/xxxxxxx. ...

  8. 漫话:如何给女朋友解释什么是"锟斤拷"?

    漫话:如何给女朋友解释什么是"锟斤拷"? ​ 周末女朋友出去逛街了,我自己一个人在家看综艺节目,突然,女朋友给我打来电话. 过了一会,女朋友回来了,她拿出手机,给我看了她在超市拍的 ...

  9. javaScript 基础知识汇总(五)

    1.垃圾回收 JavaScript 的内存管理是自动的,不能强制执行或者阻止执行 可达性 JavaScript中主要的内存管理概念是可达性. 什么是可达性? 定义一个对象 let user = { n ...

  10. Mac应用程序无法打开或文件损坏的处理方法你知道吗?

    很多用户在安装Mac软件的时候,经常会遇到提示“xxx.app已损坏,打不开.您应该将它移到废纸篓“或”打不开的xxx.app,因为它来自身份不明的开发者”,如下图的样子: 真的损坏了么?是不是真的要 ...