15.NFS 服务器
NFS 服务介绍
NFS是Network File System的缩写,即网络文件系统,是一种基于TCP/IP协议的网络文件共享协议,最早由Sun公司开发,它允许不同操作系统的计算机通过网络共享文件和目录,实现跨平台的文件访问和管理。
核心功能:
- 文件共享:将服务器上的目录 “挂载” 到客户端,客户端可像访问本地文件一样读写共享目录中的内容。
- 跨平台兼容:支持 Unix、Linux、Windows、macOS 等多种操作系统,解决不同系统间的文件互通问题。
- 透明访问:客户端访问共享文件时,无需了解文件实际存储在远程服务器,操作方式与本地文件一致。
- 权限控制:通过文件系统权限(如 Unix 的用户 / 组权限)和 NFS 配置,限制客户端对共享资源的访问权限(读、写、执行等)。
NFS工作原理
NFS工作原理图:
NFS工作流程:
- 用户进程在客户端房间提出要访问远程文件的请求。
- 本地文件访问的小助手把请求转给 NFS 客户端。
- NFS 客户端通过 TCP/IP 协议栈这个管道把请求发送到服务器端。
- 服务器端的 RPC 服务(portmap)这个导航员指引 NFS 客户端找到 NFS 服务。
- NFS 服务处理请求,通过本地文件访问小助手从本地磁盘获取文件。
- 文件再通过 TCP/IP 协议栈管道返回给客户端的 NFS 客户端。
- 最后,客户端的本地文件访问小助手把文件交给用户进程。
部署服务
NFS服务由nfs-utils软件包提供
# 安装软件包
[root@server ~]# yum install -y nfs-utils# 准备用户作为客户端(client)
[root@server ~]# useradd -u 1000 bq
[root@server ~]# echo 123 | passwd --stdin bq# 准备共享目录
[root@server ~]# mkdir -p /shares/nfs
[root@server ~]# chown bq /shares/nfs# 启用并启动服务
[root@server ~]# systemctl enable nfs-server --now # 配置防火墙,学习阶段可直接把防火墙直接关闭
[root@server ~]# firewall-cmd --permanent --add-service=nfs --add-service=rpc-bind --add-service=mountd
[root@server ~]# firewall-cmd --reload
配置 NFS 导出
exportfs 命令:
exportfs
是 Linux 系统中用于管理 NFS 服务器共享目录(导出目录)的核心命令,主要用于查看、刷新、添加或删除 NFS 共享配置,无需重启 NFS 服务即可使修改生效。
命令基本格式:
exportfs [选项] [参数]
1. 查看当前导出的 NFS 共享
exportfs -v # 详细显示所有导出的共享目录及配置选项
exportfs -r # 重新加载 /etc/exports 配置(常用)
-
-v
:显示详细信息,包括共享目录、允许访问的客户端、权限选项等。 -
示例输出:
/data 10.1.8.11/24(rw,sync,no_root_squash,wdelay)
2. 重新加载 NFS 共享配置
当修改 /etc/exports
文件后,无需重启 NFS 服务,直接执行:
exportfs -ra
-r
:重新读取/etc/exports
并同步共享配置(刷新现有共享)。-a
:应用所有共享配置(包含新增和删除的共享)。- 这是修改 NFS 共享后最常用的命令,确保配置立即生效。
3. 临时导出一个共享目录
无需修改 /etc/exports
,可临时导出一个目录(重启 NFS 服务后失效):
exportfs -o rw,sync 10.1.8.11:/tmp/share
-o
:指定共享选项(如rw
读写、sync
同步写入)。- 格式:
客户端IP:/要共享的本地目录
。
4. 删除已导出的共享目录
exportfs -u 10.1.8.11/24:/data # 取消特定客户端对 /data 的共享
exportfs -ua # 取消所有已导出的共享
-u
:取消导出(卸载共享)。- 常用于临时移除某个共享,而不修改
/etc/exports
。
5. 其他实用选项
-i
:忽略/etc/exports
文件,仅通过命令行参数指定共享(需配合-o
使用)。-f
:在重新加载配置前,清除所有当前导出的共享(通常与-r
结合使用:exportfs -fr
)。
常见使用场景
-
修改
/etc/exports
后刷新配置:vim /etc/exports # 编辑共享配置 exportfs -ra # 使配置生效
-
查看当前所有 NFS 共享详情:
exportfs -v
-
临时取消某个共享(如紧急维护):
exportfs -u 10.1.8.11/24:/data
注意事项
exportfs
仅用于管理 NFS 服务器的共享配置,客户端挂载不受直接影响。- 临时导出的共享(未写入
/etc/exports
)在 NFS 服务重启后会失效,需持久化配置请编辑/etc/exports
。 - 执行命令需 root 权限(使用
sudo
)。
编辑/etc/exports
文件
- 共享目录格式:
共享目录 客户端IP(访问权限)
- 访问权限选项
rw
:读写权限。ro
:只读权限。sync
:同步写入,确保数据在写入内存的同时也写入磁盘,保证数据安全但性能稍低。async
:异步写入,数据先写入内存,再异步写入磁盘,性能较高但可能丢失数据。no_subtree_check
:不检查子树,提高性能。no_root_squash
,默认情况下,当客户机上的root用户访问NFS导出时,服务器会将其视为nobody用户(在服务器上定义)的访问。
重新加载配置
- 使用
exportfs - ra
命令重新加载/etc/exports
文件中的配置,使新的共享设置生效。
==提示:==NFS服务器主要配置文件是**/etc/exports**,目录**/etc/exports.d中任何以.exports**结尾且不以点(.)开头的文件也会生效。 所有这些文件都使用相同的语法。
==提示:==与编辑文件/etc/exports本身相比,在/etc/exports.d中创建或删除文件可能更容易,并且它可以减少一系列相关配置更改意外破坏现有导出的风险。
配置文件中,每一行都声明一个导出点。 第一个字段是要导出到客户端的目录的名称。 该行的其余部分列出了可以访问共享目录的客户端系统以及授予它们的访问权限。
==提示:==NFS不要使用SMB共享的目录。 如果这样做,则可能会导致文件损坏或其他文件完整性或一致性问题。
配置示例
- 可解析DNS的主机名,例如client.bq.cloud。 在以下示例中,client.bq.cloud系统可以挂载/shares/nfs目录。
/shares/nfs client.bq.cloud
- DNS解析的主机名,带*通配符。 以下示例允许bq.cloud域中的所有系统访问NFS共享。
/shares/nfs *.bq.cloud
- IPv4地址。 以下示例允许从10.1.8.12 IP地址访问NFS共享。
/shares/nfs 10.1.8.11
- IPv4网络。 以下示例允许从10.1.8.0/24网络访问NFS共享。 您也可以使用10.1.8.0/255.255.255.0 表示法。
/shares/nfs 10.1.8.0/24
/shares/nfs 10.1.8.0/255.255.255.0
- IPv6地址。 以下示例允许具有fde2:6494:1e09:2::20 IPv6地址的客户端系统访问NFS共享。
/shares/nfs fde2:6494:1e09:2::20
- IPv6网络。 以下示例允许fde2:6494:1e09:2::/64 IPv6网络访问NFS共享。
/shares/nfs fde2:6494:1e09:2::/64
- 要与多个客户机系统共享目录,请在目录名称后使用以空格分隔的列表:
/shares/nfs 10.1.8.0/24 client.bq.cloud *.example.net
默认情况下,目录以只读模式与客户端共享。 在每个客户定义之后,您可以立即在括号中指定导出选项以覆盖默认值。 客户端定义的末尾和左括号之间必须没有空格。
选项示例
-
rw,此选项允许对指定客户端进行读/写访问。 如果没有该选项(或者如果您使用ro代替),则NFS仅授予读取访问权限。 在以下示例中,client.bq.cloud具有读/写访问权限,而client2.bq.cloud具有只读访问权限。
/shares/nfs client.bq.cloud(rw) client2.bq.cloud
-
no_root_squash,默认情况下,当客户机上的root用户访问NFS导出时,服务器会将其视为nobody用户(在服务器上定义)的访问。 这意味着,如果客户端上的root用户在导出文件上创建了文件,则该文件将归用户nobody所有。 这也意味着,如果客户机上的root用户尝试读取导出文件,而该文件是没人能读取的用户,则访问将失败。 您可以通过添加no_root_squash选项来禁用该安全保护。 (nobody用户对大多数系统资源只有读或无权限操作)
以下示例允许client.bq.cloud系统具有对/shares/nfs导出目录的读/写访问权限和实际root用户访问权限。
/shares/nfs client.bq.cloud(rw,no_root_squash)
我们使用以下记录:
[root@server ~]# vim /etc/exports
/shares/nfs 10.1.8.0/24(rw)
每当您在/etc/exports或/etc/exports.d/*.exports中更改导出点时,请对NFS服务运行exportfs -r命令确保更改生效,或者运行systemctl reload nfs-server
。
[root@server ~]# exportfs -r
# 或者
[root@server ~]# systemctl reload nfs-server
# 或者
[root@server ~]# exportfs -av
每当您在/etc/exports或/etc/exports.d/*.exports中更改导出点时,请对NFS服务运行exportfs -r命令确保更改生效,或者运行systemctl reload nfs-server
。
[root@server ~]# exportfs -r
# 或者
[root@server ~]# systemctl reload nfs-server
# 或者
[root@server ~]# exportfs -av
监视 NFS 导出
使用exportfs命令列出NFS服务器当前导出的目录。
[root@server ~]# exportfs
/shares/nfs 10.1.8.0/24
默认情况下,该命令不显示导出选项。 使用-v选项列出这些选项,包括缺省选项。
[root@server ~]# exportfs -v
/shares/nfs 10.1.8.0/24(sync,...,rw,secure,no_root_squash,...)
客户端挂载
# 安装软件包
[root@client ~]# yum install -y nfs-utils
# 准备用户
[root@client ~]# useradd -u 1000 bq
[root@client ~]# echo redhat | passwd --stdin bq# 查看服务端提供的共享
[root@client ~]# showmount -e server
Export list for server:
/shares/nfs 10.1.8.0/24# 挂载
[root@client ~]# mkdir /mnt/nfs
[root@client ~]# mount -t nfs server:/shares/nfs /mnt/nfs# root用户不能创建
[root@client ~]# touch /mnt/nfs/root-f1
touch: cannot touch ‘/mnt/nfs/root-f1’: Permission denied# bq用户能创建
[bq@client ~]$ touch /mnt/nfs/bq-f1
持久化挂载
修改 /etc/fstab,最后添加如下记录:
server:/shares/nfs /mnt/nfs nfs defaults 0 0
如涉及版权问题,请联系作者处理!!!!!!