简介
NFS,即网络文件系统,是一个分布式文件系统协议,允许你在服务器上挂载远程目录。这允许你在不同的地方管理存储空间,并从多个客户端写到该空间。NFS为通过网络访问远程系统提供了一种相对标准且性能良好的方法,在必须定期访问共享资源的情况下效果很好。
在本指南中,你将了解如何在Rocky Linux 8上安装NFS功能所需的软件,在服务器和客户端配置两个NFS挂载,并挂载和卸载远程共享。
前提条件
在本教程中,你将使用两台服务器,其中一台与另一台共享其部分文件系统。要跟上进度,你将需要。
-
两台Rocky Linux 8服务器。每台服务器都应该有一个具有
sudo权限的非root用户,一个用UFW设置的防火墙,以及私人网络(如果你有的话)。
在本教程中,共享其目录的服务器将被称为主机,挂载这些目录的服务器被称为客户端。你将需要知道两者的IP地址。如果有的话,请确保使用私人网络地址。
在本教程中,这些IP地址将以占位符host_ip 和client_ip 来表示。请根据需要替换。
第1步 - 下载和安装组件
你将首先在每台服务器上安装必要的组件。
在主机上
在主机服务器上,使用dnf 软件包管理器安装nfs-utils 软件包,这将允许你共享你的目录。
sudo dnf install nfs-utils
一旦这些包安装完毕,就切换到客户服务器。
在客户机上
在客户服务器上,你需要安装同样的nfs-utils 包。
sudo dnf install nfs-utils
现在,两个服务器都有必要的软件包,你可以开始配置它们。
你将共享两个独立的目录,并进行不同的配置设置,以说明NFS挂载在超级用户访问方面的两种关键配置方式。
超级用户可以在其系统的任何地方做任何事情。然而,NFS挂载的目录并不是它们所挂载的系统的一部分,所以默认情况下,NFS服务器拒绝执行需要超级用户权限的操作。这个默认限制意味着客户端上的超级用户不能以root身份写入文件,重新分配所有权,或在NFS挂载上执行任何其他超级用户任务。
然而,有时客户机系统上有受信任的用户需要在挂载的文件系统上执行这些操作,但他们不需要在主机上有超级用户访问权。你可以配置NFS服务器来允许这样做,尽管这引入了一个风险因素,即一个恶意的用户可能获得对整个主机系统的根权限。
例子1:导出一个通用的挂载
在第一个例子中,你将创建一个通用的NFS挂载,使用默认的NFS行为,使客户机上具有root权限的用户难以使用这些客户机超级用户权限与主机进行交互。你可能会使用这样的东西来存储使用内容管理系统上传的文件,或者为用户创建空间来轻松地共享项目文件。
首先,创建共享目录(使用mkdir 的-p 选项,如果需要,它将创建整个文件路径)。
sudo mkdir /var/nfs/general -p
因为你是用sudo 来创建的,所以该目录是由主机的根用户拥有的。
ls -dl /var/nfs/general
Output
drwxr-xr-x 2 root root 4096 Apr 17 23:51 /var/nfs/general
作为一项安全措施,NFS将把客户机上的任何根操作转换为nobody 用户。因此,你需要把目录的所有权改为nobody 。
sudo chown nobody /var/nfs/general
现在你已经准备好导出这个目录了。
例2:导出主目录
在第二个例子中,我们的目标是使存储在主机上的用户主目录在客户服务器上可用,同时允许这些客户服务器的受信任的管理员访问,以方便管理用户。
要做到这一点,你将导出/home 目录。由于它已经存在,你不需要创建它。你也不会改变权限。如果你这样做,可能会导致在主机上有主目录的人出现一系列问题。
第3步 - 配置主机上的NFS出口
接下来,你将深入到NFS配置文件中,以设置这些资源的共享。
Rocky Linux 9所附带的默认文本编辑器是vi 。vi 是一个非常强大的文本编辑器,但对于缺乏经验的用户来说,它可能有些晦涩难懂。你可能想安装一个更友好的编辑器,如nano ,以方便在你的Rocky Linux 8服务器上编辑配置文件。
sudo dnf install nano
在主机上,以root权限在nano 或你喜欢的文本编辑器中打开/etc/exports 文件。
sudo nano /etc/exports
在Rocky Linux 8上,这个文件默认为空。这是你需要创建的语法。
/etc/exports
directory_to_share client(share_option1,...,share_optionN)
为你计划共享的每个目录添加一行。请确保将这里的 client_ip将这里显示的占位符改为你的实际IP地址。
/etc/exports
/var/nfs/general client_ip(rw,sync,no_subtree_check)
/home client_ip(rw,sync,no_root_squash,no_subtree_check)
在这里,除了no_root_squash ,你在两个目录中使用了相同的配置选项。 看看这些选项各自的含义。
rw:这个选项使客户端计算机对卷的读写权限都有了。sync:这个选项强制NFS在回复之前将变化写入磁盘。这导致了一个更稳定和一致的环境,因为回复反映了远程卷的实际状态。然而,它也降低了文件操作的速度。no_subtree_check:这个选项可以防止子树检查,在这个过程中,主机必须为每个请求检查文件在导出的树中是否真的仍然可用。当一个文件在客户端打开时被重新命名,这可能会导致许多问题。在几乎所有情况下,最好禁用子树检查。no_root_squash:默认情况下,NFS将来自远程根用户的请求翻译成服务器上的非特权用户。这是作为一种安全功能,以防止客户机上的root账户以root身份使用主机的文件系统。no_root_squash,对于某些共享,禁用这种行为。
当你完成修改后,保存并关闭该文件。如果你使用的是nano ,按Ctrl+X ,然后在出现提示时,按Y ,然后按 Enter。然后,为了使你配置的客户端可以使用这些共享,启动NFS服务器,并用systemctl ,使其自动运行。
sudo systemctl enable nfs-server
sudo systemctl start nfs-server
使用systemctl status 验证该服务已经启动。
sudo systemctl status nfs-server
Output
● nfs-server.service - NFS server and services
Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: >
Drop-In: /run/systemd/generator/nfs-server.service.d
└─order-with-mounts.conf
Active: active (exited) since Mon 2022-08-08 17:41:18 UTC; 4s ago
Process: 14348 ExecStart=/bin/sh -c if systemctl -q is-active gssproxy; then systemct>
Process: 14336 ExecStart=/usr/sbin/rpc.nfsd (code=exited, status=0/SUCCESS)
Process: 14335 ExecStartPre=/usr/sbin/exportfs -r (code=exited, status=0/SUCCESS)
Main PID: 14348 (code=exited, status=0/SUCCESS)
Aug 08 17:41:18 rocky8-nfs-host systemd[1]: Starting NFS server and services...
Aug 08 17:41:18 rocky8-nfs-host systemd[1]: Started NFS server and services.
然而,在你能够实际使用新的共享之前,你需要确定防火墙规则允许对共享的通信。
步骤 4 - 调整主机上的防火墙
如果你正在运行firewalld 防火墙,正如我们在Rocky Linux 8的初始服务器设置指南中所推荐的那样,请在firewall-cmd 的输出中的services 行中检查哪些服务是当前允许的。
firewall-cmd --permanent --list-all | grep services
Output
services: cockpit dhcpv6-client ssh
在你的系统中,只有核心系统服务被允许,所以你需要为NFS流量添加规则。Rocky Linux上的NFS使用了三种不同的服务,它们都需要被允许通过你的防火墙。你可以用firewall-cmd 添加这些规则。
firewall-cmd --permanent --add-service=nfs
firewall-cmd --permanent --add-service=mountd
firewall-cmd --permanent --add-service=rpc-bind
firewall-cmd --reload
你可以验证它们是否已经被添加。
firewall-cmd --permanent --list-all | grep services
Output
services: cockpit dhcpv6-client mountd nfs rpc-bind ssh
请注意,这将在全球范围内为这些服务打开你的防火墙,而不是只对单个客户开放。这不应该是一个问题,因为你已经将你的NFS挂载配置为只对一个IP地址开放。如果你需要直接为你的Firewalld配置增加更多的安全性,你可以实现Firewalld区域。
第5步 - 在客户端创建挂载点和挂载目录
现在,主机服务器已经配置好,并为其共享提供服务,你将准备好你的客户端。
为了使客户机上的远程共享可用,你需要将主机上你想共享的目录挂载到客户机上的空目录中。
注意:如果你的挂载点中有文件和目录,一旦你挂载NFS共享,它们就会变成隐藏的。为了避免重要文件的丢失,请确保如果你在一个已经存在的目录中挂载,该目录是空的。
你将为你的挂载创建两个目录。
sudo mkdir -p /nfs/general
sudo mkdir -p /nfs/home
现在你有了一个放置远程共享的位置,并且你已经打开了防火墙,你可以使用你的主机服务器的IP地址来挂载共享。
sudo mount host_ip:/var/nfs/general /nfs/general
sudo mount host_ip:/home /nfs/home
这些命令将把共享从主机装到客户机上。你可以通过几种方式仔细检查它们是否安装成功。你可以用mount 或findmnt 命令来检查,但df -h 提供了更可读的输出。
df -h
Output
Filesystem Size Used Avail Use% Mounted on
Filesystem Size Used Avail Use% Mounted on
devtmpfs 370M 0 370M 0% /dev
tmpfs 405M 0 405M 0% /dev/shm
tmpfs 405M 11M 394M 3% /run
tmpfs 405M 0 405M 0% /sys/fs/cgroup
/dev/vda1 25G 1.5G 24G 6% /
tmpfs 81M 0 81M 0% /run/user/0
host_ip:/var/nfs/general 25G 1.6G 24G 7% /nfs/general
host_ip:/home 25G 1.6G 24G 7% /nfs/home
你挂载的两个共享都出现在底部。因为它们是从同一个文件系统挂载的,所以它们显示了相同的磁盘使用率。
第6步 - 测试NFS访问
接下来,通过向每个股份写东西来测试对它们的访问。
首先,写一个测试文件到/var/nfs/general 共享。
sudo touch /nfs/general/general.test
然后,检查其所有权。
ls -l /nfs/general/general.test
Output
-rw-r--r--. 1 nobody nobody 0 Aug 8 18:24 /nfs/general/general.test
因为你没有改变NFS的默认行为就挂载了这个卷,并且通过sudo 命令以客户机 根用户的身份创建了文件,所以文件的所有权默认为nobody 。客户机超级用户不能在这个NFS挂载的共享上执行典型的管理操作,比如改变文件的所有者或为一组用户创建一个新目录。
要比较 "通用 "共享和 "主目录 "共享的权限,可以用同样的方法在/nfs/home 中创建一个文件。
sudo touch /nfs/home/home.test
然后查看该文件的所有权。
ls -l /nfs/home/home.test
Output
-rw-r--r--. 1 root root 0 Aug 8 18:26 /nfs/home/home.test
你以root身份使用sudo 命令创建了home.test ,与你创建general.test 文件的方式完全相同。然而,在这种情况下,它是由root拥有的,因为当你在这个挂载上指定no_root_squash 选项时,你推翻了默认行为。这允许你在客户机上的root用户以root身份行事,使用户账户的管理更加方便。同时,这意味着你不需要给这些用户在主机上的root权限。
第7步 - 启动时挂载远程NFS目录
你可以在启动时自动挂载远程NFS共享,方法是将它们添加到客户端的/etc/fstab 文件中。
在你的文本编辑器中以root权限打开/etc/fstab 。
sudo nano /etc/fstab
在文件的底部,为你的每个共享添加一行。它们将看起来像这样。
/etc/fstab
. . .
host_ip:/var/nfs/general /nfs/general nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
host_ip:/home /nfs/home nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
注意:你可以在NFS手册中找到关于你在这里指定的选项的更多信息。
客户端将在启动时自动挂载远程分区,尽管可能需要一些时间来建立连接并使共享可用。
如果你不再希望远程目录被挂载在你的系统上,你可以通过移出共享的目录结构并卸载它,像这样。
cd ~
sudo umount /nfs/home
sudo umount /nfs/general
请注意,该命令被命名为umount ,而不是你可能期望的unmount 。
这将删除远程共享,只留下你的本地存储可以访问。
df -h
Output
Filesystem Size Used Avail Use% Mounted on
devtmpfs 370M 0 370M 0% /dev
tmpfs 405M 0 405M 0% /dev/shm
tmpfs 405M 11M 394M 3% /run
tmpfs 405M 0 405M 0% /sys/fs/cgroup
/dev/vda1 25G 1.5G 24G 6% /
tmpfs 81M 0 81M 0% /run/user/0
如果你还想防止它们在下一次重启时被重新挂载,请编辑/etc/fstab ,并删除这一行,或者在这一行的开头放置一个# 字符,将其注释。你也可以通过删除auto 选项来防止自动挂载,这将允许你仍然手动挂载。
总结
在本教程中,你创建了一个NFS主机,并通过创建两个不同的NFS挂载来说明一些关键的NFS行为,你与一个NFS客户端共享这些挂载。
如果你想在生产中实施NFS,重要的是要注意该协议本身是不加密的。在你通过私人网络共享的情况下,这可能不是一个问题。在其他情况下,有必要使用VPN或其他类型的加密隧道来保护你的数据。