共享存储nfs介绍

一、实验环境说明

NFS 服务端:
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# ip addr show|sed -rn '/inet[[:space:]]+127/! s/^[[:space:]]+inet[[:space:]]+(.*)\/[[:digit:]]+[[:space:]]+.*$/\1/p'
172.16.0.118

NFS客户端:
[root@localhost ~]# cat /etc/redhat-release 
CentOS Linux release 7.1.1503 (Core) 
[root@localhost ~]# uname -a
Linux localhost.localdomain 3.10.0-229.el7.x86_64 #1 SMP Fri Mar 6 11:36:42 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
[root@localhost ~]# ip addr show|sed -rn '/inet[[:space:]]+127/! s/^[[:space:]]+inet[[:space:]]+(.*)\/[[:digit:]]+[[:space:]]+.*$/\1/p'
172.16.0.120

NFS 客户端和服务端SElinux都是关闭的。firewalld防火墙有开启。

二、nfs概述和引入

https://baike.baidu.com/item/NFS/812203?fr=aladdin

NFS(Network File System) 是网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。

早期NFS是SUN公司设计的一种用于在各类unix主机之间共享文件系统的协议。它本身也属于一种文件系统,我们之前接触的大部分文件系统都在内核中实现,NFS也是在内核中实现。如果各类unix系统在其内核附带了NFS协议的支持的功能的话,结合用户空间某些特定的服务,NFS就可以工作起来了。NFS本身是在内核中,要依赖用户空间中的程序。所以,对于在内核中实现了NFS协议功能的系统才能够使用NFS,比如windows系统就不行。其实linux系统上是后来有对早期SUN公司的NFS协议的重新实现,而且兼容原生SUN公司研发的NFS协议。所以可以不加区分的说现在linux系统上的是SUN公司研发的那个NFS协议。现在NFS有4个版本,第一个版本是NFSv1,这个版本没有走出过实验室。第二个版本是NFSv2,早期设计考虑为了性能,只支持udp协议,所以这个v2版本只支持udp协议,而且不支持kerberos进行集中的身份认证,所以相对来说不可靠而且不安全。第三个版本是NFSv3,它加入了对tcp协议的支持,而且部分功能实现了对kerberos的支持。第四个版本是NFSv4,这个版本才算得上是真正意义上的各功能模块完成了对kerberos的功能的支持,我们现在用的一般都是NFSv4版本。如图所示,可以实际理解从NFS是众多文件系统中的一种,可以通过VFS接口进行调用和转化。
在这里插入图片描述

既然nfs是一种文件系统,而且是在内核中实现的功能,那么它如何监听用户请求呢,因为一般是用户空间的进程向内核发起系统调用,申请注册使用某个端口,通过主机和端口可以标识一个套接字,所以说套接字是用户空间进程注册监听使用的。

nfs的工作严重依赖于RPC机制来进行数据传输。可以说RPC也属于一种协议。PRC叫做远程过程调用(Remote Procedure Call),也是SUN公司开发和提出的,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。RPC协议假定某些传输协议的存在,如TCP或UDP,为通信程序之间携带信息数据。在OSI网络模型中,RPC跨越传输层和应用层。RPC使得开发包括网络分布式多程序在内的应用程序更加容易。RPC采用C/S模式。请求程序就是一个客户端,而服务提供程序就是一个服务端。首先客户端调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务端,进程保证睡眠状态直到调用信息到达为止。当一个调用信息到达,服务端获得进程参数,计算结果,发送答复信息,然后等待下一个调试信息,最后,客户端调用进程接受答复,重新获得进程结果,然后调用执行继续进行。RPC调用过程大概如下图所示:
在这里插入图片描述

其实可以把RPC的功能和pam,nsswitch以及xinetd进行类比,其实它无非也是个公共框架。配合nfs工作流程大概是:
在服务端,rpc监听在某个套接字上,以接受客户端请求,请求达到后(比如图中的RPC call),rpc会去把请求的服务启动,然后把请求转交给那个服务(就是图中的invoke service),由那个服务去调用客户端请求的过程(就是图中的call dispathch routine等步骤)。
然后,我们结合实际文件系统挂载目录然后来梳理一下这个过程。如下图所示:
在这里插入图片描述

在NFS server端,比如把本地磁盘的某个分区挂载到本地文件系统的某个目录下,比如把/dev/sda1挂载到/shared,然后在用户空间的应用程序向rpc server注册,让其代为监听到某个套接字上,此时这个rpc服务器对外的接口就表现为NFS协议的NFS服务器。待rpc服务器收到数据后,还是会通过本地的系统调用去存储数据(还是会通过本地内核所管理的文件系统去操作底层的数据存储等)。
在NFS client端,对于NFS文件系统,最终都是要挂载使用的,而我们的NFS客户端的内核中是有NFS模块的,因此NFS客户端本地的mount程序可以通过本地内核中NFS模块向远端NFS服务端发起连接请求,而后mount程序就将NFS共享的文件系统目录挂载到本地上的某个目录下了。比如挂载到/nfs目录下。在NFS client上用户空间的某个用户进程,就可以对本地文件系统的目录/nfs进行访问,用户权限允许的话,用户进程就可以向这个目录实现文件的增删改查。但是写入的文件不会在本地文件系统保留,即不是写入本地的ext系列或XFS文件系统,而是通过VFS文件系统接口使用内核中NFS文件系统模块向NFS服务器的rpc server发起远程过程调用,然后rpc会把请求转交给特定应用程序,后边nfs server端的处理步骤上边就有讲解了。

三、nfs服务端和客户端安装以及说明

服务端和客户端都要安装上软件包nfs-utils。

  • nfs-utils软件包
Installed Packages
Name        : nfs-utils
Arch        : x86_64
Epoch       : 1
Version     : 1.3.0
Release     : 0.61.el7
Size        : 1.0 M
Repo        : installed
From repo   : base
Summary     : NFS utilities and supporting clients and daemons for the kernel NFS server
URL         : http://sourceforge.net/projects/nfs
License     : MIT and GPLv2 and GPLv2+ and BSD
Description : The nfs-utils package provides a daemon for the kernel NFS server and
            : related tools, which provides a much higher level of performance than the
            : traditional Linux NFS server used by most users.
            : 
            : This package also contains the showmount program.  Showmount queries the
            : mount daemon on a remote host for information about the NFS (Network File
            : System) server on the remote host.  For example, showmount can display the
            : clients which are mounted on that host.
            : 
            : This package also contains the mount.nfs and umount.nfs program.
说明:nfs-utils为内核中的NFS 服务端提供守护进程,以及支持NFS客户端的功能。还提供了一些相关的工具(
这些工具提供的NFS 服务器比大部分用户使用的传统linux的NFS服务器性能更高)。
工具包也包含showmount程序。showmount可以查询远程主机上的NFS服务端的挂载进程信息。可以在NFS客户端主机上显示远程主机上NFS服务端的挂载(导出)的文件系统信息。

  • nfs-utils主要安装文件:
[root@localhost ~]# rpm -ql nfs-utils
/etc/exports.d #挂载配置文件目录,还有一个主配置/etc/exports,这个配置是由setup程序提供的
/etc/gssproxy/24-nfs-server.conf
/etc/modprobe.d/lockd.conf
/etc/nfs.conf	#nfs守护进程和工具的通用配置的配置文件
/etc/nfsmount.conf #nfs挂载的配置文件。三部分组成:Mount,Server以及Global
/etc/request-key.d/id_resolver.conf 
/etc/sysconfig/nfs  #nfs-config.service服务的配置文件
/sbin/mount.nfs #nfs的挂载程序
/sbin/mount.nfs4 #nfs的挂载程序,linux内核版本2.6.32之后,mount.nfs4与mount.nfs没有区别,都可以挂载所
#有NFS版本,不过在linux内核版本2.6.32之前,mount.nfs4必须挂载到NFS的第四版本的文件通,mount.nfs可
#以挂载NFS第二版和第三版的文件系统。
/sbin/osd_login 
/sbin/rpc.statd # 维持nfs状态相关的一个程序
/sbin/umount.nfs #卸载nfs文件系统的程序
/sbin/umount.nfs4 #卸载nfs文件系统的程序
/usr/lib/systemd/scripts/nfs-utils_env.sh #一个bash脚本,可以为nfs-config.service提供环境变量相关的
/usr/lib/systemd/system-generators/nfs-server-generator
/usr/lib/systemd/system-generators/rpc-pipefs-generator
/usr/lib/systemd/system/auth-rpcgss-module.service
/usr/lib/systemd/system/nfs-blkmap.service
/usr/lib/systemd/system/nfs-client.target
/usr/lib/systemd/system/nfs-config.service
/usr/lib/systemd/system/nfs-idmap.service
/usr/lib/systemd/system/nfs-idmapd.service
/usr/lib/systemd/system/nfs-lock.service
/usr/lib/systemd/system/nfs-mountd.service
/usr/lib/systemd/system/nfs-secure.service
/usr/lib/systemd/system/nfs-server.service
/usr/lib/systemd/system/nfs-utils.service
/usr/lib/systemd/system/nfs.service
/usr/lib/systemd/system/nfslock.service
/usr/lib/systemd/system/proc-fs-nfsd.mount
/usr/lib/systemd/system/rpc-gssd.service
/usr/lib/systemd/system/rpc-statd-notify.service
/usr/lib/systemd/system/rpc-statd.service
/usr/lib/systemd/system/rpc_pipefs.target
/usr/lib/systemd/system/rpcgssd.service
/usr/lib/systemd/system/rpcidmapd.service
/usr/lib/systemd/system/var-lib-nfs-rpc_pipefs.mount
/usr/sbin/blkmapd #与
/usr/sbin/exportfs #维护导出的NFS文件系统表的程序
/usr/sbin/mountstats #分别显示每个客户端挂载的信息的程序
/usr/sbin/nfsdcltrack NFSv4客户端的一个追踪标记程序
/usr/sbin/nfsidmap #用于上层调用的一个id和用户名中间相互映射的程序
/usr/sbin/nfsiostat #使用/etc/self/mountstats文件来评估NFS挂载点的iostat信息(CPU的统计信息,以及输入输出设别的统计信息等)
/usr/sbin/nfsstat #列出NFS的统计信息的程序
/usr/sbin/rpc.gssd #PRCSEC_GSS守护进程
/usr/sbin/rpc.idmapd #idmapd守护进程
/usr/sbin/rpc.mountd #NFS挂载的守护进程
/usr/sbin/rpc.nfsd #NFS服务端的程序
/usr/sbin/rpcdebug
/usr/sbin/showmount #NFS服务端显示NFS挂载的信息的程序
/usr/sbin/sm-notify #发送重启通知的程序
/usr/sbin/start-statd
#中间省略安装文档文件(说明文档和man手册等)
/var/lib/nfs 
/var/lib/nfs/etab
/var/lib/nfs/rmtab
/var/lib/nfs/rpc_pipefs
/var/lib/nfs/statd
/var/lib/nfs/statd/sm
/var/lib/nfs/statd/sm.bak
/var/lib/nfs/state
/var/lib/nfs/v4recovery
/var/lib/nfs/xtab
  • 安装软件包截图
    在这里插入图片描述

四、nfs配置

(1) 服务端启动服务服务

扫描二维码关注公众号,回复: 4959689 查看本文章
大概有这些服务或者其他的unit:
[root@localhost ~]# cat txt
auth-rpcgss-module.service
nfs-blkmap.service
nfs-client.target
nfs-config.service
nfs-idmap.service
nfs-idmapd.service
nfs-lock.service
nfs-mountd.service
nfs-secure.service
nfs-server.service
nfs-utils.service
nfs.service
nfslock.service
proc-fs-nfsd.mount
rpc-gssd.service
rpc-statd-notify.service
rpc-statd.service
rpc_pipefs.target
rpcgssd.service
rpcidmapd.service
var-lib-nfs-rpc_pipefs.mount

初始状态是:
[root@localhost ~]# while read name;do echo "$name:"&&systemctl status $name; done<txt
auth-rpcgss-module.service:
● auth-rpcgss-module.service - Kernel Module supporting RPCSEC_GSS
   Loaded: loaded (/usr/lib/systemd/system/auth-rpcgss-module.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-blkmap.service:
● nfs-blkmap.service - pNFS block layout mapping daemon
   Loaded: loaded (/usr/lib/systemd/system/nfs-blkmap.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
nfs-client.target:
● nfs-client.target - NFS client services
   Loaded: loaded (/usr/lib/systemd/system/nfs-client.target; enabled; vendor preset: disabled)
   Active: inactive (dead)
nfs-config.service:
● nfs-config.service - Preprocess NFS configuration
   Loaded: loaded (/usr/lib/systemd/system/nfs-config.service; static; vendor preset: disabled)
   Active: inactive (dead) since Thu 2018-12-20 13:35:42 CST; 7min ago
 Main PID: 12729 (code=exited, status=0/SUCCESS)

Dec 20 13:35:42 localhost.localdomain systemd[1]: Starting Preprocess NFS configuration...
Dec 20 13:35:42 localhost.localdomain systemd[1]: Started Preprocess NFS configuration.
nfs-idmap.service:
● nfs-idmapd.service - NFSv4 ID-name mapping service
   Loaded: loaded (/usr/lib/systemd/system/nfs-idmapd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-idmapd.service:
● nfs-idmapd.service - NFSv4 ID-name mapping service
   Loaded: loaded (/usr/lib/systemd/system/nfs-idmapd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-lock.service:
● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
   Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-mountd.service:
● nfs-mountd.service - NFS Mount Daemon
   Loaded: loaded (/usr/lib/systemd/system/nfs-mountd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-secure.service:
● rpc-gssd.service - RPC security service for NFS client and server
   Loaded: loaded (/usr/lib/systemd/system/rpc-gssd.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs-server.service:
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
nfs-utils.service:
● nfs-utils.service - NFS server and client services
   Loaded: loaded (/usr/lib/systemd/system/nfs-utils.service; static; vendor preset: disabled)
   Active: inactive (dead)
nfs.service:
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
nfslock.service:
● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
   Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
   Active: inactive (dead)
proc-fs-nfsd.mount:
● proc-fs-nfsd.mount - NFSD configuration filesystem
   Loaded: loaded (/usr/lib/systemd/system/proc-fs-nfsd.mount; static; vendor preset: disabled)
   Active: inactive (dead)
    Where: /proc/fs/nfsd
     What: nfsd
rpc-gssd.service:
● rpc-gssd.service - RPC security service for NFS client and server
   Loaded: loaded (/usr/lib/systemd/system/rpc-gssd.service; static; vendor preset: disabled)
   Active: inactive (dead)
rpc-statd-notify.service:
● rpc-statd-notify.service - Notify NFS peers of a restart
   Loaded: loaded (/usr/lib/systemd/system/rpc-statd-notify.service; static; vendor preset: disabled)
   Active: inactive (dead)
rpc-statd.service:
● rpc-statd.service - NFS status monitor for NFSv2/3 locking.
   Loaded: loaded (/usr/lib/systemd/system/rpc-statd.service; static; vendor preset: disabled)
   Active: inactive (dead)
rpc_pipefs.target:
● rpc_pipefs.target
   Loaded: loaded (/usr/lib/systemd/system/rpc_pipefs.target; static; vendor preset: disabled)
   Active: inactive (dead)
rpcgssd.service:
● rpc-gssd.service - RPC security service for NFS client and server
   Loaded: loaded (/usr/lib/systemd/system/rpc-gssd.service; static; vendor preset: disabled)
   Active: inactive (dead)
rpcidmapd.service:
● nfs-idmapd.service - NFSv4 ID-name mapping service
   Loaded: loaded (/usr/lib/systemd/system/nfs-idmapd.service; static; vendor preset: disabled)
   Active: inactive (dead)
var-lib-nfs-rpc_pipefs.mount:
● var-lib-nfs-rpc_pipefs.mount - RPC Pipe File System
   Loaded: loaded (/usr/lib/systemd/system/var-lib-nfs-rpc_pipefs.mount; static; vendor preset: disabled)
   Active: inactive (dead)
    Where: /var/lib/nfs/rpc_pipefs
     What: sunrpc   

服务初始注册状态:(虽然portmapper已经命名称rpcbind,这里的service名字还是portmapper)
[root@localhost ~]# rpcinfo -p
   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
[root@localhost ~]# ss -tnl
State      Recv-Q Send-Q                                                                                      Local Address:Port                                                                                        Peer Address:Port 
LISTEN     0      128                                                                                                     *:111                                                                                                    *:*     
LISTEN     0      128                                                                                                     *:22                                                                                                     *:*     
LISTEN     0      100                                                                                             127.0.0.1:25                                                                                                     *:*     
LISTEN     0      128                                                                                                    :::111                                                                                                   :::*     
LISTEN     0      128                                                                                                    :::22                                                                                                    :::*     
LISTEN     0      100                                                                                                   ::1:25                                                                                                    :::*   

没有开启nfs之前,内核模块并没有nfs:
[root@localhost ~]# lsmod |grep nfs
[root@localhost ~]# 


服务端启动nfs服:
[root@localhost ~]# systemctl start nfs.service
[root@localhost ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Thu 2018-12-20 13:45:24 CST; 4s ago
  Process: 9751 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 9749 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 9748 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 9813 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 9797 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 9795 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 9797 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Dec 20 13:45:24 localhost.localdomain systemd[1]: Starting NFS server and services...
Dec 20 13:45:24 localhost.localdomain systemd[1]: Started NFS server and services.

再看注册的服务:
[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  54405  status
    100024    1   tcp  40615  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  52176  nlockmgr
    100021    3   udp  52176  nlockmgr
    100021    4   udp  52176  nlockmgr
    100021    1   tcp  51506  nlockmgr
    100021    3   tcp  51506  nlockmgr
    100021    4   tcp  51506  nlockmgr

启动后内核中有了nfs模块:
nfsd                  290215  13 
auth_rpcgss            59343  1 nfsd
nfs_acl                12837  1 nfsd
lockd                  93977  1 nfsd
sunrpc                295293  19 nfsd,auth_rpcgss,lockd,nfs_acl

(2) 配置NFS服务导出的文件系统

配置文件:/etc/exports或/etc/exports.d/*   (配置文件默认为空)
如果要配置,可以参考 man exports,里面有配置实例说明:
# sample /etc/exports file
/               master(rw) trusty(rw,no_root_squash)
/projects       proj*.local.domain(rw)
/usr            *.local.domain(ro) @trusted(rw)
/home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
/pub            *(ro,insecure,all_squash)
/srv/www        -sync,rw server @trusted @external(ro)
/foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
/build          buildhost[0-9].local.domain(rw)

总体表现形式可以总结为,可以共享多个文件系统目录,每行定义一个:
/PATH/TO/SOME_DIR 	clients1(export_options, ...)  clients2(export_options, ...)

(1) 第一个参数指定一个NFS server上文件系统的路径,表示要共享的文件系统目录。这个路径如果是提供
给其他非单一客户端挂载使用的,应该考虑到空间,性能等。最好是单独的硬盘的单独分区。比如共享的目录为
/shared;
(2) 第二个或第三等,可以允许设置多个访问端口,针对不同来源的客户端挂载时候有不同的权限等设置,我们
示例假设只设置一个client。注意clients与小括号间不能有空格,否则会有语法错误。
(3) client设置值
(a) 单个主机(single host):ipv4地址,ipv6地址,FQDN(域名);
例如:172.16.0.120 , fe80::20c:29ff:fe4d:d522,node2.yanhui.com
(b) 一个网络地址(network):address/netmask,子网掩码支持长格式和短格式;
例如:172.16.0.0/16,172.16.0.0/255.255.0.0
(c) 主机通配名(wildcards):例如*.yanhui.com;
NIS域内的主机组(netgroups):@group_name;
(d) 匿名的(anonymous):使用*通配所有主机;
说明:为了安全,生产环境共享出去的NFS文件系统,应该精细的控制客户端访问的地址。a,b,c三种形式比较常见。

每个客户端后边使用小括号引用起来的(导出)选项之间以逗号隔开,不能有空格。
(4) 常用导出的通用选项
ro:只读共享;
rw:读写共享;
sync:同步;(同步的话对io性能要求较高)
async:异步;
secure:客户端端口小于1024,否则就要使用insecure选项。
等等,还有很多

(5) 常用导出的用户ID映射选项
root_squash:压缩root用户,一般指将其映射为nfsnobody;
no_root_squash:不压缩root用户;
all_squash:压缩所有用户;
anonuid and anongid:将压缩的用户映射为此处指定的用户; 

NFS server配置实例1:

[root@localhost ~]# mkdir -p /shared
[root@localhost ~]# vim /etc/exports
[root@localhost ~]# cat /etc/exports
/shared 172.16.0.0/16(rw,sync,all_squash)
[root@localhost ~]# 

重启或重载服务:
[root@localhost ~]# systemctl restart nfs.service
[root@localhost ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled)
   Active: active (exited) since Thu 2018-12-20 21:01:15 CST; 23s ago
  Process: 10812 ExecStopPost=/usr/sbin/exportfs -f (code=exited, status=0/SUCCESS)
  Process: 10809 ExecStopPost=/usr/sbin/exportfs -au (code=exited, status=0/SUCCESS)
  Process: 10807 ExecStop=/usr/sbin/rpc.nfsd 0 (code=exited, status=0/SUCCESS)
  Process: 10842 ExecStartPost=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi (code=exited, status=0/SUCCESS)
  Process: 10826 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
  Process: 10824 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
 Main PID: 10826 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service

Dec 20 21:01:15 localhost.localdomain systemd[1]: Starting NFS server and services...
Dec 20 21:01:15 localhost.localdomain systemd[1]: Started NFS server and services.


这里为了方便就直接关闭防火墙或者把nfs服务器对外开放了:
[root@localhost ~]# firewall-cmd --list-all --permanent
public (default)
  interfaces: 
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
	
[root@localhost ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eno16777736
  sources: 
  services: dhcpv6-client ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 
  
开放nfs服务:
[root@localhost ~]# firewall-cmd --add-service=nfs --permanent
success
[root@localhost ~]# firewall-cmd --reload
success
[root@localhost ~]# firewall-cmd --list-all
public (default, active)
  interfaces: eno16777736
  sources: 
  services: dhcpv6-client nfs ssh
  ports: 
  masquerade: no
  forward-ports: 
  icmp-blocks: 
  rich rules: 

查看启动的端口信息(ss -tnl或ss -tnlp):
[root@localhost ~]# ss -tnl
State      Recv-Q Send-Q                                           Local Address:Port                                             Peer Address:Port 
LISTEN     0      64                                                           *:2049                                                        *:*     
LISTEN     0      128                                                          *:40615                                                       *:*     
LISTEN     0      64                                                           *:43881                                                       *:*     
LISTEN     0      128                                                          *:111                                                         *:*     
LISTEN     0      128                                                          *:20048                                                       *:*     
LISTEN     0      128                                                          *:22                                                          *:*     
LISTEN     0      100                                                  127.0.0.1:25                                                          *:*     
LISTEN     0      64                                                          :::2049                                                       :::*     
LISTEN     0      128                                                         :::111                                                        :::*     
LISTEN     0      128                                                         :::20048                                                      :::*     
LISTEN     0      64                                                          :::60145                                                      :::*     
LISTEN     0      128                                                         :::22                                                         :::*     
LISTEN     0      128                                                         :::50360                                                      :::*     
LISTEN     0      100                                                        ::1:25                                                         :::*  

使用showmount工具查看:
[root@localhost ~]# showmount -e   #NFS服务端上执行
Export list for localhost.localdomain:
/shared 172.16.0.0/16

(3) 客户端挂载使用

使用mount.nfs或mount -t nfs来挂载。其使用形式大概如下:
mount -t nfs servername:/path/to/share /path/to/mount_point  [-rvVwfnsh ] [-o options]

其中mount -t nfs可以替换为mount.nfs;
servername表示NFS server的ip;
/path/to/share表示共享的文件爱你系统目录;
/path/to/mount_point表示NFS client上文件系统的挂载点;
后边还可以跟选项。可以参考man nfs中的相关选项介绍,NFSv2,NFSv3相比NFSv4有独立的选项,NFSv4相较以前的版本也有独立的选项。这里不详细介绍了。

在NFS client上执行,假设挂载到/data目录下
[root@localhost ~]# mkdir /data
[root@localhost ~]# mount -t nfs 172.16.0.118:/shared /data 
可以使用df或mount命令查看:
[root@localhost ~]# df -h | tail -1
172.16.0.118:/shared      50G  1.1G   49G   3% /data

[root@localhost ~]# mount |tail -1
172.16.0.118:/shared on /data type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.0.120,local_lock=none,addr=172.16.0.118)

默认创建文件:
[root@localhost data]# touch yanhui.txt
touch: cannot touch ‘yanhui.txt’: Permission denied
说明:为什么,读写挂载的文件系统没有写入权限呢?
默认我的NFS server共享文件系统的挂载选项中有个参数"all_squash",所有客户端的用户写入都会
在NFS server上映射成匿名用户,如果不指定,就是默认的nfsnobody,来NFS server上看看nfsnobody
对共享的文件系统的权限
[root@localhost ~]# id nfsnobody
uid=65534(nfsnobody) gid=65534(nfsnobody) groups=65534(nfsnobody)
[root@localhost ~]# ls -ld /shared/
drwxr-xr-x 2 root root 6 Dec 20 16:06 /shared/
上面共享目录,普通用户根本没有写入选项。所以上面会提示权限拒绝(NFS共享权限和文件系统权限的交集才是最终的权限)。

推荐解决方案1:
直接在NFS server上让nfsnobody这个默认用户对文件系统目录拥有读写权限。可以使用acl权限设置来完成,示例代码:
[root@localhost ~]# ls -ld /shared/
drwxr-xr-x 2 root root 6 Dec 20 23:07 /shared/
[root@localhost ~]# setfacl -m u:nfsnobody:rwx /shared
#修改设置acl权限,让nfsnobody用户对/shared目录拥有读写权限。
[root@localhost ~]# getfacl -p /shared
# file: /shared
# owner: root
# group: root
user::rwx
user:nfsnobody:rwx
group::r-x
mask::rwx
other::r-x

[root@localhost ~]# ls -ld /shared
drwxrwxr-x+ 2 root root 6 Dec 20 23:07 /shared
#上面后边多了一个符号"+"就表示这个目录拥有acl权限设置。

重新测试写入:
[root@localhost data]# echo "git clone" > yanhui.txt
[root@localhost data]# ls -l
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
服务端上查看:
[yanhui@localhost ~]$ ls -l /shared/
total 4
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
[yanhui@localhost ~]$ cat /shared/yanhui.txt 
git clone

解决方法2:直接改文件目录属主或属组的形式,这个就不演示了,和设置acl没区别
解决方法3:把NFS server的共享挂载选项的all_squash改成no_root_squash或root_squash,推荐改成
root_squash,这样一来就只有root用户被映射成普通用户,其他普通用户可以写入。

NFS server上创建一个普通用户centos,NFS client上创建一个普通用户xiaotang。我故意把它们的uid设置成一样。看看效果。
NFS 服务端修改挂载选项:
[root@localhost ~]# cat /etc/exports
/shared 172.16.0.0/16(rw,async,root_squash)
[root@localhost ~]# systemctl reload nfs.service

NFS client客户端重新卸载后挂载:
[root@localhost ~]# umount /data
[root@localhost ~]# mount -t nfs 172.16.0.118:/shared /data 
[root@localhost ~]# mount | tail -1
172.16.0.118:/shared on /data type nfs4 (rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.16.0.120,local_lock=none,addr=172.16.0.118)

NFS server创建用户centos,指明uid为10001:
[root@localhost ~]# useradd -u 10001 centos
[root@localhost ~]# id centos
uid=10001(centos) gid=10001(centos) groups=10001(centos)

NFS client创建用户xiaotang,指明uid为10001:
[root@localhost ~]# useradd -u 10001 xiaotang
[root@localhost ~]# id xiaotang
uid=10001(xiaotang) gid=10001(xiaotang) groups=10001(xiaotang)

NFS server端设置让centos用户拥有读写执行权限:
[root@localhost ~]# ls -ld /shared/
drwxrwxr-x+ 2 root root 23 Dec 20 23:13 /shared/
[root@localhost ~]# setfacl -m u:centos:rwx /shared/
[root@localhost ~]# getfacl -p /shared/
# file: /shared/
# owner: root
# group: root
user::rwx
user:centos:rwx
user:nfsnobody:rwx
group::r-x
mask::rwx
other::r-x

NFS client切换到普通用户xiaotang,然后向/data写入文件:
[xiaotang@localhost ~]$ ls -ld /data/
drwxrwxr-x 2 root root 23 Dec 20 23:13 /data/
[xiaotang@localhost ~]$ cd /data/
[xiaotang@localhost data]$ ls
yanhui.txt
[xiaotang@localhost data]$ touch file
[xiaotang@localhost data]$ ls -l
total 4
-rw-rw-r-- 1 xiaotang  xiaotang   0 Dec 20 23:22 file
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt

服务端上查看:
[root@localhost ~]# ls -l /shared/
total 4
-rw-rw-r-- 1 centos    centos     0 Dec 20 23:22 file
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
用户是根据uid来对应的,这个实验验证了。

NFS client还是用root用户向/data写入:
[root@localhost ~]# echo "hello,world"0 > /data/mytxt
[root@localhost ~]# ls -l /data/mytxt 
-rw-r--r-- 1 nfsnobody nfsnobody 13 Dec 20 23:23 /data/mytxt
[root@localhost ~]# cat /data/mytxt
hello,world0

NFS server上查看:
[root@localhost ~]# ls -l /shared/
total 8
-rw-rw-r-- 1 centos    centos     0 Dec 20 23:22 file
-rw-r--r-- 1 nfsnobody nfsnobody 13 Dec 20 23:23 mytxt
-rw-r--r-- 1 nfsnobody nfsnobody 10 Dec 20 23:13 yanhui.txt
[root@localhost ~]# cat /shared/mytxt 
hello,world0
因为挂载权限root_squash的干预,root用户被映射成了默认的nfsnobody用户。这样做是比较安全的。如果要
使用root用户本身,可以修改挂载选项为no_root_squash。

五、几个比较常用的工具和常用选项说明

  • showmount
    showmount -e NFS_SERVER_IP: 查看指定的nfs server上导出的所有文件系统;(客户端上执行)
    showmount -a:在nfs server上查看nfs服务的所有客户端列表;(服务端上执行)

示例:

#NFS client上执行:
[root@localhost ~]# showmount -e 172.16.0.118
Export list for 172.16.0.118:
/shared 172.16.0.0/16

#NFS server上执行:
[root@localhost ~]# showmount -e
Export list for localhost.localdomain:
/shared 172.16.0.0/16

  • exportfs
    -r:重新导出;
    -a:所有文件系统;
    -v:详细信息;
    -u:取消导出文件系统;
[root@localhost ~]# exportfs -v
/shared       	172.16.0.0/16(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@localhost ~]# exportfs -au   #这里指定了-a选项,配合-u表示取消所有的文件系统导出,所有客端挂载都会断开
[root@localhost ~]# exportfs -v
[root@localhost ~]# exportfs -r #这是重新导出,可以不用重启或重载服务,会更新/etc/exports和/var/lib/nfs/xtab中的内容
[root@localhost ~]# exportfs -v
/shared       	172.16.0.0/16(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
[root@localhost ~]# exportfs -u 172.16.0.0/16:/shared   #这是单独卸载一个共享文件系统。标准语法为:
exportfs -u host:/path
[root@localhost ~]# exportfs -v
[root@localhost ~]# exportfs -r
[root@localhost ~]# exportfs -v
/shared       	172.16.0.0/16(async,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

猜你喜欢

转载自blog.csdn.net/u012271055/article/details/85042553