使用iscsi创建网络共享储存

Linux ginotang 2525℃ 0评论

什么是SAN

SAN(Storage Area Network)区域储存网络,简单来说,它提供的是一种共享存储空间,类似于samba,NFS。但它们主要有以下不同的地方:

  • samba和NFS在服务器端已经提供了文件系统,客户端挂载后直接可以使用;而SAN只负责提供存储设备,不负责文件系统的创建,使用什么文件系统由客户端自己决定(通过格式化创建)。

  • samba共享的目录挂载后表现为一个网络存储设备;而SAN设备连接后完全表现为一个本地磁盘。

  • 它们的传输协议不同,SAN一般通过fibre channel传输,而其他两个则通过网络协议传输,通常是tcp协议。

  • SAN成本可能会比较高,虽然也有廉价的解决方案

SAN并不依赖于特定环境,无论是windows还是linux操作系统,都可以提供SAN服务和使用SAN设备。

Target和Initiator

target和initiator是SAN的两个核心概念。target是一个或多个存储设备(LUN)的集合,由服务器端创建;而initiator则是客户端使用的工具,用来连接服务器端创建的target

在centos7中安装iscsi环境

在centos7下面,target和initiator分别对应两个软件包,它们分别是scsi-target-utilsiscsi-initiator-utils

安装scsi-target-utils

通过下面的命令安装scsi-target-utils

安装完毕之后,我们查看一下它提供了什么配置文件:

可以看到,它提供的配置文件不多,在上面的文件中,我们主要关注/etc/tgt/targets.conf文件。

创建用于共享的设备

iscsi可以使用多种设备向外提供服务器:

  • 用dd命令生成的文件
  • 一个磁盘分区或者整个磁盘
  • LVM(logical volume manager)

下面我们分别创建两种类型的设备来共享出去,这两种类型是dd虚拟出来的磁盘和lvm创建的磁盘。

通过dd命令创建虚拟磁盘

下面我们使用dd命令创建一个500m的虚拟磁盘

/srv/iscsi目录如果不存在的话请先创建出来。

创建lvm设备

lvm设备不难创建,只是比dd命令多几个步骤

首先通过gdisk命令(如果磁盘是mbr,则可以使用fdisk)分一个2g的分区:

分区准备好就可以开始创建lv

整个过程不需要几分钟,一切准备就绪,下面正式开始配置target。

编写targets.conf

targets.conf在/etc/tgt目录下面,从它的文件名可以看出,文件里面必定是target的配置集合,target的配置语言类似于xml。

target和iqn

iqn全称ISCSI Qualified Name,它是target的唯一标识符,客户端正是通过这个标识符找到target的。IQN有一个命名标准,例如:iqn.2001-04.com.example:storage1

当然这只是一个标准,尊不遵守还是由我们自己决定。上面的IQN分为4个部分,分别是:1,以iqn开头。2,年月组成的时间。3,域名的倒转写法。4,用冒号分隔的名称,这个名称有意义更好。这四个部分以点和最后的冒号连接。

一个最简单的target配置

要target可以完全工作,不需要太多的设置,例如:

除去targets.conf中的注释和空行,就只有上面的内容,其中target标签包裹的内容完全是我们自己添加上去的。

虽然配置文件就是这么多,但是一个重要的东西必须要注意,那就是selinux,由于selinux的限制,sharedisk.img文件现在是不能被tgtd访问的,必须把他的文件类型设置为tgtd_var_lib_t

到这里为止,就可以重启tgtd服务,之后客户端就可以通过initiator连接这个target了。

targets.conf常用指令

targets.conf文件中的最高层标签是,它包含一系列配置指令,其中最常用的有:

  • backing-store:定义一个逻辑单元(LUN),这个LUN通常是一个普通文件或者块设备
  • direct-store:作用和backing-store相同,不同的是它的LUN类型通常是物理设备,例如整个硬盘
  • initiator-address:限制可以连接target的客户端地址范围
  • incominguser:限制可以连接target的客户端用户

限制客户端访问

处于安全考虑,我们可以只允许特定的ip地址或指定的用户才能连接target

其中incominguser中定义的用户和/etc/passwd中的用户没有任何关系。

配置客户端

客户端的功能由iscsi-initiator-utils提供,它只有一个配置文件,就是/etc/iscsi/iscsid.conf。虽然它只提供了一个配置文件,但同时也提供了2个服务和一个主要命令:

  • iscsid:iscsi客户端守护进程,启动这个服务后iscsiadm命令才能正常工作
  • iscsi:自动登录target的程序,运行一次后退出
  • iscsiadm:客户端管理target的命令

启动服务

如上所述,客户端依赖iscsid和iscsi两个服务,因此必须先启动它们,还有设置它们开机自动启动

修改iscsid.conf配置文件

对iscsid.conf文件的修改不多,主要是添加账号验证:

这两个字段对应服务器的incominguser的用户和密码,如果服务器没有设置权限,我们甚至不需要修改iscsid.conf就可以使用iscsiadm命令连接target。

发现target

意思就是搜索服务器提供了什么target,它们的IQN是什么,如果你已经知道target的IQN,那么可以跳过这个步骤直接连接target。

如果成功,返回服务器的target列表。

参数说明:

-m: mode,即模式,常用的有node和discovery

-t:通常都是使用sendtargets

-p:portal,指服务器的ip地址和端口,如果没有设置端口,使用默认的3260

从linux登录target(连接target)

通过上一个步骤取得target的名称之后,就可以进行target的连接,target连接之后,就可以对target进行操作。

参数说明:

-T:指定target名称(IQN)

–login:登录到target(也可以使用-l,小写L)

登录成功可以使用lsblk命令查看:

会发现多了一个磁盘sdb,到这一步,我们就可以使用这个磁盘进行常规操作,例如分区,格式化。

从windows登录target

windows提供了一个方便的target连接工具,名称为ISCSI发起程序,win7之后的系统默认自带,xp可以从官方网站下载相关程序。

首先打开发起程序,然后切换到发现标签,点击发现门户:

windows initiator

在发现目标门户中输入服务器的ip地址,点击确定,成功后切换回目标标签,选择要连接的目标,然后点击连接,会出现连接到目标对话框:

login

如果服务器有访问控制,则选择高级按钮:

login2

勾选启用CHAP登录,输入名称和目标机密,确定后回到之前的窗口,继续进行连接即可。不过,windows下面的发起程序要求目标机密长度必须大于等于12为字符,否则会提示错误。

targetcli

targetcli是centos7之后用来替换scsi-target-utils的一个交互shell程序,因此,如果你的系统是centos7,那么推荐使用targetcli(scsi-target-utils依然可用)。

scsi-target-utils是通过配置文件来设置target的,targetcli虽然也有配置文件,但基本上我们都不需要手动去修改,而是通过targetcli的shell去完成这些工作。

它们之间还有不同的是:targetcli不需要重启守护进程,创建好后就马上生效,除非手动编辑了配置文件/etc/target/saveconfig.json

安装targetcli

targetcli是通过目录树的方式管理iscsi对象的,安装好后可以启动targetcli

目录树的根是/,下面包含几个子目录:

  • backstores:存储对象,按照不同类型划分不同的子目录:
    • block:保存的是块设备
    • fileio:保存的是文件类型设备,类似于前面使用dd命令创建的文件
    • pscsi:本地实体scsi设备
    • ramdisk:内存磁盘
  • iscsi:保存target的相关属性,例如acl,portal等

创建target

和之前的一样,target的创建也是分几步走。

通过非交互的方式使用targetcli

第一步:要先创建虚拟磁盘,不过这次我们不用dd命令,targetcli包含了这个功能

第二步:创建target

targetcli在创建target的时候会默认创建一个TPG,并把该target放置于这个TPG下面,一个TPG可以包含多个target,TPG的作用类似分组,就是把多个需要使用相同设置(例如权限)的target集中管理

这一步创建的target还不能被使用,因为它还没有被输出(export)

第三步:输出target

输出target的意思是利用第一步创建的虚拟磁盘来建立一个LUN

第四步:关闭ACL验证

targetcli默认开启ACL,如果不需要这个功能,通过下面的方式关闭

注意这里1是关闭acl验证,而0是开启验证;可以理解generate_node_acls为是否忽略acl验证。

第五步:查看最后结果

到这一步位置,就可以通过客户端连接这个target。

第六步:服务器开机自动启动target服务

target服务通过targetctl恢复target的配置文件,即/etc/target/saveconfig.json文件。

通过交互shell创建target

通过交互方式使用targetcli可以获得更好的操作体验,因为交互方式可以使用两次tab来获得自动提示。除此之外,交互式和非交互式的使用方法并无不同的地方

交互创建target的完整例子:

转载请注明:Pure nonsense » 使用iscsi创建网络共享储存

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x