你可以使用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池和文件系统
在本节中,我将使用镜像配置中的存储设备vdb和vdc创建一个ZFS池pool1。
$ sudo lsblk -e7 -d
要使用镜像配置中的存储设备vdb和vdc创建一个新的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 pool1的sharenfs属性进行如下设置。
$ sudo zfs set sharenfs='rw' pool1
或者。
$ sudo zfs set sharenfs='rw=*' pool1
为了允许网络子网192.168.122.0/24上的每台计算机/服务器只对ZFSpool1 进行读/写访问,你可以设置ZFSpool1的sharenfs属性,如下所示。
$ sudo zfs set sharenfs='rw=@192.168.122.0/24' pool1
为了只允许IP地址为192.168.122.203的计算机读写ZFS池pool1,你可以设置ZFS池pool1的sharenfs属性如下。
$ sudo zfs set sharenfs='rw=192.168.122.203' pool1
你也可以使用冒号(:)符号来允许从多个网络子网或IP地址访问ZFSpool1 。
例如,为了允许网络子网192.168.122.0/24和192.168.132.0/24读/写访问ZFSpool1,你可以设置ZFSpool1的sharenfs属性,如下所示。
$ sudo zfs set sharenfs='rw=@192.168.122.0/24:@192.168.132.0/24' pool1
同样,为了只允许IP地址为192.168.122.203和192.168.122.233的计算机对ZFSpool pool1进行读写访问,你可以设置ZFS poolpool1的sharenfs属性如下。
$ 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文件系统fs1 的sharenfs属性进行如下设置。
$ sudo zfs set sharenfs='rw' pool1/fs1
或者。
$ sudo zfs set sharenfs='rw=\*' pool1/fs1
为了允许网络子网192.168.122.0/24上的每台计算机/服务器对ZFS文件系统pool1/fs1进行读/写访问,你可以对ZFS文件系统pool1/fs1的sharenfs属性进行如下设置。
$ sudo zfs set sharenfs='rw=@192.168.122.0/24' pool1/fs1
要想只允许IP地址为192.168.122.203的计算机读写ZFS文件系统pool1/fs1,可以设置ZFS文件系统pool1/fs1的sharenfs属性如下。
$ sudo zfs set sharenfs='rw=192.168.122.203' pool1/fs1
你也可以使用冒号(:)符号来允许从多个网络子网或IP地址访问ZFS文件系统fs1。
例如,为了允许网络子网192.168.122.0/24和192.168.132.0/24读/写访问ZFS文件系统pool1/fs1,你可以设置ZFS文件系统pool1/fs1的sharenfs属性如下。
$ sudo zfs set sharenfs='rw=@192.168.122.0/24:@192.168.132.0/24' pool1/fs1
同样,为了只允许IP地址为192.168.122.203和192.168.122.233的计算机读写ZFS文件系统pool1/fs1,你可以设置ZFS文件系统pool1/fs1的sharenfs属性如下。
$ 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),你会得到如下截图所示的拒绝许可信息。
为了解决这个问题,你可以采取以下措施之一。
- 在NFS服务器的/pool1(ZFS poolpool1)和/pool1/fs1(ZFS文件系统fs1)目录下设置0777权限,这样每个人都可以写入ZFS poolpool1和文件系统fs1。这种方法有很大的安全风险。所以,我不建议这样做,除非你是为了测试而使用它。
- 在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,你必须将ZFSpool1的sharenfs属性设置为关闭,如下所示。
$ sudo zfs set sharenfs=off pool1
ZFSpool1的NFS共享应该被禁用,你可以在下面的截图中看到。
$ sudo zfs get sharenfs pool1
以同样的方式,你可以通过将ZFS文件系统fs1 的sharenfs属性设置为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共享进行写入访问。