NFS介绍

NFS基本概述

NFS(Network File System)网络文件系统
主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录。
NFS系统和Windows网络共享、网络驱动器类似, 只不过windows用于局域网, NFS用于企业集群架构中, 如果是大型网站, 会用到更复杂的分布式文件系统FastDFS,glusterfs,HDFS

为什么要使用NFS服务

实现多台服务器之间数据共享
实现多台服务器之间数据的一致

NFS服务内容概述

NFS优缺点以及生产建议
RPC服务知识概念介绍说明
NFS服务工作原理
NFS共享文件系统使用原理
NFS服务配罝文件exports编写格式及测试

NFS存储小结

nfs属于本地文件存储服务

NFS存储优点

NFS文件系统简单易用、方便部署、数据可靠、服务稳定、满足中小企业需求。
NFS文件系统内存放的数据都在文件系统之上,所有数据都是能看得见。

NFS存储局限

存在单点故障, 如果构建高可用维护麻烦。
NFS数据明文, 并不对数据做任何校验。
客户端挂载无需账户密码, 安全性一般(内网使用)

生产应用建议

生产场景应将静态数据尽可能往前端推, 减少后端存储压力
必须将存储里的静态资源通过CDN缓存(jpg\png\mp4\avi\css\js)
如果没有缓存或架构本身历史遗留问题太大, 在多存储也无用

NFS应用场景

跨系统文件数据共享

实现Windows与linux系统文件数据共享方法
a.ftp(ftp服务部署)        b.samba服务

共享存储的价值

图解集群需要共享存储服务原因
没有共享存储

  1. A用户传图片到WEB1服务器
  2. B用户访问这张图片,结果B用户访问的请求分发到了WEB2,因为WEB2上没有这张图片,结果B用户无法看到A用户传的图片。

有共享存储
1.如果有共享存储的情况, A用户上传图片无论分发到WEB1还是WEB2, 最终都存储至共享存储
2.在当B用户访问图片时,无论分发到WEB1还是WEB2上,最终也都会去共享存储上访问,这样就可以访问到资源了

NFS实现原理


本地文件操作方式
当用户执行mkdir命令, 该命令会通过shell解释器翻译给内核,由内核解析完成后驱动硬件,完成相应的操作。
NFS实现原理
需要先了解[程序|进程|线程]
1.用户进程访问NFS客户端,使用不同的函数对数据进行处理
2.NFS客户端通过TCP/IP的方式传递给NFS服务端。
3.NFS服务端接收到请求后,会先调用portmap进程进行端口映射。
4.nfsd进程用于判断NFS客户端是否拥有权限连接NFS服务端。
5.Rpc.mount进程判断客户端是否有对应的权限进行验证。
6.idmap进程实现用户映射和压缩
7.最后NFS服务端会将对应请求的函数转换为本地能识别的命令,传递至内核,由内核驱动硬件。
rpc是一个远程过程调用,那么使用nfs必须有rpc服务

NFS服务安装

服务器系统 角色 外网IP 内网IP
CentOS 7.5 NFS服务端 eth0:10.0.0.31 eth1:172.16.1.31
CentOS 7.5 NFS客户端 eth0:10.0.0.41 eth1:172.16.1.41

注意: 检查关闭防火墙, 以免默认的防火墙策略禁止正常的NFS共享服务

  1. 关闭Firewalld防火墙
  2. [root@nfsnobody ~]# systemctl disable firewalld
  3. [root@nfsnobody ~]# systemctl stop firewalld
  4. 关闭selinux防火墙
  5. [root@nfsnobody ~]# sed -ri '#^SELINUX=#cSELINUX=Disabled' /etc/selinux/config
  6. [root@nfsnobody ~]# setenforce 0

安装NFS

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

配置NFS

配置内容

NFS服务程序的配置文件为/etc/exports默认该文件里没有任何内容。
按照共享目录的路径 允许访问的NFS客户端(共享权限参数)格式,定义要共享的目录与相应的权限。
exports配置文件格式

  1. [root@nfs ~]# cat /etc/exports
  2. /data 172.16.1.0/24(rw,sync,all_squash)
  3. 注意: NFS客户端地址与权限之间没有空格
  4. [root@nfs ~]# vim /etc/exports
  5. /data 172.16.1.0/24(rw,sync,all_squash)
  6. NFS服务器上建立用于NFS文件共享的目录,并设置对应权限
  7. [root@nfs ~]# mkdir /data
  8. [root@nfs ~]# chown -R nfsnobody.nfsnobody /data
  9. NFS共享目录会记录至/var/lib/nfs/etab,如果该目录不存在共享信息,请检查/etc/exports是否配置错误
  10. 如果想要把/data目录共享给172.16.1.0/24网段内的所有主机
  11. 1.主机都拥有读写权限
  12. 2.在将数据写入到NFS服务器的硬盘中后才会结束操作,最大限度保证数据不丢失
  13. 3.将所有用户映射为本地的匿名用户(nfsnobody)

exports配置内容说明

  1. /data 172.16.1.0/24(rw,sync,all_squash)
  2. 第一部分:/data --指定共享目录信息
  3. 第二部分:172.16.1.0/24 --指定了一个网段信息,表示允许指定的网段主机挂载到我本地的共享目录上
  4. 第三部分:(rw,sync) --表示定义共享参数信息,
  5. rw 表示读写 对共享目录设置的权限
  6. syn 同步, 数据会先写入到NFS服务器内存中,会立刻同步到磁盘里面==直接存储硬盘中

创建对应的目录

创建/data目录 
并将所属用户和组修改成nfsnobody

  1. [root@nfs ~]# mkdir /data
  2. [root@nfs ~]# chown -R nfsnobody.nfsnobody /data
  3. NFS共享目录管理用户为nfsnobody,此用户不用创建,安装nfs软件时会自动创建

启动服务

在使用NFS服务进行文件共享之前,需要使用RPC(Remote Procedure Call远程过程调用, 服务将NFS服务器的IP地址和端口号信息发送给客户端。
因此,在启动NFS服务之前,需要先重启并启用rpcbind服务程序,同时都加入开机自启动

  1. 先启动rpcbind 再启动nfs-server 顺序不能颠倒
  2. [root@nfs-server ~]# systemctl restart rpcbind
  3. [root@nfs-server ~]# systemctl restart nfs-server
  4. [root@nfs-server ~]# systemctl enable rpcbind
  5. [root@nfs-server ~]# systemctl enable nfs-server

检查服务

上面都执行过后  检查 检查是必不可少的一个环节 
有问题可以尽早发现

  1. 检查端口
  2. [root@nfs ~]# netstat -lntp
  3. Active Internet connections (only servers)
  4. Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
  5. tcp 0 0 0.0.0.0:2049 0.0.0.0:* LISTEN -
  6. tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 653/rpcbind
  7. 检查共享的内容
  8. NFS服务开启后,默认的参数文件位置,注意:修改此文件,对nfs服务没有任何影响
  9. [root@nfs ~]# cat /var/lib/nfs/etab
  10. /data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,secure,root_squash,all_squash)
  11. 检查匿名用户对应的真实账户,并授权共享目录为nfsnobody
  12. [root@nfs ~]# grep "65534" /etc/passwd
  13. nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin

配置客户端

客户端只启动rpcbind服务
showmount -e查看远程服务器rpc提供的可挂载nfs信息
客户端创建一个挂载目录, 使用mount命令并结合-t参数, 指定要挂载的文件系统的类型

  1. 说明: 如果nfs软件不安装
  2. 无法使用showmount 命令
  3. 客户端无法识别nfs 文件系统类型
  4. NFS客户端的配置步骤 先使用showmount命令,查询NFS服务器的远程共享信息
  5. 其输出格式为“共享的目录名称 允许使用客户端地址”。
  6. 配置客户端
  7. 安装客户端工具,仅启动rpcbind服务
  8. [root@web01 ~]# yum install nfs-utils -y
  9. [root@web01 ~]# systemctl enable rpcbind
  10. [root@web01 ~]# systemctl start rpcbind
  11. 使用showmount -e查看远程服务器rpc提供的可挂载nfs信息 showmount使用,需要安装nfs-utils软件
  12. [root@web01 ~]# showmount -e 172.16.1.31
  13. Export list for 172.16.1.31:
  14. /data 172.16.1.0/24
  15. 配置客户端-创建挂载点目录,执行挂载命令
  16. NFS客户端创建一个挂载目录, 使用mount命令并结合-t参数, 指定要挂载的文件系统的类型, 并在命令后面写上服务器的IP地址, 以及服务器上的共享目录, 最后需要写上要挂载到本地系统(客户端)的目录。
  17. [root@web01 ~]# mkdir /data
  18. [root@web01 ~]# mount -t nfs 172.16.1.31:/data /data/
  19. 查看挂载信息
  20. [root@web01 ~]# df -h
  21. 文件系统 容量 已用 可用 已用% 挂载点
  22. 172.16.1.31:/data 50G 2.6G 48G 6% /data

测试客户端

  1. [root@web01 ~]# echo "123" > /data/test
  2. [root@web01 ~]# ll /data/
  3. 总用量 4
  4. -rw-r--r-- 1 nfsnobody nfsnobody 4 9 6 03:41 test
  5. 挂载成功后可以进行增删改操作
  6. 使用客户端往nfs存储写入
  7. [root@web01 ~]# echo "nfs-client" >> /mnt/test.txt
  8. 检查nfs服务端是否存在客户端创建的新文件
  9. [root@nfs ~]# cat /data/test.txt
  10. nfs-client
  11. 如果希望NFS文件共享服务能一直有效,则需要将其写入到fstab文件中
  12. [root@web01 ~]# vim /etc/fstab
  13. 172.16.1.31:/data /nfsdir nfs defaults 0 0
  14. 如果不希望使用NFS共享, 可进行卸载 umount
  15. [root@web01 ~]# umount /nfsdir
  16. 注意:卸载的时候如果提示”umount.nfs: /nfsdir: device is busy
  17. 切换至其他目录, 然后在进行卸载。
  18. NFS Server宕机, 强制卸载umount -lf /nfsdir

nfs参数详解

NFS配置文件

执行man exports命令,然后切换到文件结尾,可以快速查看如下样例格式:

nfs共享参数 参数作用
rw* 读写权限
ro 只读权限
root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户(不常用)
no_root_squash 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员(不常用)
all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
no_all_squash 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户(常用)
sync* 同时将数据写入到内存与硬盘中,保证不丢失数据
async 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据
anonuid* 配置all_squash使用,指定NFS的用户UID,必须存在系统
anongid* 配置all_squash使用,指定NFS的用户UID,必须存在系统

验证权限作用

验证ro权限

  1. 1.服务端修改rwro参数
  2. [root@nfs01 ~]# cat /etc/exports
  3. /data 172.16.1.0/24(ro,sync,all_squash)
  4. [root@nfs01 ~]# systemctl restart nfs-server
  5. 2.客户端验证
  6. [root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
  7. [root@backup ~]# df -h
  8. Filesystem Size Used Avail Use% Mounted on
  9. 172.16.1.31:/data 98G 1.7G 97G 2% /mnt
  10. # 无法写入文件
  11. [root@backup mnt]# touch file
  12. touch: cannot touch file’: Read-only file system
  13. 2.验证all_squashanonuidanongid权限
  14. //1.服务端配置
  15. [root@nfs01 ~]# cat /etc/exports
  16. /data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
  17. //2.服务端需要创建对应的用户
  18. [root@nfs01 ~]# groupadd -g 666 www
  19. [root@nfs01 ~]# useradd -u 666 -g 666 www
  20. [root@nfs01 ~]# id www
  21. uid=666(www) gid=666(www) groups=666(www)
  22. //3.重载nfs-server
  23. [root@nfs01 ~]# systemctl restart nfs-server
  24. [root@nfs01 ~]# cat /var/lib/nfs/etab
  25. /data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=666,anongid=666,sec=sys,secure,root_squash,all_squash)
  26. //4.授权共享目录为www
  27. [root@nfs01 ~]# chown -R www.www /data/
  28. [root@nfs01 ~]# ll -d /data/
  29. drwxr-xr-x 3 www www 53 Sep 3 02:08 /data/
  30. //5.客户端验证
  31. [root@backup ~]# umount /mnt/
  32. [root@backup ~]# mount -t nfs 172.16.1.31:/data /mnt
  33. //6.客户端查看到的文件,身份是666
  34. [root@backup ~]# ll /mnt/
  35. drwxr-xr-x 2 666 666 6 Sep 3 02:08 rsync_dir
  36. -rw-r--r-- 1 666 666 0 Sep 3 02:08 rsync_file
  37. //7.客户端依旧能往/mnt目录下写文件
  38. [root@backup mnt]# touch fff
  39. [root@backup mnt]# mkdir 111
  40. [root@backup mnt]# ll
  41. drwxr-xr-x 2 666 666 6 Sep 3 03:05 111
  42. -rw-r--r-- 1 666 666 0 Sep 3 03:05 fff
  43. //8.建议:将客户端也创建一个uid为666,gid为666,统一身份,避免后续出现权限不足的情况
  44. [root@backup mnt]# groupadd -g 666 www
  45. [root@backup mnt]# useradd -g 666 -u 666 www
  46. [root@backup mnt]# id www
  47. uid=666(www) gid=666(www) groups=666(www)
  48. //9.最后检查文件的身份
  49. [root@backup mnt]# ll /mnt/
  50. total 4
  51. drwxr-xr-x 2 www www 6 Sep 3 03:05 111
  52. -rw-r--r-- 1 www www 0 Sep 3 03:05 fff

NFS扩展项

  1. //1.扩展:无需重启NFS服务平滑加载配置文件
  2. [root@nfs01 r]# cat /etc/exports
  3. /data/r 172.16.1.0/24(ro)
  4. /data/p 172.16.1.0/24(ro)
  5. /data/w 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)
  6. [root@nfs01 r]# exportfs -rv
  7. exporting 172.16.1.0/24:/data/w
  8. exporting 172.16.1.0/24:/data/p
  9. exporting 172.16.1.0/24:/data/r
  10. //2.扩展:nfs客户端挂载参数
  11. [root@backup-41 ~]# mount.nfs4 -o noatime,nodiratime,noexec,nodev,nosuid 172.16.1.31:/data/r /data/r/
  12. //3.扩展:nfs客户端永久挂载参数
  13. [root@backup-41 ~]# tail -2 /etc/fstab
  14. 172.16.1.31:/data/r /data/r nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0
  15. 172.16.1.31:/data/w /data/w nfs defaults,noatime,nodiratime,noexec,nodev,nosuid 0 0
  16. //4.扩展:客户端检查挂载参数是否生效
  17. [root@backup ~]# mount
  18. 等于
  19. [root@backup ~]# cat /proc/mounts

NFS服务部署的更多相关文章

  1. nfs服务部署记录

    一.概念介绍NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操作系统能 ...

  2. Linux NFS 服务部署

    系统环境:Oracle Linux 5.7 服务端:192.168.1.111 客户端:192.168.1.171 一.服务端配置 二.客户端配置 一.服务端配置 1.依次启动portmap和nfs服 ...

  3. NFS网络共享服务部署

    10.3 NFS服务端部署环境准备 10.3.1 NFS服务部署服务器准备 服务器系统 角色 IP Centos6.7 x86_64 NFS服务器端(NFS-server) 192.168.1.14 ...

  4. Linux NFS存储服务部署

    什么是NFS 中文意思是网络文件系统,主要功能是通过网络(一般是局域网)让不同主机之间可以共享文件或目录 NFS属于本地文件存储服务 缺点1: 1 2 3 4 5 6 7 windows上无法使用   ...

  5. NFS服务基础

    NFS服务部署: (一)NFS环境准备: 操作系统 角色 IP地址 CentOS Linux release 7.3.1611 (Core) NFS服务端 192.168.152.138 CentOS ...

  6. NFS存储服务部署

    第1章 NFS介绍 1.1 NFS服务内容的概述 □ RPC服务知识概念介绍说明,以及RPC服务存在价值(必须理解掌握) □ NFS服务工作原理讲解(必须理解掌握) □ NFS共享文件系统使用原理讲解 ...

  7. LINUX 系统下部署 NFS服务

    NFS服务 NFS,是Network File System的简写,即网络文件系统.也被称为NFS: NFS允许一个系统在网络上与他人共享目录和文件. NFS通常运行于2049端口. 部署NFS 前提 ...

  8. NFS共享存储服务部署

    第1章 NFS介绍 1.1 NFS基本概述 NFS(Network File System)网络文件系统 主要功能是通过局域网络让不同的主机系统之间可以共享文件或目录. NFS系统和Windows网络 ...

  9. ubuntu14.04 部署nfs服务

    安装nfs服务 apt-get install nfs-kernel-server 修改配置文件,共享目录为/var/www,*号可替换为客户端IP地址,*默认为任何部署了nfs客户端的IP可以挂载该 ...

随机推荐

  1. CSPS模拟 69

    $C_n^0=1$ $C_n^0=1$ $C_n^0=1$ 我怎么又双叒叕犯这种错误了啊 (咳檀) T1 WA0,大神题,不会做! T2 就是要找一个最长区间,满足左端点是区间最小值,右端点是区间最大 ...

  2. csps模拟测试92反思

    连着挂了三天T1了. 89: SPFA$vst$数组没清空 90:调试的时候多删了一句代码 91:没开$long long$ 我真是废物. 希望以后不要犯SB错误了

  3. Android开发中常用的设计模式

    首先需要说明的是,这篇博文灵感来自于 http://www.cnblogs.com/qianxudetianxia/archive/2011/07/29/2121547.html ,在这里,博主已经很 ...

  4. Kubernetes3-kubectl管理Kubernetes容器平台-2

    一.kubectl管理集群中deployment资源与service服务 1.相关参数 kubectl edit 编辑服务器侧资源 kubectl replace 替换,使用 yaml 配置文件来替换 ...

  5. jquery手机端横屏判断方法

    jquery手机端横屏判断方法<pre>$(function() { var bodywidth = $('body').width(); var bodyheight = $('body ...

  6. python中程序的异常处理

    什么叫异常? 导致程序异常退出叫做异常 try...except...else 如果要抓取某种特定异常可以用except ERROR as e else:如果程序正常执行那么会执行else里面的代码 ...

  7. js数组方法大全(下)

    # js数组方法大全(下) 记录一下整理的js数组方法,免得每次要找方法都找不到.图片有点多,注意流量,嘻嘻! 本期分享 forEach() map() filer() every() some() ...

  8. PowerMock学习之PoweMock的入门(二)

    前言 在上一篇<PowerMock学习之PoweMock的入门(一)>文章中,已经简单提及一些关于powermock的用法,但是入门还未完,我还要坚持把它学习并坚持更新到博客中. Mock ...

  9. spark集群搭建(三台虚拟机)——kafka集群搭建(4)

    !!!该系列使用三台虚拟机搭建一个完整的spark集群,集群环境如下: virtualBox5.2.Ubuntu14.04.securecrt7.3.6_x64英文版(连接虚拟机) jdk1.7.0. ...

  10. nyoj 305 表达式求值 (递归)

    表达式求值 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min ...