如何用NFS共享ZFS文件系统——详细教程

1,519 阅读5分钟

你可以使用NFS(网络文件系统)文件共享协议共享你的ZFS池和文件系统,并非常容易地从远程计算机访问它们。

在这篇文章中,我将向你展示如何使用NFS文件共享服务共享ZFS池和文件系统,并从远程计算机访问它们。那么,让我们开始吧。

网络图

在这篇文章中,我将把一台Ubuntu 20.04 LTS计算机(主机名:linuxhint,IP:192.168.122.98)配置为NFS服务器,把一台Ubuntu 20.04 LTS计算机(主机名:nfs-client,IP:192.168.122.203)配置为NFS客户端。这两台电脑都在192.168.122.0/24的子网中。我将以一种方式配置NFS服务器,即只有这个子网中的计算机/服务器能够访问NFS服务器。

图1:连接到网络子网192.168.122.0/24的NFS服务器和客户端

安装NFS服务器

你必须在你想通过NFS共享你的ZFS池/文件系统的计算机上安装NFS服务器软件包。

如果你使用的是Debian 10或Ubuntu 20.04 LTS,你可以在你的电脑上安装NFS服务器包,方法如下。

$ sudo apt install nfs-kernel-server -y

一旦NFS服务器包安装完毕,nfs**-server的systemd服务应该是激活的**。

$ sudo systemctl status nfs-server.service

安装 NFS客户端

你必须在你将通过NFS访问你的ZFS池/文件系统的计算机上安装NFS客户端软件包。

如果你使用的是Debian 10或Ubuntu 20.04 LTS,你可以运行以下命令在你的计算机上安装NFS客户端软件包。

$ sudo apt install nfs-common -y

创建ZFS池和文件系统

在本节中,我将使用镜像配置中的存储设备vdbvdc创建一个ZFS池pool1

$ sudo lsblk -e7 -d

要使用镜像配置中的存储设备vdbvdc创建一个新的ZFSpool1,运行以下命令。

$ sudo zpool create -f pool1 mirror vdb vdc

一个新的ZFS poolpool1应该被创建,ZFSpool1应该被自动挂载到**/pool1**目录下。

$ sudo zfs list

在ZFSpool1中创建一个ZFS文件系统fs1,方法如下。

$ sudo zfs create pool1/fs1

一个新的ZFS文件系统fs1应该被创建并自动挂载在**/pool1/fs1**目录下。

$ sudo zfs list

用NFS共享ZFS池

要通过NFS共享ZFS池pool1,你必须对ZFS池的sharenfs属性进行相应的设置。

为了允许网络上的每个人对ZFSpool1进行读/写访问,你可以对ZFSpool pool1sharenfs属性进行如下设置。

$ sudo zfs set sharenfs='rw' pool1

或者。

$ sudo zfs set sharenfs='rw=*' pool1

为了允许网络子网192.168.122.0/24上的每台计算机/服务器只对ZFSpool1 进行读/写访问,你可以设置ZFSpool1sharenfs属性,如下所示。

$ sudo zfs set sharenfs='rw=@192.168.122.0/24' pool1

为了只允许IP地址为192.168.122.203的计算机读写ZFS池pool1,你可以设置ZFS池pool1sharenfs属性如下。

$ sudo zfs set sharenfs='rw=192.168.122.203' pool1

你也可以使用冒号(:)符号来允许从多个网络子网或IP地址访问ZFSpool1

例如,为了允许网络子网192.168.122.0/24192.168.132.0/24读/写访问ZFSpool1,你可以设置ZFSpool1sharenfs属性,如下所示。

$ sudo zfs set sharenfs='rw=@192.168.122.0/24:@192.168.132.0/24' pool1

同样,为了只允许IP地址为192.168.122.203192.168.122.233的计算机对ZFSpool pool1进行读写访问,你可以设置ZFS poolpool1sharenfs属性如下。

$ sudo zfs set sharenfs='rw=192.168.122.203: 192.168.122.233' pool1

你可以验证sharenfs属性在ZFSpool pool1上是否被正确设置,如下所示。

$ sudo zfs get sharenfs pool1

用NFS共享ZFS文件系统

要通过NFS共享ZFS文件系统fs1 ,你必须相应地设置ZFS文件系统的sharenfs属性。

为了允许网络上的每个人对ZFS文件系统fs1进行读/写访问,你可以对ZFS文件系统fs1sharenfs属性进行如下设置。

$ sudo zfs set sharenfs='rw' pool1/fs1

或者。

$ sudo zfs set sharenfs='rw=\*' pool1/fs1

为了允许网络子网192.168.122.0/24上的每台计算机/服务器对ZFS文件系统pool1/fs1进行读/写访问,你可以对ZFS文件系统pool1/fs1sharenfs属性进行如下设置。

$ sudo zfs set sharenfs='rw=@192.168.122.0/24' pool1/fs1

要想只允许IP地址为192.168.122.203的计算机读写ZFS文件系统pool1/fs1,可以设置ZFS文件系统pool1/fs1sharenfs属性如下。

$ sudo zfs set sharenfs='rw=192.168.122.203' pool1/fs1

你也可以使用冒号(:)符号来允许从多个网络子网或IP地址访问ZFS文件系统fs1

例如,为了允许网络子网192.168.122.0/24192.168.132.0/24读/写访问ZFS文件系统pool1/fs1,你可以设置ZFS文件系统pool1/fs1sharenfs属性如下。

$ sudo zfs set sharenfs='rw=@192.168.122.0/24:@192.168.132.0/24' pool1/fs1

同样,为了只允许IP地址为192.168.122.203192.168.122.233的计算机读写ZFS文件系统pool1/fs1,你可以设置ZFS文件系统pool1/fs1sharenfs属性如下。

$ sudo zfs set sharenfs='rw=192.168.122.203: 192.168.122.233' pool1/fs1

你可以验证sharenfs属性是否在ZFS文件系统pool1/fs1上正确设置,方法如下。

$ sudo zfs get sharenfs pool1/fs1

挂载NFS共享的ZFS池和文件系统

要挂载你在电脑上通过NFS共享的ZFS池和文件系统(NFS客户端),你需要知道NFS服务器的IP地址。

你可以在你的NFS服务器上运行`hostname -I`命令来找到你的NFS服务器的IP地址。在我的例子中,IP地址是192.168.122.98

$ hostname -I

一旦你知道了NFS服务器的IP地址,你就可以从你的计算机上列出所有可用的NFS共享,方法如下。

$ showmount -e 192.168.122.98

你可以看到,ZFS池pool1和ZFS文件系统fs1分别被列为NFS共享/pool1和/pool1/fs1

创建一个目录/mnt/pool1 用于挂载NFS共享/pool1(ZFS poolpool1),如下所示。

$ sudo mkdir -v /mnt/pool1

你可以从NFS服务器192.168.122.98挂载NFS共享/pool1(ZFSpool1)到你的计算机(NFS客户端)的/mnt/pool1目录,如下所示。

$ sudo mount -t nfs 192.168.122.98:/pool1 /mnt/pool1

NFS共享/pool1应该被挂载在您的计算机(NFS客户端)的/mnt/pool1目录下。

$ df -h /mnt/pool1

以同样的方式,创建一个新的目录/mnt/fs1来挂载NFS共享/pool1/fs1(ZFS文件系统fs1),如下所示。

$ sudo mkdir -v /mnt/fs1

从NFS服务器192.168.122.98挂载NFS共享**/pool1/fs1(ZFS文件系统fs1**)到你的计算机(NFS客户端)的**/mnt/fs1**目录下,方法如下。

$ sudo mount -t nfs 192.168.122.98:/pool1/fs1 /mnt/fs1

NFS共享/pool1/fs1(ZFS文件系统fs1)应该被挂载到您的计算机(NFS客户端)的/mnt/fs1 目录下。

$ df -h /mnt/fs1

自动挂载NFS共享的ZFS池和文件系统

你可以在启动时自动挂载你的计算机(NFS客户端)上的NFS共享/pool1(ZFSpool1)和/pool1/fs1(ZFS文件系统fs1)。

要做到这一点,用nano文本编辑器打开**/etc/fstab**文件,如下所示。

$ sudo nano /etc/fstab

在/etc/fstab文件的末尾添加以下几行。

# Mount NFS shares
192.168.122.98:/pool1                       /mnt/pool1      nfs       defaults          0          0
192.168.122.98:/pool1/fs1     /mnt/fs1          nfs       defaults          0          0

一旦你完成了,按**+X**,然后按Y和**<Enter>保存**/etc/fstab文件。

为了使这些变化生效,请按以下方法重新启动你的计算机(NFS客户端)。

$ sudo reboot

下次你的计算机(NFS客户端)启动时,NFS共享/pool1(ZFS池pool1)和/pool1/fs1(ZFS文件系统fs1)应该分别挂载在/mnt/pool1和/mnt/fs1目录下。

$ df -h -t nfs4

允许对NFS共享的ZFS池和文件系统进行写入

如果你现在试图从你的电脑(NFS客户端)写到NFS共享/pool1(ZFS池pool1)或/pool1/fs1(ZFS文件系统fs1),你会得到如下截图所示的拒绝许可信息。

为了解决这个问题,你可以采取以下措施之一。

  1. 在NFS服务器的/pool1(ZFS poolpool1)和/pool1/fs1(ZFS文件系统fs1)目录下设置0777权限,这样每个人都可以写入ZFS poolpool1和文件系统fs1。这种方法有很大的安全风险。所以,我不建议这样做,除非你是为了测试而使用它。
  2. 在NFS服务器和NFS客户端计算机上创建一个组nfs-users(比方说),你想从这个组写到你的NFS共享。然后,将NFS服务器的/pool1(ZFSpool1)和/pool1/fs1(ZFS filesystemfs1)目录的组改为nfs-users。同时,为NFS服务器的/pool1(ZFS poolpool1)和/pool1/fs1(ZFS filesystemfs1)目录设置组写权限(0775)。这样,你可以在NFS客户端计算机上创建新的用户,将nfs-users设置为他们的主组,他们应该能够毫无问题地写到NFS共享。

注意:NFS将NFS客户计算机的UID(用户ID)和GID(组ID)与NFS服务器的UID和GID进行映射。因此,如果一个用户/组可以写到NFS服务器上的NFS共享,那么具有相同UID/GID的同一用户/组也应该能够从NFS客户计算机写到该NFS共享。

在本节中,我将向你展示如何在NFS服务器和客户端计算机上设置必要的用户和组,以便能够写到NFS共享。

在NFS服务器上,创建一个新的组nfs-users,并将nfs-users组的GID(组ID)设置为2000,方法如下。

$ sudo groupadd --gid 2000 nfs-users

在NFS客户端计算机上,创建一个新的组nfs-users,并将nfs-users组的GID(组ID)也设为2000

$ sudo groupadd --gid 2000 nfs-users

在NFS服务器上,将/pool1(ZFS poolpool1)和/pool1/fs1(ZFS filesystemfs1)目录的组别改为nfs-users,如下所示。

$ sudo chgrp -Rfv nfs-users /pool1

允许/pool1(ZFS poolpool1)和/pool1/fs1(ZFS filesystemfs1)目录的组读和写权限,方法如下。

$ sudo chmod -Rfv 0775 /pool1

/pool1(ZFS poolpool1)和/pool1/fs1(ZFS filesystemfs1)目录的组应该改为nfs-users,组的读/写权限也应该被设置。

$ ls -lhd /pool1  
$ ls -lhd /pool1/fs1

为了使这些变化生效,请按如下步骤重新启动NFS服务器。

$ sudo reboot

现在,你必须在你的NFS客户端计算机上创建必要的用户账户,以便能够写入NFS共享。

创建一个新的用户alex(比方说),其UID为5001(这样他们就不会干扰NFS服务器中已有的用户),并将该用户的主组设置为nfs-users,方法如下。

$ sudo useradd -m -s /bin/bash -u 5001 -g nfs-users alex

应该在NFS客户端计算机上创建一个新的用户alex,其UID为5001,主组为nfs-users(GID为2000)。

$ id alex

现在,重新启动NFS客户端计算机以使这些变化生效。

$ sudo reboot

一旦NFS客户端计算机启动,NFS共享**/pool1**(ZFS池pool1)和**/pool1/fs1**(ZFS文件系统fs1)应该被挂载。

$ df -h -t nfs4

NFS共享/pool1(ZFS poolpool1)和/pool1/fs1(ZFS文件系统fs1)也应该有正确的目录权限。

$ ls -lhd /mnt/pool1  
$ ls -lhd /mnt/fs1

现在,在NFS客户端计算机上以用户alex的身份登录,方法如下。

$ sudo su - alex

用户alex应该能够在NFS共享/pool1(ZFS池pool1)上创建文件并访问它们,你可以在下面的截图中看到。

$ echo '\[pool1\] Hello world' > /mnt/pool1/hello.txt  
$ ls -lh /mnt/pool1  
$ cat /mnt/pool1/hello.txt

用户alex也应该能够在NFS共享/pool1/fs1(ZFS文件系统fs1)上创建文件并访问它们,你可以在下面的截图中看到。

$ echo '[fs1] Hello world' > /mnt/fs1/hello.txt
$ ls -lh /mnt/fs1
$ cat /mnt/fs1/hello.txt

在NFS服务器上,用户alex从NFS客户端计算机上创建的文件的UID(用户ID)应该是5001,组应该是nfs-users,你可以在下面的截图中看到。

$ ls -lh /pool1  
$ ls -lh /pool1/fs1

如果你想把UID解析为NFS服务器上的用户名,你必须在NFS服务器上创建具有相同UID的用户(就像你在NFS客户电脑上创建的那样)。

对于少量的用户,你可以在NFS服务器和客户计算机上运行同一个useradd命令来解决这个问题。如果你必须管理大量的用户,那么手动操作将是一个很大的工作量。相反,你应该使用NIS(网络信息服务器)或LDAP(轻量级目录访问协议)在你的NFS服务器和NFS客户端计算机之间自动同步用户。

取消共享 ZFS 池和文件系统

如果你想停止共享ZFSpool1,你必须将ZFSpool1sharenfs属性设置为关闭,如下所示。

$ sudo zfs set sharenfs=off pool1

ZFSpool1的NFS共享应该被禁用,你可以在下面的截图中看到。

$ sudo zfs get sharenfs pool1

以同样的方式,你可以通过将ZFS文件系统fs1sharenfs属性设置为off来停止共享ZFS文件系统fs1 ,如下所示。

$ sudo zfs set sharenfs=off pool1/fs1

ZFS文件系统fs1 的NFS共享应该被禁用,你可以在下面的截图中看到。

$ sudo zfs get sharenfs pool1/fs1

总结

在这篇文章中,我向你展示了如何共享ZFS池和文件系统,并使用NFS文件共享协议远程访问它们。我还向你展示了如何在启动时在NFS客户端计算机上自动装载你用NFS共享的ZFS池/文件系统。我向你展示了如何管理NFS共享的访问权限,并允许从NFS客户端计算机对NFS共享进行写入访问。