终于完成最后一篇了,一上午的时间就过去了.
下文主要是对基本操作和我对iSCSI的理解,网上有很多iSCSI原理,在这里我就不写了,请自行学习.
这篇文章仅对iSCSI的很多误解做一次梳理,你必须对所有实验都自行验证,才能慢慢理解iSCSI.所有
步骤我都加上了自己的理解,请做参考,实验仅是基础,更多高级功能,还需要自行研究,这篇文章会让你
对iSCSI有基础入门的理解,但前提是,你必须要对iSCSI的原理,已经历史有一定了解,在网上有很多这样的
文章,我这里仅是通过实验的方式,让初学者,像我这样的,希望了解iSCSI的人,能不在被毫无头绪的原理困扰,
而不知道究竟该如何使用它.做一个学习总结.
另外送每个看客: 快就是慢,慢就是快!!!
---------马帮弟子:zcf
名词:
Endpoint: 目标名称与显式或屏蔽的TPG (IQN/WWN +标记)的组合。
Initiator:控制SCSI会话开启和结束的控制设备,比较典型的就是 计算机。
Target: SCSI会话的接收端,通常是磁盘驱动器、磁带驱动器或扫描仪等设备。
IQN (iSCSI限定名):iSCSI的一种名称格式,惟一标识世界上的每个设备
(例如iqn.5886.com.acme.tapedrive.sn-a12345678)。
Network Portal:iSCSI端点与IP地址和TCP端口的组合。IANA定义的iSCSI协议的TCP端口号是3260
TPG(Target Portal Group)IP地址和TCP端口号的列表,确定特定iSCSI目标将侦听哪些接口。
WWN (World Wide Name):标识特定光纤通道或InfiniBand目标的唯一标识符。
每个WWN是一个8字节的数字,来自IEEE OUI和供应商提供的信息。
targetcli的基本语法
[<path>] <command> [<parameters>]
iSCSI fabric target模块:
targetcli在处理target时,它是添加了一个中间层target portal group(TPG),TPG上层是target,
下层是该target下具体的LUN和ACL. 其他fabric模块不存在这种中间层,它们由特定的fabric模块支持的格式
WWN定义. 在创建iSCSI target时,targetcli会自动创建TPG,而其它则会屏蔽TPG.
下图为不同fabric target的结构:
bookmarks [add|del|go|show] [书签名]
引用方式: ls @书签名
cd @书签名
get [GroupName] [ParameterName]
列出给定组中的一个或多个配置参数的值。
若指定了一个组,则列出该组中的所有可用参数。
若无指定组或参数的情况下,列出所有可用的组。
如:
get global color_mode loglevel_console
set [GroupName] [ParameterName=Value...]
如:
set global color_mode=true loglevel_console=info
pwd 显示当前目录
cd 进入目录
ls 查看
refresh: 刷新
status: 显示当前节点的摘要信息.
所有可用类型:
@ bool: Boolean. Values: {TRUE|FALSE}
@ bool-iSCSI: Boolean per RFC 3720. Values: {Yes|No}
@ enum: List of alphanumeric values.
@ integer: Digits. Values: [0–9]
@ string: Alphanumeric characters
@ color: {black|blue|cyan|default|green|magenta|red|white|yellow}
@ loglevel: {critical|debug|error|info|warning}
backstore(后端存储):
BLOCK: 创建后端磁盘设备
create <name> <dev> [readonly] [wwn]
FILEIO: 仅用于测试的后端存储类型, 镜像文件
create <name> <file_or_device> [size(kK|mM|gG|tT)] [<generate_wwn>] [<buffered>]
file_or_device: 若为镜像文件,此时size可用来指定使用多少该镜像文件的空间.
若块设备,则不能使用size设置使用多少磁盘空间.
generate_wwn: 默认自动生成WWN号码.
buffered: 是否在该设备上启用写缓存,默认是禁止写缓存的.即同步I/O.
delete <StoreObjectName> #如果有lun使用这个存储对象,它们也将被删除。
PSCSI: 使用真实SCSI磁盘设备做为后端存储,iSCSI将直接使用SCSI驱动来操纵物理设备,
而不会使用SCSI模拟器.
create <name> <device>
device:可以是SCSI设备的完整路径名,也可以是SCSI设备ID。如果设备是路径名,
Datera组织建议使用/dev/disk/by- ID层次结构,以确保在重新引导或修改底层
物理SCSI系统时保持一致的命名。
不建议将设备指定为传统H:C:T:L格式的SCSI设备ID,因为SCSI ID可能随时间而变化
创建LUN:
create <storage_object> [<lun>] [<add_mapped_luns>]
storage_object:指定要关联的后端存储设备对象的绝对路径.
lun: 指定LUN编号,默认从0开始,自动分配.
add_mapped_luns: true:自动为新的LUN关联可用的节点ACL.若不指定,
默认将使用全局的auto_add_mapped_luns的值决定,
auto_add_mapped_luns它默认为true
创建节点ACL:
create <mapped_lun> <tpg_lun_iscsi> [<write_protect>]
<mapped_lun>是出现在启动程序中的映射LUN。
<tpg_lun_iscsi>是对应的TPG LUN(仅iSCSI)。
<write_protect>是一个可选的布尔参数,它指定发起者是否具有对映射LUN的写访问权。
创建端口:
create [<ip_address>] [<ip_port>]
创建一个LUN的步骤:
1.到相应目录下,创建一个Target。【不同目录所支持的命令不同】
若是iSCSI,则targetcli会自动创建TPG.其它类型的Target则会屏蔽TPG.
2.创建LUN并自动关联对应的后端存储对象上.
3.创建一个iSCSI的网络访问端口,但端口必须与一个可用IP关联。
4.定义ACL,控制可访问此LUN的客户端
5.set LUN,可定义LUN映射,即将某个LUN映射为指定LUN号,让客户端看到映射后的LUN号.[可选]
TPG下创建几个LUN最合适?
一个iSCSI可支持多个Target,窄SCSI总线可支持最多8个Target,宽SCSI总线可支持最多16个Target,
每个Target下可扩展N多个LUN,每个LUN可表示一块磁盘,因此一个Target接几个LUN?
首先:一个Target监听的端口,允许所有合法用户与其建立会话,一旦建立,这个会话将持续保持,直到发起者,
也就是客户端主动断开,该会话才会终止.
而一个Target下有多个LUN,就可能有多个客户端与该target建立会话,而iSCSI对于一个Target仅关联
到一个处理器核心上,也就意味着所有连接到该Target上的用户将共享一个CPU核心资源,那么单个TPG
下LUN数越多导致每个客户端所能获得的CPU处理资源会更少,总体性能就会下降.客户端的访问体检就会不好.
所以:资料中提示,若你的网络带宽是1GbE的,则每个TPG下最多不要超过4~8个LUN.
若你的网络是10GbE的,则每个TPG下最多不要超过8~16个LUN.
命令队列深度【并不是很理解】
fabric命令队列的深度与存储对象的TCQ深度不同。目标强制fabric命令队列深度,
以确定给定启动程序可以向给定目标端点上的所有lun发送多少未完成的I/Os。
一旦fabric命令队列清除了I/O,它仍然由底层存储对象TCQ强制执行,
TCQ为所有fabric模块导出的存储对象共享。
对于较大的存储数组,Datera建议将命令队列深度增加到128。
/iscsi/iqn.20...a0e4a11/tpgt1> set attribute default_cmdsn_depth = 128
写缓存仿真
对于不完全符合标准的iSCSI启动器(例如Red Hat RHEL5),建议在IBLOCK设备级别模拟写缓存。
要启用写缓存模拟,请在IBLOCK设备上下文中输入:
/backstores/iblock> set emulate_write_cache = 1
iSCSI的架构图:
http://www.linux-iscsi.org/Doc/LIO%20Admin%20Manual.pdf
详情可参考此英文pdf
实验环境【RHEL7】:
iscsiServer.zcf.com---------------------------client.zcf.com
192.168.10.21 192.168.10.22
注:
时间已经同步
名称都写入/etc/hosts, 互相可以解析
iscsiServer:
1. 安装iscsi
yum install targetcli
注:
从RHEL7后,使用lio替换了工作在用户空间的iSCSI target守护进程tgtd,
lio(Linux-IO(LIO)Target)是一个内核空间的iscsi target驱动级的守护进程.
它是iSCSI target的开源实现.
targetcli 是操作lio的客户端工具.
2. 创建一个无认证的iSCSI磁盘
2.1 进入targetcli的操作shell
targetcli
2.2 创建一个后端存储 块设备
/> cd backstores/block
/backstores/block> create name=blkstore dev=/dev/sdb1
注:
Backstore(后端存储):
它提供iSCSI 底层实际的物理存储设备。
它支持:
FILEIO:它是用于测试目的的镜像文件,如使用dd创建的file.img .
BLOCK : BLOCK是LIO可见的任何块设备,用于导出本机基于块的设备访问。
LVM将其逻辑卷表示为块设备,因此是导出块设备的推荐方法。
PSCSI: 对底层为物理SCSI设备提供支持,让上层LIO可直接操纵SCSI物理设备,而无需经过SCSI模拟器.
RAMDISK: 它是为内存映射为SCSI磁盘提供驱动模拟支持的后端存储类型.
它们的创建方式类似block, 可参考它的创建方式:
/backstores/block> help create #可查看create的帮助.
/backstores/block> #在所有地方,按两下tab键,可查看此上下文支持那些命令.
2.2 创建一个iscsi target
/backstores/block> cd /iscsi
/iscsi> create iqn.2019-04.com.zcf:rnode21
注:
iqn: 是iSCSI的完全合格名称.
格式:
iqn.yyyy-mm.<Reversed Domain Name>[:identifier]
如:
#2015年1月zcf.com,二楼,1号机房,1号机架,5号存储
iqn.2015-01.com.zcf:F2.R1.Farm1.5
注:
当执行create IQN ,会自动创建iSCSI Target的基本结构,这些都是可手工创建的
有变量可关闭自动创建, 具体可在 /iscsi> 这里按两下tab键查看.
但不建议关闭自动创建.
另注:
此处要特别注意: 这里创建target时,它首先创建了一个tpg(Target portal Group)
TPG实际是为了方便管理target下众多LUN,而添加的一个虚拟层.
如图中所表示的, 它就是为了方便管理而设置的.
2.3 创建一个LUN
/iscsi/iqn.20...m.zcf:rnode21> tpg1/luns
/iscsi/iqn.20...e21/tpg1/luns> create storage_object=/backstores/block/blkstore
注:
在命令后按tab键,可查看该命令支持那些可用参数.
直接写路径 和 使用 cd 路径 功能一样,都可进入该目录(准确说: 命令空间的上下文).
2.4 创建一个ACL
/iscsi/iqn.20...e21/tpg1/luns> cd ../acls
/iscsi/iqn.20...e21/tpg1/acls> create wwn=iqn.2019-04.com.zcf.blk:disktop1
创建ACL此处的目的不是认证,而是让客户端可登录iSCSI后,找到确切要访问的后端
存储设备.
注意: 这里自动创建LUN与ACL关联的变量是true, 因此,当执行create后,自动将所有
已经创建出来的LUN都关联到该ACL下. 若需要关闭, 可使用
/iscsi/iqn.20...:rnode21/tpg1> set global auto_add_mapped_luns=true
但关闭后, 你需要手动将LUN与ACL关联,并且LUN也需要手动关联.
另注:
创建一个LUN,实际是将后端存储与Target下的一个lun关联, 并且在创建一个让
客户端查看的lun编号【在上文提供的pdf中解释, 但我不是很懂】
我的理解如下:
以上创建target, lun, acl 的关系如下:
将它们以实际物理设备的形象说明比较容易理解
iSCSI驱动卡==[target0]===[target1]==.....==[targetN]====【这是Target总线,即上面创建的target】
| | |
|___[lun0]
|___[lun1] - - - - - [ACL: 客户端来访问告诉iSCSI我访问lun1]
|.....
注意: 这里假设创建了一个ACL,该ACL仅关联了lun1.
2.5 修改iSCSI监听的端口
/iscsi/iqn.20...:rnode21/tpg1> cd portals
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260
/iscsi/iqn.20.../tpg1/portals> create 192.168.10.20 3260
注:
一个target总线上可以有多个target, 不同target,都可提供一组LUN,所以
他们可监听不同的IP和端口,来对外提供iSCSI服务.
客户端配置:
1. 安装iSCSI客户端访问工具
yum install iscsi-initiator-utils
2. 修改配置文件
cd /etc/iscsi/
vim initiatorname.iscsi
InitiatorName=iqn.2019-04.com.zcf.blk:disktop1
注:
这里的WWN, 就是服务器端LUN ACL的wwn名称.
你希望此客户端访问那个LUN,就告诉它那个wwn.
3. 重启iscsi服务,重读配置文件
systemctl restart iscsi iscsid
4. 查看是否可登录iSCSI, 并测试是否可对iscsi磁盘做分区
#先发现一个iSCSI
iscsiadm -m discovery -d 2 -t sendtargets -p 192.168.10.21
#尝试登陆发现的iSCSI target
iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -l
#查看 并测试分区
fdisk -l
parted /dev/sdb mktable gpt #若成功,则说明iSCSI磁盘可分区,可挂载.
#退出登录
iscsiadm -m node -T iqn.2019-04.com.zcf:rnode21 -p 192.168.10.21 -u
#删除登录信息,避免下次系统重启后,自动连接iSCSI target
iscsiadm -m node -T iqn.2019-04.com.zcf:rnode21 -p 192.168.10.21 -o delete
5. 在登录iSCSI target 成功后, 需要关注一下这些目录
/var/lib/iscsi/nodes/
/var/lib/iscsi/send_targes/
/sys/class/iscsi_*
/sys/class/iscsi_session/
注:
当iscsi 服务器端故障,导致已建立的iscsi会话没有正常断开,这里会看到会话信息,
即便是root也不能删除, 此时似乎只能重启.
iSCSI的安全认证
这三种CHAP的关系和区别:
discovery CHAP: 全局认证.只有认证通过才能看到设备.
TPG CHAP: 一个target下的全局只读认证,若要使用TPG认证的用户名和密码,就不能配置LUN级别的ACL,
因为LUN级别的ACL优先级更高,它会覆盖TPG级别的用户名和密码.所以若要使用TPG级别的用户名
密码就不能配置LUN级别的ACL,但这样认证是正常了,但用户挂载后,就只能有读权限,而没有写权限.
LUN ACL CHAP: 这是最精确的权限控制,配置后,用户必须使用提供该ACL的WWN,以便使用该ACL的用户名和密码
做CHAP认证,否则iSCSI将无法知道用户到底提供的是那个ACL的用户名和密码,导致用户即便发现了
并且成功登录的iSCSI,也无法获取该LUN设备的写权限.
实验:
测试1:
discovery CHAP + TPG CHAP认证配置:
discovery CHAP:
1. 启用发现CHAP认证
/> cd iscsi/
/iscsi> #下面都在此目录下操作
set discovery_auth enable=true
2. 启用单向CHAP认证, 客户端必须提供这里设置的用户名和密码,才能发现iSCSI输出的target.
set discovery_auth userid=discoveryUser1 password=discoveryPasswd1
3. 启用双向CHAP认证,即客户端要提供上面设置的服务器端的用户名和密码,
同时服务器端必须提供客户端所设置的用户名和密码,才能认证通过.
set discovery_auth mutual_userid=ClientDisUser1 mutual_password=ClientDisPasswd1
4. 查询配置:
get discovery_auth
TPG CHAP
1. 启用CHAP认证
/> cd iscsi/iqn.2019-04.com.zczf:rnode21/tpg1/
/iscsi/iqn.20...:rnode21/tpg1> #在此目录下做以下操作:
set attribute authentication=1 generate_node_acls=1
2. 配置单向CHAP
set auth userid=tpguser1 password=tgppasswd1
3. 配置双向CHAP
#在先有第二步,才能配置此步.
set auth mutual_userid=ClientTPGuser1 mutual_password=ClientTPGPasswd1
只读客户端CHAP认证配置:
1. 设置客户端使用指定WWN下面的LUN资源:
vim /etc/iscsi/initiatorname.iscsi
InitiatorName=WWN #此WWN可任意指定,或使用默认值,格式: iSCSI的完全合格名
iqn:iSCSI的合格名称
iqn.yyyy-mm.<Reversed Domain Name>[:identifier]
如:
#2015年1月zcf.com,二楼,1号机房,1号机架,5号存储
iqn.2015-01.com.zcf:F2.R1.Farm1.5
2. 配置客户端使用CHAP认证的用户名和密码
vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = tpguser1
node.session.auth.password = tpgpasswd1
#node.session.auth.username_in = ClientTPGuser1
#node.session.auth.password_in = ClientTPGPasswd1
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = discoveryUser1
discovery.sendtargets.auth.password = discoveryPasswd1
#discovery.sendtargets.auth.username_in = ClientDisUser1
#discovery.sendtargets.auth.password_in = ClientDisPasswd1
注:
去掉#注释,就是双向认证.
2.1 重启iSCSI客户端连接进程,以便重读配置文件.
systemctl restart iscsi iscsid
3. 客户端测试登录
#尝试发现iSCSI服务端提供的target:
iscsiadm -m discovery -d 2 -t sendtargets -p 192.168.10.21
#尝试登录发现的target
iscsiadm -m node -T iqn.2019-04.com.zcf:rnode21 -p 192.168.10.21 --login
#使用fdisk查看iSCSI磁盘
fdisk -l
fdisk /dev/sdb #测试是否可分区, 这种情况下是不能分区的, 因为此时没有写权限.
#尝试退出该target ; 前提是,没有在使用该iSCSI磁盘
iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -u
#删除target信息,避免重启后,自动连接该target设备
iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -o delete
discovery CHAP + LUN ACL CHAP认证:
discovery CHAP 使用上面的配置.
LUN ACL CHAP:
1. 启用CHAP认证
TPG CHAP认证中的第一步,是配置LUN ACL CHAP的前提.
2. 配置单向CHAP
/> cd iscsi/iqn.2019-04.com.zczf:rnode21/tpg1/acls/
/iscsi/iqn.20...e21/tpg1/acls> create wwn=iqn.2019-09.com.zcf:disktop1
/iscsi/iqn.20...e21/tpg1/acls> cd iqn.2019-09.com.zcf:disktop1/
/iscsi/iqn.20....zcf:disktop1> #下面都要在此目录中操作
set auth userid=lunuser1 password=lunpasswd1
3. 配置双向CHAP
#在先有第二步,才能配置此步.
set auth mutual_userid=ClientLUNuser1 mutual_password=ClientLUNPasswd1
读写客户端CHAP认证配置:
1. 设置客户端使用指定WWN下面的LUN资源:
vim /etc/iscsi/initiatorname.iscsi
InitiatorName=WWN #此WWN要使用LUN ACL中ACL的WWN.这样iSCSI才知道
客户端提供的用户名密码是那个LUN ACL提供的,从而对该
客户端做认证,来确定它是否为合法客户端.
2. 配置客户端使用CHAP认证的用户名和密码
vim /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = lunuser1
node.session.auth.password = lunpasswd1
#node.session.auth.username_in = ClientLUNuser1
#node.session.auth.password_in = ClientLUNPasswd1
discovery.sendtargets.auth.authmethod = CHAP
discovery.sendtargets.auth.username = discoveryUser1
discovery.sendtargets.auth.password = discoveryPasswd1
#discovery.sendtargets.auth.username_in = ClientDisUser1
#discovery.sendtargets.auth.password_in = ClientDisPasswd1
2.1 重启iSCSI客户端连接进程,以便重读配置文件.
systemctl restart iscsi iscsid
3. 客户端测试登录
#尝试发现iSCSI服务端提供的target:
iscsiadm -m discovery -d 2 -t sendtargets -p 192.168.10.21
#尝试登录发现的target
iscsiadm -m node -T iqn.2019-04.com.zcf:rnode21 -p 192.168.10.21 --login
#使用fdisk查看iSCSI磁盘
fdisk -l
fdisk /dev/sdb #测试是否可分区, 此时iSCSI磁盘是可以分区的,因为认证成功后,
已经确定用户为合法用户,所以给予了该用户写权限.
#尝试退出该target ; 前提是,没有在使用该iSCSI磁盘
iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -u
#删除target信息,避免重启后,自动连接该target设备
iscsiadm -m node -T iqn.2019-04.com.zczf:rnode21 -p 192.168.10.21 -o delete