NFS服务

一、工作原理

1.NFS服务工作流程

2.NFS服务工作原理

二、RPC服务

1.RPC服务端口

默认端口:111

[root@nfs01 /]# systemctl restart rpcbind
[root@nfs01 /]# rpcinfo -p 172.16.1.131
   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

2.RPC服务版本

Cent OS 5: portmap
Cent OS 6 & 7: rpcbind

3.RPC服务命令

rpcinfo IP地址 查询rpc服务注册信息

  • -p 使用 rpcbind 协议的第 2 版本样式来探测 rpcbind
[root@nfs01 /]# systemctl restart rpcbind
[root@nfs01 /]# systemctl restart nfs
[root@nfs01 /]# rpcinfo -p 172.16.1.131 | egrep 'nfs|portmapper'
    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
    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

三、NFS服务相关文件及命令

1.服务端

  • /var/lib/nfs/etab NFS服务端共享目录信息记录文件
[root@nfs01 /upload]# tail /var/lib/nfs/etab 
/upload 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)

以上为NFS服务缺省参数

  • /etc/exports NFS服务端配置文件
NFS服务配置文件格式

共享目录 允许IP地址/子网掩码(参1,参2...)
[root@nfs01 /upload]# cat /etc/exports
#/var/www/images @ web01 share with /upload @ localhost
/upload 172.16.1.0/24(rw)

2.客户端

  • /proc/mounts NFS客户端挂载信息记录文件
[root@web01 /var/www/images]# tail -2 /proc/mounts | head -1
172.16.1.131:/upload /var/www/images nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.17,local_lock=none,addr=172.16.1.131 0 0

3.NFS服务命令

showmount IP地址 查询NFS服务器的相关信息

  • -e 显示NFS服务器的共享目录
[root@nfs01 /]# showmount -e 172.16.1.131
Export list for 172.16.1.131:
/upload 172.16.1.0/24

四、NFS服务配置文件主要参数

  • rw 读写权限
  • ro 只读权限
  • sync 同步(系统默认值)
同步:请求或写入数据时,数据同步写到NFS服务端硬盘后才返回

优点:数据安全不会丢
缺点:性能较异步要差
  • async 异步
异步:写入数据时,数据暂时存放在内存缓冲区,NFS服务端硬盘空闲时,再写入磁盘

优点:写入效率提高
缺点:服务器宕机或非正常关机时,缓冲区数据丢失
  • no_root_squash 保持root用户不压缩
  • root_squash 保持root用户压缩(系统默认值)
  • no_all_squash 保持所有用户不压缩(系统默认值)
  • all_squash 保持所有用户压缩
    压缩:代指转换该用户
  • anonuid=UID 指定压缩用户的UID,默认是nfsnobody(UID=65534)
  • anongid=GID 指定压缩用户的GID,默认是nfsnobody(GID=65534)
该UID和GID必须是共享目录的属主和属组

五、NFS服务挂载相关参数

1.性能相关

  • rsize 指定NFS每次读的容量(单位:字节)
  • wsize 指定NFS每次写的容量(单位:字节)
rsize和wsize的容量至少≥131072
  • noatime 不更新文件的访问时间
  • nodiratime 不更新目录的访问时间

2.安全相关

  • nosuid 去掉文件的特殊权限
  • noexec 去掉文件的执行权限
  • nodev 去掉文件的特殊设备属性
[root@web01 ~]# mount -o rsize=131072,wsize=131072,noatime,nodiratime,nosuid,noexec,nodev 172.16.1.131:/upload /var/www/images/
[root@web01 ~]# grep '/upload' /proc/mounts 
172.16.1.131:/upload /var/www/images nfs4 rw,nosuid,nodev,noexec,noatime,nodiratime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.17,local_lock=none,addr=172.16.1.131 0 0
[root@web01 ~]# cp /bin/ls /var/www/images/
[root@web01 ~]# cd /var/www/images/
[root@web01 /var/www/images]# ll
total 116
-rw-r--r-- 1 www www      0 Jun 21 16:16 aspen.txt
-rwxr-xr-x 1 www www 117680 Jun 21 16:36 ls
[root@web01 /var/www/images]# ./ls
-bash: ./ls: Permission denied
-----------------------------------------------------------------------------------------------------------------------
[root@web01 ~]# tail -1 /etc/fstab 
172.16.1.131:/upload /var/www/images nfs rsize=131072,wsize=131072,noatime,nodiratime,noexec,nosuid,nodev 0 0
[root@web01 ~]# grep 'upload' /proc/mounts 
172.16.1.131:/upload /var/www/images nfs4 rw,nosuid,nodev,noexec,noatime,nodiratime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.17,local_lock=none,addr=172.16.1.131 0 0
[root@web01 /var/www/images]# cp /bin/pwd ./
[root@web01 /var/www/images]# ll
total 152
-rw-r--r-- 1 www www      0 Jun 21 16:16 aspen.txt
-rwxr-xr-x 1 www www 117680 Jun 21 16:36 ls
-rwxr-xr-x 1 www www  33280 Jun 21 16:47 pwd
[root@web01 /var/www/images]# ./pwd
-bash: ./pwd: Permission denied

六、NFS服务部署流程

1.服务端

step1:安装RPC服务和NFS服务
安装NFS服务后,默认创建nfsnobody用户

yum install -y rpcbind nfs-utils
[root@nfs01 /]# yum install -y nfs-utils.x86_64 rpcbind.x86_64 
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
......
Installed:
  nfs-utils.x86_64 1:1.3.0-0.61.el7                         rpcbind.x86_64 0:0.2.0-47.el7                        

Dependency Installed:
  gssproxy.x86_64 0:0.7.0-21.el7                            keyutils.x86_64 0:1.5.8-3.el7                         
  libbasicobjects.x86_64 0:0.1.1-32.el7                     libcollection.x86_64 0:0.7.0-32.el7                   
  libevent.x86_64 0:2.0.21-4.el7                            libini_config.x86_64 0:1.3.1-32.el7                   
  libnfsidmap.x86_64 0:0.25-19.el7                          libpath_utils.x86_64 0:0.2.1-32.el7                   
  libref_array.x86_64 0:0.1.5-32.el7                        libtirpc.x86_64 0:0.2.4-0.15.el7                      
  libverto-libevent.x86_64 0:0.2.5-4.el7                    quota.x86_64 1:4.01-17.el7                            
  quota-nls.noarch 1:4.01-17.el7                            tcp_wrappers.x86_64 0:7.6-77.el7                      

Complete!

step2:启动RPC服务

systemctl restart rpcbind
[root@nfs01 /]# systemctl restart rpcbind
[root@nfs01 /]# rpcinfo -p 172.16.1.131
   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

step3:启动NFS服务

systemctl restart nfs
[root@nfs01 /]# systemctl restart nfs
[root@nfs01 /]# rpcinfo -p 172.16.1.131 | grep nfs
    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

step4:修改NFS配置文件(/etc/exports)
不指定NFS服务的UID与GID,默认使用nfsnobody用户

vim /etc/exports
[root@nfs01 /]# groupadd -g 2000 www
[root@nfs01 /]# useradd -Ms /nologin -u 2000 -g www www
[root@nfs01 /]# vim /etc/exports
#/var/www/images @ web01 share with /upload @ localhost
/upload 172.16.1.0/24(rw,sync,anonuid=2000,anongid=2000)

step5:创建共享目录,并修改目录的属主和属组为nfs配置文件中指定用户

mkdir -p 目录
chown 属主.属组 目录
[root@nfs01 /]# chown www.www /upload/
[root@nfs01 /]# ll -d /upload/
drwxr-xr-x 2 www www 6 Jun 21 14:53 /upload/

step6:重启NFS服务

systemctl reload nfs

NFS服务不要用restart强制重启,会造成系统卡死90s;因为系统对NFS服务有一个90s的保护时间
[root@nfs01 /]# systemctl reload nfs
[root@nfs01 /]# showmount -e 172.16.1.131
Export list for 172.16.1.131:
/upload 172.16.1.0/24

step7:本地测试

mount -t nfs IP:目录 本地挂载点
touch 文件 本地挂载点
[root@nfs01 /]# mount -t nfs 172.16.1.131:/upload /mnt
[root@nfs01 /]# touch /mnt/image{1..5}.jpg
[root@nfs01 /]# ll /upload/
total 0
-rw-r--r-- 1 www www 0 Jun 21 14:57 image1.jpg
-rw-r--r-- 1 www www 0 Jun 21 14:57 image2.jpg
-rw-r--r-- 1 www www 0 Jun 21 14:57 image3.jpg
-rw-r--r-- 1 www www 0 Jun 21 14:57 image4.jpg
-rw-r--r-- 1 www www 0 Jun 21 14:57 image5.jpg

step8:nfs服务和rpcbind服务开机自启动

[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]# systemctl enable rpcbind
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl enable nfs
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.

2.客户端

step1:安装NFS服务
安装NFS服务后,默认创建nfsnobody用户

yum install -y nfs-utils
[root@web01 ~]# yum install -y nfs-utils.x86_64 
Loaded plugins: fastestmirror
Determining fastest mirrors
 * base: mirrors.aliyun.com
 * extras: mirrors.aliyun.com
 * updates: mirrors.aliyun.com
......
Installed:
  nfs-utils.x86_64 1:1.3.0-0.61.el7                                                                               

Dependency Installed:
  gssproxy.x86_64 0:0.7.0-21.el7                            keyutils.x86_64 0:1.5.8-3.el7                         
  libbasicobjects.x86_64 0:0.1.1-32.el7                     libcollection.x86_64 0:0.7.0-32.el7                   
  libevent.x86_64 0:2.0.21-4.el7                            libini_config.x86_64 0:1.3.1-32.el7                   
  libnfsidmap.x86_64 0:0.25-19.el7                          libpath_utils.x86_64 0:0.2.1-32.el7                   
  libref_array.x86_64 0:0.1.5-32.el7                        libtirpc.x86_64 0:0.2.4-0.15.el7                      
  libverto-libevent.x86_64 0:0.2.5-4.el7                    quota.x86_64 1:4.01-17.el7                            
  quota-nls.noarch 1:4.01-17.el7                            rpcbind.x86_64 0:0.2.0-47.el7                         
  tcp_wrappers.x86_64 0:7.6-77.el7                         

Complete!

step2:创建共享目录

mkdir -p 目录
[root@web01 ~]# mkdir -p /var/www/images
[root@web01 ~]# ll -d /var/www/images/
drwxr-xr-x 2 root root 6 Jun 21 15:13 /var/www/images/

step3:查看NFS服务端共享目录

showmount -e IP地址
[root@web01 ~]# showmount -e 172.16.1.131
Export list for 172.16.1.131:
/upload 172.16.1.0/24

step4:挂载

mount -t nfs IP:目录 本地挂载目录
[root@web01 ~]# mount -t nfs 172.16.1.131:/upload /var/www/images/
[root@web01 ~]# df -h | tail -1
172.16.1.131:/upload   99G  1.7G   98G   2% /var/www/images

step5:永久挂载

vim /etc/rc.local
vim /etc/fstab
[root@web01 ~]# vim /etc/fstab 

#
# /etc/fstab
# Created by anaconda on Sat May 11 15:50:18 2019
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=69d3eed0-c901-4e0e-ae98-4c31b2a23719 /                       xfs     defaults        0 0
UUID=7e8b6491-678b-444f-bbdb-019eb0c2bf8c /boot                   xfs     defaults        0 0
UUID=42eaa7c4-975b-4c3a-8301-1e4543eb730e swap                    swap    defaults        0 0
172.16.1.131:/upload /var/www/images nfs defaults 0 0
在Cent OS 6中,采用修改/etc/fstab文件的方式挂载NFS服务,会报错!
解决方法:设置系统开机自启动netfs服务

3.功能验证

[NFS客户端]

[root@web01 /var/www/images]# ls
[root@web01 /var/www/images]# touch aspen{01..5}.jpeg
[root@web01 /var/www/images]# ll
total 0
-rw-r--r-- 1 2000 2000 0 Jun 21 15:43 aspen01.jpeg
-rw-r--r-- 1 2000 2000 0 Jun 21 15:43 aspen02.jpeg
-rw-r--r-- 1 2000 2000 0 Jun 21 15:43 aspen03.jpeg
-rw-r--r-- 1 2000 2000 0 Jun 21 15:43 aspen04.jpeg
-rw-r--r-- 1 2000 2000 0 Jun 21 15:43 aspen05.jpeg
-----------------------------------------------------------------------------------------------------------------------
[root@web01 /var/www/images]# groupadd -g 2000 www
[root@web01 /var/www/images]# useradd -Ms /sbin/nologin -u 2000 -g www www
[root@web01 /var/www/images]# ll
total 0
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen01.jpeg
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen02.jpeg
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen03.jpeg
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen04.jpeg
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen05.jpeg

使用NFS服务默认用户(nfsnobody)不会存在该问题
[NFS服务端]

[root@nfs01 /mnt]# cd /upload/
[root@nfs01 /upload]# ll
total 0
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen01.jpeg
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen02.jpeg
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen03.jpeg
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen04.jpeg
-rw-r--r-- 1 www www 0 Jun 21 15:43 aspen05.jpeg
NFS服务经典故障案例
在客户端挂载点目录创建文件时,系统提示:readonly file system

故障原因:磁盘故障或/etc/fstab书写故障
解决方案:mount -o rw,remount 挂载点
[root@web01 ~]# touch /var/www/images/aspen.txt
touch: cannot touch ‘/var/www/images/aspen.txt’: Read-only file system
[root@web01 ~]# mount -o rw,remount /var/www/images/
[root@web01 ~]# touch /var/www/images/aspen.txt
[root@web01 ~]# ls /var/www/images/
aspen.txt

七、NFS服务排错流程

step1:检查防火墙SElinux的服务状态

[root@nfs01 /upload]# systemctl status firewalld
● firewalld.service - firewalld - dynamic firewall daemon
   Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
     Docs: man:firewalld(1)
[root@nfs01 /upload]# getenforce 
Disabled

step2:Ping服务(NFS)相应的地址

[root@web01 ~]# ping 172.16.1.131
PING 172.16.1.131 (172.16.1.131) 56(84) bytes of data.
64 bytes from 172.16.1.131: icmp_seq=1 ttl=64 time=0.210 ms
64 bytes from 172.16.1.131: icmp_seq=2 ttl=64 time=0.309 ms
64 bytes from 172.16.1.131: icmp_seq=3 ttl=64 time=0.401 ms
^C
--- 172.16.1.131 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2001ms
rtt min/avg/max/mdev = 0.210/0.306/0.401/0.080 ms

step3:通过rpcinfo查看RPC服务信息

[root@web01 ~]# rpcinfo -p 172.16.1.131 |egrep 'portmapper|nfs'
    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
    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

step4:通过showmount查看NFS服务信息

[root@web01 ~]# showmount -e 172.16.1.131
Export list for 172.16.1.131:
/upload 172.16.1.0/24

step5:查看相关文件

服务端

/var/lib/nfs/etab
/etc/exports

客户端

/proc/mounts

附:思维导图