参考链接:
https://docs.ceph.com/en/latest/rbd/iscsi-overview/
https://www.enterprisestorageforum.com/storage-hardware/iscsi.html
https://www.kernel.org/doc/html/latest/target/tcmu-design.html
改写配置文件,降低默认的心跳间隔(检测关闭的OSD),减少超时的可能性
vi /ceph.conf
[osd]
osd heartbeat grace = 20
osd heartbeat interval = 5
推送新配置文件
ceph-deploy --overwrite-conf config push node-{num}
从监控节点更新运行状态
ceph tell osd.* config set osd_heartbeat_grace 20
ceph tell osd.* config set osd_heartbeat_interval 5
查看 osd 配置
ceph config show osd.0
在所有的 iSCSI 网关节点上都要安装以下软件,至少有两个网关节点(两台机器),保证高可用。
安装通用包
yum install libnl3 libkmod librbd1 pyparsing python-kmod python-pyudev pyhton-gobject python-urwid pyhton-pyparsing python-rados python-rbd python-netifaces python-crypto python-requests python-flask pyOpenSSL rpm-build python-cryptography git
安装tcmu-runner,并开启服务
git clone https://github.com/open-iscsi/tcmu-runner #最好git直接克隆
cd tcmu-runner
./extra/install_dep.sh #若权限不够chmod u+x install_dep.sh make_runnerrpms.sh
.extra/make_runnerrpms.sh
cmake -Dwith-glfs=false -Dwith-qcow=false -DSUPPORT_SYSTEMD=ON -DCMAKE_INSTALL_PREFIX=/usr
make && make install
#开启服务,开机自启
systemctl daemon-reload
systemctl enable tcmu-runner
systemctl start tcmu-runner
systemctl status tcmu-runner
安装rtslib-fb
git clone https://github.com/open-iscsi/rtslib-fb.git
cd rtslib-fb
python setup.py install
#若报错error: Could not find suitable distribution for Requirement.parse('pyudev>=0.16.1')则执行安装高版本pyudev
git clone git://github.com/pyudev/pyudev.git
cd pyudev/ && python setup.py install
安装configshell-fb
git clone https://github.com/open-iscsi/configshell-fb.git
cd configshell-fb
python setup.py install
#若报错error: Could not find suitable distribution for Requirement.parse('pyparsing==2.4.7'),则更新pyparsing
yum install python-pip
pip install --upgrade pip
pip install --upgrade pyparsing
安装targetcli-fb
git clone https://github.com/open-iscsi/targetcli-fb.git
cd targetcli-fb
python setup.py install
mkdir /etc/target
mkdir /var/target
安装ceph-iscsi
git clone https://github.com/ceph/ceph-iscsi.git
cd ceph-iscsi
python setup.py install --install-scripts=/usr/bin
cp usr/lib/systemd/system/rbd-target-gw.service /lib/systemd/system
cp usr/lib/systemd/system/rbd-target-api.service /lib/systemd/system
systemctl daemon-reload
systemctl enable rbd-target-gw
systemctl start rbd-target-gw
systemctl enable rbd-target-api
systemctl start rbd-target-api
gwcli 要求名为 rbd 的存储池,所以需要在集群中创建 rbd 池。
ceph osd lspools #检查pools
ceph osd create pool rbd 64 64 #新建rbd pool,pg 数根据实际情况自行计算
在每一个 iSCSI 网关节点上,都要写入 iscsi-gateway.cfg 配置文件,并且配置文件必须相同。
vi /etc/ceph/iscsi-gateway.cfg
[config]
# Name of the Ceph storage cluster. A suitable Ceph configuration file allowing
# access to the Ceph storage cluster from the gateway node is required, if not
# colocated on an OSD node.
cluster_name = ceph
# Place a copy of the ceph cluster's admin keyring in the gateway's /etc/ceph
# drectory and reference the filename here
gateway_keyring = ceph.client.admin.keyring
# API settings.
# The API supports a number of options that allow you to tailor it to your
# local environment. If you want to run the API under https, you will need to
# create cert/key files that are compatible for each iSCSI gateway node, that is
# not locked to a specific node. SSL cert and key files *must* be called
# 'iscsi-gateway.crt' and 'iscsi-gateway.key' and placed in the '/etc/ceph/' directory
# on *each* gateway node. With the SSL files in place, you can use 'api_secure = true'
# to switch to https mode.
# To support the API, the bear minimum settings are:
api_secure = false
# Additional API configuration options are as follows, defaults shown.
# api_user = admin
# api_password = admin
# api_port = 5001
# trusted_ip_list = 192.168.0.10,192.168.0.11
通过 gwcli 在 rbd 中创建 disk_1 image,并导出为 LUN。
#使用 root 权限,开启 gwcli
gwcli
#进入 iscsi-targets 并创建一个具有 iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw 名称的目标
/> cd /iscsi-target
/iscsi-target> create iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw
#创建两个网关,create {nodename} {ip} 第一个网关必须设为本机地址,至少创建两个网关
/iscsi-target> cd iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/gateways
/iscsi-target...-igw/gateways> create node-1 192.168.159.101
/iscsi-target...-igw/gateways> create node-2 192.168.159.102
#添加 disk_1 image
/iscsi-target...-igw/gateways> cd /disks
/disks> create pool=rbd image=disk_1 size=90M
#创建客户端,名称 iqn.1994-05.com.redhat:rh7-client,记录客户端的名称、用户名和密码,后续操作会用到
/disks> cd /iscsi-target/iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/hosts
/iscsi-target...eph-igw/hosts> create iqn.1994-05.com.redhat:rh7-client
> /iscsi-target...at:rh7-client> auth username=myiscsiusername password=myiscsipassword #设置用户名和密码
#将 rbd/disk_1 添加到该客户端上
> /iscsi-target...at:rh7-client> disk add rbd/disk_1
在客户端(即使用 iSCSI 协议链接存储池的远程机器)执行下列操作。只要拿到上面创建的网关地址、client 名称、用户名和密码,可以在任意一台机器上配置客户端,并使用 iSCSI 协议连接硬盘。
安装 iSCSI initiator 和 multipath 工具
yum install iscsi-initiator-utils
yum install device-mapper-multipath
配置多路径,开启多路径服务
#配置 multipath
vi /etc/multipath.conf
devices {
device {
vendor "LIO-ORG"
hardware_handler "1 alua"
path_grouping_policy "failover"
path_selector "queue-length 0"
failback 60
path_checker tur
prio alua
prio_args exclusive_pref_bit
fast_io_fail_tmo 25
no_path_retry queue
}
}
#开启服务
mpathconf --enable --with_multipathd y
systemctl reload multipathd
配置 client 名称、用户名和密码,分别在 /etc/iscsi/initiatorname.iscsi 和 /etc/iscsi/iscsid.conf 中。
vi /etc/iscsi/initiatorname.iscsi
#名称为上面记录的client名称
InitiatorName=iqn.1994-05.com.redhat:rh7-client
vi /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
#用户名和密码为上面记录的usrename和password
node.session.auth.username = myiscsiusername
node.session.auth.password = myiscsipassword
#重启服务
systemctl restart iscsid
#可以在 targe 节点上,通过以下命令查询 client 配置信息
/> cd /iscsi-targets/iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw/hosts/iqn.1994-05.com.redhat:rh7-client/
/iscsi-target...at:rh7-client> info
Client Iqn .. iqn.1994-05.com.redhat:rh7-client #记录client名字
Ip Address ..
Alias ..
Logged In ..
Auth
- mutual_password .. None
- mutual_username .. None
- password .. myiscsipassword #记录password
- username .. myiscsiusername #记录username
Group Name ..
Luns
- rbd/disk .. lun_id=0
登录 target 网关,查看硬盘
#发现target网关,建立链接
iscsiadm -m discovery -t sendtargets -p 192.168.159.101 #发现
iscsiadm -m node -T iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw -l #登陆
#iscsiadm -m node -o delete -T iqn.2003-01.com.redhat.iscsi-gw:iscsi-igw #删除session
multipath -ll #查看iscsi链接的硬盘
ll /dev/disk/by-path/ #查看扫描到的硬盘
ISCSI接口是一个传输层协议,它工作在传输控制协议(TCP)之上,并支持在TCP/IP网络上iSCSI发起者和存储目标之间的块级SCSI数据传输。
ISCSI代表因特网小型计算机系统接口。iSCSI是在传输控制协议(TCP)之上工作的传输层协议。它支持通过TCP/IP网络在iSCSI启动程序和存储目标之间进行块级SCSI数据传输。iSCSI支持加密网络数据包,并在到达目标时进行解密。
SCSI是一组基于块的命令,用于将计算设备连接到网络存储,包括旋转存储媒体和数据读写。
协议使用启动器将SCSI命令发送到远程服务器上的存储设备目标。存储目标可以是SAN、NAS、磁带、通用服务器(SSD和HDD lun)或其他。该协议允许主机将数据存储到远程网络存储中,从而允许管理员更好地利用共享存储,并为需要直接附加存储的应用程序虚拟化远程存储。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fMPKU1bM-1635216400649)(C:\Users\wq\AppData\Roaming\Typora\typora-user-images\image-20200827102509966.png)]
这些技术将SCSI命令打包到网络数据包中,并将它们指向存储目标。基于软件的iSCSI启动器是最便宜的选项,通常包含在操作系统(OS)中。基于主机的适配器是一种硬件设备。HBA比软件贵,但性能更高,功能更多。完整HBA的硬件替代方案是具有iSCSI卸载引擎的iSOE卡。引擎从主机处理器卸载启动程序操作,从而释放主机服务器上的CPU周期。
iSCSI通过TCP/IP网络传输数据包。iSCSI目标是远程存储,它在主机系统中显示为本地驱动器。iSCSI协议通过IP网络连接主机和存储:LAN、WAN和Internet。
当包到达iSCSI目标时,协议反汇编包以向操作系统提供SCSI命令。如果iSCSI已经加密了网络包,它在这个阶段对包进行解密。
iSCSI性能高度依赖于底层技术,如10千兆以太网(10 GbE)和数据中心中的桥接技术。
10 GbE。以太网网络连接速度对iSCSI性能的影响最大。虽然较小的网络可能运行iSCSI协议超过1 GbE网络,较慢的速度对于中型或企业型数据中心是不够的。管理员可以通过增加多个NICs在一个sub-10 GbE网络上增加一些性能,但是一个交换机不会为多个iSCSI端口提高速度。10 GbE是企业存储环境的推荐速度。因为它是一个较宽的管道,所以很少需要多NICs。相反,添加服务器类网络适配器将加速iSCSI包在10 GbE网络中的传输。
数据中心连接。桥接是一组以太网扩展,可以保护SCSI通信不受数据丢失的影响。这使得iSCSI能够更好地与高可靠的光纤通道竞争,后者已运行多年的无损连接。
多路径。多路径I/O加速iSCSI网络数据包,并且大多数操作系统支持这项技术。典型的iSCSI多路径特性为单个iSCSI会话分配多个地址,从而加速数据传输。
巨型帧。这些9000字节帧缓解了不使用10GBE的较慢以太网的拥塞,这使性能提高了约10- 20%。巨型帧不会给10GBE带来很大的性能提升,如果有的话。
iSCSI和光纤通道(FC)是将数据传输到远程存储的主要方法。通常,FC是一种高性能但昂贵的存储网络,需要专门的管理技能集。iSCSI的成本更低,部署和管理也更简单,但延迟更高。
还有一些附加协议将两者合并。最著名的包括IP光纤通道(FCIP),这是一种用于SAN-to-SAN复制的隧道协议,它将FC帧包装到TCP流上;以及光纤以太网通道(FCoE),使FC SANs能够在以太网网络上传输数据包。
典型的目标包括SAN、NAS、磁带和LUNs。
部署iSCSI并不是特别困难,特别是使用软件定义的协议。但是配置iSCSI启动器和目标需要额外的步骤,而10gbe对于高性能来说是必需的。支持通信量负载的其他最佳实践包括在单独的物理网络或单独的虚拟LAN上运行iSCSI通信量。
安全性是另一个问题,因为iSCSI很容易受到包嗅探的攻击。数据包嗅探是一种网络攻击,攻击者的恶意软件或设备捕获在脆弱网络中移动的数据包。管理员可以采取安全措施来防止这种情况发生,但是许多小公司的存储或多能管理员会跳过额外的安全措施来简化iSCSI管理。
这很少是一个好的计划,因为对包嗅探的防御很容易实现。针对这种攻击类型的主要防御是质询-握手认证协议(CHAP)和Internet协议安全(IPsec),它们都是特定于iSCSI的。
CHAP通过确认发起者和目标之间的链接来工作。在数据传输之前,小伙子向连接请求者发送一个质询消息。请求者返回从散列函数派生的值,以便服务器进行身份验证。如果哈希值匹配,链接就会激活。如果没有,CHAP终止连接。
对于在Internet网络上运行的iSCSI数据包,IPsec协议对通过Internet网络发送的数据包进行身份验证和加密。它的主要用途是在IPsec代理(主机到主机、网络到网络或网络到主机)之间进行相互身份验证。该协议还在会话期间协商加密和解密,并支持数据源级和网络级对等身份验证以及数据完整性验证。由于IPsec的部署和配置很复杂,它主要用于传输高度敏感数据的(虚拟专用网络)。
其他iSCSI安全措施包括使用访问控制列表(acl)来控制用户数据访问和保护管理控制台。
TCM是LIO(内核内iSCSI目标(服务器))的另一个名称。现有的TCM目标在内核中运行。TCMU(用户空间中的TCM)允许编写用作iSCSI目标的用户空间程序。本文档介绍了该设计。
现有内核为不同的SCSI传输协议提供模块。TCM还对数据存储进行了模块化。现有用于文件,块设备,RAM或使用其他SCSI设备作为存储的模块。这些被称为“后备存储”或“存储引擎”。这些内置模块完全作为内核代码实现。
除了模块化用于传输SCSI命令(“结构”)的传输协议之外,Linux内核目标LIO还对实际数据存储进行了模块化。这些被称为“后备存储”或“存储引擎”。该目标随附有后备存储,这些后备存储允许将文件,块设备,RAM或其他SCSI设备用于导出的SCSI LUN所需的本地存储。与LIO的其余部分一样,它们完全作为内核代码实现。
这些存储区涵盖了最常见的用例,但不是全部。其他非内核目标解决方案(例如tgt)能够支持的一种新用例是使用Gluster的GLFS或Ceph的RBD作为备份库。然后,目标充当转换程序,允许启动程序将数据存储在这些非传统的网络存储系统中,同时仍然仅使用标准协议本身。
如果目标是用户空间过程,则支持这些过程很容易。例如,tgt每个适配器仅需要一个小的适配器模块,因为这些模块仅使用RBD和GLFS的可用用户空间库。
在LIO中添加对这些Backstore的支持要困难得多,因为LIO完全是内核代码。除了承担将GLFS或RBD API和协议移植到内核的繁重工作之外,另一种方法是为LIO创建用户空间直通后备存储区“ TCMU”。
除了可以相对轻松地支持RBD和GLFS,TCMU还可以更轻松地开发新的后备存储。TCMU与LIO环回结构结合在一起,变得类似于FUSE(用户空间中的文件系统),但在SCSI层而不是在文件系统层。一个SUSE,如果可以的话。
缺点是有更多不同的组件需要配置,并可能导致故障。这是不可避免的,但如果我们小心地使事情尽可能简单,希望它不会致命。
TCMU接口的核心是在内核空间和用户空间之间共享的内存区域。在该区域内是:控制区域(邮箱);无锁生产者/消费者循环缓冲区,用于传递命令并返回状态;和一个输入/输出数据缓冲区。
TCMU使用预先存在的UIO子系统。UIO允许在用户空间中开发设备驱动程序,并且从概念上讲它与TCMU用例非常接近,除了TCMU代替物理设备之外,它实现了为SCSI命令设计的内存映射布局。使用UIO还可以通过处理设备自省(例如,用户空间确定共享区域的大小的方法)和双向信令机制来使TCMU受益。
内存区域中没有嵌入式指针。一切都表示为与该区域的起始地址的偏移量。这样,如果用户进程终止并用映射到其他虚拟地址的区域重新启动,环仍然可以工作。
有关结构定义,请参见target_core_user.h。
邮箱始终位于共享内存区域的开头,并包含一个版本,有关命令环的起始偏移量和大小的详细信息,以及内核和用户空间(分别)用于放置命令的头和尾指针环,并指示命令何时完成。
版本-1(否则用户空间应中止)
标志:
TCMU_MAILBOX_FLAG_CAP_OOOC:表示支持乱序完成。有关详细信息,请参见“命令环”。
cmdr_off
命令环的起始位置与内存区域的起始位置的偏移量,以说明邮箱的大小。
cmdr_size
命令环的大小。这并没有需要为二的力量。
cmd_head
由内核修改,以指示何时将命令放置在环上。
cmd_tail
由用户空间修改,以指示何时完成命令处理。
通过内核将mailbox.cmd_head递增命令的大小(对cmdr_size取模),将命令放置在环上,然后通过发出信号通知用户空间uio_event_notify()。命令完成后,用户空间将以相同的方式更新mailbox.cmd_tail,并通过4字节的write()通知内核。当cmd_head等于cmd_tail时,环为空–当前没有命令正在等待用户空间处理。
TCMU命令是8字节对齐的。它们以包含“ len_op”的通用标头开始,len_op是存储长度的32位值,以及未使用的最低位中的操作码。它还包含cmd_id和flags字段,用于由内核(kflags)和用户空间(uflags)设置。
当前仅定义了两个操作码TCMU_OP_CMD和TCMU_OP_PAD。
当操作码为CMD时,命令环中的条目为结构tcmu_cmd_entry。用户空间通过tcmu_cmd_entry.req.cdb_off找到SCSI CDB(命令数据块)。这是从整个共享内存区域的开始而不是条目的偏移。可通过ret.iov []数组访问数据输入/输出缓冲区。iov_cnt包含iov []中描述数据输入或数据输出缓冲区所需的条目数。对于双向命令,iov_cnt指定多少个iovec条目覆盖“数据输出”区域,而iov_bidi_cnt指定紧接在iov []中的iovec条目覆盖数据输入区域。就像其他字段一样,iov.iov_base是从区域开始的偏移量。
完成命令后,用户空间将设置rsp.scsi_status和rsp.sense_buffer(如有必要)。然后,用户空间通过entry.hdr.length(mod cmdr_size)增加mailbox.cmd_tail,并通过UIO方法向内核发出信号,即向文件描述符写入4字节。
如果为邮箱->标志设置了TCMU_MAILBOX_FLAG_CAP_OOOC,则内核能够处理乱序补全。在这种情况下,用户空间可以按不同于原始命令的顺序处理命令。由于内核仍然会按照在命令环中出现的顺序处理命令,因此用户空间在完成命令时需要更新cmd-> id(也就是窃取原始命令的条目)。
当操作码为PAD时,用户空间仅按上述方式更新cmd_tail –这是空操作。(内核插入PAD条目以确保每个CMD条目在命令环内是连续的。)
将来可能会添加更多操作码。如果用户空间遇到它无法处理的操作码,则必须在hdr.uflags中将UNKNOWN_OP位置1(位0),更新cmd_tail,然后继续处理其他命令(如果有)。
这是命令环之后的共享内存空间。该区域的组织未在TCMU界面中定义,并且用户空间应仅访问未决iovs引用的部分。
除TCMU外,其他设备可能正在使用UIO。不相关的用户进程也可能正在处理不同组的TCMU设备。TCMU用户空间进程必须通过扫描sysfs类/ uio / uio * /名称来找到其设备。对于TCMU设备,这些名称的格式为:
tcm-user////
对于所有TCMU支持的UIO设备,“ tcm-user”是通用的。
/sys/kernel/config/target/core/user_/
此位置包含诸如“ hw_block_size”之类的属性,用户空间需要知道这些属性才能进行正确的操作。
将是一个用户空间进程唯一的字符串,用于标识预期将由某个处理程序支持的TCMU设备,而 将是供用户进程配置设备的其他特定于处理程序的字符串。 。由于LIO的限制,该名称不能包含’:’。
对于所有发现的设备,用户处理程序将打开/ dev / uioX并调用mmap():
mmap(NULL, size, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0)
其中size必须等于从/ sys / class / uio / uioX / maps / map0 / size读取的值。
如果添加或删除了新设备,则将使用通用网络链接系列名称“ TCM-USER”和名为“ config”的多播组通过网络链接广播通知。这将包括上一节中所述的UIO名称,以及UIO次编号。这应该允许用户空间识别UIO设备和LIO设备,以便在确定设备受支持之后(基于子类型)可以采取适当的措施。
用户空间处理程序进程永远不会附加:
用户空间处理程序进程被杀死:
用户空间处理程序进程挂起:
用户空间处理程序进程是恶意的:
class / uio / uioX / maps / map0 / size读取的值。
如果添加或删除了新设备,则将使用通用网络链接系列名称“ TCM-USER”和名为“ config”的多播组通过网络链接广播通知。这将包括上一节中所述的UIO名称,以及UIO次编号。这应该允许用户空间识别UIO设备和LIO设备,以便在确定设备受支持之后(基于子类型)可以采取适当的措施。
用户空间处理程序进程永远不会附加:
用户空间处理程序进程被杀死:
用户空间处理程序进程挂起:
用户空间处理程序进程是恶意的: