ZFS卷是块状存储设备,其工作方式与任何其他存储设备(HDD/SSD)类似。你可以创建分区表,创建新的分区,格式化这些分区,创建文件系统,并在你的计算机上安装它们。
你还可以通过iSCSI协议共享ZFS卷,并从远程计算机访问它们。
在这篇文章中,我将向你展示如何通过iSCSI共享ZFS卷并从远程计算机访问它们。我将使用Ubuntu 20.04 LTS操作系统进行演示。然而,本文所展示的步骤经过一些调整也应该适用于其他Linux发行版。
让我们开始吧。
目录。
- 网络图
- 在iSCSI服务器上安装tgt
- 在iSCSI客户端上安装open-iscsi
- 创建一个ZFS池
- 创建ZFS卷
- 创建iSCSI目标
- 将ZFS卷添加到iSCSI目标上
- 配置iSCSI验证(可选)
- 生成iSCSI服务器配置
- 通过iSCSI访问共享的ZFS卷宗
- 通过iSCSI自动挂载共享的ZFS卷宗
- 总结
- 参考资料
网络图。
在这篇文章中,我将设置两台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.vol1和 iqn.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.vol1和iqn.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.vol1的node.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 管理工具
[5] iSCSI 命名规则