板块三章节3——NFS 服务器

NFS 服务器

NFS 服务介绍

NFS 是Network File System的缩写,即网络文件系统,最早由Sun公司开发,**用来在UNIX&Linux系统间实现磁盘文件共享的一种方法。**它的主要功能是通过网络让不同的主机系统之间可以共享文件或目录。NFS客户端(一般为应用服务器,例如web)可以通过挂载(mount)的方式将NFS服务端共享的数据目录挂载到NFS客户端本地系统中(就是某一个挂载点下)。从NFS客户端的机器本地看,NFS服务端共享的目录就好像是客户自己的磁盘分区或者目录一样,而实际上确是远端的NFS服务端的目录。

在企业集群架构的工作场景中,NFS网络文件系统一般被用来存储共享视频、图片、附件等静态资源文件。一般是把网站用户上传的文件都放在NFS共享里,例如,BBS产品的图片、附件、头像,特别是中小网站公司应用频率更高。

NFS 支持的功能相当的多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口没有固定住,而是随机取用一些未被使用的小于1024的端口提供服务。但如此一来客户端如何获得服务器端的相关端口呢?

此时我们就得需要远程过程调用(RPC)的服务!RPC最主要的功能是注册每个NFS功能所对应的端口,并且汇报给客户端,让客户端可以连结到正确的端口。RPC定义了一种进程间通过网络进行交互通信的机制,它允许客户端进程通过网络向远程服务进程请求服务,而不需要了解服务器底层的通信协议详细信息。

  • NFS 服务器:导出文件系统目录及其内容。
  • NFS 客户端:挂载服务器导出的文件系统到本地。

部署服务

NFS服务由nfs-utils软件包提供,RHEL8默认安装了该软件包。

bash 复制代码
# 安装软件包
[whisky@server-gx ~ 10:10:08]$ yum install -y nfs-utils.x86_64 

# 准备用户
[root@server-gx whisky 10:16:05]# id whisky

# 准备共享目录
[root@server-gx whisky 10:22:25]# mkdir -p /shares/webapp
[root@server-gx whisky 10:22:59]# chown whisky /shares/webapp
[root@server-gx whisky 10:23:23]# chown 48:48 /shares/webapp

# 启用并启动服务
[root@server-gx whisky 10:26:12]# systemctl enable nfs-server.service --now 

配置 NFS 导出

NFS服务器主要配置文件是**/etc/exports**,目录**/etc/exports.d中任何以.exports**结尾且不以点(.)开头的文件也会生效。 所有这些文件都使用相同的语法。

==提示:==与编辑文件/etc/exports本身相比,在/etc/exports.d中创建或删除文件可能更容易,并且它可以减少一系列相关配置更改意外破坏现有导出的风险。

配置文件中,每一行都声明一个导出点。 第一个字段是要导出到客户端的目录的名称。 该行的其余部分列出了可以访问共享目录的客户端系统以及授予它们的访问权限。

==提示:==NFS不要使用SMB共享的目录。 如果这样做,则可能会导致文件损坏或其他文件完整性或一致性问题。

配置示例:

  • 可解析DNS的主机名,例如client.laoma.cloud。 在以下示例中,client.laoma.cloud系统可以挂载/shares/nfs目录。
bash 复制代码
/shares/nfs client.laoma.cloud
  • DNS解析的主机名,带*通配符。 以下示例允许laoma.cloud域中的所有系统访问NFS共享。

    /shares/nfs *.laoma.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.laoma.cloud *.example.net

默认情况下,目录以只读模式与客户端共享。 在每个客户定义之后,您可以立即在括号中指定导出选项以覆盖默认值。 客户端定义的末尾和左括号之间必须没有空格。

常用的选项:

  • rw,此选项允许对指定客户端进行读/写访问。 如果没有该选项(或者如果您使用ro代替),则NFS仅授予读取访问权限。 在以下示例中,client.laoma.cloud具有读/写访问权限,而client2.laoma.cloud具有只读访问权限。

    复制代码
    /shares/nfs client.laoma.cloud(rw) client2.laoma.cloud
  • no_root_squash ,默认情况下,当客户机上的root用户访问NFS导出时,服务器会将其视为nobody 用户(在服务器上定义)的访问。 这意味着,如果客户端上的root用户在导出文件上创建了文件,则该文件将归用户nobody 所有。 这也意味着,如果客户机上的root用户尝试读取导出文件,而该文件是没人能读取的用户,则访问将失败。 您可以通过添加no_root_squash选项来禁用该安全保护。

    以下示例允许client.laoma.cloud系统具有对/shares/nfs导出目录的读/写访问权限和实际root用户访问权限。

    复制代码
    /shares/nfs client.laoma.cloud(rw,no_root_squash)

==提示:==rhel7中使用nfsnobody用户,rhel8中使用nobody用户。

我们使用以下记录:

bash 复制代码
#创建/shares/nfs,后续可以通过此目录为客户端共享文件
[root@server-gx ~ 17:25:00]# mkdir /shares/nfs

#在执行如下代码前请确保已创建目录"/shares/nfs",否则无法在后续执行exportfs -r 命令
[root@server-gx ~ 17:12:12]# vim /etc/exports
/shares/nfs 10.1.8.0/24(rw)

每当您在/etc/exports或/etc/exports.d/*.exports中更改导出点时,请对NFS服务运行exportfs -r命令确保更改生效,或者运行systemctl reload nfs-server

bash 复制代码
[root@server-gx ~ 17:28:33]# exportfs -r
# 或者
[root@server ~]# systemctl reload nfs-server
# 或者
[root@server ~]# exportfs -av

监视 NFS 导出

使用exportfs命令列出NFS服务器当前导出的目录。

bash 复制代码
[root@server-gx ~ 17:28:42]# exportfs 
/shares/nfs   	10.1.8.0/24

默认情况下,该命令不显示导出选项。 使用-v选项列出这些选项,包括缺省选项。

bash 复制代码
[root@server-gx ~ 19:12:30]# exportfs -v
/shares/nfs   	10.1.8.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,root_squash,no_all_squash)

客户端挂载

bash 复制代码
# 安装软件包
[root@client-gx ~ 19:14:35]# yum install -y nfs-utils
# 准备用户
[root@client-gx ~ 19:16:12]# id whisky
uid=1000(whisky) gid=1000(whisky) 组=1000(whisky),10(wheel)
[root@client-gx ~ 19:18:45]# id apache
uid=48(apache) gid=48(apache) 组=48(apache)

# 查看服务端提供的共享
[root@client-gx ~ 19:18:56]# showmount -e server
Export list for server:
/shares/nfs 10.1.8.0/24

# 挂载
[root@client-gx ~ 19:30:24]# mkdir /mnt/nfs
[root@client-gx ~ 19:31:02]# mount -t nfs server:/shares/nfs /mnt/nfs         

# root用户不能创建
[root@client-gx ~ 19:31:56]# touch /mnt/nfs/root-test1
touch: 无法创建"/mnt/nfs/root-test1": 权限不够

# apache用户能创建(注:之前创建apache用户时uid为48,无法使用交互式界面登录,此处使用临时切换用户的方式执行)
[root@client-gx ~ 21:20:57]# su - apache -s /bin/bash
上一次登录:四 8月  7 21:19:15 CST 2025pts/0 上
-bash-4.2$ echo apache website > /mnt/nfs/test.html
#此时server端也可以查看
[root@server-gx ~ 20:01:15]# cat /shares/nfs/test.html
apache website

持久化挂载

修改 /etc/fstab,最后添加如下记录:

ini 复制代码
server:/shares/nfs /mnt/nfs nfs defaults 0 0
相关推荐
学习网安的doro23 分钟前
3a服务器的基本功能1之身份认证
服务器·网络·学习·安全·身份认证·ac
Lovyk24 分钟前
DNS 服务器
运维·服务器
望获linux25 分钟前
【实时Linux实战系列】实时数据流处理框架分析
linux·运维·前端·数据库·chrome·操作系统·wpf
zxyzxyzxyzxyzz1 小时前
Ubuntu设置Samba文件共享
linux·服务器·ubuntu
Forever Nore2 小时前
Nginx 学习
运维·学习·nginx
DIY机器人工房2 小时前
一个基于 epoll 实现的多路复用 TCP 服务器程序,相比 select 和 poll 具有更高的效率
开发语言·嵌入式硬件·php·嵌入式·diy机器人工房
野犬寒鸦2 小时前
Pipeline功能实现Redis批处理(项目批量查询点赞情况的应用)
java·服务器·数据库·redis·后端·缓存
泽02023 小时前
Linux基本指令(一)
linux·运维·服务器
2301_801673013 小时前
ipv6学习
linux·服务器·学习