Skip to content

Linux_iSCSI存储_搭建记录

核心原理

iSCSI通过将SCSI命令封装在TCP/IP协议中,实现基于IP网络的块存储传输。它由以下组件组成:

  • Target:存储服务端,提供块设备
  • Initiator:存储客户端,连接并使用远程块设备
  • IQN:iSCSI限定名称,唯一标识Target和Initiator

环境准备

系统要求

  • 操作系统:Linux(例如CentOS、RHEL、Debian等)
  • 软件包:targetcli(用于配置iSCSI目标)
  • 磁盘:本地的块设备,例如/dev/sdb1和/dev/sdc1,可以是未使用的硬盘或分区

步骤1:安装targetcli工具

在大多数Linux发行版中,你可以通过包管理器安装targetcli。

bash
# 对于RHEL/CentOS:
yum install targetcli -y

# 对于Debian/Ubuntu:
apt install targetcli-fb -y

注意:如果使用CentOS 8/RHEL 8及以上版本,可能需要启用PowerTools或AppStream仓库:

bash
# CentOS 8
dnf install targetcli -y

步骤2:启动targetcli并配置后端存储

启动targetcli命令行界面:

bash
targetcli

进入存储配置目录/backstores/block,创建块设备backstore,将本地磁盘/dev/sdb1/dev/sdc1作为后端存储:

bash
/backstores/block> create winqj_1 /dev/sdb1
/backstores/block> create winqj_2 /dev/sdc1

说明winqj_1winqj_2是两个用于标识后端存储对象的名字,分别对应物理设备/dev/sdb1/dev/sdc1。这些名称可以自定义,建议使用有意义的命名规则。

步骤3:创建iSCSI目标(IQN)

进入iSCSI配置目录:

bash
/backstores/block> cd /iscsi

创建两个iSCSI目标,分别命名为iqn.2021-07.com.miscrosft:winqj1iqn.2021-07.com.miscrosft:winqj2,并自动分配默认端口3260:

bash
/iscsi> create iqn.2021-07.com.miscrosft:winqj1
/iscsi> create iqn.2021-07.com.miscrosft:winqj2

IQN命名规则:iSCSI限定名称(IQN)格式为iqn.YYYY-MM.reverse.domain:name,其中:

  • YYYY-MM:年月,表示分配该名称的时间
  • reverse.domain:反向域名
  • name:特定标识符

步骤4:关联LUN与Backstore

LUN(逻辑单元号)是iSCSI中发起程序(Initiator)访问的存储单元。需要将后端存储对象(backstore)与iSCSI目标的LUN进行关联。

进入第一个iSCSI目标的LUN目录并创建LUN:

bash
/iscsi/iqn.2021-07.com.miscrosft:winqj1/tpg1/luns> create /backstores/block/winqj_1

同样地,为第二个iSCSI目标创建LUN:

bash
/iscsi/iqn.2021-07.com.miscrosft:winqj2/tpg1/luns> create /backstores/block/winqj_2

原理说明:LUN将后端存储块设备映射到iSCSI目标,每个LUN在客户端表现为一个独立的磁盘。TPG(Target Portal Group)用于组织LUN和访问控制。

步骤5:配置网络端口

默认情况下,iSCSI目标监听在所有网络接口的0.0.0.0:3260端口。为了提高安全性和可控性,我们可以绑定特定的IP地址。

  1. 进入iSCSI目标的网络端口配置目录并删除默认的0.0.0.0:3260端口:
bash
/iscsi/iqn.2021-07.com.miscrosft:winqj1/tpg1/portals> delete 0.0.0.0 3260
  1. 为两个iSCSI目标配置特定的IP地址和端口号(例如:192.168.122.131:3260):
bash
/iscsi/iqn.2021-07.com.miscrosft:winqj1/tpg1/portals> create 192.168.122.131 3260
/iscsi/iqn.2021-07.com.miscrosft:winqj2/tpg1/portals> create 192.168.122.131 3260

安全提醒:绑定特定IP可以限制iSCSI服务的访问范围,提高安全性。生产环境中建议使用专用存储网络,并配置防火墙规则。

步骤6:设置访问控制列表(ACL)

iSCSI发起程序使用IQN标识它们的身份。我们需要为发起程序创建访问控制列表(ACL),以允许它们访问iSCSI目标。

  1. 进入第一个iSCSI目标的ACL目录,并为发起程序iqn.1991-05.com.microsoft:win-132iqn.1991-05.com.microsoft:win-133创建访问权限:
bash
/iscsi/iqn.2021-07.com.miscrosft:winqj1/tpg1/acls> create iqn.1991-05.com.microsoft:win-132
/iscsi/iqn.2021-07.com.miscrosft:winqj1/tpg1/acls> create iqn.1991-05.com.microsoft:win-133
  1. 同样地,为第二个iSCSI目标添加相同的发起程序:
bash
/iscsi/iqn.2021-07.com.miscrosft:winqj2/tpg1/acls> create iqn.1991-05.com.microsoft:win-132
/iscsi/iqn.2021-07.com.miscrosft:winqj2/tpg1/acls> create iqn.1991-05.com.microsoft:win-133

说明:ACL(访问控制列表)基于客户端的IQN进行权限控制。只有被明确允许的客户端才能连接到iSCSI目标,这是iSCSI安全性的重要组成部分。

步骤7:保存配置并退出

  1. 保存所有配置:
bash
/> saveconfig
  1. 退出targetcli:
bash
/> exit

注意:必须执行saveconfig命令,否则配置将在服务重启后丢失。

步骤8:启动iSCSI服务并配置自动启动

  1. 启动target服务:
bash
systemctl start target
  1. 设置服务开机自动启动:
bash
systemctl enable target
  1. 检查服务状态:
bash
systemctl status target

步骤9:在发起程序端测试连接

在客户端(iSCSI发起程序)上,可以使用以下命令发现和连接到iSCSI目标:

1. 安装iSCSI工具

bash
# CentOS/RHEL
yum install iscsi-initiator-utils -y

# Debian/Ubuntu
apt install open-iscsi -y

2. 发现目标

bash
iscsiadm -m discovery -t sendtargets -p 192.168.122.131

3. 登录到iSCSI目标

bash
# 登录所有发现的目标
iscsiadm -m node --login

# 或登录特定目标
iscsiadm -m node -T iqn.2021-07.com.miscrosft:winqj1 -p 192.168.122.131:3260 --login

4. 查看和使用挂载的iSCSI磁盘

bash
lsblk
fdisk -l

5. 配置自动登录(可选)

bash
# 设置自动登录
iscsiadm -m node -T iqn.2021-07.com.miscrosft:winqj1 -p 192.168.122.131 --op update -n node.startup -v automatic

# 启动iscsi服务
systemctl start iscsi
systemctl enable iscsi

参数详解

Target端常用命令

命令功能示例
ls列出当前目录内容/backstores/block> ls
cd切换目录/backstores> cd /iscsi
create创建对象/iscsi> create iqn.2021-07.com.example:target1
delete删除对象/iscsi> delete iqn.2021-07.com.example:target1
saveconfig保存配置/> saveconfig

Initiator端常用命令

命令功能示例
iscsiadm -m discovery发现目标iscsiadm -m discovery -t sendtargets -p 192.168.1.100
iscsiadm -m node节点管理iscsiadm -m node --login
iscsiadm -m session会话管理iscsiadm -m session
iscsiadm -m iface接口管理iscsiadm -m iface

注意事项

⚠️ 安全提醒

  • 在生产环境中,应使用专用存储网络(VLAN或物理隔离网络)
  • 启用CHAP认证以增强安全性
  • 定期备份iSCSI配置文件(/etc/target/saveconfig.json

⚠️ 性能优化

  • 使用Jumbo Frames(9000 MTU)提高传输效率
  • 为高I/O负载场景配置多路径(Multipath I/O)
  • SSD后端存储可适当调整队列深度

⚠️ 故障处理

  • session failed to reconnect错误通常是网络问题
  • 使用iscsiadm -m node -R重新连接所有节点
  • 检查防火墙设置(确保3260端口开放)

扩展应用

CHAP认证配置

bash
# 在targetcli中设置CHAP认证
/iscsi/iqn.2021-07.com.example:target1/tpg1/acls> create iqn.1991-05.com.microsoft:win-132
/iscsi/iqn.2021-07.com.example:target1/tpg1/acls/iqn.1991-05.com.microsoft:win-132> set auth userid=username
/iscsi/iqn.2021-07.com.example:target1/tpg1/acls/iqn.1991-05.com.microsoft:win-132> set auth password=password123

使用文件作为后端存储

bash
# 创建大文件作为后端存储
dd if=/dev/zero of=/var/lib/iscsi-storage/disk1.img bs=1M count=10240

# 在targetcli中创建fileio backstore
/backstores/fileio> create disk1 /var/lib/iscsi-storage/disk1.img

用心记录,持续学习 | CNB