NFS

简述

NFS(Network File System)即网络文件系统,是FreeBSD支持的文件系统中的一种,它允许网络中的计算机之间通过TCP/IP网络共享资源。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。NFS在文件传送或信息传送过程中依赖于RPC协议。


NFS与RPC的关系

因为NFS支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用多个端口来传输数据,因此,NFS的功能所对应的端口才没有固定住,而是随机取用一些未被使用的小于1024的端口用来传输。这样做就导致当客户端连接服务器时,不知道要连接哪个端口。

那RPC又是如何知道每个NFS的端口呢?这是因为当服务器在启动NFS时会随机取用多个端口口,并主动的向RPC注册,因此RPC可以知道每个端口对应的NFS功能,然后RPC又是固定使用端口号111来监听客户端的需求并回报客户端正确的端口。这样RPC就作为了一个中介代理,解决了客户端不知道该连接NFS服务端哪个端口的问题。

要启动NFS之前,要先启用RPC,否则NFS会无法向RPC注册。另外,RPC若重新启动时,原本注册的数据会不见,因此RPC重新启动后,它管理的所有服务都需要重新启动来重新向RPC注册。

当客户端有NFS档案存取需求时,他会如何向服务器端要求数据呢?
1.客户端会向服务器端的RPC端口(111) 发出NFS档案存取功能的询问要求;
2.服务器端找到对应的已注册的NFS 守护进程(daemon) 端口后,会回报给客户端;
3.客户端了解正确的端口口后,就可以直接连接NFS 守护进程端口了。

配置实例

服务端
1.安装nfs服务

[root@jiangpeisi ~]# yum -y install nfs-utils rpcbind

RPC主程序:rpcbind :完成端口注册
NFS主程序:nfs-utils:包含两个 rpc.nfsd 、rpc.mountd守护进程
2.创建共享目录

[root@jiangpeisi ~]# mkdir /mnt/nfstest

3.修改/etc/exports文件:控制NFS服务器要导出的共享目录以及访问控制。

/mnt/nfstest    192.168.32.0/24(rw,sync)

4./etc/port配置文件解析:

共享目录    允许访问的主机(控制访问)
  • 设置允许访问的主机:
    使用具体IP地址
    192.168.32.5
    使用IP地址指定网段
    192.168.32.0/24
    192.168.32.0/255.255.255.0
    192.168.32.
    使用具体域名
    Mirror.sh.com
    使用通配符匹配域名内客户端
    .sh.com
    指定所有客户端
  • 控制访问:
    rw/ro:该目录分享的权限是可擦写 (read-write) 或只读 (read-only),但最终能不能读写,还是与文件系统的 rwx 及身份有关。

    sync/async:sync 代表数据会同步写入到内存与硬盘中,async 则代表数据会先暂存于内存当中,而非直接写入硬盘。

    no_root_squash/root_squash:客户端使用 NFS 文件系统的账号若为 root 时,系统该如何判断这个账号的身份?预设的情况下,客户端 root 的身份会由 root_squash 的设定压缩成 nfsnobody, 如此对服务器的系统会较有保障。但如果你想要开放客户端使用 root 身份来操作服务器的文件系统,那么这里就得要开 no_root_squash 才行!

    all_squash:不论登入 NFS 的使用者身份为何, 他的身份都会被压缩成为匿名用户。

    anonuid/anongid:anonuid 意指 anonymous (匿名者) 前面关于 *_squash 提到的匿名用户的 UID 设定值,通常为 nfsnobody,但是可以自行设定这个 UID,这个 UID 必需要存在于 /etc/passwd 当中! anongid 设置匿名用户的GID。

5.启动服务

[root@jiangpeisi ~]# systemctl start rpcbind
[root@jiangpeisi ~]# systemctl start nfs

6.由于端口不固定无法放行固定端口,暂时防火墙关闭

[root@jiangpeisi ~]# systemctl stop firewalld.service 

客户端
1.安装NFS主程序

[root@jiangpesi ~]# yum install nfs-utils.x86_64 -y

3.查看NFS服务器共享目录信息

[root@jiangpeisi ~]# showmount -e 192.168.32.152
Export list for 192.168.32.152:
/mnt/nfstest 192.168.32.0/24

4.挂载

[root@jiangpesi ~]# mkdir /mnt/client
[root@jiangpesi ~]# mount -t nfs 192.168.32.152:/mnt/nfstest /mnt/client/
[root@jiangpesi client]# df -h
文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root           17G  2.0G   16G   12% /
devtmpfs                     478M     0  478M    0% /dev
tmpfs                        489M     0  489M    0% /dev/shm
tmpfs                        489M  6.8M  482M    2% /run
tmpfs                        489M     0  489M    0% /sys/fs/cgroup
/dev/sda1                   1014M  139M  876M   14% /boot
tmpfs                         98M     0   98M    0% /run/user/0
192.168.32.152:/mnt/nfstest   17G  2.2G   15G   13% /mnt/client

测试
1.服务端创建文件

[root@jiangpeisi nfstest]# touch a
[root@jiangpeisi nfstest]# ll
总用量 0
-rw-r--r-- 1 root root 0 4月  12 11:07 a

2.客户端查看

[root@jiangpesi client]# ll
总用量 0
-rw-r--r--. 1 root root 0 4月  12 11:07 a

3.服务端修改共享目录权限

[root@jiangpeisi mnt]# chmod 777 nfstest/

4.客户端创建文件

[root@jiangpesi client]# touch b

5.服务端查看

[root@jiangpeisi nfstest]# ll
总用量 0
-rw-r--r-- 1 root      root      0 4月  12 11:07 a
-rw-r--r-- 1 nfsnobody nfsnobody 0 4月  12 11:09 b

设置自动挂载
设置自动挂载可以在不用到远程共享目录的时候自动卸载,在用到的时候自动挂载上远程目录。
1.安装工具包

[root@jiangpesi ~]# yum install autofs.x86_64 -y

2.修改配置文件

[root@jiangpesi ~]# vim /etc/auto.master
/mnt    /etc/auto.nfs
[root@jiangpesi ~]# vim /etc/auto.nfs
/client -fstype=nfs     192.168.32.152:/mnt/nfstest

3.启用服务

[root@jiangpesi ~]# systemctl start autofs.service 

4.测试

[root@jiangpesi mnt]# umount /mnt/client/
[root@jiangpesi mnt]# df -h
文件系统             容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root   17G  2.0G   16G   12% /
devtmpfs             478M     0  478M    0% /dev
tmpfs                489M     0  489M    0% /dev/shm
tmpfs                489M  6.8M  482M    2% /run
tmpfs                489M     0  489M    0% /sys/fs/cgroup
/dev/sda1           1014M  139M  876M   14% /boot
tmpfs                 98M     0   98M    0% /run/user/0
[root@jiangpesi mnt]# cd client/
[root@jiangpesi client]# df -h
文件系统                     容量  已用  可用 已用% 挂载点
/dev/mapper/cl-root           17G  2.0G   16G   12% /
devtmpfs                     478M     0  478M    0% /dev
tmpfs                        489M     0  489M    0% /dev/shm
tmpfs                        489M  6.8M  482M    2% /run
tmpfs                        489M     0  489M    0% /sys/fs/cgroup
/dev/sda1                   1014M  139M  876M   14% /boot
tmpfs                         98M     0   98M    0% /run/user/0
192.168.32.152:/mnt/nfstest   17G  2.2G   15G   13% /mnt/client

NFS是支持设置固定端口的,方便防火墙的配置
1.修改端口配置文件

[root@jiangpeisi nfstest]# vim /etc/sysconfig/nfs 

2.修改注释行

RQUOTAD_PORT=30001
LOCKD_TCPPORT=30002
LOCKD_UDPPORT=30002
MOUNTD_PORT=30003
STATD_PORT=30004   

3.重启服务

service nfs restart