NFS服务

Posted zyybky

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NFS服务相关的知识,希望对你有一定的参考价值。

1、NFS服务:文件共享
  NFS(Network File System)网络文件系统,一种分散式文件系统的协定,功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位与服务器磁盘中的数据,是类Unix系统间实现磁盘文件共享的一种方法。
  NFS服务器可以允许NFS客户端将远端NFS服务端的共享目录挂载到本地的NFS客户端中,在本地的NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁盘分区和目录一样,一般客服端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。
NFS一般用来共享视频,图片等静态数据。

2、NFS挂载原理
  NFS是通过网络来进行服务端和客户端之间的数据传输。两者之间要想传输数据就要有对应的网络端口来进行传输。NFS服务器端随机选择端口来进行数据传输。NFS客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?其实NFS服务器时通过远程过程调用(remote procedure call 简称RPC)协议/服务来实现的。也就是说RPC服务会统一管理NFS的端口,客户端和服务端通过RPC来先沟通NFS使用了哪些端口,之后再利用这些端口(小于1024)来进行数据的传输。
  也就是RPC管理服务端的NFS端口分配,客户端要传数据,那客户端的RPC会先跟服务端的RPC去要服务器的端口,要到端口后再建立连接,然后传输数据。
那RPC和NPS之间又是如何之间相互通讯的?。

3、RPC和NFS之间的通讯过程
  首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口。RPC就会记录下这些端口。并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那服务器端的RPC就会将记录的NFS端口信息告知客户端。

4、RPC和NFS的启动顺序
  在启动NFS server之前,首先要启动RPC服务,否则NFS server就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文件后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload

总结:
  1>首先服务器启动RPC服务,并且开启111端口
  2>启动NFS服务,并向RPC注册端口信息
  3>客户端启动RPC,向服务端的RPC服务请求服务端的NFS端口
  4>服务器的RPC服务反馈NFS端口信息给客户端
  5>客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

 

技术图片

 5、NFS相关协议及软件安装管理
  1>协议:
    RPC(Remote Procedure Call Protocol)远程过程调用协议
  2>软件:
    nfs-utils*:包括NFS命令与监控程序
    rpcbind*:支持NFS RPC服务的连接
    注:通常情况下,是作为系统的默认包安装,CentOS6.*之前rpcbind叫portmap

  使用 rpm -q nfs、rpm -q rpcbind 命令来查看是否安装,如果默认没有安装则执行以下安装命令(centos7环境):

[root@centos7 ~]# yum install nfs-utils* rpcbind* -y    //服务器端
[root@centos7 ~]# yum install nfs-utils* rpcbind* -y //客户端

6、NFS系统守护进程
  nfs:它是基本的NFS守护进程,主要功能是管理客户端是否能够登陆服务器
  rpcbind:主要功能是进行端口映射工作,当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,rpcbind会将所管理的与服务器对应的端口提供给客户端,从而使客户端可以通过该端口向服务器请求服务。

7、NFS服务器的配置
  NFS服务器的配置相对比较简单,只需要在相应的配置文件中进行设置,然后启动NFS服务器即可。
  NFS服务的配置文件为/etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。
  /etc/ exports文件内容格式:

共享目录 客户端1(访问权限,用户映射,其他) 客户端2(访问权限,用户映射,其他)
  共享目录:共享目录是指NFS服务器共享给客户机使用的目录
  
  客户端:客户端是指网络中可以访问这个NPS共享目录的计算机   客户端常用的指定方式:     指定ip地址的主机:
192.168.100.20     指定子网中的所有主机:192.168.100. 0     指定域名的主机:www.pc.com     指定域中的所有主机:*.pc.com     所有主机:*
  
  设置输出目录的访问权限、用户映射等
    1>访问权限选项:
      设置输出目录只读:ro
      设置输出目录读写:rw
    2>用户映射选项
    root_squash:将root用户的访问映射为匿名 (nfsnobody) 用户uid和gid;(默认生效)
    no_root_squash:保留管理员权限,以服务器管理员的权限管理;
    all_squash:将远程访问的用户及所属组都映射为指定uid、gid的匿名用户;
    anonuid=xxx:将远程访问的所有用户都映射为指定uid的匿名用户;
    anongid=xxx:将远程访问的所有用户组都映射为指定gid匿名组账户;
    其它选项:
    sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性(同步);
    async:将数据先保存在内存缓冲区中,必要时才写入磁盘(异步);

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

语法:mount nfs服务器ip:共享目录 本地挂载点目录
# mount -o vers=3 共享 本地    //指定挂载使用nfs V3版本(避免同步延迟)

9、nfs共享权限和访问控制
  1>客户端root用户
    使用客户端的root身份在nfs服务器上创建文件,文件的所有者和所属组是nfsnobody。
  2>客户端普通用户
    使用客户端的普通用户身份在nfs服务器上创建文件,所有者和所属组是nobody或普通用户;
    如果明确设定了普通用户的映射用户身份,那么此时客户端用户的身份转换为指定映射用户;
    如果nfs server上面有同名用户,那么此时客户端登录账户的身份转换为nfs server 上面的同名用户。

10、nfs服务器实战

  1>环境构建:centos7
    192.168.100.101  nfs-server
    192.168.100.20    nfs-client

  2>服务器、客户机先查看是否安装rpcbind、nfs,若没有安装则进行安装

nfs-server:
[root@nfs-server ~]# rpm -q rpcbind
package rpcbind is not installed
[root@nfs-server ~]# rpm -q nfs
package nfs is not installed
[root@nfs-server ~]# yum install nfs-utils* rpcbind* -y

nfs-client:
[root@nfs-client ~]# rpm -q rpcbind
package rpcbind is not installed
[root@nfs-client ~]# rpm -q nfs
package nfs is not installed
[root@nfs-client ~]# yum install nfs-utils* rpcbind* -y

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

nfs-server:
[root@nfs-server ~]# systemctl start rpcbind
[root@nfs-server ~]# systemctl enable rpcbind
[root@nfs-server ~]# systemctl start nfs
[root@nfs-server ~]# 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-client:
[root@nfs-client ~]# systemctl start rpcbind
[root@nfs-client ~]# systemctl enable rpcbind
[root@nfs-client ~]# systemctl start nfs
[root@nfs-client ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

  4>查询NPS服务器状态:

[root@nfs-server ~]# systemctl status rpcbind
[root@nfs-server ~]# systemctl status nfs

  5>查看RPC服务器端口、共享状态

[root@nfs-server ~]# exportfs    //查看nfs共享有没有生效
# showmount -e 本机ip    //服务器查看nfs共享状态
# showmount -e nfs服务器ip    //客户端查看nfs共享状态

  6>创建共享目录,并配置nfs服务器、nfs客户端

nfs-server端:
[root@nfs-server ~]# mkdir /share //创建共享目录
[root@nfs-server ~]# chmod o+w /share //设定权限,允许其他人写操作
[root@nfs-server ~]# ll -d /share/
drwxr-xrwx 2 root root 6 Mar 13 15:07 /share/
[root@nfs-server ~]# vim /etc/exports //编辑配置文件 /share/ 192.168.100.20(rw) #允许192.168.100.20主机对共享目录,进行读写操作
[root@nfs-server ~]# systemctl reload nfs //重新加载配置文件
nfs-client端:
[root@nfs-client ~]# mkdir /share //创建共享目录,建议和nfs-server共享目录保持一致,方便管理
[root@nfs-client ~]# chmod o+w /share //设定权限,允许其他人写操作
[root@nfs-client ~]# ll -d /share/
drwxr-xrwx 2 root root 6 Mar 13 15:12 /share/
[root@nfs-client ~]# mount -o vers=3 192.168.100.101:/share/ /share //mount -o vers=3 指定挂载使用nfs V3版本(避免同步延迟)

  7>测试

client端创建:
[root@nfs-client ~]# cd /share/
[root@nfs-client share]# touch f1
[root@nfs-client share]# ls
f1

server端查看:
[root@nfs-server ~]# cd /share/
[root@nfs-server share]# ls
f1

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

[root@nfs-client share]# ll
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 3月  13 14:27 f1

  更改nfs-server端配置文件,使客户端所创建的文件所有者所属组为root

nfs-server端:
[root@nfs-server ~]# vim /etc/exports
/share/ 192.168.100.20(rw,no_root_squash)    #客户端所创建的文件所有者所属组为root
[root@nfs-server ~]# systemctl reload nfs

nfs-client端测试创建:
[root@nfs-client share]# touch f2
[root@nfs-client share]# ll
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 3月  13 14:27 f1
-rw-r--r-- 1 root      root      0 3月  13 14:34 f2

nfs-server端查看:
[root@nfs-server share]#ll
总用量 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 3月  13 14:27 f1
-rw-r--r--. 1 root      root      0 3月  13 14:34 f2

  更改nfs-server配置文件,设置映射用户

nfs-server创建测试映射用户nfstest,编辑nfs-server配置文件
[root@nfs-server share]# useradd nfstest
[root@nfs-server share]# id nfstest
uid=1000(nfstest) gid=1000(nfstest) 组=1000(nfstest)
[root@nfs-server share]# vim /etc/exports
/share/ 192.168.100.20(rw,all_squash,anonuid=1000,anongid=1000)
[root@nfs-server share]#  systemctl reload nfs

nfs-client端创建文件,服务端查看验证
[root@nfs-client share]# touch f3
[root@nfs-client share]# ll
总用量 0
-rw-r--r-- 1 nfsnobody nfsnobody 0 3月  13 14:27 f1
-rw-r--r-- 1 root      root      0 3月  13 14:34 f2
-rw-r--r-- 1      1000      1000 0 3月  13 14:40 f3

nfs-server端查看验证
[root@nfs-server share]#ll
总用量 0
-rw-r--r--. 1 nfsnobody nfsnobody 0 3月  13 14:27 f1
-rw-r--r--. 1 root      root      0 3月  13 14:34 f2
-rw-r--r--. 1 nfstest   nfstest   0 3月  13 14:40 f3

11、卸载和自动挂载
  1>卸载:
    (1)卸载客户端的挂载目录(客户端主动卸载)
      umount 挂载点
    (2)停止服务器端的共享(服务器端主动卸载)
      exportfs -au
  2>自动挂载:/etc/fstab
    # 192.168.100.101:/share /share nfs defaults 0 0

12、相关命令

1>exportfs命令
  如果我们在启动了NFS之后又修改了/etc/ exports,是不是还要重新启动nfs呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:
  格式: exportfs [-aruv]
    -a全部挂载或卸载/etc/exports中的内容
    -r重新读取/etc/exports 中的信息,并同步更新/etc/exports、 /var/lib/nfs/xtab
    -u卸载单一目录(和-a一起使用为卸载所有/etc/exports文件中的目录)
    -v在export的时候,将详细的信息输出到屏幕上
  例:
    # exportfs -au卸载所有共享目录
    # exportfs -ra重新共享所有目录并输出详细信息
2>rpcinfo命令
  利用rpcinfo -p可以查看出RPC开启的端口所提供的程序有哪些,其中nfs开启的是2049端口,portmapper (rpcbind)开启的是111,其余则是rpc开启的

以上是关于NFS服务的主要内容,如果未能解决你的问题,请参考以下文章

Linux NFS服务

rsync nfs 实时同步,结合实战

java保存nfs

搭建NFS服务器

NFS 源代码

NFS文件系统服务器与客户端安装exportfs命令