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开启的