NFS是Network File System的缩写,即网络文件系统。它的主要功能是通过网络(一般是局域网)让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从NFS客户端的机器本地看,NFS服务端共享的目录就好像是客户自己的磁盘分区或者目录一样,而实际上确是远端的NFS服务端的目录
NFS网络文件系统类似windows系统的网络共享、安全功能、网络驱动器映射,这也和linux系统里的samba服务类似。应用于互联网中小型集群架构后端作为数据共享,如果是大型网站,那么有可能还会用到更复杂的分布式文件系统,例如Moosefs(mfs)、glusterfs、FastDFS
当我们在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)来进行数据的传输
那么RPC又是如何知道每个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)
nfs的主配置文件是/etc/exports,在此文件中,可以定义NFS系统的输出目录(即共享目录)、访问权限和允许访问的主机等参数。该文件默认为空,没有配置输出任何共享目录,这是基于安全性的考虑,如此即使系统启动了NFS服务也不会输出任何共享资源
exports文件中每一行提供了一个共享目录的设置,其命令格式为
<输出目录> [客户端1(选项1,选项2,...)] [客户端2(选项1,选项2,...)]
其中,除输出目录是必选参数外,其他参数均是可选项。另外,格式中的输出目录和客户端之间、客户端与客户端之间都使用空格分隔,但客户端与选项之间不能有空格
选项用来设置共享目录的访问权限、用户映射等,exports文件中的选项比较多,一般可分为三类
访问权限选项
访问权限选项 | 说明 |
---|---|
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选项 |
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 //在输出目录时将目录显示到屏幕上 检查输出目录所使用的选项:
环境
主机 | IP |
---|---|
client | 192.168.25.100 |
server | 192.168.25.110 |
搭建一个nfs服务器
安装NFS服务,需要安装两个软件
RPC主程序:rpcbind
NFS 其实可以被视为一个 RPC 服务,因为启动任何一个 RPC 服务之前,我们都需要做好 port 的对应 (mapping) 的工作才行,这个工作其实就是『 rpcbind 』这个服务所负责的!也就是说, 在启动任何一个 RPC 服务之前,我们都需要启动 rpcbind 才行
NFS主程序:nfs-utils
提供 rpc.nfsd 及 rpc.mountd 这两个 NFS daemons 与其他相关 documents 与说明文件、执行文件等的软件!这个就是 NFS 服务所需要的主要软件
[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
[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 ~]#
[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
// 创建共享目录 [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