1. 什么是NFS

  NFS是 Network File System 的缩写,即网络文件系统。一种使用于分散式文件系统的协议,有Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix 系统间实现磁盘文件共享的一种方法。

  它的主要功能是通过网络让不同的机器之间可以彼此共享文件和目录。NFS 服务器可以允许NFS客户端将远端NFS 服务器端的共享目录挂载到本地的 NFS 客户端中。在本地的 NFS 客户端的机器看来,NFS 服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但是为了方便管理,建议和服务器端保持一致。

NFS 一般用来存储共享视频,图片等静态数据。

2. NFS 挂载原理

  NFS 是通过网络进行服务端和客户端之间的数据传输。两者之间要传输数据就要有相对应的网络端口来进行传输。NFS服务器到底使用什么网络端口来传输数据的,NFS 服务器端其实是随机选择端口来进行数据传输。那NFS客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?其实NFS 服务器是通过远程调用(remote procedure call 简称 RPC)协议/服务来实现的。也就是说RPC 服务会统一管理NFS 的端口,客户端和服务端通过RPC 来沟通NFS 使用哪些端口,之后在利用这些端口(小于1024)来进行数据的传输。

  也就是 RPC 管理服务端的 NFS 端口分配,客户端要传数据,那客户端的 RPC 会先跟服务端的 RPC 去要服务器的端口,要到端口之后再建立连接,然后传输数据。

RPC 和 NFS 之间如何相互通讯?

首先当NFS 启动后,就会随机的使用一些端口,然后NFS 就会向 RPC 去注册这些端口。RPC 就会记录下来这些端口。并且 RPC 会开启111 端口,等待客户端 RPC 的请求,如果客户端有请求,那服务端的 RPC 就会把记录的 NFS 端口信息告诉客户端。

RPC 和 NFS 的启动顺序是怎样的?

在启动 NFS 服务之前,首先要启动RPC 服务(即 portmap 服务,下同),否则NFS 服务就无法向 RPC 服务区注册,另外,如果 RPC 服务重新启动,原来已经注册好的 NFS 端口数据就会全部丢失,因此此时 RPC 服务管理的NFS 服务也需要重新启动以重新想 RPC 注册。注:一般修改 NFS 配置文件后,是不需要重启NFS 的,直接 /etc/init.d/nfs reload

总结:客户端 NFS 和服务端 NFS 通讯过程

1)首先服务器端启动RPC 服务,并开启111端口

2)启动 NFS 服务,并向 RPC 注册端口信息

3)客户端启动RPC(portmap服务),向服务端的RPC 服务请求服务端的 NFS 端口

4)服务端的 RPC (portmap)服务反馈NFS 端口信息给客户端

5)客户端通过获取到的NFS 端口来建立和服务端的NFS 连接并进行数据的传输

3. NFS 相关协议及软件安装管理

协议:

  RPC(Remote Procedure Call Protocol)--远程过程调用协议

软件:

  nfs-util-*:包括 NFS 命令与监控程序

  rpcbind-*:支持安装NFS RPC 服务的连接

注:通常情况下,是作为系统的默认包安装的

Centos6.*之前 rpcbind 叫 portmap

4. NFS 系统守护进程

nfs:基本的NFS 守护进程,主要功能是管理客户端是否能够登陆服务器

rpcbind:主要功能是进行端口映射工作。当客户端尝试连接并使用RPC 服务器提供的服务(如NFS服务)时,rpcbind 会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过端口向服务器请求服务。

5.NFS 服务器的配置

NFS 服务器的配置相对比较简单,只需在相应的配置文件中进行设置,然后启动NFS 服务器即可。

NFS 服务的配置文件为 /etc/exports,这个文件是NFS 的主要配置文件,不过系统没有默认值,所以这个文件不一定会存在,可能需手动建立,然后在文件里写入配置内容。

/etc/exports 文件内容格式:

共享目录  客户端1 (访问权限,用户映射,其他) 客户端2 (访问权限,用户映射,其他)

a. 共享目录:共享目录是指NFS 服务器共享给客户机使用的目录

b. 客户端:客户端是指网络中可以访问这个 NFS 共享目录的计算机

客户端常用的指定方式:

  指定ip 地址的主机:192.168.80.130

  指定子网中所有的主机:192.168.80.0

  指定域名的主机:www.learn.com

  指定域中的所有主机:*.learn.com

  所有主机:*

c. 设置共享目录的访问权限、用户映射等。

访问权限设置:

  设置共享目录只读:ro

  设置共享目录读写:rw

用户映射选项:

  root_squash:将root用户的访问映射为匿名(nfsnobady)用户的 uid 和 gid(默认生效);

  no_root_squash:保留管理员权限,以服务器管理员的权限管理;

  all_squash:将远程访问的用户及所属组都映射为指定 uid 和 gid 的匿名用户;

    anonuid=xxx:将远程访问的所有用户都映射为指定 uid 的匿名用户;

    anongid=xxx:将远程访问的所有用户组都映射为指定 gid 的匿名组用户;

其他选项:

  sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性(同步);

  async:将数据先保存在内存缓冲区中,必要时再写入磁盘(异步);

6. NFS服务器的启动与停止

6.1 启动 NFS 服务器

为了使NFS 服务器能正常工作,需要启动 rpcbind 和 nfs 两个服务,并且 rpcbind 一定要先于 nfs 启动

[root@centos2 ~]# systemctl start rpcbind
[root@centos2 ~]# systemctl start nfs

6.2 查看NFS 服务状态

[root@centos2 ~]# systemctl status nfs
[root@centos2 ~]# systemctl status rpcbind

6.3 停止 NFS 服务

要停止 NFS 时,需要先停止nfs 服务再通知 rpcbind 服务,对于系统中有其他服务(如NIS)需要使用时,不需要停止rpcbind服务

root@centos2 ~]# systemctl stop nfs
[root@centos2 ~]# systemctl stop rpcbind

6.4 设置NFS 服务的自启动状态

设置rpcbind和nfs服务在系统运行级别2345自动启动。

chkconfig --level  rpcbind on
chkconfig --level nfs on systemctl enable rpcbind
systemctl enable nfs

6.5 查看RPC 服务开启了哪些端口

[root@centos2 ~]# rpcinfo -p localhost

7. 实验

7.1 将 NFS 服务器的/home/sss共享给192.168.80.0 网段,rw 权限

[root@centos2 ~]# vim /etc/exports
/home/sss 192.168.80.0 (rw)

7.2 重启rpcbind和nfs 服务

[root@centos2 ~]# systemctl restart rpcbind
[root@centos2 ~]# systemctl restart nfs
[root@centos2 ~]# exportfs

7.3 服务器端查看nfs共享状态

[root@centos2 ~]# showmount -e 本机ip
#查看自己共享的状态

7.4 客户端查看nfs共享状态

[root@localhost ~]# showmount -e NFS服务器IP

7.5 客户端挂载nfs服务器共享目录

命令格式:

mount NFS服务器IP:共享目录 本地挂载点
[root@localhost ~]# mount 192.168.80.129:/home/sss /mnt/sss
[root@localhost ~]# mount |grep nfs
mount -o vers= 共享 本地
#指定挂载使用nfs v3版本(避免同步延迟)

验证客户端和nfs服务端文件是否一致

如果权限不够,修改服务器端相应程序,不然客户端无法正常访问和使用

7.6 nfs共享权限和访问控制

a. 客户端root 用户

  使用客户端的root 身份在nfs 服务器上创建文件,文件的所有者和所属组是nfsnobody。

b. 客户端普通用户

  使用客户端的普通用户身份在nfs服务器上创建文件,所有者和所属组是nobody或普通用户。

  如果明确设定了普通用户的映射用户身份,那么此时客户端用户的身份转换为指定映射用户;

  如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;

7.7 卸载和自动挂载

卸载:

  1. 卸载客户端的挂载目录

umount 挂载点

  2. 停止服务端的共享

exportfs -au

自动挂载:/etc/fstab

  格式:

<server>:</remote/export> </local/directory> nfs < options>  

192.168.80.129:/home/sss /mnt/sss nfs defaults  

mount -a

8. 相关命令

exportfs 命令

  如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs 命令来使改动立刻生效,该命令格式如下:

格式:exportfs [-aruv]
-a 全部挂载或卸载 /etc/exports 中的内容
-r 重新读取 /etc/exports 中的信息,并同步更新/etc/exports、/var/lib/nfs/xtab
-u 卸载单一目录(和-a一起使用为卸载所有/etc/exportswe文件中的目录)
-v 在export的时候,把详细信息输出到屏幕上

例:

exportfs -au    卸载所有共享目录
exportfs -ra 重新共享所有目录并输出详细信息

rpcinfo 命令

利用rpcinfo -p 可以查看RPC 开启的端口所提供的程序有哪些

其中nfs 开启的是2049,portmapper(rpcbind) 开启的是111,其余则是rpc开启的

网络文件系统-NFS的更多相关文章

  1. Linux下网络文件系统NFS服务搭建易错点总结

    一.环境准备: 1 [root@czh ~]# cat /etc/redhat-release 2 CentOS release 6.7 (Final) 3 [root@czh ~]# uname - ...

  2. 网络文件系统(NFS)简介

    网络文件系统(Network File System, NFS)是一种分布式文件系统协议,最初由Sun Microsystems公司开发,并于1984年发布.其功能旨在允许客户端主机可以像访问本地存储 ...

  3. 网络文件系统NFS

    NFS介绍 什么是NFS? NFS是Network File System的缩写,即网络文件系统.它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录.NFS客户端(一般为应用 ...

  4. Centos 7网络文件系统nfs服务的安装与配置

    实验环境>>>>>>>>> nfs服务端:(nfs-server)192.168.100.2 nfs客户端:(nfs-client)192.168 ...

  5. Linux网络文件系统NFS详解

    什么是文件系统,NFS文件系统又是什么? 简单的说,文件系统就是通过软件对磁盘上的数据进行组织和管理的一种机制,对其的一种封装或透视. 你女朋友拍了美美的暧昧照片,放一个文件夹里发送给了A服务器,当你 ...

  6. NFS的安装以及windows/linux挂载linux网络文件系统NFS

    1.创建linux的NFS服务端安装centos6.4,关闭防火墙/etc/init.d/iptables status yum install nfs-utils rpcbind [root@lin ...

  7. 网络文件系统nfs文件系统使用(很全面)

    一.NFS简介 1.NFS就是Network FileSystem的缩写,它的最大功能就是可以通过网络让不同的机器,不同的操作系统彼此共享文件(sharefiles)——可以通过NFS挂载远程主机的目 ...

  8. 网络文件系统nfs文件系统使用(比较全面)

    一.NFS简介 1.NFS就是Network FileSystem的缩写,它的最大功能就是可以通过网络让不同的机器,不同的操作系统彼此共享文件(sharefiles)——可以通过NFS挂载远程主机的目 ...

  9. 网络文件系统nfs在ubuntu16.04的安装

    1.搜索nfs-sudo apt-cache search nfs- 2.安装sudo apt-get install nfs-kernel-server 3.配置:/etc/exports /hom ...

随机推荐

  1. connect ECONNREFUSED 127.0.0.1:80错误解决

    这个报错也是一直困扰了我许久,服务端一直打印这个报错,但是页面数据响应又都正常,起初真不知道是因为什么原因,能看出来他是在调用80端口, 但是不明白为什么会调用80端口.一度以为是config.js里 ...

  2. 使用socket.io实现简单的聊天功能

    Socket.io实际上是WebSocket的父集,Socket.io封装了WebSocket和轮询等方法 首先得在你的项目中安装socket.io $ npm install socket.io 服 ...

  3. 第02组 Alpha冲刺(1/6)

    队名:無駄無駄 组长博客 作业博客 组员情况 张越洋 过去两天完成了哪些任务 如何进行团队代码的版本管理 如何使用微信云开发 如何使用管理微信开发团队 接下来的计划 沟通前后端成员,监督.提醒他们尽快 ...

  4. npm install命令遇到relocation error: npm: symbol SSL_set_cert_cb的报错问题

    在安装elasticsearch-head的过程中npm install遇到如下报错 [root@localhost elasticsearch-head]# npm install npm: rel ...

  5. 缓存穿透 & 缓存击穿 & 缓存雪崩

    参考文档: 缓存穿透和缓存失效的预防和解决:https://blog.csdn.net/qq_16681169/article/details/75138876 缓存穿透 缓存穿透是指查询一个一定不存 ...

  6. Makefile文件基本格式

    以下是Makefile的基本模板 #指定编译器CC = g++#指定编译参数CFLAGS = -std=c++11 #指定头文件路径,此处用于指定非标准库的头文件路径INC = -I./ -I /us ...

  7. gamma测试报告

    Gamma阶段测试报告 测试计划及结果 我们针对测试做了比较多的改进. 测试代码分为针对纯java部分的单元测试和需要android运行环境的自动化仪器化测试 单元测试 这一部分基本继承Beta阶段的 ...

  8. 数据对象如何定义为Java代码示例

    想将数据保存为这样子: [{ "subject": { "code": "B123", "words": [{ &quo ...

  9. PatchMatchStereo可能会需要的Rectification

    在稠密三维重建中,rectification可以简化patch match的过程.在双目特征匹配等场景中其实也用得到,看了一下一篇论文叫< A Compact Algorithm for Rec ...

  10. 详解redis持久化

    我们的Redis必须使用数据持久化吗?如果我们的Redis服务器只作为缓存使用,Redis中存储的所有数据都是从其他地方同步过来的备份,那么就没必要开启数据持久化的选项.Redis提供了将数据定期自动 ...