本章首先介绍计算机硬件存储设备的不同接口的优缺点,并由此切入 iSCSI 技术主题的讲解。iSCSI 技术实现了物理硬盘设备与 TCP/IP 网络协议的相互结合,使得用户能够通过互联网方便地访问远程机房提供的共享存储资源。我们将学习在 Linux 系统上部署 iSCSI 服务端程序,并分别基于 Linux 系统和 Windows 系统来远程访问存储资源。结合前面第 6 章、第 7 章的学习,我们将进一步理解和掌握在 Linux 系统中管理硬盘设备和存储资源。
17.1 iSCSI 技术介绍
硬盘是计算机硬件设备中重要的组成部分之一,硬盘存储设备读写速度的快慢也会对服务器的整体性能造成影响。为了进一步提升硬盘存储设备的读写速度和性能,人们一直在努力改进物理硬盘设备的接口协议。当前的硬盘接口类型主要有 IDE、SCSI 和 SATA 这 3 种。
➢ IDE:一种成熟稳定、价格便宜的并行传输接口。
➢ SATA:一种传输速度更快、数据校验更完整的串行传输接口。
➢ SCSI:一种用于计算机和硬盘、光驱等设备之间系统级接口的通用标准,具有系统资源占用率低、转速高、传输速度快等优点。
无论使用什么类型的硬盘接口,硬盘上的数据总是要通过计算机主板上的总线与 CPU、内存等进行数据交换,这种物理环境上的限制给硬盘资源的共享带来了各种不便。后来 IBM 公司开始研发基于 TCP/IP 协议和 SCSI 接口协议的新型存储技术,这也就是我们目前能看到的互联网小型计算机系统接口(iSCSI,Internet Small Computer System Interface)。这是一种将 SCSI 接口与以太网技术相结合的新型存储技术,可以用来在网络中传输 SCSI 接口的命令和数据,不仅克服了传统 SCSI 接口设备的物理局限性,实现了跨区域的存储资源共享,而且可以在不停机的状态下扩展存储容量。
既然要通过以太网来传输硬盘设备上的数据,那么数据是通过网卡传入到计算机中的么?与一般的网卡不同(连接网络总线和内存,供计算机上网使用),iSCSI-HBA 卡(见下图)连接的则是 SCSI 接口或 FC(光纤通道)总线和内存,专门用于在主机之间交换存储数据,其使用的协议也与一般网卡有本质的不同。运行 Linux 系统的服务器会基于 iSCSI 协议把硬盘设备命令与数据打包成标准的 TCP/IP 数据包,然后通过以太网传输到目标存储设备,而当目标存储设备接收到这些数据包后,还需要基于 iSCSI 协议把 TCP/IP 数据包解压成硬盘设备命令与数据。
iSCSI 技术以区块为单位的数据存储空间,在简化了存储空间管理步骤的前提下,还增添了存储空间的弹性。可以使用本地的计算机操作系统进行管理,就像是使用本地硬盘那样来使用远程存储空间。这种高扩展性和低组建成本、低维护成本的整合存储方式,正是大部分预算受限的中小企业和办公室所需要的。
17.2 创建 RAID 磁盘阵列
既然要使用 iSCSI 存储技术为远程用户提供共享存储资源,首先要保障存放共享资源服务器的稳定性与可用性,否则一旦在使用过程中出现故障,则维护的难度相较于本地硬盘设备要复杂。因此我们按第 7 章学习的知识来部署 RAID 磁盘阵列组,确保数据的安全性。
下面以配置 RAID 5 磁盘阵列组为例;首先在虚拟机中添加 4 块 SCSI 类型的硬盘,用于创建 RAID 5 磁盘阵列和备份盘,如图所示。
启动虚拟机系统,使用 mdadm 命令创建 RAID 磁盘阵列。其中,-Cv 参数为创建阵列并显示过程,/dev/md 为生成的阵列组名称,-n 3 参数为创建 磁盘阵列所需的硬盘个数,-l 5 参数为 RAID 磁盘阵列的级别,-x 1 参数为磁盘阵列的备份盘个数。在命令后面要逐一写上使用的硬盘名称。允许使用第 3 章学习的通配符来指定硬盘设备的名称。
创建成功后得到一块名称为/dev/md0 的新设备,这是一块 RAID 5 级别的磁盘阵列,并且还有一块备份盘。可使用 mdadm -D 命令来查看设备的详细信息。由于在使用远程设备时极有可能出现设备识别顺序发生变化的情况,因此直接在 fstab 挂载配置文件中写入/dev/sdb、/dev/sdc 等设备名称的话,就有可能在下一次挂载了错误的存储设备。而 UUID 值是设备的唯一标识符,用于精确地区分本地或远程设备。于是我们可以把这个值记录下来,稍后填写到挂载配置文件中。
17.3 配置 iSCSI 服务端
iSCSI 技术在工作形式上分为服务端(target)与客户端(initiator)。iSCSI 服务端即用于存放硬盘存储资源的服务器,它作为前面创建的 RAID 磁盘阵列的存储端,能够为用户提供可用的存储资源。iSCSI 客户端则是用于访问远程服务端的存储资源。下面来配置 iSCSI 服务端和客户端所用的 IP 地址。
主机名称 | 操作系统 | IP地址 |
iSCSI服务端 | RHEL 8 | 192.168.187.128 |
iSCSI客户端 | CentOS 7.6 | 192.168.187.20 |
第一步:
在 RHEL 8/CentOS 8 系统中,默认已经安装了 iSCSI 服务端程序,我们需要配置好软件仓库后安装 iSCSI 服务端的交互式配置工具 targetcli。相较于直接修改配置文件,通过交互式的过程来配置参数会更直观且有趣。
iSCSI 支持跨平台可以在 Windows 系统下搭建 iSCSI 服务端,再共享给 Linux 系统主机。不过类似的 DataCore 软件公司推出的 SANmelody 或是 FalconStor 软件公司推出的 iSCSI Server for Windows 等软件,在 Windows 系统上使用都是要收费的。
第二步:
配置 iSCSI 服务端共享资源;targetcli 是用于管理 iSCSI 服务端存储资源的专用配置命令,它能够提供类似于 fdisk 命令的交互式配置功能,将 iSCSI 共享资源的配置内容抽象成“目录”的形式,我们只需将各类配置信息填入到相应的“目录”中即可。这里的难点主要在于认识每个“参数目录”的作用。把配置参数正确地填写到“目录”后,iSCSI 服务端也就可以提供共享资源服务了。
在执行 targetcli 命令后就能看到交互式的配置界面了。在该界面中允许使用很多 Linux 命令,比如利用 ls 查看目录参数的结构,使用 cd 切换到不同的目录中,但基本不支持带参数。
/backstores/block 是 iSCSI 服务端配置共享设备的位置,我们需要把刚创建的 RAID 5 磁盘阵列 md0 文件加入到配置共享设备的“资源池”中,并将该文件重新命名为 d0,这样用户就不会知道是由服务器中的哪块硬盘来提供共享存储资源,而只会看到一个名为 d0 的存储设备。
第三步:
创建 iSCSI target 名称及配置共享资源;iSCSI target 名称是由系统自动生成的,这是一串用于描述共享资源的唯一字符串,需进入到 /iscsi 目录下执行 create 命令;稍后用户在扫描 iSCSI 服务端时即可看到这个字符串,因此我们不需要记住它。
系统在生成这个 target 名称后,还会在 /iscsi 参数目录中创建一个与其字符串同名的新 “目录”用来存放共享资源。我们需要把前面加入到 iSCSI 共享资源池中的硬盘设备添加到这个新目录中,这样用户在登录 iSCSI 服务端后,即可默认使用这硬盘设备提供的共享存储资源了。
第四步:
设置访问控制列表(ACL);用户在访问存储共享资源时不需要输入密码,只要 iSCSI 客户端的名称与服务端中设置的访问控制列表中,名称条目某一段一致即可,因此需要在 iSCSI 服务端的配置文件中写入一串能够验证用户信息的名称。acls 参数目录用于存放能够访问 iSCSI 服务端共享存储资源的客户端名称。可以在刚刚系统生成的 iSCSI target 后面追加上类似于:client 的参数,这样既能保证客户端的名称具有唯一性,又非常便于管理和阅读。
第五步:
设置 iSCSI 服务端的监听 IP 地址和端口号;位于生产环境中的服务器上可能有多块网卡,那么到底是由哪个网卡或 IP 地址对外提供共享存储资源呢?在配置文件中默认是允许所有网卡提供 iSCSI 服务,如果觉得这不安全可以手动删除。再直接指定服务器 IP 地址 192.168.187.128 的 3260 端口向外提供 iSCSI 共享存储资源服务。
在参数文件配置妥当后,回到 / 目录检查一下配置的信息是否正确,在确认信息无误后输入 exit 命令退出会自动保存。千万不要习惯性地按 Ctrl + c 组合键结束进程,这样就不会保存配置文件了。
iptables -F 清空防火墙中的默认策略并保存,设置主用的 firewalld 防火墙,使其放行iSCSI服务或3260/TCP 端口号。到此服务器设置完毕。
17.4 配置 Linux 客户端
无论是什么服务,客户端的配置步骤都要比服务端的配置步骤简单一些;在 RHEL 8/CentOS 7.6 默认都安装了 iSCSI 客户端服务程序 initiator,如果系统没有安装的话,可以使用软件仓库手动安装。
iSCSI 协议是通过客户端的名称来进行验证的,而该名称也是 iSCSI 客户端的唯一标识,而且必须与服务端配置文件中访问控制列表中的信息一致,否则客户端在尝试访问存储共享设备时,系统会弹出验证失败的信息。
下面编辑 iSCSI 客户端中的 initiator 名称文件 /etc/iscsi/initiatorname.iscsi,把客户端默认的标识窜删除或加上 # 号注释掉,再把服务端的访问控制列表名称填写进来,保存后重启客户端 iscsid 服务程序并将其加入到开机启动项中。
iscsiadm 是用于管理、查询、插入、更新或删除 iSCSI 数据库配置文件的命令行工具,用户需要先使用这个工具扫描发现远程 iSCSI 服务端,然后查找到的服务端上有哪些可用的共享存储资源。其中 -m discovery 参数是扫描并发现可用的存储资源,-t st 参数为执行扫描操作的类型,-p 192.168.187.128 参数为 iSCSI 服务端的 IP 地址。
在使用 iscsiadm 命令发现了远程服务器上可用的存储资源后,接下来准备登录 iSCSI 服务端。其中 -m node 参数为将客户端所在主机作为一台节点,-T 参数为要使用的存储资源(我们可以直接复制前面命令中扫描发现的结果,以免录入错误),-p 192.168.187.128 参数依然为对方 iSCSI 服务端的 IP 地址。最后使用--login 或-l 参数进行登录验证。
在 iSCSI 客户端成功登录之后,会在客户端主机上多出一块名为/dev/sdb 的设备文件虽然它没有接入本地插槽;第 6 章学过 udev 服务在命名硬盘名称时,与硬盘插槽是没有关系的。接下来便能够像使用本地硬盘那样来操作这个设备文件了,直接格式化并挂载使用。
由于 udev 服务是按照系统识别硬盘设备的顺序来命名硬盘设备的,当客户端主机同时使用多个远程存储资源时,如果下一次识别远程设备的顺序发生了变化,则客户端挂载目录中的文件也将失效。因此应该在 /etc/fstab 配置文件中使用设备的 UUID(通用唯一识别码)进行挂载,不论远程设备资源的识别顺序再怎么变化,系统也能正确找到设备所对应的目录。blkid 命令用于查看设备的名称、文件系统及 UUID。
由于/dev/sdb 是一块网络存储设备,而 iSCSI 协议是基于 TCP/IP 网络传输数据的,因此必须在/etc/fstab 配置文件中添加上_netdev 参数,表示当系统联网后再进行挂载操作,以免系统开机时间过长或开机失败。
测试在新硬盘读写操作一切正常;如果不再需要使用 iSCSI 共享设备资源了,可以用 iscsiadm 命令加 -u 参数将其卸载,但先要 umount 卸载本地挂载点。
这种获取 iSCSI 远程存储的方法依赖的是 RHEL 8 系统自带的 iSCSI initiator 软件程序;该软件程序将以太网卡虚拟成 iSCSI 卡,然后基于 TCP/IP 协议在主机与 iSCSI 存储设备之间实现数据传输功能。但是采用这种方式传输数据时会消耗硬件自身的 CPU 计算性能,适合在低 I/O 或者低带宽要求的环境中使用。
如果在生产环境中需要进行大量的远程数据存储,建议配备 iSCSI HBA(Host Bus Adapter,主机总线适配器)硬件卡设备,从而实现 iSCSI 服务器与交换机之间、iSCSI 服务器与客户端之间的高效数据传输。与 initiator 的软件方式相比,iSCSI HBA 硬件卡设备不需要消耗 CPU 计算性能,而且它是专用的远程数据存储设备,因此对 iSCSI 的支持也会更好。
17.5 配置 Windows 客户端
使用 Windows 系统的客户端也可以正常访问 iSCSI 服务器上的共享存储资源,而且操作原理及步骤与 Linux 系统的客户端基本相同。
运行 iSCSI 发起程序;在 Windows 10 操作系统中已经默认安装了 iSCSI 客户端程序,我们只需在控制面板或是直接搜索找到iSCSI 发起程序,打开该图标,在第一次运行 iSCSI 发起程序时,系统会提示“Microsoft iSCSI 服务端未运行”,单击“是”按钮即可自动启动并运行 iSCSI 发起程序。
扫描发现 iSCSI 服务端上可用的存储资源;不论是 Windows 系统还是 Linux 系统,要想使用 iSCSI 共享存储资源,都必须先进行扫描发现操作。在 iSCSI 发起程序的 “目标”选项卡的“目标”文本框中写入 iSCSI 服务端的 IP 地址,然后单击“快速连接”按钮。
在弹出的“快速连接”对话框中可看到共享的硬盘存储资源,此时显示“无法登录到目标”属于正常情况,单击“完成”按钮即可
回到“目标”选项卡页面,可以看到共享存储资源的名称已经出现。
由于在 iSCSI 服务端程序上设置了 ACL,使得只有客户端名称与 ACL 策略中的名称保持一致时才能使用远程存储资源,因此需要在 “配置”选项卡中单击“更改”按钮。
在修改界面写入 iSCSI 服务器配置过的ACL 策略名称,同Linux客户端,值得注意的是直接写值就好,=及前面的都不用。
在确认 iSCSI 发起程序名称与 iSCSI 服务器 ACL 策略一致后,重新单击“连接”按钮,并单击“确认”按钮。大约 1~3 秒后,状态会更新为“已连接”,如图
还需要做初始化及格式化;右键单击桌面上的“计算机”图标,打开计算机管理程序,或是直接搜索磁盘管理。
开始对磁盘进行初始化操作,Windows 系统用来初始化磁盘设备的步骤十分简单,我们只需各种右键点点点,或左键开开开。
一直保持默认下一步即可。
回到资源管理器界面,可见已存在新硬盘。
接下来即可进入正常的使用过程;由于整个传输过程是完全透明的,而且像一块本地硬盘那样稳定,因此不知情的用户可能都察觉不到这是一块远程存储设备。不过这只是理论状态,实际上的 iSCSI 数据传输速率并不能完全达到本地硬盘的性能,会或多或少地受到网络带宽的影响。
如果不需要用了,可以再进入磁盘管理右键选脱机。
然后在 iSCSI 目标项断开连接,再到旁边发现项删除即可。