如何通过iSCSI共享ZFS卷轴

1,637 阅读7分钟

ZFS卷是块状存储设备,其工作方式与任何其他存储设备(HDD/SSD)类似。你可以创建分区表,创建新的分区,格式化这些分区,创建文件系统,并在你的计算机上安装它们。

你还可以通过iSCSI协议共享ZFS卷,并从远程计算机访问它们。

在这篇文章中,我将向你展示如何通过iSCSI共享ZFS卷并从远程计算机访问它们。我将使用Ubuntu 20.04 LTS操作系统进行演示。然而,本文所展示的步骤经过一些调整也应该适用于其他Linux发行版。

让我们开始吧。

目录。

  1. 网络图
  2. 在iSCSI服务器上安装tgt
  3. 在iSCSI客户端上安装open-iscsi
  4. 创建一个ZFS池
  5. 创建ZFS卷
  6. 创建iSCSI目标
  7. 将ZFS卷添加到iSCSI目标上
  8. 配置iSCSI验证(可选)
  9. 生成iSCSI服务器配置
  10. 通过iSCSI访问共享的ZFS卷宗
  11. 通过iSCSI自动挂载共享的ZFS卷宗
  12. 总结
  13. 参考资料

网络图。

在这篇文章中,我将设置两台Ubuntu 20.04 LTS电脑: iscsi-server和iscsi-client。我将在 iscsi-server计算机上安装ZFS和iSCSI服务器软件,并将其配置为通过iSCSI共享ZFS卷。

我将在 iscsi-client计算机上安装 iSCSI客户端软件,并将其配置为通过iSCSI访问从iscsi-server计算机上导出的ZFS卷。

整个设置在下图中显示出来。

在iSCSI服务器上安装tgt。

在本节中,我将向你展示如何在iscsi-server计算机上安装iSCSI服务器软件包tgt。

首先,更新APT软件包库的缓存,如下所示。

$ sudoapt update

然后,用以下命令在iscsi-server计算机上安装tgt包。

$ sudoaptinstalltgt-y

如果你在iscsi-server计算机上还没有安装ZFS,你可以用下面的命令安装它。

$ sudoaptinstallzfsutils-linux-y

在iSCSI客户端上安装open-iscsi。

在本节中,我将向你展示如何在iscsi-client计算机上安装 iSCSI客户端软件包open-iscsi

首先,用以下命令更新APT软件包库的缓存。

$ sudoapt update

然后,用下面的命令在iscsi-client计算机上安装 open-iscsi软件包

$ sudoaptinstallopen-iscsi-y

创建一个ZFS池。

为了演示,我将在iscsi-server计算机上使用vdb和vdc存储设备创建一个ZFS池,pool1。

$ sudolsblk-e7 -d

创建一个ZFS池,pool1,使用vdb和vdc存储设备进行镜像配置,方法如下。

$ sudozpool create-fpool1 mirror vdb vdc

一个新的ZFS池,pool1,应该在iscsi-server计算机上创建。

$ sudozfs list

创建ZFS卷。

在本节中,我将向你展示如何在ZFS池pool1上创建ZFS卷vol1和vol2**,**以便你可以通过iSCSI导出它们。

要在ZFS池pool1上创建一个大小为1GB的ZFS卷vol1,运行以下命令。

$ sudozfs create-V1G pool1/vol1

要在ZFS池pool1上创建一个大小为2GB的ZFS卷vol2,运行下面的命令。

$ sudozfs create-V2G pool1/vol2

ZFS卷vol1和vol2应该在ZFS池pool1中被创建。

$ sudozfs list

创建iSCSI目标。

一个iSCSI目标就像一个命名的容器。你可以把一个或多个ZFS卷放在那里。当你从其他计算机访问一个目标时,你放在该容器中的所有ZFS卷将被挂载。

iSCSI目标名称有一个标准格式。

iqn. -< mm>.:.

这里。

- 4位数格式的年份,即2021年、2018年

- 2位数格式的数字月。应在01-12范围内,即01(一月),08(八月),12(十二月)。

- 反向格式的完全合格域名。即iscsi.linuxhint.com应该写成com.linuxhint.iscsi

<唯一标识符>- 它可以是你设置中唯一的东西。对于小型家庭和办公室的设置,你可以使用ZFS池的名称和卷的名称**(即pool1.vol1,pool1.vol2**)或者将使用这些共享卷的客户的部门/分支名称**(即engineering.pc1,account.pc2,engineering.us-1,account.uk-2**)。这应该是足够独特的。在一个大公司里,你可以为每个目标使用一个唯一的UUID。

在本节中,我将向你展示如何创建 两个iSCSI目标:iqn.2021-08.com.linuxhint.iscsi:pool1.vol1iqn.2021-08.com.linuxhint.iscsi:pool1.vol2。在下一节中,我将向你展示如何向这些目标添加ZFS卷。

要创建一个 iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1,并为该目标设置1的ID,运行以下命令。

$ sudotgtadm--lldiscsi--opnew--modetarget--tid 1 --targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol1

用同样的方法,运行下面的命令来创建一个iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2,并为该目标设置一个ID为2。

$ sudotgtadm--lldiscsi--opnew--modetarget--tid 2 --targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol2

要列出所有你已经创建的目标,请运行以下命令。

$ sudotgtadm--lldiscsi--opshow--modetarget

你所创建的目标应该被列出,正如你在下面的截图中看到的那样。

将ZFS卷添加到iSCSI目标中。

您将添加到目标的ZFS卷被称为 LUN(逻辑单元)

如前所述,您可以在一个iSCSI目标中添加一个或多个ZFS卷。但是,如果你这样做,当你从其他计算机访问该目标时,你添加到该目标的所有ZFS卷将被挂载。因此,如果你想允许每个iSCSI目标只访问一个ZFS卷,那么就只在一个iSCSI目标上添加一个ZFS卷。

在本节中,我演示了如何将ZFS卷vol1和vol2分别添加到目标 iqn.2021-08.com.linuxhint.iscsi:pool1.vol1和iqn.2021-08.com.linuxhint.iscsi:pool1.vol2

iSCSI目标中的每个LUN都有一个ID,从0开始。 所以,第一个LUN被称为LUN 0。 然后,第二个LUN被称为LUN 1,而第三个LUN被称为LUN 2,以此类推。

默认情况下,每个iSCSI目标的LUN 0将被一个iSCSI控制器占用,如下面的截图所示。所以,你将不得不使用LUN 1、LUN 2,以此类推,将你的ZFS卷添加到iSCSI目标上。

$ sudotgtadm--lldiscsi--opshow--modetarget

为了将ZFS池pool1中的ZFS卷vol1 作为LUN 1添加到目标ID 1**(iqn.2021-08.com.linuxhint.iscsi:pool1.vol1**),运行以下命令。

$ sudotgtadm--lldiscsi--opnew--modelogicalunit--tid 1 --lun 1 --backing-store /dev/pool1/vol1

为了将ZFS池中ZFS卷vol2 作为LUN 1添加到目标ID 2**(iqn.2021-08.com.linuxhint.iscsi:pool1.vol2**),运行以下命令。

$ sudotgtadm--lldiscsi--opnew--modelogicalunit--tid 2 --lun 1 --backing-store /dev/pool1/vol2

ZFS卷vol1应该被添加到iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1作为LUN 1,如下图所示。

$ sudotgtadm--lldiscsi--opshow--modetarget

ZFS卷vol2应该被添加到iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2作为LUN 1,如下图所示。

配置iSCSI验证(可选)。

在本节中,我将向你展示如何为iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1iqn.2021-08.com.linuxhint.iscsi:pool1.vol2启用基本用户名和密码验证。

如果你不想为你的iSCSI目标启用认证,你可以愉快地跳过这一节。

首先,用下面的命令创建一个新的iSCSI用户linuxhint1,密码是123456(你以后必须改变它)。

$ sudotgtadm--lldiscsi--opnew--modeaccount--userlinuxhint1--password 123456

用同样的方法,用下面的命令创建另一个iSCSI用户linuxhint2,其假密码为456789(你以后必须改变它)。

$ sudotgtadm--lldiscsi--opnew--modeaccount--userlinuxhint2--password 456789

iSCSI用户linuxhint1和linuxhint2应该被创建,你可以在下面的截图中看到。

$ sudotgtadm--lldiscsi--opshow--modeaccount

为了只允许linuxhint1用户从远程iSCSI客户端访问iSCSI目标ID 1(iqn.2021-08.com.linuxhint.iscsi:pool1.vol1),运行以下命令。

$ sudotgtadm--lldiscsi--op bind --modeaccount--tid 1 --userlinuxhint1

同样,为了允许linuxhint2用户从远程iSCSI客户端访问iSCSI目标ID 2(iqn.2021-08.com.linuxhint.iscsi:pool1.vol2),运行以下命令。

$ sudotgtadm--lldiscsi--op bind --modeaccount--tid 2 --userlinuxhint2

linuxhint1用户账户应该被添加到 iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1,你可以在下面的截图中看到。

$ sudotgtadm--lldiscsi--opshow--modetarget

linuxhint2用户账户也应该被添加到 iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2,正如你在下面的截图中看到的。

生成iSCSI服务器配置。

在这一节中,我将向你展示如何为iSCSI服务器生成一个配置文件,这样你所做的改变将是持久的,并在系统重启后仍然存在。

首先,允许从任何iSCSI客户端访问iSCSI目标ID 1(iqn.2021-08.com.linuxhint.iscsi:pool1.vol1),如下所示。

$ sudotgtadm--lldiscsi--op bind --modetarget--tid 1 --initiator-addressALL

以同样的方式,允许从任何iSCSI客户端访问iSCSI目标ID 2(iqn.2021-08.com.linuxhint.iscsi:pool1.vol2),如下所示。

$ sudotgtadm--lldiscsi--op bind --modetarget--tid 2 --initiator-addressALL

现在,将当前的iSCSI服务器配置转储到iSCSI服务器配置文件**/etc/tgt/targets.conf**中,方法如下。

$ sudotgt-admin--dump | sudo tee /etc/tgt/targets.conf

当前的iSCSI服务器配置应该被保存到**/etc/tgt/targets.conf**文件中。

用户密码将不会被保存。因此,你必须在**/etc/tgt/targets.conf文件中用用户密码替换PLEASE_CORRECT_THE_PASSWORD字符串**。

用nano文本编辑器打开iSCSI服务器配置文件**/etc/tgt/targets.conf**,方法如下。

$ sudo nano /etc/tgt/targets.conf

在这里用各自的用户密码替换字符串PLEASE_CORRECT_THE_PASSWORD

对于linuxhint1用户,我将设置密码secret1,而对于linuxhint2用户,我将设置密码secret2,如下图所示。

完成后,按**+X,然后按Y和**,保存 /etc/tgt/targets.conf文件

为了使更改生效,重新启动iscsi-server计算机

$ sudoreboot

一旦iscsi-server计算机启动,iSCSI服务器应该在3260端口运行,如下面的截图所示。

$ sudoss-tlpn

通过iSCSI访问共享的ZFS卷。

一旦你在iscsi-server计算机上设置了 iSCSI服务器,你可以在iscsi-client计算机上通过iSCSI访问ZFS卷vol1和vol2

要从iscsi-server计算机访问iSCSI目标,你需要知道 iscsi-server计算机的IP地址。在我的例子中,我的iscsi-server计算机的IP地址是192.168.122.98。对你来说,这将是不同的。所以,请确保从现在开始用你的地址来替换它。

$ hostname -I

要从 **iscsi-server(IP地址192.168.122.98)**发现所有的iSCSI目标,运行以下命令。

$ sudoiscsiadm- - modediscovery--typesendtargets--portal192.168.122.98

你可以看到,iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1和iqn.2021-08.com.linuxhint.iscsi:pool1.vol2被列出。

如果你没有设置认证,你应该能够通过以下命令访问iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol1--login

以同样的方式,你可以通过以下命令访问iqn.2021-08.com.linuxhint.iscsi:pool1.vol2的iSCSI目标

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol2 -login

如果你为iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1和iqn.2021-08.com.linuxhint.iscsi:pool1.vol2启用了认证,你应该收到一个授权失败信息,如下图所示。

要成功登录到启用了认证的iSCSI目标,请为每个启用了认证的iSCSI目标设置认证方法、用户名和密码。

你可以用以下命令将iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1的认证方法设置为CHAP

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol1--opupdate--namenode.session.auth.authmethod--valueCHAP

你可以用以下命令将iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1的登录用户名设为linuxhint1

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol1--opupdate--namenode.session.auth.username--valuelinuxhint1

你可以用以下命令将iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1的登录密码设置为secret1

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol1--opupdate--namenode.session.auth.password--valuesecret1

一旦你完成了iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1的认证方式、登录用户名和密码的设置**,你应该可以成功登录到iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1**.vol1。

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol1--login

一旦你成功登录到iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1,一个新的SCSI磁盘sda应该被连接到 iscsi-client计算机。注意,在你的情况下可能有所不同。

$ sudo dmesg | grep -Iattached

正如你所看到的,一个大小为1GB的新存储设备sda被添加到iscsi-client计算机上。它是你通过iSCSI共享的ZFS卷vol1。

$ sudolsblk-e7 -d

以同样的方式,用下面的命令将iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2的认证方法设置为CHAP

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol2--opupdate--namenode.session.auth.authmethod--valueCHAP

用以下命令将iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2的登录用户名设为linuxhint2

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol2--opupdate--namenode.session.auth.username--valuelinuxhint2

用以下命令将 iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2的登录密码设置 为secret2

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol2--opupdate--namenode.session.auth.password--valuesecret2

用以下命令登录到iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol2--login

你应该能够成功登录到 iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2

一旦你成功登录到iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2,一个新的SCSI磁盘sdb应该被连接到iscsi-client计算机。注意,在你的情况下可能有所不同。

$ sudo dmesg | grep -Iattached

正如你所看到的,一个大小为2GB的新的存储设备sdb被添加到 iscsi-client计算机上。它是你通过iSCSI共享的ZFS卷vol2。

$ sudolsblk-e7 -d

通过iSCSI自动安装共享的ZFS卷。

要自动登录到一个iSCSI目标,你必须把iSCSI目标的node.startup属性设置为自动。

要将iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol1node.startup属性设置为自动,运行以下命令。

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol1--opupdate--namenode.startup--valueautomatic

要将iSCSI目标iqn.2021-08.com.linuxhint.iscsi:pool1.vol2的node.startup属性设置为自动,请运行以下命令。

$ sudoiscsiadm--modenode--targetnameiqn.2021-08.com.linuxhint.iscsi:pool1.vol2--opupdate--namenode.startup--valueautomatic

最后,启用open-iscsi systemd服务,使其在启动时自动启动,命令如下。

$ sudosystemctlenableopen-iscsi

为了使这些变化生效,用下面的命令重新启动iscsi-client 计算机

$ sudoreboot

一旦iscsi-client计算机启动,你应该看到iscsi-client计算机上的 sda和sdb存储设备,如下图所示。

$ sudolsblk-e7 -d

总结。

在这篇文章中,我已经向你展示了如何创建ZFS卷并通过iSCSI共享它们。此外,我还向你展示了如何为iSCSI目标设置认证。我向你展示了如何远程登录到iSCSI目标并访问共享的ZFS卷。

参考资料。

[1] Ubuntu手册:tgtadm - Linux SCSI目标管理工具

[2] Ubuntu手册:tgt-admin - Linux SCSI目标配置工具

[3] Ubuntu Manpage: iscsiadm - open-iscsi 管理工具

[4] 服务 - iscsi | Ubuntu

[5] iSCSI 命名规则