实验 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¶
-
确保您已以具有管理员权限的用户身份登录到您的系统。
-
首先安装
nfs-utils
包。该包提供了各种与 NFS 客户端和服务器一起使用的实用程序。键入dnf -y install nfs-utils
-
新安装的 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-idmapd
、nfsdcld
、rpcbind
、rpc-statd-notify
、rpc-statd
、auth-rpcgss-module
。 -
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 服务器上注册。问题
-
什么是 portmapper?
-
找出
rpcinfo
命令不同字段(列标题)(Program、Vers、proto 和 service)的含义。
-
-
检查
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.
-
使用 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
-
使用
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 服务器配置,方法是尝试从本地计算机访问导出的目录,然后再从远程计算机进行测试。
-
以超级用户身份登录时,创建一个名为
/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
-
假设 remote serverXY 的 IP 地址是 172.16.99.100,通过运行以下命令在 serverXY 上挂载 NFS 共享
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)的超级用户能够在 hq 机器上挂载您的 nfs 共享(/mnt/nfsXY)以供使用。
-
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