简述
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