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
相关推荐
林姜泽樾1 小时前
Linux入门第十二章,创建用户、用户组、主组附加组等相关知识详解
linux·运维·服务器·centos
xiaokangzhe1 小时前
Linux系统安全
linux·运维·系统安全
feng一样的男子1 小时前
NFS 扩展属性 (xattr) 提示操作不支持解决方案
linux·go
xiaokangzhe2 小时前
Nginx核心功能
运维·nginx
松果1772 小时前
以本地时钟为源的时间服务器
运维·chrony·时间服务器
Highcharts.js2 小时前
Highcharts React v4.2.1 正式发布:更自然的React开发体验,更清晰的数据处理
linux·运维·javascript·ubuntu·react.js·数据可视化·highcharts
ayaya_mana2 小时前
快速安装Nginx-UI:让Nginx管理可视化的高效方案
运维·nginx·ui
c++之路3 小时前
Linux网络协议与编程基础:TCP/IP协议族全解析
linux·网络协议·tcp/ip
Charlie__ZS4 小时前
Ubuntu 22.04新建用户,并赋予管理权限
linux·os·ubuntn
Johnstons4 小时前
读懂 TCP 标志位:网络运维中的“信号灯”
运维·网络·tcp/ip