跳至内容

实验 5: NFS

目标

完成本实验后,您将能够

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

预计完成本实验的时间:40 分钟

NFS

NFS 是网络文件系统的缩写。它允许在网络上与其他系统共享文件和文件夹。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 服务器(如 NFS 服务器)发出 RPC 调用的 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 单元“想要”的一些辅助服务。输入

     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 列出在运行 localhost 的 RPC 服务器上注册的所有 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
    

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

    问题

    1. 什么是 portmapper?

    2. 找出 rpcinfo 命令的不同字段(列标题)的含义(程序、版本、协议和服务)。

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

    systemctl status nfs-server
    

输出

bash ● nfs-server.service - NFS server and services Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; disabled; vendor preset: disabled) Active: inactive (dead)

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. 使用 -s 标志以及 exportfs 命令来显示适合 /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 共享

您将通过尝试从本地机器访问导出的目录来测试 NFS 服务器的配置(来自 *练习 1*),然后从远程机器测试它。

  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. 假设远程服务器 XY 的 IP 地址为 172.16.99.100,请通过运行以下命令将 NFS 共享挂载到 serverXY 上

    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)的超级用户能够挂载您的 nfs 共享(/mnt/nfsXY)以供 hq 机器使用。

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

    提示

    您需要禁用 NFS 对根拥有的文件的特殊处理。这可以通过指定一个特殊的选项来完成,该选项将“取消压缩” “/etc/exports” 文件中的超级用户。特殊选项称为 no_root_squash。请注意,使用 no_root_squash 选项被认为是不良做法,也是一种安全风险。为了在 /etc/exports 中与 localhost 匹配的任何主机上实现这一点,一个示例条目将如下所示

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

作者:瓦莱·索因卡

贡献者:史蒂文·斯宾塞,甘娜·齐尔诺娃