Ceph iSCSI initator客户端

配置Ceph iSCSI网关 服务端iSCSI target配置完成后,就可以配置Linux的iSCSI initator客户端。需要安装和配置2个客户端:

  • iscsi-initiator-utils

  • device-mapper-multipath

备注

按照 移动云计算部署Ceph ,访问iSCSI Gateway的 Libvirt虚拟机管理器 客户端位于物理笔记本 Apple ARM架构芯片M1 Pro MacBook Pro 2022,运行的操作系统是 Asahi Linux 。也就是,需要在 Arch Linux 上实现 iSCSI initator客户端配置。

安装

Arch Linux 上iSCSI客户端(initator)使用 open-iscsi ,安装:

arch linux安装open-iscsi和multipath-tools软件包
sudo pacman -S open-iscsi multipath-tools

为方便生成配置,安装 mpathconf 工具(通过 Arch Linux AUR ):

arch linux安装mpathconf配置工具
yay -S mpathconf

配置

  • 创建默认 /etc/multipath.conf 配置并激活 multipathd 服务:

使用mpathconf工具生成默认/etc/multipath.conf配置并激活multipathd
sudo mpathconf --enable --with_multipathd y

警告

这个 mpathconf 工具( Shell Atlas )已经落伍了,无法正常工作。我最初没有在意,后来发现 multipath -ll 是需要依赖这个工具生成的 find_multipaths yes 配置行。参考 Understanding mpathconf Utility to configure DM-Multipath

我的workround方法是在 Fedora 主机(因为这个工具是RedHat主推,Fedora系列一直有这个工具可使用)执行 multipath 工具生成初始配置,复制过来再做修改

实际生成的 /etc/multipath.conf 非常简单:

使用mpathconf工具生成默认/etc/multipath.conf(非常简单)
defaults {
        user_friendly_names yes
        find_multipaths yes
}
  • /etc/multipath.conf 配置文件中添加以下内容:

/etc/multipath.conf添加配置,其中blacklist剔除了本地NVMe硬盘
defaults {
        user_friendly_names yes
        find_multipaths yes
}

blacklist {
        devnode nvme0n1
}

devices {
        device {
                vendor                 "LIO-ORG"
                product                "TCMU device"
                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
        }
}

然后重新启动 multipathd 服务:

重启multipathd服务
sudo systemdctl restart multipathd

iSCSI发现和设置

  • /etc/iscsi/iscsid.conf 配置中添加 配置Ceph iSCSI网关 时在 /etc/ceph/iscsi-gateway.cfg 中配置的 CHAP 用户名和密码:

配置/etc/iscsi/iscsid.conf访问iSCSI target认证(CHAP)
node.session.auth.authmethod = CHAP
node.session.auth.username = libvirtd
node.session.auth.password = mypassword12

警告

这里的认证账号是 配置Ceph iSCSI网关 步骤中 创建一个 initator 名为 iqn.1989-06.io.cloud-atlas:libvirt-client 客户端,并且配置intiator的CHAP名字和密码 配置的,不是服务器的 /etc/ceph/iscsi-gateway.cfg 配置中的管理账号。

我最初搞错了,导致iSCSI initator无法登陆(见下文)。这里已经订正

这里有多种CHAP认证设置,对应于 配置Ceph iSCSI网关/etc/ceph/iscsi-gateway.cfg 简单认证配置上述内容。详细不同认证方法参考配置文件注释或者 arch linxu: Open-iSCSI

  • 启动并激活 iscsid 服务:

启动并激活iscsid
sudo systemctl start iscsid
sudo systemctl enable iscsid
  • 向 iSCSI target节点发送请求,语法如下:

    iscsiadm --mode discovery --portal target_ip --type sendtargets
    

实践操作如下:

使用iscsiadm discovery模式扫描target IP获取访问
sudo iscsiadm -m discovery -t st -p 192.168.8.205

输出信息就是iSCSI target,成功的关于节点和target信息会自动保存到本地的initator中:

使用iscsiadm discovery模式扫描target IP获取的成功信息会保存到本地initator中
192.168.8.205:3260,1 iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw
192.168.8.206:3260,2 iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw
  • 登陆到 iSCSI target:

iscsiadm登陆到target
sudo iscsiadm -m node -T iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw -l

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)

我仔细核对了 配置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 。对啊,我在 配置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 再次重复上述登陆…

终于,终于看到了成功登陆的信息:

iscsiadm登陆到target成功信息
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]
Login to [iface: default, target: iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw, portal: 192.168.8.205,3260] successful.
Login to [iface: default, target: iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw, portal: 192.168.8.206,3260] successful.

检查iSCSI initator信息

  • 检查运行的会话:

iscsiadm检查当前运行的会话
sudo iscsiadm -m session -P 3

此时可以看到:

iscsiadm检查当前运行的会话输出信息,可以看到iSCSI挂载了2块磁盘 sdasdb
iSCSI Transport Class version 2.0-870
version 2.1.8
Target: iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw (non-flash)
        Current Portal: 192.168.8.205:3260,1
        Persistent Portal: 192.168.8.205:3260,1
                **********
                Interface:
                **********
                Iface Name: default
                Iface Transport: tcp
                Iface Initiatorname: iqn.1989-06.io.cloud-atlas:libvirt-client
                Iface IPaddress: 192.168.8.1
                Iface HWaddress: default
                Iface Netdev: default
                SID: 19
                iSCSI Connection State: LOGGED IN
                iSCSI Session State: LOGGED_IN
                Internal iscsid Session State: NO CHANGE
                *********
                Timeouts:
                *********
                Recovery Timeout: 120
                Target Reset Timeout: 30
                LUN Reset Timeout: 30
                Abort Timeout: 15
                *****
                CHAP:
                *****
                username: libvirtd
                password: ********
                username_in: <empty>
                password_in: ********
                ************************
                Negotiated iSCSI params:
                ************************
                HeaderDigest: None
                DataDigest: None
                MaxRecvDataSegmentLength: 262144
                MaxXmitDataSegmentLength: 262144
                FirstBurstLength: 262144                                                                                   
                MaxBurstLength: 524288                                                                                     
                ImmediateData: Yes                                                                                         
                InitialR2T: Yes
                MaxOutstandingR2T: 1
                ************************
                Attached SCSI devices:
                ************************
                Host Number: 0  State: running
                scsi0 Channel 00 Id 0 Lun: 0
                        Attached scsi disk sdb          State: running
        Current Portal: 192.168.8.206:3260,2
        Persistent Portal: 192.168.8.206:3260,2
                **********
                Interface:
                **********
                Iface Name: default
                Iface Transport: tcp
                Iface Initiatorname: iqn.1989-06.io.cloud-atlas:libvirt-client
                Iface IPaddress: 192.168.8.1
                Iface HWaddress: default
                Iface Netdev: default
                SID: 20
                iSCSI Connection State: LOGGED IN
                iSCSI Session State: LOGGED_IN
                Internal iscsid Session State: NO CHANGE
                *********
                Timeouts:
                *********
                Recovery Timeout: 120
                Target Reset Timeout: 30
                LUN Reset Timeout: 30
                Abort Timeout: 15
                *****
                CHAP:
                *****
                username: libvirtd
                password: ********
                username_in: <empty>
                password_in: ********
                ************************
                Negotiated iSCSI params:
                ************************
                HeaderDigest: None
                DataDigest: None
                MaxRecvDataSegmentLength: 262144
                MaxXmitDataSegmentLength: 262144
                FirstBurstLength: 262144
                MaxBurstLength: 524288
                ImmediateData: Yes
                InitialR2T: Yes
                MaxOutstandingR2T: 1
                ************************
                Attached SCSI devices:
                ************************
                Host Number: 1  State: running
                scsi1 Channel 00 Id 0 Lun: 0
                        Attached scsi disk sda          State: running
  • 可以使用以下命令验证iSCSI会话:

iscsiadm检查当前运行的会话
sudo iscsiadm -m session -o show

此时可以看到:

iscsiadm检查当前运行的会话输出,可以看到有2个会话连接
tcp: [19] 192.168.8.205:3260,1 iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw (non-flash)
tcp: [20] 192.168.8.206:3260,2 iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw (non-flash)
  • 使用 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 设备,所以这里执行:

multipath -ll检查可用的多路设备
multipath -ll

我这里遇到一个问题, multipaht -ll 没有任何输出,虽然前面已经正确登陆了iSCSI target,显示本地已经挂载了2个磁盘。原因是 Arch Linux 上的 mpathconf 工具初始配置失败导致(见上文),通过在 Fedora 主机生成初始配置并复制到 Arch Linux 上重新完成 /etc/multipath.conf 修复。

这样能够正常工作显示如下:

multipath -ll检查可用的多路设备输出信息
mpatha (360014050c1044fe3a1241b693a733cc1) dm-6 LIO-ORG,TCMU device
size=46G features='1 queue_if_no_path' hwhandler='1 alua' wp=rw
|-+- policy='queue-length 0' prio=50 status=active
| `- 0:0:0:0 sdb 8:16 active ready running
`-+- policy='queue-length 0' prio=10 status=enabled
  `- 1:0:0:0 sda 8:0  active ready running
  • 现在完成设置,可以退出 target :

iscsiadm退出target登陆
sudo iscsiadm -m node -T iqn.2022-12.io.cloud-atlas.iscsi-gw:iscsi-igw -u

接下来,终于可以正式开始 移动云计算Libvirt集成Ceph iSCSI

参考