.. _ceph_iscsi_initator:
===========================
Ceph iSCSI initator客户端
===========================
:ref:`config_ceph_iscsi` 服务端iSCSI target配置完成后,就可以配置Linux的iSCSI initator客户端。需要安装和配置2个客户端:
- ``iscsi-initiator-utils``
- ``device-mapper-multipath``
.. note::
按照 :ref:`install_mobile_cloud_ceph` ,访问iSCSI Gateway的 :ref:`libvirt` 客户端位于物理笔记本 :ref:`apple_silicon_m1_pro` MacBook Pro 2022,运行的操作系统是 :ref:`asahi_linux` 。也就是,需要在 :ref:`arch_linux` 上实现 iSCSI initator客户端配置。
安装
======
在 :ref:`arch_linux` 上iSCSI客户端(initator)使用 ``open-iscsi`` ,安装:
.. literalinclude:: ceph_iscsi_initator/archlinux_install_open_iscsi_multipath_tools
:language: bash
:caption: arch linux安装open-iscsi和multipath-tools软件包
为方便生成配置,安装 ``mpathconf`` 工具(通过 :ref:`archlinux_aur` ):
.. literalinclude:: ceph_iscsi_initator/archlinux_install_mpathconf
:language: bash
:caption: arch linux安装mpathconf配置工具
配置
========
- 创建默认 ``/etc/multipath.conf`` 配置并激活 ``multipathd`` 服务:
.. literalinclude:: ceph_iscsi_initator/mpathconf_multipathd
:language: bash
:caption: 使用mpathconf工具生成默认/etc/multipath.conf配置并激活multipathd
.. warning::
这个 ``mpathconf`` 工具( :ref:`shell` )已经落伍了,无法正常工作。我最初没有在意,后来发现 ``multipath -ll`` 是需要依赖这个工具生成的 ``find_multipaths yes`` 配置行。参考 `Understanding mpathconf Utility to configure DM-Multipath `_
我的workround方法是在 :ref:`fedora` 主机(因为这个工具是RedHat主推,Fedora系列一直有这个工具可使用)执行 ``multipath`` 工具生成初始配置,复制过来再做修改
实际生成的 ``/etc/multipath.conf`` 非常简单:
.. literalinclude:: ceph_iscsi_initator/multipath.conf.init
:language: bash
:caption: 使用mpathconf工具生成默认/etc/multipath.conf(非常简单)
- 在 ``/etc/multipath.conf`` 配置文件中添加以下内容:
.. literalinclude:: ceph_iscsi_initator/multipath.conf
:language: bash
:caption: /etc/multipath.conf添加配置,其中blacklist剔除了本地NVMe硬盘
:emphasize-lines: 10-24
然后重新启动 ``multipathd`` 服务:
.. literalinclude:: ceph_iscsi_initator/restart_multipathd
:language: bash
:caption: 重启multipathd服务
iSCSI发现和设置
=================
- 在 ``/etc/iscsi/iscsid.conf`` 配置中添加 :ref:`config_ceph_iscsi` 时在 ``/etc/ceph/iscsi-gateway.cfg`` 中配置的 CHAP 用户名和密码:
.. literalinclude:: ceph_iscsi_initator/iscsid.conf
:language: bash
:caption: 配置/etc/iscsi/iscsid.conf访问iSCSI target认证(CHAP)
.. warning::
这里的认证账号是 :ref:`config_ceph_iscsi` 步骤中 **创建一个 initator 名为 iqn.1989-06.io.cloud-atlas:libvirt-client 客户端,并且配置intiator的CHAP名字和密码** 配置的,不是服务器的 ``/etc/ceph/iscsi-gateway.cfg`` 配置中的管理账号。
我最初搞错了,导致iSCSI initator无法登陆(见下文)。这里已经订正
这里有多种CHAP认证设置,对应于 :ref:`config_ceph_iscsi` 的 ``/etc/ceph/iscsi-gateway.cfg`` 简单认证配置上述内容。详细不同认证方法参考配置文件注释或者 `arch linxu: Open-iSCSI `_
- 启动并激活 ``iscsid`` 服务:
.. literalinclude:: ceph_iscsi_initator/start_enable_iscsid
:language: bash
:caption: 启动并激活iscsid
- 向 iSCSI target节点发送请求,语法如下::
iscsiadm --mode discovery --portal target_ip --type sendtargets
实践操作如下:
.. literalinclude:: ceph_iscsi_initator/iscsiadm_discovery_target
:language: bash
:caption: 使用iscsiadm discovery模式扫描target IP获取访问
输出信息就是iSCSI target,成功的关于节点和target信息会自动保存到本地的initator中:
.. literalinclude:: ceph_iscsi_initator/iscsiadm_discovery_target_output
:language: bash
:caption: 使用iscsiadm discovery模式扫描target IP获取的成功信息会保存到本地initator中
- 登陆到 iSCSI target:
.. literalinclude:: ceph_iscsi_initator/iscsiadm_login
:language: bash
:caption: iscsiadm登陆到target
iSCSI initator登陆失败排查
---------------------------
这里我遇到一个登陆报错::
Logging in to [iface: default, target: iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw, portal: 192.168.8.205,3260]
Logging in to [iface: default, target: iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw, portal: 192.168.8.206,3260]
iscsiadm: Could not login to [iface: default, target: iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw, portal: 192.168.8.205,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not login to [iface: default, target: iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw, portal: 192.168.8.206,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure)
iscsiadm: Could not log into all portals
但是我检查服务端 ``/etc/ceph/iscsi-gateway.cfg`` 和客户端 ``/etc/issi/iscsid.conf`` ,显示的认证信息是一致的
从客户端系统日志来看有::
[Tue Dec 20 14:46:42 2022] scsi host0: iSCSI Initiator over TCP/IP
[Tue Dec 20 14:46:42 2022] scsi host1: iSCSI Initiator over TCP/IP
[Tue Dec 20 14:46:42 2022] connection1:0: detected conn error (1020)
[Tue Dec 20 14:46:42 2022] connection2:0: detected conn error (1020)
我仔细核对了 :ref:`config_ceph_iscsi` 配置步骤,发现我搞错了一个概念:
- 在 ``gwcli`` 交互步骤中, **创建一个 initator 名为 iqn.1989-06.io.cloud-atlas:libvirt-client 客户端,并且配置intiator的CHAP名字和密码** ,这个账号密码才是 iSCSI initator 客户端的登陆密码::
username=libvirtd password=mypassword12
- 服务器的 ``/etc/ceph/iscsi-gateway.cfg`` 配置的是Ceph的iSCSI网关的管理密码
所以修订物理主机iSCSI initator的CHAP认证配置,将错误的::
node.session.auth.username = admin
node.session.auth.password = admin
修订成::
node.session.auth.username = libvirtd
node.session.auth.password = mypassword12
然后重启 ``iscsid`` 再重复上述登陆...
**还是同样报错**
仔细阅读了 `arch linxu: Open-iSCSI >> Troubleshooting/Client IQN `_ 提到了服务器端(target)可能需要包含 **客户端** 的 ``/etc/iscsi/initiatorname.iscsi`` 配置中 ``IQN`` 。对啊,我在 :ref:`config_ceph_iscsi` ``gwcli`` 交互步骤中, **创建一个 initator 名为 iqn.1989-06.io.cloud-atlas:libvirt-client 客户端,并且配置intiator的CHAP名字和密码** 步骤是包含了::
create iqn.1989-06.io.cloud-atlas:libvirt-client
也就是说服务器端是指定配置了客户端的 IQN
果然,在客户端 ``/etc/iscsi/initiatorname.iscsi`` 指定了客户端的IQN!!!
既然服务器端配置了 ``iqn.1989-06.io.cloud-atlas:libvirt-client`` ,那么也需要对应修订客户端的 ``/etc/iscsi/initiatorname.iscsi`` 内容改为::
InitiatorName=iqn.1989-06.io.cloud-atlas:libvirt-client
然后重启客户端 ``iscsid`` 再次重复上述登陆...
终于,终于看到了成功登陆的信息:
.. literalinclude:: ceph_iscsi_initator/iscsiadm_login_success
:language: bash
:caption: iscsiadm登陆到target成功信息
检查iSCSI initator信息
-------------------------
- 检查运行的会话:
.. literalinclude:: ceph_iscsi_initator/iscsiadm_session
:language: bash
:caption: iscsiadm检查当前运行的会话
此时可以看到:
.. literalinclude:: ceph_iscsi_initator/iscsiadm_session_output
:language: bash
:caption: iscsiadm检查当前运行的会话输出信息,可以看到iSCSI挂载了2块磁盘 ``sda`` 和 ``sdb``
:emphasize-lines: 50,97
- 可以使用以下命令验证iSCSI会话:
.. literalinclude:: ceph_iscsi_initator/iscsiadm_session_show
:language: bash
:caption: iscsiadm检查当前运行的会话
此时可以看到:
.. literalinclude:: ceph_iscsi_initator/iscsiadm_session_show_output
:language: bash
:caption: iscsiadm检查当前运行的会话输出,可以看到有2个会话连接
- 使用 ``fdisk -l`` 也可以看到::
Disk /dev/sda: 46 GiB, 49392123904 bytes, 96468992 sectors
Disk model: TCMU device
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 524288 bytes
Disk /dev/sdb: 46 GiB, 49392123904 bytes, 96468992 sectors
Disk model: TCMU device
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 524288 bytes
Multipath IO设置
====================
前文已经配置了 ``multipath.conf`` 来发现 ``LIO iSCSI`` 设备,所以这里执行:
.. literalinclude:: ceph_iscsi_initator/multipath_ll
:language: bash
:caption: multipath -ll检查可用的多路设备
我这里遇到一个问题, ``multipaht -ll`` 没有任何输出,虽然前面已经正确登陆了iSCSI target,显示本地已经挂载了2个磁盘。原因是 :ref:`arch_linux` 上的 ``mpathconf`` 工具初始配置失败导致(见上文),通过在 :ref:`fedora` 主机生成初始配置并复制到 :ref:`arch_linux` 上重新完成 ``/etc/multipath.conf`` 修复。
这样能够正常工作显示如下:
.. literalinclude:: ceph_iscsi_initator/multipath_ll_output
:language: bash
:caption: multipath -ll检查可用的多路设备输出信息
- 现在完成设置,可以退出 target :
.. literalinclude:: ceph_iscsi_initator/iscsiadm_logout
:language: bash
:caption: iscsiadm退出target登陆
接下来,终于可以正式开始 :ref:`mobile_cloud_ceph_iscsi_libvirt`
参考
======
- `Ceph Block Device » Ceph Block Device 3rd Party Integration » Ceph iSCSI Gateway » Configuring the iSCSI Initiators » iSCSI Initiator for Linux `_
- `arch linxu: Open-iSCSI `_
- `Ubuntu: Device Mapper Multipathing - Introduction `_