NFS

NFS(Network File System,网络文件系统),它可以通过网络让不同操作系统,不同机器共享彼此的文件。
NFS 分为服务端和客户端。服务端提供共享的文件目录,客户端将该目录挂载到本地目录,从客户端上看,相当于是将磁盘分区挂载到目录,非常便利。

NFS 工作原理

 
 
NFS 工作原理如上图所示。其中,RPC 服务是 Remote Process Call 远程过程调用服务,它的出现主要是为了解决 NFS 端口无法固定的问题。由于文件系统非常复杂,NFS 中不同程序对应不同的功能,每个程序开启相应的功能会随机启用额外的端口。但是对于客户端来说,随机取用的端口,客户端无法获取到,所以就需要 RPC 服务作为“中介”,NFS 服务每次启用的端口信息,都会到 RPC 中注册(所以启动 NFS 服务之前要先确保 RPC 服务已经启动了)。同时,RPC 会提供一个固定的外部端口 111 供外部机器访问。这样客户端有 NFS 请求,服务端会通过 RPC 服务将 NFS 的端口信息告知客户端,从而实现客户端和服务端 NFS 的连接和数据传输。
 
 
NFS 的工作流程:
1. NFS 服务器端会启动 RPC 服务(portmap),并开启 111 端口。
2. NFS 服务器端再启动 NFS 服务,服务启动后向 RPC 服务注册端口信息。
3. 客户端启动 RPC 服务,向服务端的 RPC 服务请求服务端的 NFS 端口信息。
4. 服务端的 RPC 服务将端口信息发给客户端的 RPC 服务。
5. 客户端通过获取到的端口信息建议和服务端 NFS 的连接和数据的传输。
 
 

NFS 部署

NFS 程序

NFS 程序主要有 RPC 主程序 rpcbind 和 NFS 主程序 nfs-utils。
rpcbind: 如前所述,负责 port mapping 的工作。
nfs-utils: NFS 主程序,包含 rpc.nfsd / rpc.mount / rpc.locked / rpc.statd 等几个 damones 。
[root@test home]# ps -ef | egrep "rpc|nfs"
root 487 2 0 Mar21 ? 00:00:00 [rpciod]
rpc 65293 1 0 Mar21 ? 00:00:00 /sbin/rpcbind -w
rpcuser 76183 1 0 Mar21 ? 00:00:00 /usr/sbin/rpc.statd --no-notify
root 152992 567813 0 18:43 pts/0 00:00:00 grep -E --color=auto rpc|nfs
root 757265 1 0 17:08 ? 00:00:00 /usr/sbin/rpc.idmapd
root 757267 1 0 17:08 ? 00:00:00 /usr/sbin/rpc.mountd
root 757272 2 0 17:08 ? 00:00:00 [nfsd4_callbacks]
root 757278 2 0 17:08 ? 00:00:00 [nfsd]
root 757279 2 0 17:08 ? 00:00:00 [nfsd]
root 757280 2 0 17:08 ? 00:00:00 [nfsd]
root 757281 2 0 17:08 ? 00:00:00 [nfsd]
root 757282 2 0 17:08 ? 00:00:00 [nfsd]
root 757283 2 0 17:08 ? 00:00:00 [nfsd]
root 757284 2 0 17:08 ? 00:00:00 [nfsd]
root 757285 2 0 17:08 ? 00:00:00 [nfsd]
每个 damones 负责的功能如下:
rpc.nfsd:管理客户端是否能使用服务端文件系统。包括判断用户登录 ID 等。
rpc.mountd:管理 NFS 文件系统。当客户端通过 rpc.nfsd 登入主机之后,rpc.mountd 通过读取 NFS 配置文件 /etc/exports 对客户端进行权限认证。当权限认证通过后,客户端即可以访问服务端文件系统。
rpc.locked:管理文件锁定问题。当多个用户读写同一份文件时可能会对文件造成一些问题,rpc.locked 即对文件进行保护,从而避免出现这样的问题,它是可选的。
rpc.statd:管理文件一致性问题。当多个用户同时使用文件造成文件损坏时,rpc.statd 可以检测并且尝试恢复该文件。
 

NFS 配置文件

NFS 的主要配置文件是 /etc/exports 文件。它的格式是  #共享目录 [客户端地址1(权限)] [客户端地址2(权限)] ...  其中,共享目录是服务端要共享给客户端的目录。客户端地址是可以建立 NFS 连接的客户端地址,可以是 ip ,可以是 cidr ,也可以是主机名 (前提是在 /etc/hosts 或者通过 DNS 可以查询到)。权限是客户端用户访问服务端文件系统所具有的权限,它包含以下几个参数:
参数命令
参数作用
rw
可读写
ro
只读权限
sync
请求或写入数据时,数据会同步写入到服务端硬盘,再返回
no_root_squas
对于客户端用户 root 不压缩。即客户端 root 可以以 root 身份来访问文件
root_squash
对客户端用户 root 压缩,将 root 身份压缩为 nobody
all_squash
对客户端所用用户压缩,默认将用户身份压缩为用户 nobody 和用户组 nobody。
可指定压缩用户的身份,但是需要客户端和服务端都有该用户,否则无法访问
anonuid
匿名的 uid,说明客户端以什么用户来访问服务端文件系统
anongid
匿名的 gid,说明客户端以什么用户组来访问服务端文件系统
 
举例:
/home/test 10.57.0.0/24(rw,sync,all_squash,anonuid=4300,anongid=4300),指在 cidr 10.57.0.0/24 内的客户端主机,能够以 uid/gid 4300 的用户身份通过读写方式访问服务端 /home/test 目录。
 
NFS 还有两个文件是 /var/lib/nfs/etab 和 /var/lib/nfs/rmtab 。 etab 文件记录了 NFS 共享的文件目录的完整权限设定值。 rmtab 文件记录了共享目录被挂载情况。
 

NFS 命令

rpcinfo: 输出 RPC 记录的信息。
exportfs: 维护 NFS 文件系统表。通过 exportfs 命令可重新分享 /etc/exports 文件的目录,该命令用在服务端。
showmount:查看 NFS server 共享的目录资源,该命令主要用在客户端。
 

NFS 配置实例

配置 NFS 使得 cidr 10.57.0.0/24 内的客户端主机,能够以 uid/gid 4300 的用户身份通过读写方式访问服务端 /home/test 目录。
 
配置步骤如下:
1. 服务端,客户端安装 rpcbind 和 nfs-utils。
2. 启动 rpcbind 服务,启动 nfs 服务。
3. 服务端配置 /etc/exports 文件:/home/test 10.57.0.0/24(rw,sync,all_squash,anonuid=4300,anongid=4300)
4. 服务端关闭 iptables。关闭 iptables 是因为 NFS 随机开启的端口信息并不会写入到 iptables 中,所以需要手动写入(关于 iptables 可看这里),这里暴力一点直接将 iptables 关掉。SELiunx 有开的,可以将 SELiunx 关闭。
5. 客户端挂载服务端共享目录。
6. 新建文件测试是否配置是否生效。
 
1. 服务端,客户端安装 rpcbind 和 nfs-utils:
[root@test home]# rpm -qa | egrep "rpc|nfs"
libnfsidmap-0.25-15.el7.x86_64
rpcbind-0.2.0-38.el7.x86_64
libtirpc-0.2.4-0.8.el7.x86_64
nfs-utils-1.3.0-0.33.el7.x86_64
xmlrpc-c-1.32.5-1905.svn2451.el7.x86_64
xmlrpc-c-client-1.32.5-1905.svn2451.el7.x86_64
已经安装好了,没安装的可通过 yum install rpcbind nfs-utils 命令安装。
 
2. 启动 rpcbind 服务,启动 nfs 服务:
[root@test home]# systemctl start rpcbind
[root@test home]# systemctl start nfs [root@test test]# rpcinfo -p localhost
program vers proto port service
100000 4 tcp 111 portmapper
100000 3 tcp 111 portmapper
100000 2 tcp 111 portmapper
100000 4 udp 111 portmapper
100000 3 udp 111 portmapper
100000 2 udp 111 portmapper
100024 1 udp 55860 status
100024 1 tcp 49019 status
100005 1 udp 20048 mountd
100005 1 tcp 20048 mountd
100005 2 udp 20048 mountd
100005 2 tcp 20048 mountd
100005 3 udp 20048 mountd
100005 3 tcp 20048 mountd
100003 3 tcp 2049 nfs
100003 4 tcp 2049 nfs
100227 3 tcp 2049 nfs_acl
100003 3 udp 2049 nfs
100003 4 udp 2049 nfs
100227 3 udp 2049 nfs_acl
100021 1 udp 36125 nlockmgr
100021 3 udp 36125 nlockmgr
100021 4 udp 36125 nlockmgr
100021 1 tcp 42363 nlockmgr
100021 3 tcp 42363 nlockmgr
100021 4 tcp 42363 nlockmgr
 
3. 服务端配置 /etc/exports 文件:
服务端:
[root@test test]# cat /etc/passwd | grep 4300
[root@test test]# cat /etc/group | grep 4300
[root@test test]# groupadd -g 4300 lianhuasheng
[root@test test]# useradd -u 4300 -g 4300 lianhuasheng
[root@test test]# cat /etc/passwd | grep lianhuasheng
lianhuasheng:x:4300:4300::/home/lianhuasheng:/bin/bash [root@test home]# cat /etc/exports | grep 4300
/home/test 10.57.0.0/24(rw,sync,all_squash,anonuid=4300,anongid=4300) [root@test home]# systemctl restart nfs
 
客户端:
[root@test test]# cat /etc/passwd | grep 4300
[root@test test]# cat /etc/group | grep 4300
[root@test test]# groupadd -g 4300 lianhuasheng
[root@test test]# useradd -u 4300 -g 4300 lianhuasheng
[root@test test]# cat /etc/passwd | grep lianhuasheng
lianhuasheng:x:4300:4300::/home/lianhuasheng:/bin/bash
 
如参数一节所述,服务端和客户端都需要配置相同的 uid 和 gid。同时,在重新写 exports 文件后,需要重启 nfs 服务使配置生效。
 
4. 关闭 iptables:
[root@test test]# systemctl stop iptables
 
5. 客户端挂载服务端共享目录:
[root@test lianhuasheng]# showmount -e 10.57.0.1
Export list for 10.57.0.1:
/home/test 10.57.0.0/24
[root@test test]# mount -t nfs 10.57.0.1:/home/test /home/test/lianhuasheng/
[root@test home]# df -hT | grep lianhuasheng
10.57.0.1:/home/test nfs4 895G 849G 46G 95% /home/test/lianhuasheng
 
6. 新建文件测试是否配置是否生效:
客户端:
[root@test lianhuasheng]# touch nfs.log
[root@test lianhuasheng]# ll
total 0
-rw-r--r--. 1 lianhuasheng lianhuasheng 0 Mar 22 17:10 nfs.log
 
服务端:
[root@test test]# ll -h
total 0
-rw-r--r--. 1 lianhuasheng lianhuasheng 0 Mar 22 17:10 nfs.log
 
客户端以 root 身份创建文件 nfs.log,文件所属用户和用户组被修改为 4300 对应的用户 lianhuasheng。服务端查看该文件所属用户和用户组为 lianhuasheng。
 

NFS Troubleshooting

1. 挂载出现 error:clnt_create: RPC: Port mapper failure - Unable to receive: errno 113 (No route to host)
出现这种 error 是由于客户端无法访问到服务端。可通过两种方式解决:
  • 暴力一点直接将 iptables 服务关闭。
  • 固定 NFS 端口,将端口信息写入 iptables 中,重启 iptables 服务。
参考连接见这里:  
 
2. umount 文件时出现 error:umount:/mnt:target is busy
出现这个 error 时当前磁盘正在使用。可通过 lsof 命令 show 出使用该挂载目录的 PID:
[root@test lianhuasheng]# lsof /home/test/lianhuasheng/
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
lsof 407987 root cwd DIR 0,549 21 1325440613 /home/test/lianhuasheng (10.57.0.1:/home/test)
lsof 407988 root cwd DIR 0,549 21 1325440613 /home/test/lianhuasheng (10.57.0.1:/home/test)
bash 682732 root cwd DIR 0,549 21 1325440613 /home/test/lianhuasheng (10.57.0.1:/home/test)
然后将此 PID kill 掉,重新 umount。
 
 
 (完)

每天学五分钟 Liunx 111 | 存储篇:NFS的更多相关文章

  1. 如何从40亿整数中找到不存在的一个 webservice Asp.Net Core 轻松学-10分钟使用EFCore连接MSSQL数据库 WPF实战案例-打印 RabbitMQ与.net core(五) topic类型 与 headers类型 的Exchange

    如何从40亿整数中找到不存在的一个 前言 给定一个最多包含40亿个随机排列的32位的顺序整数的顺序文件,找出一个不在文件中的32位整数.(在文件中至少确实一个这样的数-为什么?).在具有足够内存的情况 ...

  2. 五分钟学Java:如何才能学好Java Web里这么多的技术

    原创声明 本文作者:黄小斜 转载请务必在文章开头注明出处和作者. 系列文章介绍 本文是<五分钟学Java>系列文章的一篇 本系列文章主要围绕Java程序员必须掌握的核心技能,结合我个人三年 ...

  3. 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画

    原文:零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形动画 零元学Expression Blend 4 - Chapter 42 五分钟快速完成扇形变圆形 ...

  4. 《sed的流艺术之一》-linux命令五分钟系列之二十一

    本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...

  5. GC算法精解(五分钟让你彻底明白标记/清除算法)

    GC算法精解(五分钟让你彻底明白标记/清除算法) 相信不少猿友看到标题就认为LZ是标题党了,不过既然您已经被LZ忽悠进来了,那就好好的享受一顿算法大餐吧.不过LZ丑话说前面哦,这篇文章应该能让各位彻底 ...

  6. zookeeper-架构设计与角色分工-《每日五分钟搞定大数据》

    本篇文章阅读时间5分钟左右 点击看<每日五分钟搞定大数据>完整思维导图   zookeeper作为一个分布式协调系统,很多组件都会依赖它,那么此时它的可用性就非常重要了,那么保证可用性的同 ...

  7. 「每日五分钟,玩转JVM」:线程共享区

    前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计 ...

  8. 五分钟搭建一个基于BERT的NER模型

    BERT 简介 BERT是2018年google 提出来的预训练的语言模型,并且它打破很多NLP领域的任务记录,其提出在nlp的领域具有重要意义.预训练的(pre-train)的语言模型通过无监督的学 ...

  9. Python专题——五分钟带你了解map、reduce和filter

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是Python专题第6篇文章,给大家介绍的是Python当中三个非常神奇的方法:map.reduce和filter. 不知道大家看到ma ...

  10. 一门能让你五分钟学会的语言-Brainfuck

    看到标题,不出意外的话,你肯定开始骂我了:**标题党,什么编程语言五分钟就能学会? 其实我本来也是不相信的,但是学过了才知道这是真的. 1.Brainfuck 看到这个小标题,不要误会,我没有骂人. ...

随机推荐

  1. [VBA] 实现SQLserver数据库的增删改查

    [VBA] 实现 SQLserver数据库的增删改查 问题背景 用于库存管理的简单Excel系统实现,能够让库管员录入每日出入库信息并进能够按日期查询导出数据,生成简要报表,以及数据修改与删除.非科班 ...

  2. 微调baichuan2-7b遇到的显存坑

    问题描述: 微调baichuan2-7b模型,验证一轮后继续训练第一个iteration显存大幅增加 项目链接: https://github.com/wp931120/baichuan_sft_lo ...

  3. flower插件-监视celery

    安装和使用: https://flower.readthedocs.io/en/latest/install.html#installation https://github.com/mher/flo ...

  4. ElasticSearch-document文档数据-增删改

    文档就是相当于每条记录. 每个文档(数据记录行)都有几个元数据,分别是: _index,表示该文档是那个索引中的. _type,表示文档的类型 _id,文档的唯一ID编号 _score,相关性分数. ...

  5. 学习JVM---入门

    1.JVM体系结构 JVM的位置 JVM体系结构 2.类加载器 双亲委派机制 package java.lang; /** * 测试自定义java.lang.String类能否运行成功 * 体会双亲委 ...

  6. 一文读懂Spring框架中依赖注入流程

    想读懂Spring的依赖注入流程,我们先简单了解一下Ioc和DI是什么? IoC和DI Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计 ...

  7. [极客大挑战 2019]Havefun 1

    [极客大挑战 2019]Havefun 1 一,审题,观察题目信息和知识点 观察题目,没发现有效信息 ​ F12打开源代码,发现有一个GET传输. ​ 知识点 GET方法的数据传输是通过URL传输的, ...

  8. picker组件增加搜索item条目的功能

    picker组件顶部有搜索框,能搜索条目,如果条目很多的时候,上下翻很麻烦了,而且不容易找到,可以先全查,然后js搜索 wxml <button bindtap="openFlag&q ...

  9. MySQL进阶篇:详解存储引擎MyISAM

    MySQL进阶篇:第一章_一.三_存储引擎特点_MyISAM 1.1 存储引擎特点 1.1.2 MyISAM 1). 介绍 MyISAM是MySQL早期的默认存储引擎.. 2). 特点 不支持事务,不 ...

  10. 如何强制SQL走性能更优的hash join

    本文分享自华为云社区<[SQL优化]为什么有时候无法走执行性能更优的hashjoin>,作者: leapdb. 1. hash join通常优于nestloop join 通常nestlo ...