使用iscsi简易指南

最近简单折腾了一下 iSCSI,刚开始看的时候 Target、Initiator、LUN、IQN 这些名词比较多,不过实际配置一次以后会发现并没有那么复杂。

简单来说:

iSCSI 是通过 TCP/IP 网络提供块设备的一种方式。

它和 NFS 最大的区别是,NFS 提供的是文件或者目录,而 iSCSI 提供的是块设备。

客户端连接成功以后,最终看到的通常是 /dev/sdb/dev/sdc 这样的磁盘,然后可以像本地磁盘一样创建文件系统、LVM 等。

本文使用 Rocky Linux / RHEL 系统做一个最简单的 iSCSI 环境。


1. 几个基本概念

先简单记几个名词。

Target

提供存储的一方。

本文使用 Linux LIO,并通过 targetcli 配置。

Initiator

使用存储的一方。

Linux 下一般使用 Open-iSCSI,通过 iscsiadm 进行管理。

Backstore

真正保存数据的后端。

可以是:

  • 磁盘
  • LVM LV
  • 文件
  • 其他块设备

本文为了方便测试,直接使用一个文件。

LUN

Target 暴露给 Initiator 的逻辑存储单元。

Initiator 登录以后,LUN 最终会被 Linux 识别成一个块设备。

Portal

Target 提供 iSCSI 服务的地址,例如:

192.168.56.10:3260

iSCSI 默认使用 TCP 3260 端口。

IQN

IQN 是 iSCSI 使用的名称,例如:

iqn.2024-01.com.example:storage.lab

Target 和 Initiator 都会有自己的 IQN。


2. 实验环境

这里准备两台机器:

用途 IP
iSCSI Target 192.168.56.10
iSCSI Initiator 192.168.56.20

Target IQN 使用:

iqn.2024-01.com.example:storage.lab

创建一个 10G 的 LUN 给 Initiator 使用。


3. 配置 Initiator

先在客户端安装:

dnf install -y iscsi-initiator-utils

启动 iscsid

systemctl enable --now iscsid

查看当前 Initiator IQN:

cat /etc/iscsi/initiatorname.iscsi

输出类似:

InitiatorName=iqn.1994-05.com.redhat:xxxxxxxxxxxxxxxx

这个 IQN 后面配置 Target ACL 时需要用到。


4. 配置 iSCSI Target

在 Target 服务器安装:

dnf install -y targetcli

进入:

targetcli

创建 Backstore

本文直接使用一个 10G 文件:

/> backstores/fileio create lun0 /var/lib/iscsi/lun0.img 10G write_back=false

这里的 lun0 是 Backstore 名称。

实际数据保存在:

/var/lib/iscsi/lun0.img

如果是实际环境,也可以直接使用 LVM LV 或独立块设备。


5. 创建 Target

创建 Target:

/> iscsi/ create iqn.2024-01.com.example:storage.lab

然后创建监听地址:

/> iscsi/iqn.2024-01.com.example:storage.lab/tpg1/portals create 192.168.56.10

默认使用:

TCP 3260

如果服务器开启了 firewalld,需要放行端口:

firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload

6. 创建 LUN

前面创建的只是 Backstore,现在需要把它映射成 LUN:

/> iscsi/iqn.2024-01.com.example:storage.lab/tpg1/luns create /backstores/fileio/lun0

第一个 LUN 一般就是:

LUN 0

这里比较容易混:

  • Backstore 是实际的数据来源
  • LUN 是 Target 对外提供的逻辑存储单元

它们不是同一个东西。


7. 配置 ACL

为了只允许指定 Initiator 使用这个 Target,需要把客户端 IQN 加入 ACL。

例如客户端的 IQN 是:

iqn.1994-05.com.redhat:xxxxxxxxxxxxxxxx

执行:

/> iscsi/iqn.2024-01.com.example:storage.lab/tpg1/acls create iqn.1994-05.com.redhat:xxxxxxxxxxxxxxxx

然后保存:

/> saveconfig
/> exit

到这里 Target 基本就配置完成了。

简单理解 targetcli 里面几个东西的作用:

  • Backstore:数据实际放在哪里
  • LUN:提供什么存储
  • Portal:从哪里连接
  • ACL:谁可以连接
  • Target IQN:连接的是哪个 Target

把这几个关系理清楚以后,targetcli 看起来就没那么绕了。


8. Initiator 发现 Target

回到客户端:

iscsiadm -m discovery -t sendtargets -p 192.168.56.10

正常可以看到:

192.168.56.10:3260,1 iqn.2024-01.com.example:storage.lab

Discovery 只是发现 Target,并没有真正连接。


9. 登录 Target

执行:

iscsiadm -m node \
  -T iqn.2024-01.com.example:storage.lab \
  -p 192.168.56.10:3260 \
  --login

查看当前 Session:

iscsiadm -m session

然后:

lsblk

应该可以看到一块新的磁盘,例如:

sdb    10G

还可以通过:

ls -l /dev/disk/by-path/ | grep iscsi

确认具体哪个设备对应这个 iSCSI LUN。

不要单纯依赖 /dev/sdb 这种名称,因为设备名称可能发生变化。


10. 创建文件系统并挂载

确认设备没有选错以后,例如:

/dev/sdb

创建 XFS:

mkfs.xfs /dev/sdb

创建挂载目录:

mkdir -p /mnt/iscsi

挂载:

mount /dev/sdb /mnt/iscsi

查看:

df -hT /mnt/iscsi

到这里,一个最基本的 iSCSI 环境就已经可以正常使用了。


11. 设置自动登录

如果需要机器重启以后自动恢复 iSCSI Session,可以设置:

iscsiadm -m node \
  -T iqn.2024-01.com.example:storage.lab \
  -p 192.168.56.10:3260 \
  --op update \
  -n node.startup \
  -v automatic

并启用相关服务:

systemctl enable iscsid iscsi

文件系统挂载建议使用 UUID。

查看:

blkid /dev/sdb

然后在 /etc/fstab 中配置:

UUID=<UUID> /mnt/iscsi xfs _netdev 0 0

_netdev 表示这个文件系统依赖网络。


12. 关于 CHAP

iSCSI 还支持 CHAP 认证。

如果只是内部实验环境,可以先不配置。

实际使用时,不建议把 Target 直接暴露在不可信网络中,至少应该考虑:

  • Initiator ACL
  • CHAP
  • 防火墙
  • 独立存储网络或 VLAN

另外需要注意:

CHAP 解决的是身份认证问题,并不代表 iSCSI 数据本身已经被加密。


13. 一个需要注意的问题

iSCSI 提供的是共享块设备,而不是共享文件系统。

不要因为两台服务器都能连接同一个 LUN,就直接让它们同时挂载同一个普通 XFS 或 ext4 文件系统并进行读写。

普通文件系统默认并不知道还有另外一台机器正在修改相同的磁盘数据。

如果需要多个节点同时访问同一个共享块设备,一般需要使用专门的集群文件系统或者由上层集群、虚拟化软件进行管理。


总结

iSCSI 最主要的几个东西其实就是:

  • Target:提供存储
  • Initiator:连接存储
  • Backstore:真正的数据后端
  • LUN:提供给客户端的逻辑存储
  • Portal:Target 的连接地址
  • ACL:允许哪些 Initiator 访问

实际配置流程也比较简单:

  1. 创建 Backstore
  2. 创建 Target
  3. 创建 Portal
  4. 创建 LUN
  5. 配置 Initiator ACL
  6. Initiator Discovery
  7. Login Target
  8. 创建文件系统并挂载

第一次看到 targetcli 的配置树可能感觉东西很多,但把 Backstore、LUN、Portal 和 ACL 各自是干什么的弄明白以后,剩下基本就是按照流程配置。

本文只是简单把 iSCSI 跑起来,更复杂的 Multipath、多 Portal、ALUA、集群存储等内容就不在这里展开了。


参考资料

发表评论: