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/(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 服务的更多相关文章
- Linux 笔记 - 第二十三章 MySQL 主从复制配置
一.前言 MySQL Replication,也被称为主从复制.AB 复制.简单来说就是 A 和 B 两台服务器做主从后,在 A 服务器上写入数据,B 服务器上也会跟着写入输入,两者之间的数据是实时同 ...
- 《Java编程思想》笔记 第二十一章 并发
1.定义任务 实现Runnable 接口的类就是任务类(任务类不一定是实现Runnable接口的类). 实现Runnable 接口,重写run()方法,run方法的返回值只能是 void 任务类就是表 ...
- Linux 笔记 - 第十一章 正则表达式
博客地址:http://www.moonxy.com 一.前言 正则表达式(英语为 Regular Expression,在代码中常简写为 regex.regexp 或 RE),是使用单个字符串来描述 ...
- 《Linux内核设计与实现》第五周读书笔记——第十一章
<Linux内核设计与实现>第五周读书笔记——第十一章 20135301张忻 估算学习时间:共2.5小时 读书:2.0 代码:0 作业:0 博客:0.5 实际学习时间:共3.0小时 读书: ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十一章:环境光遮蔽(AMBIENT OCCLUSION) 学习目标 ...
- Flask 教程 第二十一章:用户通知
本文翻译自The Flask Mega-Tutorial Part XXI: User Notifications 这是Flask Mega-Tutorial系列的第二十一章,我将添加一个私有消息功能 ...
- RHEL5.8配置NFS服务
机器配置:4C+16GB 操作系统:RedHat Enterprise Linux 5.8 NFS基础 NFS(Network File System)是Linux系统之间使用最为广泛的文件共享协议, ...
- Gradle 1.12用户指南翻译——第二十一章. Gradle 插件
昨天晚上只顾着和女朋友看<匆匆那年>电视剧的最后几集,所以说好的Android文档<Gradle 插件用户指南>第五章自然也没翻译多少.所以今天也发不了第五章的翻译了,就发几个 ...
- [转]Ubuntu下配置NFS服务
[转]Ubuntu下配置NFS服务 http://blog.163.com/liu8821031%40126/blog/static/111782570200921021253516/ Table ...
随机推荐
- 7.19 包 logging模块 hashlib模块 openpyxl模块 深浅拷贝
包 包是什么 他是一系列文件的结合体,表现形式就是文件夹 包的本质还是模块 他通常会有__init__.py文件 我们首先回顾一下模块导入的过程 import module首次导入模块(.py文件) ...
- 上传文件时 重新载入页面以获取源代码 http://*/upload.php
今天做一个处理上传文件的接口时碰到这样一个问题, 用的是element-ui的上传组件,但是上传失败, 抓包一看返回的是 重新载入页面以获取源代码 http://*/upload.php 网上搜了一下 ...
- Nginx 502 Bad Gateway 错误的解决方法
502 bad gateway 的解决方法 通用配置 proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小 proxy_buffers 4 32k; # ...
- 彻底搞懂Java中equals和==的区别
java当中的数据类型和“==”的含义: 1.基本数据类型(也称原始数据类型) :byte,short,char,int,long,float,double,boolean.他们之间的比较,应用双等号 ...
- N个tomcat之间实现Session共享(写的不错,转来的)
以下文章写的比较不错,转来的. tomcat的session共享设置如此简单为什么很少人去用.这个我说的重点. 1.自身的session如果服务器不在同一个网段会有session失效(本人使用的是阿里 ...
- Java描述表达式求值的两种解法:双栈结构和二叉树
Java描述表达式求值的两种解法:双栈结构和二叉树 原题大意:表达式求值 求一个非负整数四则混合运算且含嵌套括号表达式的值.如: # 输入: 1+2*(6/2)-4 # 输出: 3.0 数据保证: 保 ...
- 修改预制体效果无变化(unity&&CocosCreator)
推荐阅读: 我的CSDN 我的博客园 QQ群:704621321 1.问题 修改预制体后保存,预览游戏预制体未发生变化(和改之前效果一样) 2.回忆 以前做unity的时 ...
- MySQL数据库笔记六:数据定义语言及数据库的备份和修复
1. MySQL中的函数 <1>加密函数 password(str) 该函数可以对字符串str进行加密,一般情况下,此函数给用户密码加密. select PASSWORD('tlxy666 ...
- 关于web.xml配置
整理自网上: web应用是一种可以通过Web访问的应用程序.在J2EE领域下,web应用就是遵守基于JAVA技术的一系列标准的应用程序. 最简单的web应用什么样? 2个文件夹.1个xml文件就能成为 ...
- Numpy的进阶学习
前言: 在学习cs231n编写课后作业代码过程中 .发现自己对计算的向量化vectorized不是很懂,编写不出代码.对numpy的库也只是停留在表面 Numpy Numpy学习库链接 1.numpy ...