targetcli

targetcli

  targetcli是操作iSCSI目标的命令行工具。
  通过iSCSI目标(target),我们可以通过网络将服务器上的磁盘提供给iSCSI发起者(initiator)。iSCSI发起者可以通过iSCSI目标使用远程服务器上的磁盘,就好像磁盘就在本地似的。
  按照服务器/客户端的模型,iSCSI目标就是服务器,而iSCSI发起者就是客户端。
  下面我们通过实验的方式描述targetcli的使用。

实验环境

  我们使用两台服务器分别作为服务器和客户端,两者都安装了CentOS 7.4操作系统,并且品配置了网络,以确保其能连接国际互联网。
服务器:IP地址为:12.0.60.151,作为iSCSI目标,即ISCSI的服务器。用来向iSCSI发起者提供磁盘。
客户端:IP地址为:12.0.60.152,作为iSCSI发起者,即ISCSI的客户端。用来连接iSCSI目标,以使用其提供的磁盘。
配置iSCSI目标

  首先,我们需要在服务器配置iSCSI目标,以向网络上的其它计算机提供存储磁盘。
  要配置iSCSI目标,我们需要安装软件包targetcli。其安装命令很简单:

yum -y install targetcli

  安装成功之后,可以通过以下命令来启动对应的服务,以及设置服务随系统启动:

systemctl start target
systemctl enable target

  软件包targetcli中包含命令targetcli,它与其它普通命令有所不同。执行targetcli命令后,会进入它自己的shell。在自己的shell中,可以使用cd和ls命令。它和bash shell类似,也支持tab补全。下面是一个进入targetcli后,执行ls的示例:



  从上图可以看出,ls命令以树的形式列出了其内容,包括backstores、iscsi和loopback。其中backstores指的是不同类型的本地存储资源,这些存储资源可以作为磁盘提给网络上的其它计算机使用。backstores包括四种类型:block、fileio、pscsi和ramdisk。
  fileio类型就是将文件作为磁盘,这种类型的磁盘支持write-back模式和write-thru模式。write-back模式使用本地文件系统的缓存,用来提升读写的性能,但是也增加了异常情况(例如突然断电的情况)下数据丢失的风险。
  block类型就是将本地的实际块磁盘作为目标,提供给网络上的其它计算机。
  pscsi类型就是将本地任意类型的SCSI设备作为目标,提供给网络上的其它计算机。如果此SCSI设备为块磁盘,建议使用block类型。
  ramdisk类型将一段内存作为一个SCSI块设备。因为内存是易失性的,此类型磁盘中的数据在系统重启之后就会丢失,所以这种类型只适用用于测试场景。
  下面的例子中,我们使用了block和fileio类型。可以使用命令lsblk查看当前系统中的硬盘:



  从图中可以看出,系统中有两块硬盘vda和vdb。我们要将vdb作为后端存储。使用命令:

/> backstores/block create name=vbd_iscsi dev=/dev/vdb




  使用临时文件/tmp/diskfile创建fileio类型的后端存储,命令为:

/> backstores/fileio create diskfile_iscsi /tmp/diskfile 1G write_back=false




  创建block和fileio类型的后端存储之后,我们创建对应的iSCSI目标:

/> iscsi/ create iqn.2019-06.com.fmttr:target




  接下来我们创建LUN(Logical Unit Number):

/> iscsi/iqn.2019-06.com.fmttr:target/tpg1/luns create /backstores/block/vbd_iscsi
Created LUN 0.
/> iscsi/iqn.2019-06.com.fmttr:target/tpg1/luns create /backstores/fileio/diskfile_iscsi




  然后,我们需要配置ACL(Access Control List)来允许指定的iSCSI发起者连接iSCSI目标。iSCSI发起者位于客户端12.0.60.152上。iSCSI发起者的标识位于文件/etc/iscsi/initiatorname.iscsi,可以使用自动生成的值,也可以编辑此文件使用用户自定义的值。

cat /etc/iscsi/initiatorname.iscsi





/> iscsi/iqn.2019-06.com.fmttr:target/tpg1/acls create iqn.2019-06.com.fmttr:317193865ccd




  最后执行退出命令exit,就会退出targetcli,并且将所有配置写入文件/etc/target/saveconfig.json中:



  iSCSI默认通过3260端口进行通信,下面的命令配置防火墙将3260端口添加到允许列表中:

firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload

  或者通过以下命令关闭防火墙,并且设置防火墙不随系统启动:

systemctl stop firewalld
systemctl disable firewalld

  至此,服务器端上的配置就完成了。剩下就是转到客户端上进行操作了。


配置iSCSI发起者

  iSCSI发起者位于客户端12.0.60.152。我们先安装包iscsi-initiator-utils:

yum -y install iscsi-initiator-utils

  启动并使能相关服务iscsid和iscsi:

systemctl start iscsid iscsi
systemctl enable iscsid iscsi

  可以通过iscsiadm的discovery模式查看远端服务器上提供的iSCSI目标:

iscsiadm --mode discovery --type sendtargets --portal 12.0.60.151




  通过iscsiadm登录到指定iSCSI目标后,就可以像使用本地磁盘一样使用远端的iscsi磁盘了。命令如下:

iscsiadm -m node -T iqn.2019-06.com.fmttr:target -l




  上图通过lsblk命令可以查看登录前后磁盘的情况。可以看到,登录后多了磁盘sda和sdb。可以使用--scsi选项查看磁盘的scsi的信息

lsblk --scsi




  从图中可以看到sda就是我们在服务器上配置的vbd_iscsi,而sdb对应于diskfile_iscsi。至此我们就可以像使用本地磁盘一样使用这些iSCSI磁盘了,例如对磁盘进行格式化,挂载、写入文件等等操作。
  有登录命令,就有对应的登出命令:iscsiadm -m node -u。执行登出命令后,对应的iSCSI磁盘就断开了与本机的连接。





总结

  通过上面实验,我们讲解了如何使用iSCSI的命令targetcli和iscsiadm。targetcli用于在服务器上将磁盘作为iSCSI目标提供出来,而iscsiadm用于在客户端上连接服务器上的iSCSI目标。连接成功之后,就可以像使用本地磁盘一样使用iSCSI磁盘。最后可以使用登出命令断开iSCSI目标与本机的连接。
参考资料:
  Linux-IO Target介绍(一)
  targetcli(8) - Linux man page