iSCSI 存储网络完整指南

发布时间: 更新时间: 总字数:3857 阅读时间:8m 作者:IP:上海 网址

本文是一份完整的 iSCSI 存储网络技术指南,涵盖了从基础概念到实际部署的全部内容。文章首先介绍了 SCSI 和 iSCSI 的基本概念及其关系,然后详细说明了 Linux 环境下的三大核心组件:LIO Target(服务器端框架)、targetcli(配置管理工具)和 Open-iSCSI(客户端实现)。文档提供了完整的 Ubuntu 部署示例,包括服务器端的 Target 配置、CHAP 认证设置,以及客户端的发现、连接和使用流程。通过本文,读者可以掌握利用现有以太网基础设施构建低成本、高性能存储区域网络(SAN)的完整方法。

基础概念

SCSI(小型计算机系统接口)

SCSI (Small Computer System Interface) 是一种基于**块(Block)**级别的数据传输协议。

  • 核心作用:用于在计算机(主机)和外围设备(如硬盘、磁带机、光驱等)之间进行数据通信
  • 数据传输级别:SCSI 是一种块级协议,数据以固定大小的块(通常是 512 字节或 4KB)进行传输
  • 物理连接:传统的 SCSI 协议依赖于专用的并行或串行电缆,通常是直连或使用专门的 FC(光纤通道) 网络
  • 特点:性能高,可靠性强,但传统上部署成本较高,且距离有限

简单理解:SCSI 是**语言**,定义了主机如何对存储设备发出读/写等指令。

iSCSI(互联网小型计算机系统接口)

iSCSI (Internet Small Computer System Interface) 是一种将 SCSI 协议 封装在 TCP/IP 协议 中的网络存储技术。

  • 核心作用:允许通过标准以太网(IP 网络)传输 SCSI 命令
  • 工作原理
    1. 封装:客户端(Initiator)的操作系统发出 SCSI 命令
    2. 传输:这些 SCSI 命令被封装到 TCP/IP 数据包
    3. 网络传输:数据包通过普通的以太网交换机和网线传输到目标服务器(Target)
    4. 解封装:目标服务器接收到数据包,提取出 SCSI 命令并执行
  • 数据传输级别:继承自 SCSI,也是一种块级协议
  • 优点
    • 成本效益:利用现有的标准以太网基础设施
    • 部署灵活:适用于任何 IP 网络,可远距离传输
  • 组成部分
    • Initiator(发起端):客户端软件(如 Open-iSCSI),负责封装和发送 SCSI 命令
    • Target(目标):存储服务器,负责接收和处理 SCSI 命令

iSCSI 和 SCSI 的关系

特点 SCSI(基础协议) iSCSI(网络协议)
层级 存储命令/通信规范 传输层协议
数据级别 块级 块级
传输介质 专用 SCSI 电缆或光纤通道 (FC) 标准 TCP/IP 网络(以太网)
关系 iSCSI 将 SCSI 命令作为其有效载荷进行传输
目标 实现主机和存储设备的本地连接 实现主机和存储设备的远程连接

LIO Target - 服务器端框架

什么是 LIO Target

Linux-IO (LIO) Target 是 Linux 内核中实现 SCSI Target 子系统 的主流框架。简单来说,LIO 的作用是让一台 Linux 服务器充当存储设备,将本地的存储资源(磁盘、文件等)通过网络协议(如 iSCSI、FCoE 等)暴露给其他客户端(Initiator)。

在 Linux 生态系统中,LIO 是从 Linux 内核 2.6.38 版本开始集成的官方、主线 SCSI Target 实现。

LIO Target 的核心作用

1. 作为一个通用的 SCSI Target 引擎

LIO 的设计是模块化的,它提供了一个并行的 SCSI 命令处理引擎,独立于具体的传输协议和后端存储。

  • Target (目标):LIO 允许 Linux 服务器扮演一个 Target 的角色,接收来自客户端的 SCSI 命令(读、写、状态查询等)
  • LUN 呈现:负责将服务器上的本地存储资源(称为 Backstores)抽象化为 LUNs (逻辑单元号),并通过网络暴露给 Initiator

2. 传输协议独立性(Fabric Modules)

LIO 架构的一大优势是其能够支持多种不同的存储网络协议:

协议 说明
iSCSI 最常用,通过标准 TCP/IP 端口 3260 传输 SCSI 命令
FCoE 允许在无损耗的以太网上传输光纤通道协议
SRP 用于 InfiniBand 网络,实现高性能、低延迟的传输
vHost 用于虚拟化环境,直接将存储暴露给 QEMU/KVM 虚拟机

3. 存储后端支持(Backstores)

LIO 可以使用多种类型的本地存储作为其 LUN 的后端:

类型 说明
Block 直接使用物理磁盘、分区或 LVM 逻辑卷,性能最佳
FileIO 使用文件系统上的一个文件作为存储映像,部署灵活
Pscsi 允许将 SCSI 命令直接传递给真正的物理 SCSI 设备
Ramdisk 使用内存作为存储,用于测试

4. 高级存储特性支持

LIO 支持许多企业级的高级功能:

  • SCSI-3/SCSI-4 Persistent Reservations (PRs):用于集群环境(如 Pacemaker),控制对共享 LUN 的独占访问
  • ALUA (Asymmetric Logical Unit Assignment):允许管理员管理 LUN 的访问状态和路径属性
  • VAAI (VMware vSphere APIs for Array Integration):支持某些存储卸载功能

5. 配置管理

LIO 的配置是通过一个名为 ConfigFS 的特殊内核文件系统接口完成的。

  • targetcli-fb:这是最常用的用户空间管理工具,它提供了一个类似于文件系统的命令行 Shell

targetcli - 配置管理工具

targetcli 是用于配置 Linux-IO (LIO) Target 子系统的命令行管理工具。它使用一个分层结构(类似于文件系统)来组织和管理所有配置对象。

存储后端 (Backstores)

backstores 节点定义了 iSCSI Target 实际用来存储数据的物理或逻辑资源。

节点 作用 适用场景
block 使用一个裸块设备(如整个磁盘、分区、LVM 逻辑卷)作为后端存储 推荐用于生产环境,性能最好,直接绕过文件系统层
fileio 使用文件系统上的一个文件(通常是一个稀疏文件)作为后端存储 适用于测试、开发环境,或在没有独立块设备时使用
pscsi SCSI 直通模式,允许 LIO Target 直接将 SCSI 命令传递给真正的物理 SCSI 设备 适用于需要将真实的物理设备信息暴露给客户端的特定场景
ramdisk 使用服务器内存中的一个区域作为后端存储 仅用于测试,性能极高但数据在重启后会丢失

目标结构 (Target Fabrics)

这些节点代表不同的存储传输协议(Fabric):

节点 作用 适用场景
iscsi 互联网 SCSI 目标,通过 TCP/IP 网络暴露块存储 所有标准的 iSCSI 部署
loopback 本地回环目标,用于在 Target 服务器本身上测试 LIO 配置 测试 LIO 配置、多路径设置等
vhost 虚拟主机 Target,将存储暴露给 QEMU/KVM 虚拟机 虚拟化环境,为虚拟机提供高性能块存储

Target 配置子组件

在具体的 Target 路径下(例如 `/iscsi/<Target_IQN>/tpg1/),有以下关键子节点:

节点 完整路径示例 作用
tpg1 /iscsi/iqn.../tpg1 Target Portal Group (TPG),LIO Target 的核心配置容器,包含 LUNs、ACLs 和 Portals 的具体配置
luns /iscsi/.../tpg1/luns 逻辑单元号,负责将后端存储映射到 iSCSI Target 上,并分配一个 LUN ID
acls /iscsi/.../tpg1/acls 访问控制列表,定义哪些特定的 Initiator IQN 被允许连接,可配置 CHAP 认证
portals /iscsi/.../tpg1/portals 门户,定义 Target 服务器用于侦听 iSCSI 连接的 IP 地址和 TCP 端口(默认为 3260)

配置流程总结

配置一个 iSCSI Target 的基本流程:

  1. 定义存储(Backstore)cd /backstores/fileiocd /backstores/block,然后 create 实际的存储资源
  2. 创建目标(Target)cd /iscsi,然后 create Target IQN
  3. 映射 LUNcd .../tpg1/luns,然后 create 将 Backstore 映射为一个 LUN
  4. 定义入口(Portal)cd .../tpg1/portals,通常默认的 0.0.0.0:3260 已经创建
  5. 授予权限(ACL)cd .../tpg1/acls,然后 create 客户端的 Initiator IQN,并可选地设置 CHAP 认证

Open-iSCSI - 客户端实现

什么是 Open-iSCSI

Linux Open-iSCSI 是一个为 Linux 提供的 **iSCSI 发起端(Initiator)**软件实现。

Open-iSCSI 的作用

Open-iSCSI 项目提供了一个高性能、独立于传输协议的 iSCSI 实现,它的主要作用是让 **Linux 服务器作为客户端(发起端)**通过标准的 TCP/IP 网络连接到远程的 iSCSI 存储目标(Target)

  • 实现 iSCSI 协议:实现了 RFC 3720 定义的 iSCSI 协议
  • 连接远程存储:允许 Linux 系统连接到集中式存储系统
  • 提供块设备:iSCSI 目标提供的 LUN 会在 Linux 内核中呈现为一个标准的块设备
  • 高可用性(HA):可以结合使用设备映射器多路径工具

Open-iSCSI 划分为用户空间和内核空间两部分:

  • 内核部分:包含在 Linux 内核中,负责 iSCSI 的数据路径
  • 用户空间部分:包含 iscsid 守护进程 和管理工具 iscsiadm

iscsid 进程的作用

iscsid(iSCSI Daemon)是 Open-iSCSI 用户空间的关键守护进程:

  1. 控制平面操作

    • iSCSI 发现 (Discovery)
    • 登录 (Login) 和注销 (Logout) 处理
    • 连接级错误处理
    • Nop-In/Nop-Out 处理
  2. 与内核通信:与 SCSI 中间层通信,以便在内核中创建对应的块设备

  3. 配置和会话管理:根据持久化的 iSCSI 数据库中的内容,在系统启动时自动重新连接

  4. 认证:处理与 iSCSI 目标进行会话所需的认证信息(如 CHAP)

Initiator IQN

Initiator IQN(iSCSI Qualified Name,iSCSI 限定名称)是根据 iSCSI 标准(RFC 3720)为 **iSCSI 发起端(Initiator,即客户端)**分配的全球唯一标识符。

IQN 的标准格式

iqn.YYYY-MM.REVERSE.DOMAIN.NAME:UNIQUE_STRING

例如:iqn.2005-03.org.open-iscsi:01.e7839d513f

如何获取 Linux Initiator IQN

在 Linux 系统上,当您安装了 open-iscsi 软件包后,Initiator IQN 会自动生成并存储在 /etc/iscsi/initiatorname.iscsi 文件中。

bash
cat /etc/iscsi/initiatorname.iscsi

示例输出

InitiatorName=iqn.2005-03.org.open-iscsi:01:1a2b3c4d5e6f

完整部署示例

服务器端 - Ubuntu iSCSI Target 部署

准备工作

  1. 更新系统
bash
sudo apt update
sudo apt upgrade -y
  1. 规划存储空间:创建一个目录来存放 iSCSI 映像文件
bash
sudo mkdir -p /iscsi_storage

步骤一:安装 iSCSI Target 工具

bash
sudo apt install targetcli-fb -y

步骤二:启动和启用 iSCSI Target 服务

bash
sudo systemctl start target
sudo systemctl enable target
sudo systemctl status target

步骤三:配置防火墙

iSCSI 使用 TCP 端口 3260

bash
sudo ufw allow 3260/tcp
sudo ufw reload
sudo ufw status

步骤四:使用 targetcli 配置 iSCSI Target

bash
sudo targetcli

1. 创建后端存储 (Backstore)

bash
/> cd /backstores/fileio
/backstores/fileio> create lun_file /iscsi_storage/iscsi_lun1.img 10G

2. 创建 iSCSI Target

bash
/backstores/fileio> cd /iscsi
/iscsi> create iqn.2025-10.com.example:target01

3. 关联 LUN

bash
/iscsi> cd iqn.2025-10.com.example:target01/tpg1/luns
/iscsi/.../tpg1/luns> create /backstores/fileio/lun_file

4. 配置访问控制列表 (ACL) 和 CHAP 认证

bash
/iscsi/.../tpg1/luns> cd ../acls
/iscsi/.../tpg1/acls> create iqn.2005-03.org.open-iscsi:initiator-client

设置 CHAP 认证:

bash
/iscsi/.../initiator-client> set auth userid=iscsiuser
/iscsi/.../initiator-client> set auth password=password123

5. 检查配置并退出

bash
/iscsi/.../acls> cd /
/> ls
/> saveconfig
/> exit

客户端 - Open-iSCSI 发起端使用

1. 启动 iSCSI 服务

bash
sudo systemctl start iscsid
sudo systemctl status iscsid
sudo systemctl enable iscsid

2. 发现 iSCSI 目标

bash
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.100:3260

示例输出

192.168.1.100:3260,1 iqn.2006-01.com.example:storage.target01

3. 配置 CHAP 认证(如果需要)

bash
# 启用 CHAP
sudo iscsiadm -m node -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260 --op=update -n node.session.auth.authmethod -v CHAP

# 设置用户名
sudo iscsiadm -m node -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260 --op=update -n node.session.auth.username -v myinitiatoruser

# 设置密码
sudo iscsiadm -m node -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260 --op=update -n node.session.auth.password -v myinitiatorpassword123

4. 登录 iSCSI 目标

bash
sudo iscsiadm -m node -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260 --login

5. 设置自动登录

bash
sudo iscsiadm -m node -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260 --op=update -n node.startup -v automatic

6. 使用 iSCSI 磁盘

bash
# 查看新设备
lsblk

# 创建分区
sudo fdisk /dev/sdb

# 格式化分区
sudo mkfs.ext4 /dev/sdb1

# 创建挂载点并挂载
sudo mkdir /mnt/iscsi_data
sudo mount /dev/sdb1 /mnt/iscsi_data

# 添加到 /etc/fstab 实现开机自动挂载
# UUID=... /mnt/iscsi_data ext4 _netdev,defaults 0 0

7. 注销 iSCSI 目标

bash
sudo iscsiadm -m node -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260 --logout

8. 删除发现的节点记录

bash
sudo iscsiadm -m node -o delete -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260

总结

iSCSI 存储网络由以下核心组件构成:

  1. LIO Target:Linux 内核中的 SCSI Target 实现,负责将本地存储资源通过网络暴露给客户端
  2. targetcli:用户空间的配置管理工具,提供类似文件系统的命令行界面
  3. Open-iSCSI:客户端的 iSCSI 发起端实现,包含 iscsid 守护进程和 iscsiadm 管理工具

通过这些组件,企业可以利用现有的以太网基础设施构建低成本、高性能的存储区域网络 (SAN)。