一 NFS 简介

1 简介

NFS是网络文件系统的简称(NetWork File System) 的简称,是分布式计算机系统的一个组成部分,可以实现在异构网络上共享和装配远程文件系统,NFS由SUN公司开发,目前已成为文件服务的一种标准(RFC1904,RFC1813),最大的功能就是让不同操作系统通过网络实现计算机共享数据。

2 NFS 协议

使用NFS,客户端可以透明的访问服务器上的文件和系统,这不同于FTP协议,FTP会产生一个完整的副本,NFS只访问一个进程引用文件的那一部分,并且NFS的一个目的就是实现透明访问。


NFS使用sunRPC构造的客户端/服务器应用程序,NFS客户端通过向一个NFS服务器发送RPC请求来访问其上的文件,尽管这一工作可以使用一半的用户进程来实现, NFS客户端可以第一个用户进程,对服务器进行显式调用,而服务器也可以是一个用户进程--因为两个理由,NFS不能这样实现 1 :访问NFS文件必须是对客户端透明,因此NFS的客户端调用是由客户端操作系统代表用户进程实现的 2 :处于效率考虑,NFS服务器在服务器操作系统中实现,如果NFS服务器是一个用户进程,则每个客户端请求和服务器应答,将不得不在内核和用户进程之间进行切换,这个代价太大,

二 NFS工作流程

1 基本工作流程

1 访问的是一个本地文件还是一个NFS文件对于客户端来说是透明的,当文件被打开时,由内核决定这一点,文件被打开后,内核将本地文件的所有引用传递该名为“本地文件访问”的框中,而将一个NFS文件的所有引用传递给名为“”NFS客户端“”的框中


2 NFS客户端通过他的TCp/ip模块向NFS服务器发送RPC请求,NFS主要使用UDP,最新的可以使用TCP


3 NFS服务器在端口2049接受作为UDP数据包的客户端的请求,尽管NFS是被实现成使用端口映射器,允许服务器使用一个临时端口,但是大多数实现都是直接指定UDP端口2049


4 当NFS服务器收到一个客户端的请求时,他将这个请求传递到本地文件访问例程,然后访问服务器上的一个本地的磁盘文件


5 NFS服务器需要花一段时间来处理一个客户端的请求,访问本地文件系统一般也需要一定的时间,在这段时间间隔内,服务器不应该阻止其他客户端的请求,为了实现这一功能,大多数NFS服务器都是多线程的,服务器的内核中实际有多个NFS本身的加锁管理程序中运行,实现不同操作系统的运行,共同技术就是启动一个用户进程(nfsd)的多个实例,这个实例执行一个系统调用,使自己作为一个内核进程保留在操作系统的内核中


6 同样在客户端主机上,NFS客户端需要花一定的时间来处理一个用户进程的请求,NFS客户端向服务器发送一个RFC调用,然后等待服务器的应答,为了给使用NFS客户端主机上的进程提供更过的并发性,在客户端内核中一般运行着多个NFS客户端,同样,具体实现依赖于操作系统

2 RPC(remote procedure call)

远程过程调用

因为NFS支持的功能多,不同功能都会使用不同程序来启动,每启动一个功能就会启动一些端口来传输数据,因此NFS的功能所对应的端口没有固定住,而是采用随机取用一些未被使用小于1024的端口来作为传输之用,如此又带来客户端想连服务器的困扰,因为客户端要知道服务器端口的相关端口才能够联机,此时我们使用RPC服务,RPC最主要的功能就是指定每一个NFS功能对应的端口,并且汇报给客户端,让客户端可以连接刀片正确的端口,RPC是如何知道每个NFS的端口号,这个因为服务器在启动NFS时会随机取用数个端口,并主动向RPC注册,因此,RPC可以知道每个端口对应的NFS功能,然后PRC又是固定端口111来监听客户端的请求并汇报给客户端正确的端口。


**注:在启动NFS之前,必须先启动RPC,否则无法完成注册,,若RPC重启了,则原本的注册数据会丢失,因此PRC重启后,它管理的所有服务器都需要重新启动来重新向RPC注册 **

扩展 (NFS启动配置文件如下)

[root@slave1 ~]# cat /usr/lib/systemd/system/nfs.service 
[Unit]
Description=NFS server and services
DefaultDependencies=no
Requires= network.target proc-fs-nfsd.mount
Requires= nfs-mountd.service
Wants=rpcbind.socket network-online.target
Wants=rpc-statd.service nfs-idmapd.service
Wants=rpc-statd-notify.service

After= network-online.target local-fs.target
After= proc-fs-nfsd.mount rpcbind.socket nfs-mountd.service
After= nfs-idmapd.service rpc-statd.service
Before= rpc-statd-notify.service

# GSS services dependencies and ordering
Wants=auth-rpcgss-module.service
After=rpc-gssd.service gssproxy.service

Wants=nfs-config.service
After=nfs-config.service

[Service]
EnvironmentFile=-/run/sysconfig/nfs-utils

Type=oneshot
RemainAfterExit=yes
ExecStartPre=-/usr/sbin/exportfs -r
ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS
ExecStartPost=-/bin/sh -c 'if systemctl -q is-active gssproxy; then systemctl restart gssproxy ; fi'
ExecStop=/usr/sbin/rpc.nfsd 0
ExecStopPost=/usr/sbin/exportfs -au
ExecStopPost=/usr/sbin/exportfs -f

ExecReload=-/usr/sbin/exportfs -r

[Install]
WantedBy=multi-user.target

上述显示了NFS启动配置的顺序,其中RPC会先启动

3 NFS 启动的RPC daemon

NFS服务器也被称为RPC server 之一,那么NFS服务器的主要任务是进行文件系统的分享,文件系统的分享则与权限有关,所以NFS服务器启动时至少需要两个daemons,一个管理客户端是否能够登入的问题,另一个管理客户端能够取得权限。


其中RFC处于会话层,而NFS是应用层 NFS服务器的模块: 1 rpc.nfsd :主要的NFS服务器提供商,这个daemon主要的共鞥是管理客户端是否能够使用服务器文件西戎挂载信息等,其中还包括这个登入这的ID判断。 2 rpc.mountd :这个daemon 主要的共鞥,则是在管理NFS的文件系统,当客户端顺利通过rpc.nfsd而登入服务器之后,在他可以使用NFS服务器提供的档案之前,还会经过档案权限(-rwxrwxrwx 与 owner,group 那几个权限)的认证程序,它会读取NFS的配置文件/etc/exports来比较客户端的权限,当通过这一关之后就可以取得使用NFS档案的权限。 3 rpc.lockd (非必要) 这个是用在管理档案的锁定(lock)用途,当多个客户端同时尝试同时某个档案时,就需要此功能了,此服务需要在客户端和服务器端同时开启方可生效。,此外rpc.lockd也常与rpc.statd同时启动。 4 rpc.statd(非必要) 可以用来检查档案的一致性,与rpc.lockd有关,若发生因为客户端同时使用同一档案可能有所损毁时,rpc.statd可以用来检查并尝试恢复该档案,此服务也是客户端和服务器端同时开启方可 /etc/init.d/nfs /etc/init.d/nfslock中, 与服务器相关的在nfs中,与客户端相关的在rpc.lockd中

4 客户端UID和服务端UID 相关问题

1 客户端和服务器端UID和GID 不同导致的问题

当客户端以某个身份登录服务器端获取文件系统时,服务器端会以客户端的使用者UID和GID 等身份来尝试读取服务器端的文件系统,此时若客户端的用户对应的UID和服务端不同用户名称对应的UID一样,则会造成客户端修改数据而服务器端无法判别了

2 客户端对应的UID有,而服务端没有的情况

若客户端对应的UID有而服务端没有,则会造成服务端以匿名者的身份进行处理,centos取名为nfsnobody,但若服务器端分享/tmp下的情况,则客户端操作时服务端还是会保持对应的UID,但建立的各项数据在服务端看来,就属于无拥有者的资料

3 使用者是root时

在预设情况下,root 会被主动压缩成匿名者

4 还需要开放的

客户端与服务器端的UID及账号不一致时,会造成文件系统使用上的困扰,要实际在客户端以NFS取用服务端的文件系统时,还需要具有: 1 NFS服务器有开放的权限 2 实际的被共享的档案有可写的权限

三NFS的配置文件

1 主要配置文件

:/etc/exports

2 NFS文件系统维护指令

:/usr/sbin/exportfs 可以利用这个指令重新分享/etc/exports 变更的目录资源,讲NFS server 分享的目录卸载或重新分享等,

3 分享资源的登录档:

/var/lib/nfs/*tab

4 客户端查询服务器资源的指令:

/usr/sbin/showmount

exports 是用在NFSserver端,showmount 则主要是用在client端的。

/etc/exports 中的参数设定 权限方面的参数设定:

三 NFS的安装与配置

1 一般NFS的挂载配置

1 NFS服务器端安装与配置 2 客户端检验结果 3 在服务器端开启防火墙安全策略 4 客户端测试

5 服务器端创建并编辑共享文件夹,并刷新 6 客户端查看并挂载

2 自动NFS的挂载配置

1 客户端卸载当前挂载

2 安装测试


注:其必须进入共享目录的最底层,

配置其快速卸载

配置自动挂载

上述文件/etc/auto.nfs需要自己建立 此配置为只读模式

重启服务

测试: 此也需进入目录的最底层

查看挂载情况: 其显示为只读挂载

配置为读写挂载:

服务器端配置 授权并刷新:

查看验证

3 创建文件的限制

允许文件的权限1002的用户和1002的组 1 创建用户

2 加入其中并刷新

客户端测试

此时客户端若有1002的用户和组,则此UID为1002的用户将成为该文件的所属者和所属组

使其权限为root权限创建文件,之前创建的文件都是

客户端测试

若想对访问的用户进行控制和权限进行控制则

进行设置 客户端的/etc/auto.nfs 与服务器端的/etc/exports文件均为写权限切共享目录有写权限时方可执行写权限。