跳至内容

实验 5:NFS

目标

完成此实验后,您将能够

  • 安装和配置 NFS
  • 使用 NFS 在 Linux 系统之间共享文件和目录
  • 使用通用的 NFS 实用程序查询或排查 NFS 问题

完成此实验的估计时间:40 分钟

NFS

NFS 是 Network File System(网络文件系统)的缩写。它允许通过网络与其他系统共享文件和文件夹。NFS 提供了一种简单的方式,可以将本地文件系统的内容提供给网络上的多个用户(或系统)。

这种共享传统上是在类 UNIX/Linux 系统之间进行的,但运行 Microsoft Windows 操作系统的系统也可以访问 NFS 共享,前提是它们安装了正确的软件。

必须在内核中启用或编译对 NFS 的支持。

与大多数网络概念一样,NFS 也有客户端和服务器端。服务器端由导出(共享)文件系统给其他系统的系统组成。客户端由需要访问服务器导出的文件系统的系统组成。

NFSv4 需要以下程序的(守护进程)服务

  • portmap - 将 RPC 程序映射到常规网络端口
  • mountd - 处理传入的挂载请求
  • nfsd - 这是处理实际文件传输的主要 NFS 程序

/etc/exports

/etc/exports 配置文件用作访问控制列表,用于指定可以通过 NFS 导出给授权客户端的文件系统。它为 mountd 和基于内核的 NFS 文件服务器守护进程 nfsd 提供信息。

/etc/exports 中的指令使用以下语法

shareable_directory  allowed_clients(options_affecting_allowed_clients) 

练习 1

管理 NFS

在本练习中,您将共享(导出)一个本地目录与您的伙伴系统共享,但在此之前,您将学习如何管理 NFS 服务。

NFS 是一个基于远程过程调用 (RPC) 的客户端和服务器应用程序。因此,方便地使用 RPC 实用程序非常有用,这些实用程序可用于查询、调试和向 RPC 服务器(如 NFS 服务器)发出 RPC 调用。rpcinfo 就是这样一种有用的实用程序。其用法语法和选项如下所示

SYNOPSIS
     rpcinfo [-m | -s] [host]
     rpcinfo -p [host]
     rpcinfo -T transport host prognum [versnum]
     rpcinfo -l [-T transport] host prognum versnum
     rpcinfo [-n portnum] -u host prognum [versnum]
     rpcinfo [-n portnum] [-t] host prognum [versnum]
     rpcinfo -a serv_address -T transport prognum [versnum]
     rpcinfo -b [-T transport] prognum versnum
     rpcinfo -d [-T transport] prognum versnum

启动 NFS

  1. 确保您已以具有管理员权限的用户身份登录到您的系统。

  2. 首先安装 nfs-utils 包。该包提供了各种与 NFS 客户端和服务器一起使用的实用程序。键入

    dnf -y install nfs-utils
    
  3. 新安装的 nfs-utils 包还提供了管理系统上 NFS 守护进程所需的 systemd 服务单元(nfs-server.service)。使用 systemctl 查看 nfs-server 单元“Wants”的一些辅助服务。键入

     systemctl show  -p "Wants"  nfs-server
    

    输出

    Wants=nfs-idmapd.service nfsdcld.service rpcbind.socket rpc-statd-notify.service rpc-statd.service auth-rpcgss-module.service network-online.target
    

    nfs-server 所需的一些重要且值得注意的服务包括 nfs-idmapdnfsdcldrpcbindrpc-statd-notifyrpc-statdauth-rpcgss-module

  4. rpcinfo 命令用于向 RPC 服务器发出 RPC 调用,然后报告其发现。rpcinfo 列出了所有向 rpcbind 注册的 RPC 服务。使用 rpcinfo 查询本地服务器以获取所有已注册 RPC 服务的列表。键入

    rpcinfo -p localhost
    

    输出

    program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    

    从上面的示例输出中,我们可以看出 portmapper 服务已在运行 localhost 的 RPC 服务器上注册。

    问题

    1. 什么是 portmapper?

    2. 找出 rpcinfo 命令不同字段(列标题)(Program、Vers、proto 和 service)的含义。

  5. 检查 nfs-server.service 的状态。键入

    systemctl status nfs-server
    

输出

bash ● nfs-server.service - NFS 服务器和相关服务 已加载:已加载 (/usr/lib/systemd/system/nfs-server.service; 禁用; 供应商预设:禁用) 活动:非活动(死)

nfs-server.service is currently not running according to the output on our demo system.
  1. 使用 systemctl 启动 nfs-server 守护进程。键入

    systemctl start nfs-server
    
  2. 再次检查 nfs-server 服务的状态。

  3. 再次运行 rpcinfo 命令以检查是否有任何变化。

    问题

    启动 nfs-server 后,在 rpcinfo 输出中可以看到哪些新服务?

  4. 验证 nfs-server.service 是否设置为在系统每次重新启动时自动启动。键入

    systemctl is-enabled nfs-server
    
  5. 如果您的系统上禁用了 nfs-server,请运行命令将其配置为随系统自动启动。

  6. 如果防火墙子系统正在您的服务器上运行,您需要允许 NFS 流量通过防火墙供远程 NFS 客户端访问。这可以通过运行以下命令来完成

    firewall-cmd --permanent --add-service nfs && firewall-cmd --reload
    

练习 2

导出共享

创建共享是通过创建目录或共享本地文件系统上已存在的目录来完成的。

exportfs 实用程序用于查看和维护已导出 NFS 文件系统的表。其用法语法和选项如下

SYNOPSIS
       /usr/sbin/exportfs [-avi] [-o options,..] [client:/path ..]
       /usr/sbin/exportfs -r [-v]
       /usr/sbin/exportfs [-av] -u [client:/path ..]
       /usr/sbin/exportfs [-v]
       /usr/sbin/exportfs -f
       /usr/sbin/exportfs -s

注意

不要忘记替换所有对 server 的引用为您的伙伴的实际主机名。

创建和导出共享

您将创建并共享一个名为 /mnt/nfs 的目录。该目录将是从 NFS 服务器导出的源文件系统。

  1. 确保您已以管理员权限的用户身份登录到您的系统。

  2. /mnt 下创建一个名为 nfs 的目录并切换到该目录。

    mkdir /mnt/nfs && cd /mnt/nfs
    
  3. 在您创建的新目录下创建 5 个示例文件。键入

     touch {1..5}nfs
    
  4. 使用 HEREDOC shell 功能在 /etc/exports 中创建一个新的 NFS 导出条目。您想要的是单行条目 - /mnt/nfs foocentos2(rw) localhost(rw)。键入

    cat << EOF > /etc/exports
    /mnt/nfs    172.16.99.0/24(rw)   localhost(rw)
    EOF
    

    您也可以使用任何您熟悉的文本编辑器来创建该条目。

  5. 验证 /etc/exports 的内容以确保没有错误。

  6. 在对 /etc/exports 文件进行任何更改后,您都应该运行 exportfs 命令。键入

    exportfs -r
    
  7. 使用 exportfs 命令的 -s 标志来显示适合 /etc/exports 的当前导出列表。例如,查看目录、允许的主机和选项的列表。键入

    exportfs -s
    

    问题

    输出是什么?列出输出内容。

练习 3

挂载 NFS 共享

本练习涉及 NFS 的客户端方面。您将尝试作为客户端访问 NFS 服务器。

showmount 是一个方便的实用程序,用于查询和显示 NFS 服务器上的挂载信息。它还可以显示 NFS 服务器的状态并列出正在从服务器挂载的客户端。其语法和选项如下

SYNOPSIS
       showmount [ -adehv ] [ --all ] [ --directories ] [ --exports ] [ --help ] [ --version ] [ host ]

OPTIONS
       -a or --all
              List  both  the  client  hostname or IP address and mounted directory in host:dir format.
       -d or --directories
              List only the directories mounted by some client.
       -e or --exports
              Show the NFS server's export list.
       -h or --help
              Provide a short help summary.
       -v or --version
              Report the current version number of the program.
       --no-headers
              Suppress the descriptive headings from the output.

在本地访问 NFS 共享

您将测试来自练习 1 的 NFS 服务器配置,方法是尝试从本地计算机访问导出的目录,然后再从远程计算机进行测试。

  1. 以超级用户身份登录时,创建一个名为 /mnt/nfs-local 的目录。该目录将作为 NFS 共享的测试挂载点。

  2. 作为快速的飞行前检查,请以客户端身份运行 showmount 以显示服务器上可用的导出列表。键入

    showmount  -e localhost
    

    输出

    Export list for localhost:
    /mnt/nfs 172.16.99.0/24,localhost
    

    您应该看到服务器上配置的任何 NFS 导出。

  3. 您现在可以在测试挂载点上挂载 NFS 共享。键入

    mount  -t  nfs  localhost:/mnt/nfs   /mnt/nfs-local
    
  4. 将您的 PWD 更改为 /mnt/nfs-local 目录并列出其内容。

  5. /mnt/nfs-local 目录中,尝试删除一些文件。键入

    rm -rf 1nfs  2nfs
    

    输出

    rm: cannot remove '1nfs': Permission denied
    rm: cannot remove '2nfs': Permission denied
    

    问题

    您的文件删除尝试成功了吗?

  6. 现在尝试在 NFS 共享上创建其他文件(6nfs、7nfs、8nfs)。键入

    touch {6..8}nfs
    

    问题

    您的文件创建尝试成功了吗?您认为为什么会失败?

从您的伙伴系统执行此练习

远程访问 NFS 共享

  1. 以超级用户身份登录到 serverPR 时,如果未安装 nfs-utils 包,请安装它。

  2. 创建一个名为“/mnt/nfs-remote”的目录,它将作为远程 NFS 共享的挂载点。键入

    mkdir   /mnt/nfs-remote
    
  3. 假设 remote serverXY 的 IP 地址是 172.16.99.100,通过运行以下命令在 serverXY 上挂载 NFS 共享

    mount -t nfs  172.16.99.100:/mnt/nfs  /mnt/nfs-remote
    
  4. 使用 mount 命令显示有关您刚刚挂载的 NFS 共享的一些额外信息。键入

     mount -t nfs4
    

    输出

    172.16.99.100:/mnt/nfs on /mnt/nfs-remote type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255
    ...<SNIP>...
    
  5. cd 到 NFS 挂载点并尝试删除其内容。键入

    cd /mnt/nfs-remote ; rm -f   
    

    问题

    您的尝试成功了吗?

  6. 以超级用户身份从 serverPR 注销,然后以非特权用户“ying”的身份重新登录

  7. 以“ying”用户的身份登录到 serverPR 时,cd 到第 2 步中挂载的目录。键入

    cd /mnt/nfs-remote/
    
  8. 记下目录的内容。如果您能看到预期的文件,那么您已成功完成 NFS 实验!

    实验任务

    1. 在您的本地服务器(serverXY)上配置 NFS 设置,以便 H.Q.(hq.example.org)的超级用户能够在 hq 机器上挂载您的 nfs 共享(/mnt/nfsXY)以供使用。

    2. HQ 的超级用户应该能够对您的 NFS 共享进行写入(创建)新文件和删除文件。

    技巧

    您需要禁用 NFS 对 root 拥有的文件的特殊处理。这可以通过在“/etc/exports”文件中指定一个特殊选项来实现,该选项将“un-squash”超级用户。特殊选项称为 no_root_squash。请注意,使用 no_root_squash 选项被认为是不好的做法,并且存在安全风险。在 /etc/exports 中,为与 localhost 匹配的任何主机完成此操作的示例条目将如下所示

    /mnt/nfs    172.16.99.0/24(rw)   localhost(rw,no_root_squash)
    

作者:Wale Soyinka

贡献者:Steven Spencer, Ganna Zhyrnova