Linux进阶学习笔记之——文件服务器之一:NFS服务器

文件服务器之一:NFS服务器

1、什么是NFS(Network File System)

它的最大功能是可以通过网络,让不同的机器、不同的操作系统可以共享彼此的文件
Linux进阶学习笔记之——文件服务器之一:NFS服务器_第1张图片

基本上NFS的端口是2049,但还需要开一些其他的端口,是随机选择的。客户端需要使用远程过程调用(RPC)协议来获知这些其他端口。

1.1、什么是RPC

RPC最主要的功能是指定每个NFS功能所对应的port number,并且通知客户端,让客户端可以连接到正确地端口上。那RPC是如何知道每个NFS的的端口呢?这是因为当服务器启动NFS时会随机选取数个端口,并向RPC注册,因此RPC知道每个端口对应的NFS功能

Linux进阶学习笔记之——文件服务器之一:NFS服务器_第2张图片

  1. 客户端会向服务器端的RPC(port 111)发出NFS文件访问功能的查询要求;
  2. 服务器端找到对应的已注册的NFS daemon端口后,会通知客户端;
  3. 客户端了解正确的端口后,就可以直接与NFS daemon连接。

1.2、NFS启动的RPC daemon

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一起在客户端和服务器端启动

1.3、NFS的文件访问权限

NFS本身的服务并没有进行用户身份验证,服务器端会以客户端的用户UID与GID等身份来尝试读取服务器端的文件系统。这就产生了一个问题:如果客户端与服务器端的用户身份并不一致怎么办

  1. NFS Server/NFS Client刚好有相同的账号与用户组

    此时用户可以直接以客户端的用户身份访问服务器所提供的共享文件系统

  2. NFS Server的UID对应的是另一个用户

    则客户端的UID可以访问服务器端对应相同UID用户的文件

  3. NFS Server并没有那个UID

    被压缩成匿名用户

  4. 如果用户身份是root

    也会被压缩为匿名用户

还需要具备:

  • NFS服务器已经开放可写入的权限(与/etc/exports设置有关)

  • 实际的文件权限具有可写入(w)的权限

    当你满足一下条件:1、用户账号,即UID的相关身份;2、NFS服务器允许写入的权限;3、文件系统确实具有w的权限时;你才具备写入(w)的权限。尤其是身份确认阶段,所以NFS通常与NIS仪器搭配使用。


2、NFS Server的配置

2.1、所需要的软件

[root@server ~]# yum install nfs-utils -y
  • RPC主程序:rpcbind

    在启动任何一个RPC服务之前,都需要启动rpcbind才行,做好port的对应工作。

  • NFS主程序:nfs-utils

    就是提供rpc.nfsd及rpc.mountd这两个NFS daemon与其他相关documents与说明文件、可执行文件等的软件。

2.2、NFS的软件架构

  • 主要配置文件:/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共享出来的目录资源

2.3、/etc/exports配置文件的语法与参数

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)

主机后边以小括号“()”定义权限参数,若权限参数不止一个,用逗号“,”隔开,并且主机名与小括号是连在一起的

至于主机名的设置主要有以下几种设置:

  1. 可以使用完整的IP或者网络号;
  2. 可以使用主机名,但这个主机名必须在/etc/hosts内,或可使用DNS找到才行;也可使用通配符。

至于权限,常见的参数:

参数值 说明
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

2.4、启动NFS

[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。

2.5、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的时候,将共享目录显示在屏幕上

3、NFS Client的配置

要如何挂载NFS服务器所提供的文件系统:

  1. 确认本地端已经启动了rpcbind服务;
  2. 扫描NFS服务器共享的目录有哪些,并了解是否可以使用(showmount);
  3. 在本地端建立预计要挂载点目录(mkdir);
  4. 利用mount将远程主机直接挂载到相关目录。
[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

3.1、客户端可处理的挂载参数

参数 说明 默认值
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

3.2、自动挂载autofs的使用

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

你可能感兴趣的:(Linux进阶—服务器搭建)