一、NFS介绍
NFS(Network File System,网络文件系统)是一种分布式文件系统协议,允许网络中的计算机之间通过TCP/IP网络共享资源,旨在使远程文件系统对用户透明,就好像访问本地文件一样。
NFS最初由Sun Microsystems开发,并在1984年首次发布。它广泛应用于企业环境和多操作系统环境中,提高了数据共享的效率和灵活性。NFS基于客户端-服务器架构,其中服务器端提供共享的文件系统资源,客户端通过网络请求这些资源。该协议通常在应用层实现,并依赖于传输层的协议进行通信,传统上使用UDP,但后续版本也可以使用TCP以增强可靠性。
1.1、NFS的工作流程
- NFS服务器配置:服务器端需要配置并启动NFS服务,这包括编辑出口表(/etc/exports),指定哪些目录可以被共享以及访问权限。
- 客户端配置:客户端同样需要配置以访问NFS服务器,这通常涉及到创建挂载点并使用mount命令将远程NFS目录挂载到本地。
- 网络通信:
- 当客户端请求访问NFS共享时,它首先通过发送网络请求到NFS服务器来获取文件句柄。
- 文件句柄是NFS服务器用于表示文件系统内部结构的一种机制,对客户端来说是透明的。
- 一旦获得文件句柄,客户端就可以使用该句柄进行后续的文件操作,如读取、写入、打开等。
- 数据传输:在文件句柄的基础上,客户端通过网络与NFS服务器进行数据传输,无论是读取还是写入数据。
- 缓存与延迟写:NFS客户端通常会缓存文件数据以优化性能,这可能导致写入操作被延迟执行,以提高整体的系统性能。
- 故障处理:在网络不稳定或NFS服务器出现故障的情况下,客户端需要能够处理这些异常情况,可能包括重新尝试请求或恢复到正常状态。
1.2、NFS主要涉及的软件包
NFS主要涉及的软件包有nfs-utils和rpcbind。
- nfs-utils是NFS服务的主要软件包,提供了运行NFS服务所必需的程序和工具。
- pcbind(早期称为portmap)是管理端口映射的服务,对于NFS的正常运行至关重要,因为它负责维护端口信息并帮助客户端找到正确的服务端口。
1.3、NFS的主要配置文件
- NFS的主要配置文件是 /etc/exports。
这个文件负责定义哪些目录可以被共享,以及对这些共享目录的访问权限和选项设置。比如,“/test888 192.168.78.0/24(rw,sync,no_root_squash)”表示将/test888目录共享给192.168.78.0网段的用户,并且用户有读写权限,数据同步写入,以及当客户端以root身份访问时赋予本地root权限。修改配置后,需要使用exportfs命令重新加载配置文件,以使改动生效。
二、安装NFS
2.1、更新yum
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# dnf update -y
CentOS Stream 9 - BaseOS 35 MB/s | 8.2 MB 00:00
CentOS Stream 9 - AppStream 58 MB/s | 20 MB 00:00
CentOS Stream 9 - Extras packages 237 kB/s | 18 kB 00:00
Dependencies resolved.
2.2、安装NFS服务
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# dnf install -y nfs-utils
Last metadata expiration check: 0:05:51 ago on Sun 04 Aug 2024 05:25:36 PM CST.
Dependencies resolved.
==========================================================================================================================================================================================
Package Architecture Version Repository Size
==========================================================================================================================================================================================
Installing:
nfs-utils x86_64 1:2.5.4-26.el9 baseos 460 k
Installing dependencies:
gssproxy x86_64 0.8.4-6.el9 baseos 110 k
libev x86_64 4.33-5.el9 baseos 53 k
libnfsidmap x86_64 1:2.5.4-26.el9 baseos 62 k
libverto-libev x86_64 0.3.2-3.el9 baseos 14 k
rpcbind x86_64 1.2.6-7.el9 baseos 58 k
sssd-nfs-idmap x86_64 2.9.5-4.el9 baseos 42 k
Transaction Summary
2.3、配置NFS服务器
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# vi /etc/exports
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# cat /etc/exports
/shared 192.168.1.0/24(rw,sync,no_subtree_check)
- 这表示/shared目录将被192.168.1.0/24网段的客户机以读写同步方式访问,并且不进行子树检查。
2.4、启动NFS服务
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# systemctl start nfs-server
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# systemctl status nfs-server
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; preset: disabled)
Active: active (exited) since Sun 2024-08-04 17:33:36 CST; 10s ago
Docs: man:rpc.nfsd(8)
man:exportfs(8)
Process: 88200 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=1/FAILURE)
Process: 88201 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Process: 88237 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi (code=exited, status=0/SUCCESS)
Main PID: 88237 (code=exited, status=0/SUCCESS)
CPU: 17ms
Aug 04 17:33:35 iZbp11qs3pjvo8kz8vtcvfZ systemd[1]: Starting NFS server and services...
Aug 04 17:33:35 iZbp11qs3pjvo8kz8vtcvfZ exportfs[88200]: exportfs: Failed to stat /shared: No such file or directory
Aug 04 17:33:36 iZbp11qs3pjvo8kz8vtcvfZ systemd[1]: Finished NFS server and services.
2.5、配置防火墙(如果启用了防火墙,需要允许NFS相关的端口通过)
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# firewall-cmd --permanent --add-service=nfs --add-service=mountd --add-service=rpc-bind --add-service=nscd --add-service=auditd --add-service=nfs-lock --add-service=nfs-idmap
FirewallD is not running
- 返回结果为防火墙未运行
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; preset: enabled)
Active: inactive (dead)
Docs: man:firewalld(1)
2.6、生效防火墙配置
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# firewall-cmd --reload
三、exports配置文件参数
- 访问权限
- ro:只读访问。
- rw:读写访问。
- 同步与异步
- sync:所有数据在请求时写入共享。
- async:NFS在写入数据前可以响应请求。
- 安全设置
- secure:NFS通过1024以下的安全TCP/IP端口发送。
- insecure:NFS通过1024以上的端口发送。
- 写入设置
- wdelay:如果多个用户要写入NFS目录,则归组写入(默认)。
- no_wdelay:如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
- 子目录设置
- hide:在NFS共享目录中不共享其子目录。
- no_hide:共享NFS目录的子目录。
- 检查设置
- subtree_check:如果共享子目录时,强制NFS检查父目录的权限(默认)。
- no_subtree_check:不检查父目录权限。
- 映射设置
- all_squash:共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
- no_all_squash:保留共享文件的UID和GID(默认)。
- root_squash:root用户的所有请求映射成如anonymous用户一样的权限(默认)。
- no_root_squash:root用户具有根目录的完全管理访问权限。
3.1、添加其他网段访问权限
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# vi /etc/exports
[root@iZbp11qs3pjvo8kz8vtcvfZ ~]# cat /etc/exports
/shared 192.168.1.0/24(rw,sync,no_subtree_check)
/etc 172.16.1.0/24(rp,root_squash,anonuid,anongid,insecure)
- 这表示/etc目录将被172.16.1.0/24网段的客户机以只读方式访问,并且客户端使用的root用户映射为NFS服务器的匿名用户,设置匿名用户的UID和GID,允许使用1024以上的端口
3.2、exportfs的用法
3.2.1、显示当前共享列表
- 使用exportfs -av命令可以显示所有当前已经共享的目录,以及它们的共享属性和客户端访问权限。
[root@iZbp11qs3pjvo8kz8vtcvfZ /]# exportfs -av
exporting 172.16.1.0/24:/etc
exporting 192.168.1.0/24:/shared
exportfs: Failed to stat /shared: No such file or directory
返回结果解析
- “exporting 172.16.1.0/24:/etc”,表示正在尝试导出目录 /etc,允许 IP 地址范围为 172.16.1.0/24 的客户端访问。
- “exporting 192.168.1.0/24:/shared”,表示正在尝试导出目录 /shared,允许 IP 地址范围为 192.168.1.0/24 的客户端访问。
- “exportfs: Failed to stat /shared: No such file or directory”,表示无法找到名为 /shared 的文件或目录。
注:因为系统中没有shared这样的目录,所以会报错。
3.2.2、添加共享目录
- 首先编辑/etc/exports文件,添加新的共享目录及其访问权限设置。然后运行exportfs -ar命令,使得配置文件的更改生效,无需重启NFS服务。
[root@iZbp11qs3pjvo8kz8vtcvfZ /]# exportfs -ar
[root@iZbp11qs3pjvo8kz8vtcvfZ /]#
这里不会出现返回结果
3.2.3、重新挂载共享目录
- 在某些情况下,如果更改了/etc/exports文件中的配置,需要重新挂载共享目录以应用更改。这时可以使用exportfs -r命令重新挂载所有目录,使之与配置文件同步。
[root@iZbp11qs3pjvo8kz8vtcvfZ /]# exportfs -r
[root@iZbp11qs3pjvo8kz8vtcvfZ /]#
3.2.4、显示详细信息
- 使用exportfs -v命令可以查看更详细的共享信息,包括哪些目录被共享、哪些客户端有权访问等。
[root@iZbp11qs3pjvo8kz8vtcvfZ /]# exportfs -v
/usr/sbin 192.168.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)
/etc 172.16.1.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,ro,secure,root_squash,no_all_squash)
同时,还有一条命令可以查看
[root@iZbp11qs3pjvo8kz8vtcvfZ /]# showmount -e localhost
Export list for localhost:
/usr/sbin 192.168.1.0/24
/etc 172.16.1.0/24
四、客户端配置
要在NFS客户端上使用服务器的共享目录,需要在本地主机上启动rpcbind服务,然后使用showmount命令查看NFS服务器共享的目录有哪些,使用mkdir命令在本地建立共享目录的挂载点,最后使用mount命令挂载共享目录到本地。
五、showmount命令的用法
showmount命令是一个用于检查NFS(网络文件系统)服务器上共享目录的工具。它允许客户端查看哪些目录被NFS服务器导出(共享),并获取关于这些共享的信息。showmount通常在调试NFS服务器配置和客户端挂载问题时使用。
- 查看NFS服务器上的共享目录:
showmount -e NFS服务器地址
- 列出所有已知的NFS服务器:
showmount -D
- 检查特定NFS服务器的导出列表:
showmount -d NFS服务器地址
- 列出所有已知的NFS服务器,然后对每个服务器显示其导出列表:
showmount --all
- 帮助和版本信息:
showmount -help
showmount -version
六、使用autofs按需挂载共享目录
在传统的NFS共享目录使用方式中,客户端要挂载共享目录一般是通过手工执行mount命令或在fstab文件中配置开机自动挂载这两种方式来完成。但是,NFS客户端与服务器之间并不是永久连接的,而NFS的一个缺点是当客户端和服务器连接后,任何一方离线都可能导致另一方在不断等待超时。同时,可能有很多用户挂载了共享目录,但实际上他们并不去使用该目录,这些用户也会导致NFS服务器资源的耗费。为了解决这些问题,一般的做法是使用autofs服务,仅在访问时才动态挂载共享目录。
6.1、安装autofs软件包
dnf install autofs
6.2、编辑autofs配置文件
vi /etc/auto.master
6.3、在打开的文件中添加以下内容(假设您的共享目录位于/mnt/shared)
/mnt /etc/auto.shared --timeout=600
- 这将告诉autofs将挂载点/mnt/shared映射到/etc/auto.shared文件。–timeout=600表示共享目录将在600秒后自动卸载。
6.4、创建一个新的autofs配置文件来定义共享目录的挂载规则
vi /etc/auto.shared
6.5/在打开的文件中添加以下内容(替换为您的实际共享目录路径和服务器地址)
shared_directory -fstype=nfs4,rw,sync,noatime server:/path/to/shared/directory
- shared_directory是您希望在本地系统中看到的挂载点名称,server是NFS服务器的IP地址或主机名,/path/to/shared/directory是共享目录在NFS服务器上的路径。
6.6、启动autofs服务
systemctl start autofs