实验 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¶
确保您以具有管理员权限的用户身份登录到系统。
首先安装
nfs-utils
包。此包提供了与 NFS 客户端和服务器一起使用的各种实用程序。输入dnf -y install nfs-utils
除其他事项外,新安装的 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-idmapd
、nfsdcld
、rpcbind
、rpc-statd-notify
、rpc-statd
、auth-rpcgss-module
。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
服务。问题
什么是 portmapper?
找出
rpcinfo
命令的不同字段(列标题)的含义(程序、版本、协议和服务)。
检查
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.
使用 systemctl 启动 nfs-server 守护进程。输入
systemctl start nfs-server
再次检查 nfs-server 服务的状态。
再次运行
rpcinfo
命令检查是否有变化。问题
启动 nfs-server 后,您在
rpcinfo
输出中看到了哪些新服务?验证
nfs-server.service
是否设置为在系统每次重启时自动启动。输入systemctl is-enabled nfs-server
如果您的系统上禁用了 nfs-server,请运行该命令将其配置为随系统自动启动。
如果您的服务器上运行了防火墙子系统,您需要允许/允许 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 服务器导出的源文件系统。
确保您已以具有管理权限的用户登录到您的系统。
在
/mnt
下创建一个名为nfs
的目录,并切换到该目录。mkdir /mnt/nfs && cd /mnt/nfs
在您创建的新目录下创建 5 个示例文件。输入
touch {1..5}nfs
使用 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
您也可以使用您熟悉的任何文本编辑器来创建条目。
验证
/etc/exports
的内容,以确保没有错误。对
/etc/exports
文件进行任何更改后,您应该运行exportfs
命令。输入exportfs -r
使用
-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*),然后从远程机器测试它。
以超级用户身份登录后,创建一个名为
/mnt/nfs-local
的目录。该目录将用作 NFS 共享的测试挂载点。作为快速预检,以客户端身份运行
showmount
以显示服务器上的可用导出列表。输入showmount -e localhost
输出
Export list for localhost: /mnt/nfs 172.16.99.0/24,localhost
您应该看到在服务器上配置的任何 NFS 导出。
您现在可以将 NFS 共享挂载到测试挂载点。输入
mount -t nfs localhost:/mnt/nfs /mnt/nfs-local
将您的 PWD 更改为
/mnt/nfs-local
目录并列出其内容。仍然在
/mnt/nfs-local
目录中,尝试删除一些文件。输入rm -rf 1nfs 2nfs
输出
rm: cannot remove '1nfs': Permission denied rm: cannot remove '2nfs': Permission denied
问题
您的文件删除尝试是否成功?
现在尝试在 NFS 共享上创建其他文件(6nfs、7nfs、8nfs)。输入
touch {6..8}nfs
问题
您的文件创建尝试是否成功?您认为为什么失败?
从您的合作伙伴系统执行此练习
远程访问 NFS 共享¶
以超级用户身份登录 serverPR 后,如果未安装
nfs-utils
软件包,请安装它。创建一个名为 “
/mnt/nfs-remote
” 的目录,该目录将用作远程 NFS 共享的挂载点。输入mkdir /mnt/nfs-remote
假设远程服务器 XY 的 IP 地址为 172.16.99.100,请通过运行以下命令将 NFS 共享挂载到 serverXY 上
mount -t nfs 172.16.99.100:/mnt/nfs /mnt/nfs-remote
使用
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>...
cd
到 NFS 挂载点,并尝试删除其内容。输入cd /mnt/nfs-remote ; rm -f
问题
您的尝试是否成功?
以超级用户身份注销 serverPR,然后以非特权用户 “ying” 身份登录
以 “ying” 身份登录 serverPR 后,
cd
到步骤 2 中挂载的目录。输入cd /mnt/nfs-remote/
记下目录的内容。如果可以查看预期文件,则您已成功完成 NFS 实验室!
实验室任务
在您的本地服务器(serverXY)上配置 NFS 设置,以便 H.Q.(hq.example.org)的超级用户能够挂载您的 nfs 共享(/mnt/nfsXY)以供 hq 机器使用。
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)
作者:瓦莱·索因卡
贡献者:史蒂文·斯宾塞,甘娜·齐尔诺娃