最近简单折腾了一下 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 访问
实际配置流程也比较简单:
- 创建 Backstore
- 创建 Target
- 创建 Portal
- 创建 LUN
- 配置 Initiator ACL
- Initiator Discovery
- Login Target
- 创建文件系统并挂载
第一次看到 targetcli 的配置树可能感觉东西很多,但把 Backstore、LUN、Portal 和 ACL 各自是干什么的弄明白以后,剩下基本就是按照流程配置。
本文只是简单把 iSCSI 跑起来,更复杂的 Multipath、多 Portal、ALUA、集群存储等内容就不在这里展开了。
参考资料
RFC 7143 - Internet Small Computer System Interface (iSCSI) Protocol
https://www.rfc-editor.org/rfc/rfc7143.htmlRFC 3721 - Internet Small Computer Systems Interface (iSCSI) Naming and Discovery
https://www.rfc-editor.org/rfc/rfc3721.htmlRed Hat Enterprise Linux 9 - Configuring an iSCSI target
https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/managing_storage_devices/configuring-an-iscsi-target_managing-storage-devicesRed Hat Enterprise Linux 9 - Configuring an iSCSI initiator
https://docs.redhat.com/en/documentation/red_hat_enterprise_linux/9/html/managing_storage_devices/configuring-an-iscsi-initiator_managing-storage-devicesOpen-iSCSI
https://github.com/open-iscsi/open-iscsitargetcli-fb
https://github.com/open-iscsi/targetcli-fb