Linux iscsi的基于lvm实现快速块存储服务

            iscsi块存储技术发展 了很多年了,Linux对其的支持十分成熟,其中iscsi target(块目标)管理工具有三类。

================================================================================================

1. iSCSI简介

从协议层次的角度看,通常所说的SCSI通常是指一组包含块命令、控制器管理、系统命令和enclosure服务等内容的协议规范,对应于回话层;而其下的物理通道和链接方式就对应在数据链路层,SCSI命令可以通过串口、Fibre Channel、SAS、infiniband、Internet、USB、PCIE等进行传输。iSCSI就是一种把异地存储资源通过TCP/IP网络映射到本地逻辑存储设备的SCSI实现。不同于NFS向用户提供按文件为单位访问远程存储的方式,它向用户提供了以块方式访问远程存储资源的接口,也就是说用户可以在本地/dev/下看到iSCSI映射后的磁盘。通常所说的target端是指远端存储资源所在的主机,比如存储服务器;而initiator端是指链接到target端并会访问远端存储资源的节点。

 

2. iSCSI target管理工具的特点

基于iSCSI的网络属性,很直观地我们能想到它基本上是基于server-client模型。提供存储资源的target相当于server,而使用远程存储资源的initiator端相当于client。基于现有的iSCSI协议规范,能够开发出target端和initiator端工具。在Linux系统上,initiator端工具可以用iscsiadm,目前大部分os都自带有这款工具;而target端的工具由于直接和性能和存储管理相关,数量更多,目前常见的有targetcli、targetadm、ietadm,它们各有所长,分别能适用不同的场合。

 

第一种:小巧玲珑的LIO targetcli

Linux的内核从Linux 2.6.38开始引入的Linux IO Target,用户态提供了targetcli命令和python开发库rtslib,为用户提供了友好的操作界面。为此,现在大部分Linux OS发现版本默认都自带了LIO targetcli。在缺省没有安装的linux OS上,用户可以参考下面的命令进行安装:

yum install targetcli.noarch targetd.noarch

===========================================================================================

.第二种:功能完备的tgtadm

在LIO出现之前,tgtadm是首选的target管理工具,被用到企业存储解决方案当中。除了LUN管理、ACL控制等功能之外,它还提供了对已连接上的initiator的检测和iSNS服务的支持。虽然界面没法和LIO的targetcli相比,但是不乏功能强大的命令来完成各种操作。

 

用户可以通过下面的命令来安装它:

yum install scsi-target-utils.x86_64

同样tgtadm后台依赖于tgtd的默默运行,虽然你可以打开debug选项来调试。

=================================================================================

第三种:精益求精的ietadm

tgtadm创建的SCSI设备实际都是在用户态中实现的,存在性能瓶颈。为了解决这个问题,企业级别的target管理工具((iSCSI Enterprise Target) 营运而生,它依赖内核模块iscsi_trgt.ko来帮助iSCSI设备的创建。此外,ietadm提供了以配置脚本的方式来设置和管理target及权限,还提供了显示discovery列表的功能。

 

从https://sourceforge.net/projects/iscsitarget/files/latest/download?source=typ_redirect

下载到源代码之后,整个目录是这个样子的:

[root@localhost iscsitarget-1.4.20.2]# ls

ChangeLog dkms.conf  etc      iscsitarget.spec  Makefile  README             README.mcs     RELEASE_NOTES

COPYING   doc        include  kernel            patches   README.initiators README.vmware  usr

用户可以make && make install, 然后make生成ietadm和它依赖的后台服务ietd。接着启动ietd服务后,就可以创建自己的LUN和ACL了。根据http://czmmiao.iteye.com/blog/2055805的描述,还有许多脚本可以用来控制哪些initiator可以discovery target

=================================================================================================

本次快速搭建使用targetcli管理工具,磁盘管理使用lvm动态扩展,系统为centos7,服务器IP地址 为192.168.0.16。增加一块8G容量的硬盘,原机只有一块硬盘,编号为sda。

yum install targetcli targetd -y ##安装的是一个管理工具和一个iscsi服务端。

fdisk /dev/sdb #切割为两个分区,第一个分区使用lvm管理

依次输入n,p,1,+5G,w。 输入命令partprobe同步磁盘更改。切割出第一个分区 /dev/sdb1

在依次输入 n,p,2,+3G,w。输入命令partprobe同步磁盘更改,切割出第二个分区 /dev/sdb2,留作扩容备用

[root@centos6 ~]# pvcreate /dev/sdb1
  Physical volume "/dev/sdb1" successfully created.
[root@centos6 ~]# vgcreate vg0 /dev/sdb1
  Volume group "vg0" successfully created
[root@centos6 ~]# lvcreate -L 4G  -n  iscsi_dev vg0
  Logical volume "iscsi_dev" created.

输入命令 targetcli 进入管理界面,依次执行以下命令:

cd backstores/block 

create dev=/dev/vg0/iscsi_dev name=iscsi-dev

cd iscsi

create iqn.2020-08.com.mytest:system1

cd iqn.2020-08.com.mytest:system1/tpg1/acls

create iqn.2020-08.com.mytest:system2

cd ../luns/

create /backstores/block/iscsi-dev

cd ../portals/

delete 0.0.0.0 3260
create 192.168.0.16 3260

exit 退出

再进入targetcli,应该如下所示:

/> ls
o- / ......................................................................................................................... [...]
  o- backstores .............................................................................................................. [...]
  | o- block .................................................................................................. [Storage Objects: 1]
  | | o- iscsi-dev .............................................................. [/dev/vg0/iscsi_dev (4.0GiB) write-thru activated]
  | |   o- alua ................................................................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ....................................................................... [ALUA state: Active/optimized]
  | o- fileio ................................................................................................. [Storage Objects: 0]
  | o- pscsi .................................................................................................. [Storage Objects: 0]
  | o- ramdisk ................................................................................................ [Storage Objects: 0]
  o- iscsi ............................................................................................................ [Targets: 1]
  | o- iqn.2020-08.com.mytest:system1 .................................................................................... [TPGs: 1]
  |   o- tpg1 ............................................................................................... [no-gen-acls, no-auth]
  |     o- acls .......................................................................................................... [ACLs: 1]
  |     | o- iqn.2020-08.com.mytest:system2 ....................................................................... [Mapped LUNs: 1]
  |     |   o- mapped_lun0 ............................................................................. [lun0 block/iscsi-dev (rw)]
  |     o- luns .......................................................................................................... [LUNs: 1]
  |     | o- lun0 ........................................................ [block/iscsi-dev (/dev/vg0/iscsi_dev) (default_tg_pt_gp)]
  |     o- portals .................................................................................................... [Portals: 1]
  |       o- 192.168.0.16:3260 ................................................................................................ [OK]
  o- loopback ......................................................................................................... [Targets: 0]
/> 

======================================================================================

以上就是服务端的配置完成,可以任意找一个客户端,可以是Linux也可以是Windows验证即可。

下面是扩容的步骤。

 

 

[root@centos6 ~]# pvcreate /dev/sdb2
  Physical volume "/dev/sdb2" successfully created.
[root@centos6 ~]# vgex
vgexport  vgextend  
[root@centos6 ~]# vgextend vg0 /dev/sdb2
  Volume group "vg0" successfully extended
[root@centos6 ~]# lvextend -L +3G  /dev/vg0/iscsi_dev 
  Size of logical volume vg0/iscsi_dev changed from 4.00 GiB (1024 extents) to 7.00 GiB (1792 extents).
  Logical volume vg0/iscsi_dev successfully resized.

扩容完成后,在Windows客户端需要重新扫描磁盘,控制面板的磁盘管理工具发现后将新增容量格式化为另一个分区即可。

Linux客户端需要执行命令 resize2fs命令 重新发现磁盘,发现后格式化即可。