网络服务—NFS
网络服务—NFS
什么是NFS ?
NFS 是Network File System的缩写,即网络文件系统。一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法.
它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。在本地的NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。
NFS一般用来存储共享视频,图片等静态数据。
NFS挂载原理
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就会记录下这些端口。并且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 reload
总结:客户端NFS和服务端NFS通讯过程
1)首先服务器端启动RPC服务,并开启111端口
2)启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
NFS相关协议及软件安装管理
# 协议:
RPC(Remote Procedure Call Protocol)——远程过程调用协议
# 软件:
nfs-utils-* :包括NFS命令与监控程序
rpcbind-* :支持安全NFS RPC服务的连接
注:通常情况下,是作为系统的默认包安装的
CentOS 6.*之前rpcbind叫portmap
NFS系统守护进程
# nfs:
它是基本的NFS守护进程,主要功能是管理客户端是否能够登录服务器
# rpcbind:
主要功能是进行端口映射工作。当客户端尝试连接并使用RPC服务器提供的服务(如NFS服务)时,rpcbind会将所管理的与服务对应的端口提供给客户端,从而使客户可以通过该端口向服务器请求服务。
NFS服务器的配置
NFS服务器的配置相对比较简单,只需要在相应的配置文件中进行设置,然后启动NFS服务器即可。
NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用vim手动建立,然后在文件里面写入配置内容。
# /etc/exports文件内容格式:
共享目录 客户端1(访问权限,用户映射,其他) 客户端2(访问权限,用户映射,其他)
共享目录:共享目录是指NFS服务器共享给客户机使用的目录
客户端:客户端是指网络中可以访问这个NFS共享目录的计算机
# 客户端常用的指定方式:
指定ip地址的主机:192.168.0.200
指定子网中的所有主机:192.168.88.0
指定域名的主机:www.kernel.com
指定域中的所有主机:*.kernel.com
# 所有主机:*
设置共享目录的访问权限、用户映射等。
访问权限选项:
设置输出目录只读:ro
设置输出目录读写:rw
# 用户映射选项:
root_squash:将root用户的访问映射为匿名(nfsnobody)用户uid和gid;(默认生效)
no_root_squash:保留管理员权限,以服务器管理员的权限管理;
all_squash:将远程访问的用户及所属组都映射为指定uid、gid的匿名用户;
anonuid=xxx:将远程访问的所有用户都映射为指定uid的匿名用户;
anongid=xxx:将远程访问的所有用户组都映射为指定gid匿名组账户;
# 其它选项
sync: 将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性(同步);
async:将数据先保存在内存缓冲区中,必要时才写入磁盘(异步);
NFS服务器的启动与停止
启动NFS服务器
为了使NFS服务器能正常工作,需要启动rpcbind和nfs两个服务,并且rpcbind一定要先于nfs启动。
$ service rpcbind start
$ service nfs start
查询NFS服务器状态
$ service rpcbind status
$ service nfs status
停止NFS服务器
要停止NFS运行时,需要先停止nfs服务再停止rpcbind服务,对于系统中有其他服务(如NIS)需要使用时,不需要停止rpcbind服务
$ service nfs stop
$ service rpcbind stop
设置NFS服务器的自动启动状态
设置rpcbind和nfs服务在系统运行级别2345自动启动。
$ chkconfig --level 2345 rpcbind on
$ chkconfig --level 2345 nfs on
查看RPC服务器开启了哪些端口
$ rpcinfo –p localhost
实验相关实例
将NFS服务器的/home/zhangsan共享给192.168.115.0网段,rw权限
$ vi /etc/exports
/home/zhangsan 192.168.115.0(rw)
# 重启rpcbind 和nfs 服务
$ service rpcbind restart
$ service nfs restart
$ exportfs
# 服务器端查看nfs共享状态
$ showmount -e 本机ip
# 查看自己共享的服务
# 客户端查看nfs共享状态
$ showmount -e NFS服务器IP
# 客户端挂载nfs服务器共享目录
命令格式:mount NFS服务器IP:共享目录 本地挂载点目录
$ mount 192.168.115.10:/home/zhangsan/ /media/zhangsan/
$ mount | grep nfs
mount -o vers=3 共享 本地#指定挂载使用nfs V3版本(避免同步延迟)
验证客户端和nfs服务器端文件是否一致:
$ cd /media/zhangsan/
修改服务器端相应权限,不然客户端无法正常访问和使用
nfs共享权限和访问控制
客户端root用户
使用客户端的root身份在nfs服务器上创建文件,文件的所有者和所属组是nfsnobody。
客户端普通用户
使用客户端的普通用户身份在nfs服务器上创建文件,所有者和所属组是nobody或普通用户。
如果明确设定了普通用户的映射用户身份,那么此时客户端用户的身份转换为指定映射用户;
如果NFS server上面有同名用户,那么此时客户端登录账户的身份转换为NFS server上面的同名用户;
卸载和自动挂载
卸载:
卸载客户端的挂载目录
umount 挂载点
停止服务器端的共享
exportfs –au
自动挂载:/etc/fstab
格式:<server>:</remote/export> </local/directory> nfs < options> 0 0
\#192.168.115.10:/home/zhangsan /media/zhangsan nfs defaults,vers=3 0 0
\#mount –a
相关命令
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 重新共享所有目录并输出详细信息
rpcinfo命令
利用rpcinfo -p 可以查看出RPC开启的端口所提供的程序有哪些
其中nfs 开启的是2049,portmapper(rpcbind) 开启的是111,其余则是rpc开启的
配置文件:/etc/exports
查看端口:netstat -antp
rpcinfo -p
实验:
1)前提条件:
两台虚拟机,一台为nfs服务器(110),一台为测试客户端(111)
2)服务器端配置:
# 开启nfs服务
$ service nfs start
# 编辑配置文件设置共享目录
共享目录 客户端1(访问权限,用户映射,其他) 客户端2(访问权限,用户映射,其他)
$ vim /etc/exports
/nfssever 192.168.190.111(rw)
# 创建共享目录
$ mkdir /nfsserver
# 重启服务:
$ service nfs restart
# 服务器端查看nfs共享状态
$ showmount -e 本机ip 查看自己共享的服务
# 客户端查看nfs共享状态
$ showmount -e NFS服务器IP
3)客户端配置:客户端挂载nfs服务器共享目录
# 创建挂载目录
$ mkdir /nfsclent
# 挂载共享目录到客户端创建的目录:
命令格式:mount NFS服务器IP:共享目录 本地挂载点目录
$ mount 192.168.190.110:/nfsserver /nfsclient
$ df -hP 查看
# 创建文件时的延迟,是因为创建版本的问题
$ mount | grep nfs 查看挂载信息
# mount -o vers=3 共享 本地#指定挂载使用nfs V3版本(避免同步延迟)
$ mount -o vers=3 192.168.190.11.:/nfssever /nfsclient
4)客户端写入数据测试:(配置文件,对应目录都要有权限)
$ cd /nfsclient
$ touch a.txt
# 服务器端给共享目录权限
$ chmod 777 /nfsserver
# 客户端测试,并查看权限(可以看出客户端连接到服务器映射为nsfnobody的用户来创建文件)
$ cd /nfsclient touch a.txt ll 查看权限
# 服务器将权限改回,赋予acl权限
$ chmod 755 /nfsserer setfacl -m u:nsfnobody:rwx /nfsserver/
# 客户端测试权限:
$ mkdir abc ll
参数 | 作用 |
---|---|
ro | 只读 |
rw | 读写 |
root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户 |
no_root_squash | 当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员 |
all_squash | 无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户 |
sync | 同时将数据写入到内存与硬盘中,保证不丢失数据 |
async | 优先将数据保存到内存,然后再写入硬盘;这样效率更高,但可能会丢失数据 |
anongid |
注:本文为博主查阅多方资料整理而成,如有侵权请留言联系博主删除。
学习新东西,不要忘记复习旧知识,这样你才能更好!