iSCSI 存储网络完整指南
本文是一份完整的 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 命令
- 工作原理:
- 封装:客户端(Initiator)的操作系统发出 SCSI 命令
- 传输:这些 SCSI 命令被封装到 TCP/IP 数据包中
- 网络传输:数据包通过普通的以太网交换机和网线传输到目标服务器(Target)
- 解封装:目标服务器接收到数据包,提取出 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 的基本流程:
- 定义存储(Backstore):
cd /backstores/fileio或cd /backstores/block,然后create实际的存储资源 - 创建目标(Target):
cd /iscsi,然后createTarget IQN - 映射 LUN:
cd .../tpg1/luns,然后create将 Backstore 映射为一个 LUN - 定义入口(Portal):
cd .../tpg1/portals,通常默认的0.0.0.0:3260已经创建 - 授予权限(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 用户空间的关键守护进程:
-
控制平面操作:
- iSCSI 发现 (Discovery)
- 登录 (Login) 和注销 (Logout) 处理
- 连接级错误处理
- Nop-In/Nop-Out 处理
-
与内核通信:与 SCSI 中间层通信,以便在内核中创建对应的块设备
-
配置和会话管理:根据持久化的 iSCSI 数据库中的内容,在系统启动时自动重新连接
-
认证:处理与 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 文件中。
cat /etc/iscsi/initiatorname.iscsi示例输出:
InitiatorName=iqn.2005-03.org.open-iscsi:01:1a2b3c4d5e6f完整部署示例
服务器端 - Ubuntu iSCSI Target 部署
准备工作
- 更新系统:
sudo apt update
sudo apt upgrade -y- 规划存储空间:创建一个目录来存放 iSCSI 映像文件
sudo mkdir -p /iscsi_storage步骤一:安装 iSCSI Target 工具
sudo apt install targetcli-fb -y步骤二:启动和启用 iSCSI Target 服务
sudo systemctl start target
sudo systemctl enable target
sudo systemctl status target步骤三:配置防火墙
iSCSI 使用 TCP 端口 3260:
sudo ufw allow 3260/tcp
sudo ufw reload
sudo ufw status步骤四:使用 targetcli 配置 iSCSI Target
sudo targetcli1. 创建后端存储 (Backstore)
/> cd /backstores/fileio
/backstores/fileio> create lun_file /iscsi_storage/iscsi_lun1.img 10G2. 创建 iSCSI Target
/backstores/fileio> cd /iscsi
/iscsi> create iqn.2025-10.com.example:target013. 关联 LUN
/iscsi> cd iqn.2025-10.com.example:target01/tpg1/luns
/iscsi/.../tpg1/luns> create /backstores/fileio/lun_file4. 配置访问控制列表 (ACL) 和 CHAP 认证
/iscsi/.../tpg1/luns> cd ../acls
/iscsi/.../tpg1/acls> create iqn.2005-03.org.open-iscsi:initiator-client设置 CHAP 认证:
/iscsi/.../initiator-client> set auth userid=iscsiuser
/iscsi/.../initiator-client> set auth password=password1235. 检查配置并退出
/iscsi/.../acls> cd /
/> ls
/> saveconfig
/> exit客户端 - Open-iSCSI 发起端使用
1. 启动 iSCSI 服务
sudo systemctl start iscsid
sudo systemctl status iscsid
sudo systemctl enable iscsid2. 发现 iSCSI 目标
sudo iscsiadm -m discovery -t sendtargets -p 192.168.1.100:3260示例输出:
192.168.1.100:3260,1 iqn.2006-01.com.example:storage.target013. 配置 CHAP 认证(如果需要)
# 启用 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 myinitiatorpassword1234. 登录 iSCSI 目标
sudo iscsiadm -m node -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260 --login5. 设置自动登录
sudo iscsiadm -m node -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260 --op=update -n node.startup -v automatic6. 使用 iSCSI 磁盘
# 查看新设备
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 07. 注销 iSCSI 目标
sudo iscsiadm -m node -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260 --logout8. 删除发现的节点记录
sudo iscsiadm -m node -o delete -T iqn.2006-01.com.example:storage.target01 -p 192.168.1.100:3260总结
iSCSI 存储网络由以下核心组件构成:
- LIO Target:Linux 内核中的 SCSI Target 实现,负责将本地存储资源通过网络暴露给客户端
- targetcli:用户空间的配置管理工具,提供类似文件系统的命令行界面
- Open-iSCSI:客户端的 iSCSI 发起端实现,包含
iscsid守护进程和iscsiadm管理工具
通过这些组件,企业可以利用现有的以太网基础设施构建低成本、高性能的存储区域网络 (SAN)。
最近更新
最新评论