终于完成最后一篇了,一上午的时间就过去了.
下文主要是对基本操作和我对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的架构图: 详情可参考此英文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