文章目录
1 什么NFS服务器
-
NFS是Network File System的缩写,即网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从NFS客户端的机器本地看,NFS服务端共享的目录就好像是客户自己的磁盘分区或者目录一样,而实际上确是远端的NFS服务端的目录
-
NFS网络文件系统类似windows系统的网络共享、安全功能、网络驱动器映射,这也和linux系统里的samba服务类似。应用于互联网中小型集群架构后端作为数据共享,如果是大型网站,那么有可能还会用到更复杂的分布式文件系统,例如Moosefs(mfs)、glusterfs、FastDFS
2 NFS挂载原理
当我们在NFS服务器设置好一个共享目录/home/public后,其他的有权访问NFS服务器的NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点,这个挂载点可以自己定义,如上图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/home/public的所有数据。如果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写。挂载后,NFS客户端查看磁盘信息命令:#df –h。
NFS是通过网络来进行服务端和客户端之间的数据传输。两者之间要传输数据就要有想对应的网络端口来进行传输。NFS服务器到底使用什么网络端口来传输数据的,NFS服务器端其实是随机选择端口来进行数据传输。那NFS客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?其实NFS服务器时通过远程过程调用(remote procedure call 简称RPC)协议/服务来实现的。也就是说RPC服务会统一管理NFS的端口,客户端和服务端通过RPC来先沟通NFS使用了哪些端口,之后再利用这些端口(小于1024)来进行数据的传输
3 NFS的应用场景
- 为web服务器作为视频,图片资源的服务器。域用户家目录服务器。内容文件存储服务器
- 多个机器共享一台CDROM或其他设备。这对于在多台机器中安装软件来说更加便宜与方便
- 在大型网络中,配置一台中心NFS服务器用来放置所有用户的home目录可能会带来便利。这些目录能被输出到网络以便用户不管在哪台工作站上登录,总能得到相同的home目录
- 不同客户端可在NFS上观看影视文件,节省本地空间
- 在客户端完成的工作数据,可以备份保存到NFS服务器上用户自己的路径下
4 NFS工作原理
- nfs是基于rpc来实现网络文件系统共享的
- RPC(Remote Procedure Call Protocol),远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议
- RPC管理服务端的NFS端口分配,客户端要传数据,那客户端的RPC会先跟服务端的RPC去要服务器的端口,要到端口后再建立连接,然后传输数据
4.1 RPC与NFS通讯
- 因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能对应的端口并不固定,客户端要知道NFS服务器端的相关端口才能建立连接进行数据传输,而RPC就是用来统一管理NFS端口的服务,并且统一对外的端口是111,RPC会记录NFS端口的信息,如此我们就能够通过RPC实现服务端和客户端沟通端口信息。PRC最主要的功能就是指定每个NFS功能所对应的port number,并且通知客户端,记客户端可以连接到正常端口上去。
那么RPC又是如何知道每个NFS功能的端口呢?
- 首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口,RPC就会记录下这些端口,并且RPC会开启111端口,等待客户端RPC的请求,如果客户端有请求,那么服务器端的RPC就会将之前记录的NFS端口信息告知客户端。如此客户端就会获取NFS服务器端的端口信息,就会以实际端口进行数据的传输了
4.2 NFS客户端与服务端通讯原理
- rpc程序会随着nfs启用而自动开启,默认端口号为固定的111.
- 当nfs启动后,会随机占用一些端口。
- 然后nfs会找rpcbind进行注册,记录这些端口信息。
- rpc的固定端口是111,当rpc记录到nfs的端口号后会沟通客户机的111端口,并且通知nfs的端口。
- 当客户端知道了rpc通知的nfs端口号,就可以不依靠rpc进行工作了
4.3 NFS工作机制
//NFS服务器端运行着四个进程:
nfsd
mountd
idmapd
portmapper
idmapd //实现用户帐号的集中映射,把所有的帐号都映射为NFSNOBODY,但是在访问时却能以本地用户的身份去访问
mountd //用于验证客户端是否在允许访问此NFS文件系统的客户端列表中,在则允许访问(发放一个令牌,持令牌去找nfsd),否则拒绝访问
//mountd的服务端口是随机的,由rpc服务(portmapper)提供随机端口号
nfsd //nfs的守护进程,监听在2049/tcp和2049/udp端口上
//不负责文件存储(由NFS服务器本地内核负责调度存储),用于理解客户端发起的rpc请求,并将其转交给本地内核,而后存储在指定的文件系统上
portmapper //NFS服务器的rpc服务,其监听于111/TCP和111/UDP套接字上,用于管理远程过程调用(RPC)
- 首先服务器端启动RPC服务,并开启111端口
- 服务器端启动NFS服务,并向RPC注册端口信息
- 客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
- 服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
- 客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
注:rpc重启后,nfs的注册信息会丢失,因此需要重启nfs完成注册
利用autofs自动挂载
/etc/aotu.master 定义本地挂载点
/etc/auto.misc 配置挂载的文件系统 以及 选项
4.4 exports文件的格式
nfs的主配置文件是/etc/exports,在此文件中,可以定义NFS系统的输出目录(即共享目录)、访问权限和允许访问的主机等参数。该文件默认为空,没有配置输出任何共享目录,这是基于安全性的考虑,如此即使系统启动了NFS服务也不会输出任何共享资源
exports文件中每一行提供了一个共享目录的设置,其命令格式为
<输出目录> [客户端1(选项1,选项2,...)] [客户端2(选项1,选项2,...)]
其中,除输出目录是必选参数外,其他参数均是可选项。另外,格式中的输出目录和客户端之间、客户端与客户端之间都使用空格分隔,但客户端与选项之间不能有空格
选项用来设置共享目录的访问权限、用户映射等,exports文件中的选项比较多,一般可分为三类
- 访问权限选项(用于控制共享目录的访问权限)
- 用户映射选项
默认情况下,当客户端访问NFS服务器时,若远程访问的用户是root用户,则NFS服务器 会将其映射成一个本地的匿名用户(该用户为nfsnobody),并将其所属的用户组也映射成匿名用户组(该用户组也为nfsnobody),如此有助于提高系统的安全性。 - 其他选项
访问权限选项
访问权限选项 | 说明 |
---|---|
ro | 设置输出目录只读 |
rw | 设置输出目录可读写 |
用户映射选项
用户映射选项 | 说明 |
---|---|
all_squash | 将远程访问的所有普通用户及所属组都映射为匿名用户或用户组(nfsnobody) |
no_all_squash | 不将远程访问的所有普通用户及所属用户组都映射为匿名用户或用户组(默认设置) |
root_squash | 将root用户及所属用户组都映射为匿名用户或用户组(默认设置) |
no_root_squash | 不将root用户及所属用户组都映射为匿名用户或用户组 |
anonuid=xxx | 将远程访问的所有用户都映射为匿名用户,并指定该匿名用户为本地用户帐户(UID=xxx) |
anongid=xxx | 将远程访问的所有用户组都映射为匿名用户组,并指定该匿名用户组为本地用户组(GID=xxx) |
常用的其他选项
其他选项 | 说明 |
---|---|
secure | 限制客户端只能从小于1024的TCP/IP端口连接NFS服务器(默认设置) |
insecure | 允许客户端从大于1024的TCP/IP端口连接NFS服务器 |
sync | 将数据同步写入内存缓冲区或磁盘中,效率较低,但可保证数据一致性 |
async | 将数据先保存在内存缓冲区中,必要时才写入磁盘 |
wdelay | 检查是否有相关的写操作,如果有则这些写操作一起执行,可提高效率(默认设置) |
no_wdelay | 若有写操作则立即执行,应与sync配置使用 |
subtree_check | 若输出目录是一个子目录,则NFS服务器将检查其父目录的权限(默认设置) |
no_subtree_check | 即使输出目录是一个子目录,NFS服务亦不检查其父目录的权限,可提高效率 |
nohide | 若将一个目录挂载到另一个目录之上,则原来的目录通常就被隐藏起来或看起来像空的一样。要禁用这种行为,需启用hide选项 |
5 NFS服务管理
nfs安装
//安装
yum -y install nfs-utils
//启动
systemctl start rpcbind nfs-server
使用shoumount命令测试NFS服务器的输出目录状态
//语法:showmount [选项] [NFS服务器名称或地址]
//常用的选项有:
-a //显示指定NFS服务器的所有客户端主机及其所连接的目录
-d //显示指定的NFS服务器中已被客户端连接的所有输出目录
-e //显示指定的NFS服务器上所有输出的共享目录
在客户端挂载NFS文件系统(临时挂载)
mount -t nfs SERVER:/path/to/sharedfs /path/to/mount_point
在客户端设置开机自动挂载nfs:编辑/etc/fstab文件,添加如下格式的内容(永久挂载)
SERVER:/PATH/TO/EXPORTED_FS /mnt_point nfs defaults,_netdev 0 0
exportfs //维护exports文件导出的文件系统表的专用工具
-a //输出在/etc/exports文件中所设置的所有目录
-r //重新读取/etc/exports文件中的设置,并使其立即生效,无需重启服务
-u //停止输出某一目录
-v //在输出目录时将目录显示到屏幕上
检查输出目录所使用的选项:
6 NFS服务部署
环境
主机 | IP |
---|---|
client | 192.168.25.100 |
server | 192.168.25.110 |
搭建一个nfs服务器
- 开放/nfs/shared目录,供所有用户查阅资料
- 开放/nfs/upload目录为172.16.12.0/24网段的数据上传目录,并将所有用户及所属的用户组都映射为nfs-upload,其UID与GID均为300
安装NFS服务,需要安装两个软件
RPC主程序:rpcbind
NFS 其实可以被视为一个 RPC 服务,因为启动任何一个 RPC 服务之前,我们都需要做好 port 的对应 (mapping) 的工作才行,这个工作其实就是『 rpcbind 』这个服务所负责的!也就是说, 在启动任何一个 RPC 服务之前,我们都需要启动 rpcbind 才行
NFS主程序:nfs-utils
提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文件等的软件!这个就是 NFS 服务所需要的主要软件
- 服务端安装nfs-utils rpcbind
[root@server ~]# yum install -y nfs-utils rpcbind
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
zhaojie 2.7 MB/s | 2.8 kB 00:00
zhaojie 3.1 MB/s | 3.2 kB 00:00
软件包 nfs-utils-1:2.3.3-31.el8.x86_64 已安装。
软件包 rpcbind-1.2.5-7.el8.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
// 启动nfs服务
[root@server ~]# systemctl enable --now nfs-server.service
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[root@server ~]# systemctl status nfs-server.service
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendo>
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Sat 2021-09-25 10:15:11 EDT; 1min 22s ago
- 客户端安装nfs-utils
[root@client ~]# yum install -y nfs-utils
Updating Subscription Management repositories.
Unable to read consumer identity
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
zhaojie 2.7 MB/s | 2.8 kB 00:00
zhaojie 3.1 MB/s | 3.2 kB 00:00
软件包 nfs-utils-1:2.3.3-31.el8.x86_64 已安装。
依赖关系解决。
无需任何处理。
完毕!
- 关闭防火墙
[root@client ~]# systemctl disable --now firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@client ~]# setenforce 0
[root@server ~]# systemctl disable --now firewalld.service
Removed /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@server ~]# setenforce 0
[root@server ~]#
- 在服务端编辑配置文件,开放/nfs/shared共享目录
[root@server ~]# mkdir -p /nfs/shared
[root@server ~]# cat /etc/exports
/nfs/shared *(ro,sync)
[root@client ~]# showmount -e 192.168.25.110
Export list for 192.168.25.110:
/nfs/shared *
- 挂载
[root@client ~]# cat /etc/fstab
UUID=57df8eec-8a9e-499e-8f4f-ce2597a5fa83 /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
192.168.25.110:/nfs/shared /zj nfs defaults,_netdev 0 0
[root@client ~]# tail -1 /etc/fstab
192.168.25.110:/nfs/shared /mnt nfs defaults,_netdev 0 0
[root@client ~]# mount -a
[root@client ~]# df -h
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 872M 0 872M 0% /dev
tmpfs 901M 0 901M 0% /dev/shm
tmpfs 901M 9.8M 891M 2% /run
tmpfs 901M 0 901M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 4.3G 13G 25% /
/dev/nvme0n1p1 1014M 229M 786M 23% /boot
tmpfs 181M 1.2M 179M 1% /run/user/42
tmpfs 181M 3.5M 177M 2% /run/user/0
/dev/sr0 7.9G 7.9G 0 100% /run/media/root/RHEL-8-2-0-BaseOS-x86_64
192.168.25.110:/nfs/shared 17G 4.3G 13G 25% /mnt
- 开放/nfs/upload目录为172.16.12.0/24网段的数据上传目录,并将所有用户及所属的用户组都映射为nfs-upload,其UID与GID均为300
// 创建共享目录
[root@server ~]# mkdir -p /nfs/upload
[root@server ~]# useradd -r -u 300 nfs-upload
[root@server ~]# id nfs-upload
uid=300(nfs-upload) gid=300(nfs-upload) 组=300(nfs-upload)
[root@server ~]# vim /etc/exports
[root@server ~]# exportfs -r
[root@server ~]#
//在客户端查看共享目录
[root@client ~]# showmount -e 192.168.25.110
Export list for 192.168.25.110:
/nfs/upload 192.168.25.0/24
// 创建挂载点挂载
[root@client ~]# mkdir zj
[root@client ~]# mount -t nfs 192.168.25.110:/nfs/upload zj
[root@client ~]# df -h
df: /mnt: 过旧的文件控柄
df: /mnt: 过旧的文件控柄
文件系统 容量 已用 可用 已用% 挂载点
devtmpfs 872M 0 872M 0% /dev
tmpfs 901M 0 901M 0% /dev/shm
tmpfs 901M 9.8M 891M 2% /run
tmpfs 901M 0 901M 0% /sys/fs/cgroup
/dev/mapper/rhel-root 17G 4.3G 13G 25% /
/dev/nvme0n1p1 1014M 229M 786M 23% /boot
tmpfs 181M 1.2M 179M 1% /run/user/42
tmpfs 181M 3.5M 177M 2% /run/user/0
/dev/sr0 7.9G 7.9G 0 100% /run/media/root/RHEL-8-2-0-BaseOS-x86_64
192.168.25.110:/nfs/upload 17G 4.3G 13G 25% /root/zj
//服务器端设置属主和属组
[root@server ~]# chown nfs-upload.nfs-upload /nfs/upload/
[root@server ~]# ll /nfs/
总用量 0
drwxr-xr-x. 2 root root 6 9月 25 10:13 shared
drwxr-xr-x. 2 nfs-upload nfs-upload 6 9月 25 10:25 upload