NFS(Network File System):由Sun公司开发,最早的v1版本只在其自己的系统上使用,从v2开始,Sun将其向外公布;
NFS的功能:通过网络,让不用的机器、不同的操作系统分享彼此个别的数据;可以将其简单看做是一个文件共享服务器,将服务器上的共享目录挂载到本地,让其在本地看来,就像是自己的;
NFS提供的服务:1,在目录中查找文件;2,列出目录中的文件;3,管理目录;4,取得各文件的属性;5,文件的读写操作;
NFS的一些特性
1,NFS工作在OSI第七层,基于RPC实现;
2,NFS监听的端口:tcp/udp 2049,用于传输的端口是随机选择小于1024的端口(小于1024的端口只有管理用户有权使用),由于其功能较多,还需要其他的服务来启动额外端口;
3,NFS认证用户时,无法根据用户名判断,而是根据UID映射来完成,只要客户端使用的UID和服务器上的UID相同,即客户端拥有此UID(服务器上UID)相同的权限;
4,由于其使用UID映射来完成用户认证,所以使用root用户时,root的权限会被降低为nobody;
5,NFS工作在文件系统上,而文件系统属于内核中的功能,所以NFS是在内核空间中实现(samba在用户空间实现);
6,为了避免读写冲突,NFS使用了锁机制,客户端需要向服务器请求到锁,才能读写数据;
7,NFS服务只完成文件传输,其他的功能(例如锁和认证等)是由其他的服务来完成;
关于RPC(Remote Procedure Call Protocol):远程过程调用协议,由SUN公司提出,是一种计算机通信协议,该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外的为这个交互作用编程(即不需要了解底层网络技术的协议);
功能:由客户端对服务器发出一个执行若干过程的请求,并用客户端提供的参数,执行结果将返回给客户端;
工作原理
1,调用客户端句柄,执行传送参数;
2,调用本地系统内核发送网络消息;
3,消息传送到远程主机;
4,服务器句柄得到消息并取得参数;
5,执行远程过程;
6,执行的过程将结果返回服务器句柄;
7,服务器句柄返回结果,调用远程系统内核;
8,消息传回本地主机;
9,客户端句柄由内核接收消息;
10,客户接收句柄返回的数据;
监听端口:rpc服务的监听端口是半随机的,rpcbind监听tcp/udp 111,而rpc.ststd和rpc.mountd监听的端口为随机端口;
为什么NFS需要RPC?
由于NFS支持的功能很多,而不同的功能需要启动不同的程序,每启动一个功能就会启动一些端口来传输数据,因此NFS的功能所对应的端口采用随机端口,而客户端要想连接到服务器,就需要RPC服务;NFS在启动时,会开启一些随机端口,并主动向RPC注册,RPC就知道每个端口对应的NFS功能,由此,RPC在NFS中最重要的功能就是指定每个NFS功能所对应的端口,并返回给客户端(RPC使用固定端口tcp/udp111监听客户端请求);
注意
1,在启动NFS之前,要先启动RPC,否则NFS无法向RPC注册;
2,RPC重启时,原本的注册数据会被清空,因此RPC重启后,它所管理的服务需要重新启动来向RPC注册;
3,RPC在rhel5中,服务启动脚本为/etc/rc.d/init.d/portmap,在rhel6中为/etc/rc.d/init.d/rpcbind;
NFS客户端向服务器存取数据的过程
1,客户端向服务器的RPC(111端口)发出NFS存取功能的请求;
2,服务器端找到对应的已注册的NFS daemon端口后,返回给客户端;
3,客户端获得端口后,直接与NFS daemon建立连接;
NFS启动的daemons
由于NFS服务只完成文件传输,其他的功能是由其他的服务来完成,所以NFS服务器启动至少需要两个daemons,一个管理客户端是否能登陆,一个管理客户端能够取得的权限;
常见的daemons
rpc.nfsd:最主要的NFS服务,其功能就是管理客户端是否能够使用服务器文件系统挂载信息等,还包括登陆用户的ID判断;
rpc.mountd:用于管理NFS文件系统,包括权限等;该服务会读取/etc/exports来比对客户端的权限,判断其是否有权限使用共享的资源;
rpc.lockd(非必须):管理文件的锁;rpc.lockd必须要同时在客户端与服务器端都开启,rpc.lockd常与rpc.statd同时启用;
rpc.statd(非必须):用于检查文件的一致性,与rpc.lockd有关,如果因为客户端同时使用同一个文件造成可能有所损坏时,rpc.statd可以检测并尝试恢复该文件;与rpc,lockd一样,需要服务器端与客户端同时启动才生效;
这几个RPC程序,都已经写入到两个基本的服务器启动脚本了:/etc/init.d/nfs和/etc/init.d/nfslock;
NFS的权限问题
前面提到过NFS的认证是通过UID映射来完成的,因此:
1,如果服务器上没有这个UID,则会以nobody的身份来访问;
2,除了用户权限外,还需要
a)NFS服务器有开放可写入权限(/etc/exports);
b)实际的文件或目录具有可写入的权限;
3,为了保证安全,可以使用NIS或LDAP集中管理用户账号;
关于锁
在计算机中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足,分为共享锁和独占锁;
1,共享锁(S锁):一个事务对资源加上共享锁后,其他的事务只能对该资源再加共享锁,不能加独占锁;获准共享锁的事务只能读数据,不能修改数据;
2,独占锁(排他锁,X锁):如果事务对资源加上强制锁后,其他事务不能再对该资源加任何类型的锁;获准排他锁的事务可以读写数据;
安装和使用NFS
安装:由于nfs是内核自带的功能,因此不需要额外进行安装,但还需要安装以下两个软件:
rpcbind:RPC主程序,该服务负责端口的注册(对应)等工作;再次强调,rhel5以前称为:portmap;
nfs-utils:为nfs提供额外的功能,如rpc.nfsd即rpc.mountd这两个NFSdaemons与其他相关的文件、说明文件、执行文件等;
NFS的软件结构
/etc/exports 主配置文件;
/usr/sbin/exportfs 维护NFS分析资源的命令,可以用该命令重新共享/etc/exports修改后的目录资源、将NFS Server共享的目录卸载或重新共享等;
/var/lib/nfs/*tab 共享资源的登录文件,/var/lib/nfs中有两个重要的登录文件,一个是etab,主要记录NFS共享出来的目录的完整权限设置,另一个xtab记录曾经链接到此NFS服务器的相关客户端数据;
/usr/sbin/showmoune 客户端查询服务器分享资源的命令,可用于查看NFS服务器共享出来的目录资源;
/etc/exports配置文件的语法和参数
export host(options) 依次为:共享的目录 可连接的主机(选项或权限)
主机定义的方式
1,IP地址或网段:192.168.1.1,192.168.1.0/24,192.168.1.0/255.255.255.0;
2,主机名,但这个主机名必须在/etc/hosts中,或可以用DNS解析,主机名支持通配符,如*或?等;
选项
rw或ro:目录的权限是可读写或只读,但最终能不能读写与文件系统的权限和用户的权限也有关系;
secure:默认已经启用;限制客户端只能使用小于1024的tcp/udp端口访问请求;若不想加限制,则使用insecure;只有rhel6由该选项;
sync:数据同步写入到内存和硬盘中(性能差,数据可靠性高);
async:数据先保存在内存中,而非直接写入硬盘(性能好,数据可靠性差);
wdelay:写入延迟,检查是否有相关的写操作,如果有则将这些写操作一起执行(默认启动);
no_wdelay:有写操作则立即执行,与sync配合使用;
no_acl:关闭nfs的acl功能;
root_squash:将root用户的身份压缩为nobody;
no_root_squash:不压缩root的权限;
all_squash:将所有访问的用户身份都压缩为nobody;
no_all_squash:不压缩所有用户的身份(默认设置)
anonuid=xxx:使用指定的用户作为匿名用户(该用户需要在本地存在);
anongid=xxx:使用指定的组为匿名组(该组需要在本地存在);
启动NFS服务
1,/etc/init.d/rpcbind start 如果事先已启动,不需要再重新启动;
2,/etc/init.d/nfs start
维护NFS服务
exportfs:用于维护NFS服务器的输出目录列表;
-a:输出在/etc/exports中的所有目录;
-r:重新读取/etc/exports中的设置,并立即生效,无需重启NFS服务器,常和-a一起使用;
-u:取消输出(卸载某一目录),常和-a一起使用;
-v:显示详细信息(输出的目录列表);
查看NFS服务的相关信息
rpcinfo:查看rpc服务的相关信息;
-p host:显示指定主机上所有的port与porgram信息;
-t host nfs:针对nfs这个程序检查其相关的软件版本信息(tcp);
-u host nfs:针对nfs这个程序检查其相关的软件版本信息(udp);
如果rpcinfo无法输出,表示注册的数据有问题,需要重启rpcbind与nfs;
showmount:测试NFS服务器的输出目录状态;
-a:显示指定的NFS服务器的所有客户端主机及其所连接的目录(即每一个挂载连接);
-d:显示指定的NFS服务器已经被客户端挂载的所有目录列表;
-e:显示指定服务器上所有输出的共享目录;
使用固定端口
如果需要使用固定端口(比如防火墙规则设置),可修改配置文件/etc/sysconfig/nfs,该配置文件定义了一些NFS的工作特性;
通常只需要修改三个服务的端口即可
1,RQUOTAD_PORT=xxx
2,LOCKD_TCPPORT=xxx
3,LOCKD_UDPPORT=xxx
4,MOUNTD_PORT=xxx
NFS服务器关机的注意事项
1,如果有客户端连接上服务器,关机可能会成为“不可能的任务”,可能需要数小时才能正常关机,所以
2,所以,要先关掉nfs和rpcbind这两个服务,如果无法正确停止,用netstat -tlup找出PID,然后kill掉(注意数据安全);
客户端挂载:mount -t nfs x.x.x.x:/dir /mnt;
客户端挂载NFS也可以使用本地文件系统的挂载选项:如suid、rw、dev、exec、nouser、auto等(列出来的这些为默认设置);
NFS的特殊挂载选项
fg:挂载时,在前台运行,直到成功或time out为止(默认);
bg:在后台执行挂载操作,不会影响到前台的程序操作;
hard:如果客户端与服务器之间有任何一部方脱机,RPC会持续呼叫,直到对方恢复为止,会造成系统爆慢(默认);
sort:如果任意一方脱机,RPC会在time out后重复呼叫,而非持续呼叫,因此系统的延迟不会太明显;
intr:在使用hard方式挂载时,加上intr,则当RPC持续呼叫中,该呼叫是可以被中断的(默认不使用);
rsize:读的缓存大小,默认为1024bytes;
wsize:写的缓存大小,默认为1024bytes;
示例
操作系统:CentOS 6.4 x86;
服务器IP:192.168.159.128;
客户端IP:192.168.159.132;
服务器端
1,安装NFS:yum -y install rpcbind nfs-utils
2,编辑:vim /etc/exports
#写入
/data 192.168.159.132(rw)
保存退出;
3,useradd -u 65533 nfs-user 创建一个nfs用户:
4,mkdir /data; chown -R nfs-user /data 创建对应的目录,并赋予nfs-user权限;
5,启动服务
service rpcbind start
service nfs start
客户端
1,showmount -e 192.168.159.128 查询服务器上共享了哪些目录;
2,useradd -u 65533 nfs-user 创建一个用于使用nfs的用户;
3,mount -t nfs 192.168.159.128:/data /mnt 挂载nfs目录到本地;
4,su - nfs-user 切换至nfs用户;
5,cd /mnt 切换至nfs的挂载目录;
6,touch file1 创建一个文件,测试是否成功;
7,使用root用户,在mnt下测试是否可以成功创建文件;
声明:本文为学习笔记,内容参考多方资料,如涉及版权问题,请告知本人,谢谢!
转载于:https://blog.51cto.com/jdgoo/1423151