使用NFS服务器将共享文件系统添加到您的家庭实验室。共享文件系统是为您的家庭实验室增加多功能性和功能的好方法。为实验室中的客户共享集中式文件系统使得组织数据、进行备份和共享数据变得相当容易。这对于跨多个服务器和Kubernetes使用的持久卷的Web应用程序负载平衡特别有用,因为它允许在任意数量的节点上轮换具有持久数据的pod。无论您的家庭实验室由普通计算机、备用公司服务器、RaspberryPi或其他单板计算机(SBC)组成,共享文件系统都是有用的资产,而网络文件系统(NFS)服务器是一个很好的方式创建共享文件系统。我之前写过关于设置“家庭私有云”的文章,这是一个由RaspberryPi或其他SBC组成的家庭实验室,可能还有一些其他消费类硬件或台式PC。NFS服务器是在这些组件之间共享数据的理想方式。由于大多数SBC的操作系统都是从SD卡运行的,因此存在一些挑战。尤其是作为电脑的操作系统盘,SD卡的故障率会更高,它们并不是为不断读写而设计的。您真正需要的是一个真正的硬盘驱动器:它们每GB的价格通常比SD卡便宜,尤其是对于较大的磁盘,而且它们不太可能持续出现故障。RaspberryPi4现在有一个USB3.0端口,USB3.0硬盘驱动器无处不在且价格适中。这是一个绝配。对于这个项目,我将使用一个2TBUSB3.0外部硬盘驱动器插入运行NFS服务器的RaspberryPi4。带有USB硬盘的RaspberryPi安装NFS服务器软件我在RaspberryPi上运行FedoraServer,但是这个项目应该也适用于其他发行版。要在Fedora上运行NFS服务器,您需要nfs-utils包,幸运的是它已经安装(至少从Fedora31开始)。如果您计划运行NFSv3服务,您还需要rpcbind包,但NFSv4并不严格要求它。如果您的系统上还没有这些软件包,请使用dnf命令安装它们。#安装nfs-utils和rpcbind$sudodnfinstallnfs-utilsrpcbindRaspbian是另一种流行的用于RaspberryPi的操作系统,其设置几乎相同。包名称不同,但这是唯一的主要区别。要在运行Raspbian的系统上安装NFS服务器,您需要以下软件包。nfs-common:这些文件对于NFS服务器和客户端是通用的。nfs-kernel-server:主要的NFS服务器包。Raspbian使用apt-get来管理包(而不是像Fedora那样的dnf),所以使用它来安装包。#对于Raspbian系统,使用apt-get安装NFS包$sudoapt-getinstallnfs-commonnfs-kernel-server准备一个U盘作为存储设备正如我上面提到的,U盘用于RaspberryPi或其他SBC提供了很好的存储选项,尤其是用于操作系统磁盘映像的SD卡不适合此目的。对于私有家庭云,您可以使用便宜的USB3.0硬盘驱动器进行大容量存储。插入磁盘,使用fdisk找出分配给它的设备ID,然后就可以使用它了。#Usefdisktofindyourharddisk#不相关的硬盘信息已省略$sudofdisk-lDisk/dev/sda:1.84TiB,2000398933504bytes,3907029167sectorsDiskmodel:BUPSlimBKUnits:sectorsof1*512=512bytesSectorsize(逻辑/物理):512字节/512字节I/O大小(最小/最佳):512字节/512字节磁盘标签类型:dos磁盘标识符:0xe3345ae9DeviceBootStartEndSectorsSizeIdType/dev/sda120483907028909126907为清楚起见,请参阅LinuxT48清晰度在上面的示例输出中,我省略了所有磁盘的信息,除了我感兴趣的那个。你可以看到我要使用的USB磁盘被分配了设备/dev/sda,你可以看到一些关于型号(Diskmodel:BUPSlimBK),这有助于我识别正确的磁盘。磁盘已经有一个分区,它的大小证实它就是我要找的磁盘。注意:确保正确识别设备的磁盘和分区。它可能与上面的示例不同。在驱动器上创建的每个分区都有一个特殊的通用唯一标识符(UUID)。计算机使用UUID来确保它使用/etc/fstab配置文件将正确的分区安装在正确的位置。您可以使用blkid命令检索分区的UUID。#获取这个分区的块设备属性#确保你使用的是正确的分区,它应该是不同的。$sudoblkid/dev/sda1/dev/sda1:LABEL="backup"UUID="bd44867c-447c-4f85-8dbf-dc6b9bc65c91"TYPE="xfs"PARTUUID="e3345ae9-01"在这里,/dev/sda1UUID是bd44867c-447c-4f85-8dbf-dc6b9bc65c91。您的UUID会有所不同,因此请记下它。将RaspberryPi配置为在启动时挂载此磁盘,然后挂载它现在您已经确定了要使用的磁盘和分区,您需要告诉计算机如何挂载它,并在每次启动时执行此操作。现在去安装它。由于这是一个USB磁盘,它可能会被拔掉,因此您还可以将RaspberryPi配置为在磁盘未插入或不可用时不等待启动。在Linux中,您通过将分区添加到/etc/fstab配置文件来告诉计算机如何处理分区,包括您希望它挂载的位置和一些参数。这个例子会将分区挂载到/srv/nfs,所以首先创建这个路径:#创建磁盘分区的挂载点$sudomkdir-p/srv/nfs接下来,使用以下语法修改/etc/fstab文件:使用您之前确定的UUID作为磁盘ID。正如我在上一步中提到的,挂载点是/srv/nfs。对于文件系统类型,通常最好选择其实际的文件系统,但由于这是USB磁盘,请使用auto。对于选项值,请使用nosuid、nodev、nofail。关于手册页的旁注实际上,有很多可能的选项,而手册页(man)是查看它们的最佳方式。查看fstab的手册页是一个很好的起点。#打开fstab的手册页$manfstab这将打开与fstab命令相关的手册/文档。在手册页中,每个选项被分解成不同的内容来展示它的作用和常用的选项。例如,“第四个字段(fs_mntopts)”提供了有关该字段中可用选项的一些基本信息,并指导您使用man8mount以获得对挂载选项的更深入描述。这是有道理的,因为/etc/fstab文件本质上告诉计算机如何自动挂载磁盘,就像您手动使用mount命令一样。您可以从mount手册页中获得有关您将使用的选项的更多信息。数字8表示手册页的章节。在这里,第8章是关于系统管理工具和守护进程的。您可以从手册页中获取标准章节的列表。回到安装磁盘,让我们看看man8mount。#打开第8章的mount手册页$man8mount在此手册页中,您可以看到上面列出的选项的作用。nosuid:忽略suid/guid位。不允许以root身份执行U盘上的任何文件。这是一个很好的安全实践。nodev:不识别文件系统中的字符或块特殊设备,即忽略U盘上的任何设备节点。另一个良好的安全实践。nofail:如果设备不存在,则不记录任何错误。这是一个U盘,可能没有插入,所以在这种情况下将被忽略。回到您添加到/etc/fstab文件的行,最后还有两个选项:fs_freq和fs_passno。它们的值与一些过时的选项有关,大多数现代系统对这两个选项都只使用0,尤其是U盘上的文件系统。fs_freq的值与dump命令和文件系统的dump有关。fs_passno的值定义文件系统及其在启动时被fscked的顺序。如果设置了这个值,一般根分区为1,其他文件系统为2。将此值设置为0以跳过在此分区上使用fsck。在您喜欢的编辑器中,打开/etc/fstab文件并为USB驱动器上的分区添加一个条目,将此处的值替换为前面步骤中获得的值。#使用sudo,或以root身份,将分区信息添加到/etc/fstab文件UUID="bd44867c-447c-4f85-8dbf-dc6b9bc65c91"/srv/nfsautonosuid,nodev,nofail,noatime00启用并启动NFS服务器安装包并将分区添加到/etc/fstab文件后,您现在可以启动NFS服务器。在Fedora系统中,需要启用并启动两个服务:rpcbind和nfs-server。使用systemctl命令来完成这项工作。#启动NFS服务器和rpcbind$sudosystemctlenablerpcbind.service$sudosystemctlenablenfs-server.service$sudosystemctlstartrpcbind.service$sudosystemctlstartnfs-server.service在Raspbian或其他基于Debian的发行版上,您只需使用systemctl命令启用并启动nfs-kernel-server服务,方法同上。RPCBindrpcbind工具用于将远程过程调用(RPC)服务映射到它侦听的端口。根据rpcbind手册页:“当RPC服务启动时,它告诉rpcbind它正在侦听的地址,以及它准备服务的RPC程序编号。当客户端想要对给定程序编号进行RPC调用时,它首先与服务器机器上的rpcbind通信,以确定RPC请求应发送到的地址。”对于NFS服务器,rpcbind会将NFS协议编号映射到NFS服务器正在侦听的端口。但是,NFSv4不需要使用rpcbind。如果您只使用NFSv4(通过从配置中删除版本2和3),则不需要使用rpcbind。我把它放在这里是为了向后兼容NFSv3。导出挂载的文件系统NFS服务器根据另一个配置文件/etc/exports决定要与哪些远程客户端共享(导出)哪些文件系统。这个文件只是一个IP(或子网)到要共享的文件系统的映射,以及一些选项(只读或读写、root删除等)。文件格式为:<目录><主机>(选项)在本例中,您将导出挂载到/srv/nfs的分区。这是“内容”部分。第二部分,主机,包括你要导出这个分区的主机。这些主机可以是单个主机:使用完全限定的域名(FQDN)或主机名、主机的IP地址指定;或一组主机:使用通配符来匹配域(例如*.example.org)、IP网络(例如无类域间路由的CIDRID)或网络组表示。第三部分包括适用于此导出的选项。ro/rw:将文件系统导出为只读或读写。wdelay:如果即将进行另一次写入,则推迟写入磁盘,以提高性能(如果您使用的是固态USB磁盘,这可能没有那么有用)root_squash:防止来宾上的任何root用户拥有root权限,并设置作为安全预防措施,将根UID添加到nfsnobody。测试将您安装在/srv/nfs的分区导出到客户端——例如膝上型电脑。确定您的客户端计算机的IP地址(在我的笔记本电脑上为192.168.2.64,但您的可能不同)。您可以将其共享到大型子网,但为了测试,将其限制为单个IP地址。这个IP的CIDR标识是192.168.2.64/32,/32子网代表一个IP。使用您喜欢的编辑器编辑/etc/exports文件并写入您的目录、主机CIDR和rw以及root_squash选项。#像这样编辑/etc/exports文件,将/srv/nfs192.168.2.64/32(rw,root_squash)替换为您系统上的信息注意:如果您从其他位置复制/etc/exports文件,或者如果您用副本覆盖原始文件,您可能需要恢复该文件的SELinux上下文。您可以使用restorecon命令进行恢复。#恢复/etc/exports文件的SELinux上下文$sudorestorecon/etc/exports完成后,重新启动NFS服务器以使/etc/exports文件的更改生效。#重启NFS服务器$sudosystemctlrestartnfs-server.service为NFS服务开启防火墙有些系统默认不运行防火墙服务。比如在Raspbian中,iptables规则是默认开启的,不同服务开启的端口可以在本机外立即使用。相反,Fedora服务器默认运行firewalld服务,因此您必须为NFS服务器(和rpcbind,如果您要使用NFSv3)打开端口。您可以使用firewall-cmd命令执行此操作。检查firewalld使用的区域并获取默认区域。对于Fedora服务器,这是FedoraServer区域。#列出区域#为简洁起见省略了一些输出$sudofirewall-cmd--list-all-zones#Rgetdefaultzoneinformation#记下默认区域$sudofirewall-cmd--get-default-zone#永久添加的nfs服务到允许的端口列表$sudofirewall-cmd--add-service=nfs--permanent#对于NFSv3,我们需要添加一些端口:nfsv3、rpc-mountd、rpc-bind$sudofirewall-cmd--add-service=(nfs3,mountd,rpc-bind)#查看默认zone中的服务,替换为你系统中使用的默认zone$sudofirewall-cmd--list-services--zone=FedoraServer#如果一切正常,重启加载firewalld$sudofirewall-cmd--reload就这样,你已经成功地用你挂载的U盘分区配置了NFS服务器,并导出到你的测试系统中进行共享。现在您可以在添加到导出列表的系统上测试安装它。测试NFS导出首先,在/srv/nfs目录中创建一个文件以从NFS服务器读取。#创建一个测试文件来分享echo"Canyouseethis?">>/srv/nfs/nfs_test现在,在您添加到导出列表的客户端系统上,首先确保安装了NFS客户端包。在Fedora系统上,它是nfs-utils包,可以使用dnf安装。Raspbian系统有libnfs-utils包,可以用apt-get安装。安装NFS客户端包:#Installthenfs-utilspackagewithdnf$sudodnfinstallnfs-utils安装客户端包后,您可以测试NFS导出。同样在客户端,使用带有NFS服务器IP和导出路径的mount命令,并将其安装到客户端的某个位置,在此测试中为/mnt目录。在这个例子中,我的NFS服务器的IP是192.168.2.109,但你的可能不同。#将NFS服务器的输出挂载到客户端主机#确保将其替换为您主机的相应信息$sudomount192.168.2.109:/srv/nfs/mnt#检查nfs_test文件是否可见$cat/mnt/nfs_test你能看到这个吗?成功!您现在拥有一个工作的NFS服务器,它可以与多个主机共享文件,允许多个读/写访问,并为您的数据提供集中存储和备份。在您的家庭实验室中共享存储有很多选择,但NFS是一个古老的、高效的、很好的选择,可以添加到您的“家庭私有云”家庭实验室。本系列的后续文章将详细介绍如何在客户端自动挂载NFS共享,以及如何使用NFS作为Kubernetes持久卷的存储类。