Linux中NFS配置

文章目录


一、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

bash 复制代码
[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服务

bash 复制代码
[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服务器

bash 复制代码
[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服务

bash 复制代码
[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相关的端口通过)

bash 复制代码
[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
  • 返回结果为防火墙未运行
bash 复制代码
[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、生效防火墙配置

bash 复制代码
[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、添加其他网段访问权限

bash 复制代码
[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命令可以显示所有当前已经共享的目录,以及它们的共享属性和客户端访问权限。
bash 复制代码
[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服务。
bash 复制代码
[root@iZbp11qs3pjvo8kz8vtcvfZ /]# exportfs -ar
[root@iZbp11qs3pjvo8kz8vtcvfZ /]# 

这里不会出现返回结果

3.2.3、重新挂载共享目录

  • 在某些情况下,如果更改了/etc/exports文件中的配置,需要重新挂载共享目录以应用更改。这时可以使用exportfs -r命令重新挂载所有目录,使之与配置文件同步。
bash 复制代码
[root@iZbp11qs3pjvo8kz8vtcvfZ /]# exportfs -r
[root@iZbp11qs3pjvo8kz8vtcvfZ /]# 

3.2.4、显示详细信息

  • 使用exportfs -v命令可以查看更详细的共享信息,包括哪些目录被共享、哪些客户端有权访问等。
bash 复制代码
[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)

同时,还有一条命令可以查看

bash 复制代码
[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服务器上的共享目录:
bash 复制代码
showmount -e NFS服务器地址
  • 列出所有已知的NFS服务器:
bash 复制代码
showmount -D
  • 检查特定NFS服务器的导出列表:
bash 复制代码
showmount -d NFS服务器地址
  • 列出所有已知的NFS服务器,然后对每个服务器显示其导出列表:
bash 复制代码
showmount --all
  • 帮助和版本信息:
bash 复制代码
showmount -help
showmount -version

六、使用autofs按需挂载共享目录

在传统的NFS共享目录使用方式中,客户端要挂载共享目录一般是通过手工执行mount命令或在fstab文件中配置开机自动挂载这两种方式来完成。但是,NFS客户端与服务器之间并不是永久连接的,而NFS的一个缺点是当客户端和服务器连接后,任何一方离线都可能导致另一方在不断等待超时。同时,可能有很多用户挂载了共享目录,但实际上他们并不去使用该目录,这些用户也会导致NFS服务器资源的耗费。为了解决这些问题,一般的做法是使用autofs服务,仅在访问时才动态挂载共享目录。

6.1、安装autofs软件包

bash 复制代码
dnf install autofs

6.2、编辑autofs配置文件

bash 复制代码
vi /etc/auto.master

6.3、在打开的文件中添加以下内容(假设您的共享目录位于/mnt/shared)

bash 复制代码
/mnt /etc/auto.shared --timeout=600
  • 这将告诉autofs将挂载点/mnt/shared映射到/etc/auto.shared文件。--timeout=600表示共享目录将在600秒后自动卸载。

6.4、创建一个新的autofs配置文件来定义共享目录的挂载规则

bash 复制代码
vi /etc/auto.shared

6.5/在打开的文件中添加以下内容(替换为您的实际共享目录路径和服务器地址)

bash 复制代码
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服务

bash 复制代码
systemctl start autofs
相关推荐
梅见十柒几秒前
wsl2中kali linux下的docker使用教程(教程总结)
linux·经验分享·docker·云原生
Koi慢热3 分钟前
路由基础(全)
linux·网络·网络协议·安全
传而习乎14 分钟前
Linux:CentOS 7 解压 7zip 压缩的文件
linux·运维·centos
soulteary15 分钟前
突破内存限制:Mac Mini M2 服务器化实践指南
运维·服务器·redis·macos·arm·pika
我们的五年23 分钟前
【Linux课程学习】:进程程序替换,execl,execv,execlp,execvp,execve,execle,execvpe函数
linux·c++·学习
IT果果日记1 小时前
ubuntu 安装 conda
linux·ubuntu·conda
Python私教1 小时前
ubuntu搭建k8s环境详细教程
linux·ubuntu·kubernetes
羑悻的小杀马特1 小时前
环境变量简介
linux
小陈phd2 小时前
Vscode LinuxC++环境配置
linux·c++·vscode
运维&陈同学2 小时前
【zookeeper01】消息队列与微服务之zookeeper工作原理
运维·分布式·微服务·zookeeper·云原生·架构·消息队列