它的最大功能是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件。
基本上NFS的端口是2049,但还需要开一些其他的端口,是随机选择的。客户端需要使用远程过程调用(RPC)协议来获知这些其他端口。
RPC最主要的功能是指定每个NFS功能所对应的port number,并且通知客户端,让客户端可以连接到正确地端口上。那RPC是如何知道每个NFS的的端口呢?这是因为当服务器启动NFS时会随机选取数个端口,并向RPC注册,因此RPC知道每个端口对应的NFS功能。
NFS服务器在启动的时候需要向RPC注册,所以NFS服务器也称为RPC Server之一。那么NFS服务器主要任务是进行文件系统的共享,而文件系统的共享是权限有关的。所以NFS服务器启动时至少需要两个daemon,一个管理客户端是否能够登录的问题,一个管理客户端能够取得的权限。以功能较为单纯的NFS服务器来说,需要启动以下daemon:
需要启动的daemon | 说明 |
---|---|
rpc.nfsd | 最主要的NFS服务提供程序,这个主要是管理客户端是否能够使用服务器文件系统挂载信息,其中还包含判断这个登录用户的ID |
rpc.mountd | 用于管理NFS的文件系统。当客户端顺利地通过rpc.nfsd登录服务器之后,在它可以使用NFS服务器提供的文件之前,还会经过文件权限的认证程序。它会去读取NFS的配置文件/etc/exports来比对客户端的权限。 |
rpc.lockd(非必要) | 同步问题,服务器端和客户端同时启动 |
rpc.statd(非必要) | 检查文件的一致性,与rpc.lockd一起在客户端和服务器端启动 |
NFS本身的服务并没有进行用户身份验证,服务器端会以客户端的用户UID与GID等身份来尝试读取服务器端的文件系统。这就产生了一个问题:如果客户端与服务器端的用户身份并不一致怎么办?
NFS Server/NFS Client刚好有相同的账号与用户组
此时用户可以直接以客户端的用户身份访问服务器所提供的共享文件系统
NFS Server的UID对应的是另一个用户
则客户端的UID可以访问服务器端对应相同UID用户的文件
NFS Server并没有那个UID
被压缩成匿名用户
如果用户身份是root
也会被压缩为匿名用户
还需要具备:
NFS服务器已经开放可写入的权限(与/etc/exports设置有关)
实际的文件权限具有可写入(w)的权限
当你满足一下条件:1、用户账号,即UID的相关身份;2、NFS服务器允许写入的权限;3、文件系统确实具有w的权限时;你才具备写入(w)的权限。尤其是身份确认阶段,所以NFS通常与NIS仪器搭配使用。
[root@server ~]# yum install nfs-utils -y
RPC主程序:rpcbind
在启动任何一个RPC服务之前,都需要启动rpcbind才行,做好port的对应工作。
NFS主程序:nfs-utils
就是提供rpc.nfsd及rpc.mountd这两个NFS daemon与其他相关documents与说明文件、可执行文件等的软件。
主要配置文件:/etc/exports
不一定会存在,可以自己创建
NFS文件系统维护命令:/usr/sbin/exportfs
维护NFS共享资源的命令,可以利用这个命令共享/etc/exports更新的目录资源,将NFS Server共享目录卸载或重新共享等。
*共享资源的日志文件:/var/lib/nfs/tab
日志文件都存放在/var/lib/nfs/目录中,两个文件比较重要,一个是etab,主要记录了NFS所共享出来的目录完整权限设置;另一个是xtab,记录了曾经链接到NFS服务器端的相关客户端的数据
客户端查询服务器共享命令的命令:/usr/sbin/showmount
h很重要的脚本文件,showmount可以用来查看NFS共享出来的目录资源
NFS会用到内核功能,所以内核必须支持NFS才行。
#可能不会主动提供/etc/exports文件,可以手动创建它
[root@server ~]# vim /etc/exports
[要共享的目录] [第一台主机(权限)] [可用主机名表示] [可用通配符表示]
/usr/local/src 10.0.0.0/8(rw,sync,no_root_squash) client(rw,sync,no_root_squash)
主机后边以小括号“()”定义权限参数,若权限参数不止一个,用逗号“,”隔开,并且主机名与小括号是连在一起的。
至于主机名的设置主要有以下几种设置:
至于权限,常见的参数:
参数值 | 说明 |
---|---|
rw ro |
该目录共享的权限是可读写或只读,但最终能不能读写,还是与文件系统的rwx有关 |
sync async |
sync代表数据会同步到内存与硬盘,async则代表数据会暂时存于内存当中,而非硬盘 |
no_root_squash root_squash |
默认客户端root身份会由root_squash的设置压缩成nfsnobody;但如果想开放root身份使用服务器端文件系统,可使用no_root_squash |
all_squash | 任何身份都被压缩成匿名用户 |
anonuid anongid |
可以自行设置被压缩成的用户,默认为nfsnobody |
[root@server ~]# systemctl start nfs.service
[root@server ~]# netstat -tulnp | grep -E '(rpc|nfs)'
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 5459/rpcbind
tcp 0 0 0.0.0.0:20048 0.0.0.0:* LISTEN 5470/rpc.mountd
tcp 0 0 0.0.0.0:57893 0.0.0.0:* LISTEN 5449/rpc.statd
tcp6 0 0 :::59784 :::* LISTEN 5449/rpc.statd
tcp6 0 0 :::111 :::* LISTEN 5459/rpcbind
tcp6 0 0 :::20048 :::* LISTEN 5470/rpc.mountd
udp 0 0 0.0.0.0:969 0.0.0.0:* 5459/rpcbind
udp 0 0 0.0.0.0:57299 0.0.0.0:* 5449/rpc.statd
udp 0 0 0.0.0.0:20048 0.0.0.0:* 5470/rpc.mountd
udp 0 0 0.0.0.0:111 0.0.0.0:* 5459/rpcbind
udp 0 0 127.0.0.1:961 0.0.0.0:* 5449/rpc.statd
udp6 0 0 :::969 :::* 5459/rpcbind
udp6 0 0 :::20048 :::* 5470/rpc.mountd
udp6 0 0 :::111 :::* 5459/rpcbind
udp6 0 0 :::57156 :::* 5449/rpc.statd
使用rpcinfo来查看每个RPC服务的注册情况:
[root@server ~]#rpcinfo -p [IP|hostname]
[root@server ~]#rpcinfo -t|-u IP|hostname 程序名称
选项与参数:
-p:针对某IP(未写默认为本机)显示出所有的port与program信息
-t:针对某主机的某个程序检查其TCP数据报所在的软件版本
-u:针对某主机的某个程序检查其UDP数据报所在的软件版本
如果rpcinfo无法输出,说明注册的数据有问题,可能需要重新启动rpcbind和nfs。
可以在Server端检查一下是否可以连接:
[root@server ~]#showmount [-ae] [hostname|IP]
选项与参数:
-a:显示当前主机与客户端的NFS连接共享的状态
-e:显示某台主机的/etc/exports所共享的目录数据
如果有其他客户端挂载了你的NFS系统,那么该客户端与文件系统信息就会被记录到**/var/lib/nfs/xtab**里边。
如果更改了/etc/exports文件,可以使用exportfs命令重新读取:
[root@server ~]# exportfs [-aruv]
选项与参数:
-a:全部挂载(或卸载)/etc/exports文件里边的设置
-r:重新挂载/etc/exports里边的设置,此外,亦同步更新/etc/exports及/var/lib/nfs/xtab的内容
-u:卸载某一目录
-v:在export的时候,将共享目录显示在屏幕上
要如何挂载NFS服务器所提供的文件系统:
[root@client ~]# showmount -e 10.0.0.185(服务器IP)
Export list for 10.0.0.185:
/usr/local/src 10.0.0.0/8
将NFS Server的/usr/local/src挂载到/usr/local/li下:
[root@client ~]# mkdir /usr/local/li
[root@client li]# mount -t nfs 10.0.0.185:/usr/local/src /usr/local/li
参数 | 说明 | 默认值 |
---|---|---|
suid nosuid |
当挂载的partition上有任何SUID的binary程序时,只要使用nosuid就能够取消SUID的功能 | suid |
rw ro |
指定该文件系统是只读或可读写的 | rw |
dev nodev |
保留设备文件的特殊功能,一般只有/dev这个目录下才会有特殊的设备 | dev |
exec noexec |
是否具有执行binary file的权限?如果想挂载的仅是数据分区,可以选择noexec | exec |
user nouser |
是否允许用户进行文件的挂载与卸载操作 | nouser |
auto noauto |
会不会挂载到项目 | auto |
fg bg |
当执行挂载时,该挂载的行为会在前台还是后台执行? | fg |
soft hard |
如果是hard情况,RPC会持续呼叫,直到对方恢复连接为止;如果是soft情况,则RPC会在time out后重复呼叫,而非持续呼叫 | hard |
intr | 上述的hard,使用intr,则当RPC持续呼叫时,也是可以中断的 | 无 |
rsize wsize |
读出与写入的区块大小,缓冲容量 | rsize=1024 wsize=1024 |
#挂载的文件系统只能进行数据访问
[root@client li]# mount -t nfs -o nosuid,noexec,nodev,rw \
> -o bg,soft,rsize=32768,wsize=32768 \
> 10.0.0.185:/usr/local/src /usr/local/li
autofs会持续地检测某个指定的目录,并预先设置当使用到该目录下的某个子目录时,将会取得来自服务器端的NFS文件系统资源,并进行自动挂载操作。
[root@client ~]# yum install autofs -y
建立主配置文件:/etc/auto.master,并指定检测的特定目录
[root@client li]# vim /etc/auto.master
/usr/local/li /etc/auto.nfs
建立数据对应文件内(/etc/auto.nfs)的挂载信息与服务器对应的资源
/etc/auto.nfs是自行设置的,并不存在
[本地端子目录] [-挂载参数] [服务器所提供的目录]
选项与参数:
[本地端子目录]:指的是在/etc/auto.master内指定的目录的子目录
[-挂载参数]:rw、bg、soft等参数
[服务器所提供的目录]:就是要挂在的服务器端的目录
[root@client li]# vim /etc/auto.nfs
src -rw,bg,rsize=32678,wsize=32678 10.0.0.185:/usr/local/src
[root@client li]# systemctl start autofs
[root@client src]# cd /usr/local/li/src
[root@client src]# ll /usr/local/li/src
总用量 17520
-rw-r--r--. 1 root root 17936580 7月 20 10:46 鸟哥的Linux私房菜服务器架设篇(第三版).pdf