nfs

一、概念

1.基本概念

NFS就是Network File System的缩写,它最大的功能就是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。

​NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利。

NFS一般用来存储共享视频,图片等静态数据。不适合存储脚本、数据库文件。磁盘主要提供读操作,而尽量减少写操作。

 2.工作原理

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会开启111端口,等待客户端RPC请求。

如果客户端发起请求,那服务端的RPC就会将记录的NFS端口信息告知客户端。

RPC和NFS的启动顺序是怎样的?
启动NFS Server之前,首先要启动RPC服务(即portmap服务,下同)否则NFS Server无法向RPC服务器注册。另外,如果RPC服务重新启动,原来己经注册好的NFS端口数据就会全部去失。此时,RPC服务管理的NFS程序要重新启动,并重新向RPC注册。最后,一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs  reloade或者systemctl reload nfs

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

1)首先,服务端启动RPC服务,并开启RPC端口为111端口
2)之后,服务端启动NFS服务,并向该RPC服务注册1个随机的NFS端口。
3)然后,客户端启动RPC服务,并向服务端的RPC请求注册的NFS端口。
4)然后,服务端的RPC反馈NFS端口信息给客户端。
5)最后,客端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

3.NFS相关协议和软件

   (1)RPC  rpcbind(Linux)或RPC Endpoint Mapper(Windows)  服务端/客户端默认安装    

 

 

  (2)nfs-utilis-*  包括NFS命令与监控程序,默认安装了

  (3)rpcbind-*    支持安装RPC NFS服务连接。CentOS 6之前的叫做portmap,默认安装了

 

 4.NFS守护进程

   (1)nfs    主要:管理客户端是够能登陆到服务器

   (2)rpcbind  主要:进行端口映射工作

 

二、NFS服务简介

1.主配置文件

  /etc/exports  默认为空,或者默认不存在

  内容格式      共享目录  客户端1(访问权限、用户映射、其他)   客户端2(访问权限、用户映射、其他)

  a.共享目录:共享目录是指NFS服务器共享给客户机使用的目录.,
  b.客户端:客户端是指网络中可以访问这个NFS共享目录的计算机
  客户端常用的指定方式(*代表所有主机)
    指定ip地址的主机:192.168.100.20
    指定子网中的所有主机:192.168.100.0
    指定域名的主机:www.atguigu.com
    指定域中的所有主机:*.atguigu.com 
  c.设置输出目录的访问权限、用户映射等。

    访问权限选项:
      设置输出目录只读:ro
      设置输出目录读写:rw
    用户映射选项:
      root_squash:将root用户的访问映射为匿名(nfsnobody)用户uid和gid
      no_root_squash:保留管理员权限,以服务器管理员的权限管理
      all_squash:将远程访问的用户及所属组都映射为指定uid、gid的匿名用户:
          anonuid=xxx:将远程访问的所有用户都映射为指定uid的匿名用户
          anongid=xxx:将远程访问的所有用户组都映射为指定gid匿名组账户

    其它选项:

      sync:将数据立刻同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性(同步)。
      async:将数据先保存在内存缓冲区中,必要时才写入磁盘(异步)

2.NFS启动和停止 

  1、启动NFS服务器
    为了使NFS服务器能正常工作,需要启动rpcbind和nfs两个服务,   

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

  2、查询NFS服务器状态

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

  3、停止NFS服务器

[root@localhost ~]# systemctl stop nfs

  4、设置NFS服务自启动状态

[root@localhost ~]# chkconfig --list nfs
[root@localhost ~]# chkconfig --level 2345 nfs on
Note: Forwarding request to 'systemctl enable nfs.service'.
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

  5、查看RPC服务开启哪些端口

[root@localhost ~]# 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  50510  status
    100024    1   tcp  44883  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  45128  nlockmgr
    100021    3   udp  45128  nlockmgr
    100021    4   udp  45128  nlockmgr
    100021    1   tcp  43901  nlockmgr
    100021    3   tcp  43901  nlockmgr

 

三、NFS实验案例

1.NFS服务端的/atguigu共享给10.0.0.0网段,rw权限

[root@localhost ~]# mkdir /atguigu
[root@localhost ~]# chmod o+w /atguigu/    #文件系统开启other的写权限,文件系统+配置文件共同决定写权限。
[root@localhost ~]# vim /etc/exports
/atguigu  10.0.0.0(rw)               #共享目录写绝对路径,网段不用加/24只需要最后1位为0
[root@localhost ~]# systemctl reload nfs

2.NFS服务端重启rpcbind和nfs服务

[root@localhost ~]# systemctl restart nfs
[root@localhost ~]# exportfs            #查看已经设置的共享目录、共享者有哪些
/atguigu          10.0.0.150

3.NFS服务端查看NFS状态

[root@localhost ~]# showmount -e 10.0.0.50    #和exportfs功能相同,填写服务端IP地址
Export list for 10.0.0.50:
/atguigu 10.0.0.150

4.NFS客户端查看NFS状态

[root@localhost ~]# showmount -e 10.0.0.50    #和exportfs功能相同,仍然填写服务端IP地址
Export list for 10.0.0.50:
/atguigu 10.0.0.150

5.客户端挂载共享目录

[root@localhost sharedir]# mkdir /mnt/atguigu  #创建本地挂载点
[root@localhost sharedir]# mount -o vers=3 10.0.0.50:/atguigu /mnt/atguigu    #-o vers=3避免同步延迟,使用nfs v3版本进行挂载
[root@localhost sharedir]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 26G 4.4G 22G 17% /
devtmpfs 1.4G 0 1.4G 0% /dev
tmpfs 1.4G 0 1.4G 0% /dev/shm
tmpfs 1.4G 11M 1.4G 1% /run
tmpfs 1.4G 0 1.4G 0% /sys/fs/cgroup
/dev/sda1 1014M 170M 845M 17% /boot
tmpfs 283M 4.0K 283M 1% /run/user/42
tmpfs 283M 32K 283M 1% /run/user/1000
/dev/sr0 4.4G 4.4G 0 100% /run/media/user1/RHEL-7.5 Server.x86_64
//10.0.0.50/atguigu 26G 3.6G 23G 14% /mnt/sharedir
10.0.0.50:/atguigu 26G 3.6G 23G 14% /mnt/atgui

6.NFS共享权限和访问控制

6.1  root用户——>nfsnobody用户(默认情况下)

客户端:

[root@localhost atguigu]# vim a.txt
[root@localhost atguigu]# ll
total 8
-rw-r--r--. 1 nfsnobody nfsnobody  0 May  8 21:23 a.txt   #以root身份创建,但是被映射为nfsnobody用户
[root@localhost atguigu]# grep nfs /etc/passwd        #看一下nfsnobody是什么用户
rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin
nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologi

6.2  root用户——>root用户

服务端:

[root@localhost /]# vim /etc/exports
/atguigu  10.0.0.150(rw,no_root_squash)
[root@localhost /]# systemctl reload nfs

客户端:

[root@localhost atguigu]# vim b.txt  #客户端同步更新配置
[root@localhost atguigu]# ll
total 12
-rw-r--r--. 1 nfsnobody nfsnobody  0 May  8 21:23 a.txt
-rw-r--r--. 1 root      root      12 May  8 21:56 b.txt

6.3  任意用户——>指定uid+gid的匿名用户

服务端:

[root@localhost xinetd.d]# useradd nfs_test            #创建1个用户
[root@localhost xinetd.d]# id nfs_test
uid=1003(nfs_test) gid=1003(nfs_test) groups=1003(nfs_test)  #查看这个用户的uid和gid
[root@localhost /]# vim /etc/exports
tguigu  10.0.0.150(rw,all_squash,anonuid=1003,anongid=1003)  #将这个用户uid和gid映射过去
[root@localhost /]# systemctl reload nfs

客户端:

[root@localhost atguigu]# vim c.txt
[root@localhost atguigu]# ll
total 16
-rw-r--r--. 1 nfsnobody nfsnobody  0 May  8 21:23 a.txt
-rw-r--r--. 1 root      root      12 May  8 21:56 b.txt
-rw-r--r--. 1      1003      1003 10 May  8 22:08 c.txt

服务端:

[root@localhost atguigu]# ll
total 16
-rw-r--r-- 1 nfsnobody nfsnobody  0 May  8 21:23 a.txt
-rw-r--r-- 1 root      root      12 May  8 21:56 b.txt-rw-r--r-- 1 nfs_test  nfs_test  10 May  8 22:08 c.txt

7.卸载与自动挂载

7.1卸载

  客户端卸载:

[root@localhost atguigu]# umount /mnt/atguigu    #客户端主动卸载挂载的目录

  服务端卸载:

[root@localhost atguigu]# exportfs -au        #服务端暂时停止的自身共享

  服务端重新挂载:

[root@localhost atguigu]# exportfs -ra        #服务端继续进行的自身共享

7.2自动卸载

  /etc/fstab

[root@localhost atguigu]# vim /etc/fstab 
10.0.0.50/:atguigu     /mnt/atguigu            nfs     defaults,vers=3 0 0 
[root@localhost user1]# umount /mnt/atguigu
[root@localhost user1]# mount -a
[root@localhost user1]# df -h
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root   26G  4.4G   22G  17% /
devtmpfs               1.4G     0  1.4G   0% /dev
tmpfs                  1.4G     0  1.4G   0% /dev/shm
tmpfs                  1.4G   11M  1.4G   1% /run
tmpfs                  1.4G     0  1.4G   0% /sys/fs/cgroup
/dev/sda1             1014M  170M  845M  17% /boot
tmpfs                  283M  4.0K  283M   1% /run/user/42
tmpfs                  283M   32K  283M   1% /run/user/1000
/dev/sr0               4.4G  4.4G     0 100% /run/media/user1/RHEL-7.5 Server.x86_64
//10.0.0.50/atguigu     26G  3.6G   23G  14% /mnt/sharedir
10.0.0.50:/atguigu      26G  3.6G   23G  14% /mnt/atguigu

8.NFS的相关命令

8.1 exportfs

如果我们在启动了NFS之后又修改了/etc/exports,是不是还要重新启动NFS呢?这个时候我们就可以用exportfs命令来使改动立刻生效,该命令格式如下:
  格式:exportfs  [-aruv]
  -a全部挂载或卸载/etc/exports中的内容
  -r重新读取/etc/exports中的信息,并同步更新/etc/exports、/var/lib/nfs/xtab
  -u卸载单一目录(和-a起使用为卸载所有/etc/exportfs文件中的目录)
  -v在export的时候,将详细的信息输出到屏幕上。

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

8.2 rpcinfo

  rpcinfo -p      可以查看出c开启的端口所提供的程序有哪些。其中nfs开启的是2049,portmapper(rpcbind)开启的是111,其余则是rpc开启的。

  rpcbind    rpc服务不要停止、重启,它不仅仅为NFS提供服务,还为其他进程提供服务!!

 

 

 

 

 

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

C:\Users\y21355\Documents\ShareX\Screenshots\2020-05\chrome_6bVVxCCHSF.png

1、启动NFS服务器
为了使NFS服务器能正常工作,需要启动rpcbind和nfs两个服务,
servlcerpcbindstarte
servlcenfSstart
2、查询NFS服务器状态
servlcerpcbindstatus+'
servlcenfSStatLlS
并且rpcbind
一定要先于nfs启动。

posted @ 2020-05-08 23:32  3月の狮子  阅读(238)  评论(0编辑  收藏  举报