NFS是Network File System的缩写NFS在文件传送或信息传送的过过程中,依赖于RPC协议。RPC,远程过程调用(Remote Procedure Call),是使客户端能够执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,就是因为NFS使用了RPC提供的传输协议,可以说NFS就是使用PRC的一个程序。
检查是否安装有RPC和NFS的包
[root@centosclient ~]# rpm -qa |grep nfs
nfs4-acl-tools-0.3.3-13.el7.x86_64
nfs-utils-1.3.0-0.48.el7_4.x86_64
libnfsidmap-0.25-9.el7.x86_64
[root@centosclient ~]# rpm -qa |grep rpc
xmlrpc-c-1.32.5-1905.svn2451.el7.x86_64
xmlrpc-c-client-1.32.5-1905.svn2451.el7.x86_64
libtirpc-0.2.4-0.10.el7.x86_64
rpcbind-0.2.0-42.el7.x86_64
其中
nfs-utils-1.3.0-0.48.el7_4.x86_64
rpcbind-0.2.0-42.el7.x86_64
是必须的包
如果没有,yum安装即可
yum install rpcbind nfs-utils
查看RPC的服务状态
[root@centosclient ~]# systemctl status rpcbind.service
● rpcbind.service - RPC bind service
Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2018-01-17 01:39:48 PST; 27min ago
Process: 767 ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS (code=exited, status=0/SUCCESS)
Main PID: 775 (rpcbind)
CGroup: /system.slice/rpcbind.service
└─775 /sbin/rpcbind -w
Jan 17 01:39:45 centosclient systemd[1]: Starting RPC bind service...
Jan 17 01:39:48 centosclient systemd[1]: Started RPC bind service.
查看nfs服务的状态
[root@centosclient ~]# systemctl status nfs.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Wed 2018-01-17 01:40:00 PST; 27min ago
Process: 2103 ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS (code=exited, status=0/SUCCESS)
Process: 2077 ExecStartPre=/bin/sh -c /bin/kill -HUP `cat /run/gssproxy.pid` (code=exited, status=0/SUCCESS)
Process: 1984 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=1/FAILURE)
Main PID: 2103 (code=exited, status=0/SUCCESS)
CGroup: /system.slice/nfs-server.service
Jan 17 01:39:59 centosclient systemd[1]: Starting NFS server and services...
Jan 17 01:39:59 centosclient exportfs[1984]: exportfs: No options for /nbuinstall *: suggest *(sync) to avoid warning
Jan 17 01:39:59 centosclient exportfs[1984]: exportfs: No host name given with /nbuinstall (rw,sync), suggest *(rw,sync) to avoid warning
Jan 17 01:39:59 centosclient exportfs[1984]: exportfs: incompatible duplicated export entries:
Jan 17 01:39:59 centosclient exportfs[1984]: exportfs: *:/nbuinstall (0x424) [IGNORED]
Jan 17 01:39:59 centosclient exportfs[1984]: exportfs: *:/nbuinstall (0x425)
Jan 17 01:40:00 centosclient systemd[1]: Started NFS server and services.
Hint: Some lines were ellipsized, use -l to show in full.
查看rpcbind服务的端口
[root@centosclient ~]# netstat -antlp |grep rpc
tcp 0 0 0.0.0.0:33412 0.0.0.0:* LISTEN 1874/rpc.statd
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 1905/rpc.mountd
tcp6 0 0 :::58574 :::* LISTEN 1874/rpc.statd
tcp6 0 0 :::20048 :::* LISTEN 1905/rpc.mountd
查看此时RPC服务上是否有端口注册
[root@centosclient ~]# 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
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
100024 1 udp 42560 status
100024 1 tcp 33412 status
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 51802 nlockmgr
100021 3 udp 51802 nlockmgr
100021 4 udp 51802 nlockmgr
100021 1 tcp 60935 nlockmgr
100021 3 tcp 60935 nlockmgr
100021 4 tcp 60935 nlockmgr
NFS服务器的配置相对比较简单,只需要在相应的配置文件中进行设置,然后启动NFS服务器即可。
NFS的常用目录
文件目录 | 用途 |
---|---|
/etc/exports | NFS服务的主要配置文件 |
/usr/sbin/exportfs | NFS服务的管理命令 |
/usr/sbin/showmount | 客户端的查看命令 |
/var/lib/nfs/etab | 记录NFS分享出来的目录的完整权限设定值 |
/var/lib/nfs/xtab | 记录曾经登录过的客户端信息 |
NFS服务的配置文件为/etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。
/etc/exports文件内容格式:
<输出目录> [客户端1 选项(访问权限,用户映射,其他)] [客户端2 选项(访问权限,用户映射,其他)]
a. 输出目录:
输出目录是指NFS系统中需要共享给客户机使用的目录;
b. 客户端:
客户端是指网络中可以访问这个NFS输出目录的计算机
客户端常用的指定方式
指定ip地址的主机:192.168.0.200
指定子网中的所有主机:192.168.0.0/24 192.168.0.0/255.255.255.0
指定域名的主机:david.bsmart.cn
指定域中的所有主机:*.bsmart.cn
所有主机:*
c. 选项:
选项用来设置输出目录的访问权限、用户映射等。
NFS主要有3类选项:
访问权限选项
设置输出目录只读:ro
设置输出目录读写:rw
用户映射选项
all_squash:将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody);
no_all_squash:与all_squash取反(默认设置);
root_squash:将root用户及所属组都映射为匿名用户或用户组(默认设置);
no_root_squash:与rootsquash取反;
anonuid=xxx:将远程访问的所有用户都映射为匿名用户,并指定该用户为本地用户(UID=xxx);
anongid=xxx:将远程访问的所有用户组都映射为匿名用户组账户,并指定该匿名用户组账户为本地用户组账户(GID=xxx);
其它选项
secure:限制客户端只能从小于1024的tcp/ip端口连接nfs服务器(默认设置);
insecure:允许客户端从大于1024的tcp/ip端口连接服务器;
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性;
async:将数据先保存在内存缓冲区中,必要时才写入磁盘;
wdelay:检查是否有相关的写操作,如果有则将这些写操作一起执行,这样可以提高效率(默认设置);
no_wdelay:若有写操作则立即执行,应与sync配合使用;
subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置);
no_subtree:即使输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样可以提高效率;
/ user01(rw) user02(rw,no_root_squash)
表示共享服务器上的根目录(/)只有user01和user02两台主机可以访问,且有读写权限;user01主机用root用户身份访问时,将客户机的root用户映射成服务器上的匿名用户(root_squash,该参数为缺省参数),相当于在服务器使用nobody用户访问目录;user02主机用root用户身份访问该共享目录时,不映射root用户(no_root_squash),即相当于在服务器上用root身份访问该目录
/root/share/ 192.168.1.2(rw,insecure,sync,all_squash)
表示共享服务器上的/root/share/目录只有192.168.1.2主机可以访问,且有读写权限;此主机用任何身份访问时,将客户机的用户都映射成服务器上的匿名用户(all_squash),相当于在服务器上用nobody用户访问该目录(若客户机要在该共享目录上保存文件(即写操作),则服务器上的nobody用户对该目录必须有写的权限)
/home/ylw/ *.test.com (rw,insecure,sync,all_squash)
表示共享/home/ylw/目录,*.test.com域中所有的主机都可以访问该目录,且有读写权限
/home/share/ .test.com (ro,sync,all_squash,anonuid=zh3,anongid=wa4)
表示共享目录/home/share/,*.test.com域中的所有主机都可以访问,但只有只读的权限,所有用户都映射成服务器上的uid为zh3、gid为wa4的用户
exportfs 命令用来管理当前NFS共享的文件系统列表。
参数:
-a 打开或取消所有目录共享。
-o options,...指定一列共享选项,与 exports(5) 中讲到的类似。
-i 忽略 /etc/exports 文件,从而只使用默认的和命令行指定的选项。
-r 重新共享所有目录。它使 /var/lib/nfs/xtab 和 /etc/exports 同步。 它将 /etc/exports 中已删除的条目从 /var/lib/nfs/xtab 中删除,将内核共享表中任何不再有效的条目移除。
-u 取消一个或多个目录的共享。
-f 在“新”模式下,刷新内核共享表之外的任何东西。 任何活动的客户程序将在它们的下次请求中得到 mountd添加的新的共享条目。
-v 输出详细信息。当共享或者取消共享时,显示在做什么。 显示当前共享列表的时候,同时显示共享的选项。
showmount命令用于查询NFS服务器
Usage: showmount [-adehv]
[--all] [--directories] [--exports]
[--no-headers] [--help] [--version] [host]
-a或--all
以 host:dir 这样的格式来显示客户主机名和挂载点目录。
-d或--directories
仅显示被客户挂载的目录名。
-e或--exports
显示NFS服务器的输出清单。
-h或--help
显示帮助信息。
-v或--version
显示版本信。
--no-headers
禁止输出描述头部信息。
显示NFS客户端信息
# showmount
显示指定NFS服务器连接NFS客户端的信息
# showmount 192.168.1.1 #此ip为nfs服务器的
显示输出目录列表
# showmount -e
显示指定NFS服务器输出目录列表(也称为共享目录列表)
# showmount -e 192.168.1.1
显示被挂载的共享目录
# showmount -d
显示客户端信息和共享目录
# showmount -a
显示指定NFS服务器的客户端信息和共享目录
# showmount -a 192.168.1.1
如果RPC与NFS的启动顺序不对,可能会造成报错
[root@redhatclient /]# showmount -d
clnt_create: RPC: Program not registered