Akemi

iSCSI协议

2025/04/17

SCSI协议栈

SCSI(Small Computer System Interface)协议栈是一套分层的标准化体系,定义了计算机与存储设备(或其他外设)之间的通信规则,涵盖从物理连接、数据传输到高级命令交互的完整流程。其核心目标是为存储操作提供统一、可扩展且高性能的接口

SCSI结构

SCSI协议栈基于 客户端-服务端(Initiator-Target) 架构,分为以下四层:

1.应用层(SCSI Command Layer)
功能:定义存储操作的语义,即 SCSI指令集(如 READ, WRITE, INQUIRY 等)。

2.传输层(Transport Layer)
功能:负责将SCSI指令和数据进行封装、传输、错误恢复和流量控制。

常见传输协议

iSCSI:通过TCP/IP网络传输SCSI指令。
SAS(Serial Attached SCSI)
:基于串行物理链路的SCSI协议。
Fibre Channel(FC):用于高性能SAN(存储区域网络)。
USB Attached SCSI(UAS):通过USB接口传输SCSI指令。
SRP(SCSI RDMA Protocol):基于RDMA(如InfiniBand)的高性能传输。

3.物理层(Physical Layer)

4.管理扩展层
功能:提供设备发现、多路径管理、安全认证等高级功能。

SCSI核心组件

1. Initiator(启动器)

  • 角色:发起存储请求的设备(如服务器的HBA卡、iSCSI Initiator软件)。
  • 功能:生成SCSI指令,通过传输协议发送到目标设备。

2. Target(目标器–服务端)

  • 角色:响应存储请求的设备(如硬盘阵列、iSCSI Target服务器)。
  • 功能:接收并执行SCSI指令,返回结果或数据。

3. 逻辑单元(LUN)

  • 定义:目标器上的逻辑存储单元(如一个虚拟磁盘、磁带卷)。
  • 寻址:通过 LUN ID 唯一标识(例如 LUN 0 表示第一个逻辑磁盘)。

SCSI工作流程

1.指令生成
Initiator应用层生成SCSI指令(如 READ(10)),封装为CDB。

2.传输封装
传输层将CDB和数据封装为协议数据单元(如iSCSI PDU或SAS帧)。

3.物理传输
物理层通过电缆或网络将数据发送到目标器。

4.指令执行
Target解析CDB,访问指定LUN的数据块,执行读/写操作。

5.结果返回
响应数据或状态码(如成功/错误)通过协议栈返回Initiator。

iSCIS协议

iSCIS协议允许通过 IP 网络(如以太网)传输 SCSI 命令,将远程存储设备(如 SAN 存储阵列)虚拟化成本地磁盘供计算机使用。

特点

  • 基于 TCP/IP:通过标准网络传输,无需专用硬件(如光纤通道)。
  • 跨平台支持:Windows、Linux、VMware 等均支持 iSCSI。
  • 典型应用:企业级存储区域网络(SAN)、云服务器挂载远程磁盘。

iSCSI概念—IQN

IQN(iSCSI Qualified Name) 是 iSCSI(Internet Small Computer System Interface)协议中用于唯一标识 iSCSI发起端(Initiator)iSCSI目标端(Target) 的标准命名格式。它的核心作用是确保在 IP 网络中传输 SCSI 指令时,设备能够被准确识别和寻址。

相当于是IP,毕竟iSCSI本身也是基于TCP/IP协议的

1
2
3
4
5
6
7
8
**IQN的命名规则:**

iqn.<yyyy-mm>.<反写域名>:<自定义标识>

比如:
iqn.2025-04.com.example:server01

iqn.2025-04.com.example:storage-array-01

iSCSI概念—Portal

指的是IP+端口的一组地址

iSCSI概念—TPG

包含了target、Portal,LUN、ACL的所有配置

块存储的共享挂载问题

块存储(如 iSCSI、FC 等)通过网络共享给多台主机时,技术上可以挂载,但存在严重的数据一致性问题风险

类型 块存储(Block Storage) 文件存储(File Storage)
共享方式 提供原始块设备(如 /dev/sdb 提供文件系统接口(如 NFS、SMB)
多主机访问 需集群文件系统(如 GFS2、OCFS2)协调 天然支持并发访问(服务端管理锁机制)
典型协议 iSCSI、Fibre Channel (FC) NFS、CIFS/SMB、GlusterFS
风险 直接挂载到多台主机会导致数据损坏 无此问题(服务端处理并发)

在Linux上搭建iSCSI target

target文件配置存放位置/etc/target/saveconfig.json

1
2
3
4
5
6
7
8
9
10
11
12
13
hostnamectl set-hostname iscsi-target && bash

yum -y install targetcli
targetcli
/> ls
o- / ......................................................................................... [...]
o- backstores .............................................................................. [...]
| o- block .................................................................. [Storage Objects: 0]
| o- fileio ................................................................. [Storage Objects: 0]
| o- pscsi .................................................................. [Storage Objects: 0]
| o- ramdisk ................................................................ [Storage Objects: 0]
o- iscsi ............................................................................ [Targets: 0]
o- loopback ......................................................................... [Targets: 0]

targetcli 的目录结构解析

(1) /backstores —— 存储后端(Storage Backends)
作用:定义存储资源的来源(物理磁盘、文件、内存等)。
子目录:
block:使用物理块设备(如 /dev/sdb)作为存储。
fileio:使用文件(如 .img 文件)模拟块设备。
pscsi:直通物理 SCSI 设备(如磁带机)。
ramdisk:使用内存作为临时存储(重启后数据丢失)。
(2) /iscsi —— iSCSI 目标配置
作用:定义 iSCSI Target(存储服务端),配置访问规则和 LUN 映射。
初始状态:[Targets: 0] 表示尚未创建任何 iSCSI 目标。
(3) /loopback —— 本地回环目标
作用:用于本地测试,将存储映射到同一台机器的其他服务(如虚拟机)。

创建iSCSI—block设备

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# 硬盘分区
我有一块多的磁盘,将其分一下区
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 1024M 0 rom
vda 252:0 0 10G 0 disk
└─vda1 252:1 0 7.8G 0 part /
vdb 252:16 0 50G 0 disk
├─vdb1 252:17 0 20G 0 part
└─vdb2 252:18 0 25G 0 part

# 将vbd2做成逻辑卷
pvcreate /dev/vdb2
vgcreate iscsi /dev/vdb2
lvcreate -n iscsi-lvs-1 -L 5G iscsi

lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
sr0 11:0 1 1024M 0 rom
vda 252:0 0 10G 0 disk
└─vda1 252:1 0 7.8G 0 part /
vdb 252:16 0 50G 0 disk
├─vdb1 252:17 0 20G 0 part
└─vdb2 252:18 0 25G 0 part
└─iscsi-iscsi--lvs--1 253:0 0 5G 0 lvm

# 创建iSCSI
targetcli
/> /backstores/block create name=for-linux dev=/dev/vdb1
Created block storage object for-linux using /dev/vdb1.
/> /backstores/block create name=for-windows dev=/dev/iscsi/iscsi-lvs-1
Created block storage object for-windows using /dev/iscsi/iscsi-lvs-1.

/> ls
o- / ......................................................................................... [...]
o- backstores .............................................................................. [...]
| o- block .................................................................. [Storage Objects: 2]
| | o- for-linux .................................... [/dev/vdb1 (20.0GiB) write-thru deactivated]
| | | o- alua ................................................................... [ALUA Groups: 1]
| | | o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
| | o- for-windows ...................... [/dev/iscsi/iscsi-lvs-1 (5.0GiB) write-thru deactivated]
| | o- alua ................................................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
| o- fileio ................................................................. [Storage Objects: 0]
| o- pscsi .................................................................. [Storage Objects: 0]
| o- ramdisk ................................................................ [Storage Objects: 0]
o- iscsi ............................................................................ [Targets: 0]
o- loopback ......................................................................... [Targets: 0]


创建target-for-linux

创建一个iqn

这个行为实际上就是已经创建了一个target了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/>/iscsi create iqn.2025-04.com.wangsheng.storage:for-linux
Created target iqn.2025-04.com.wangsheng.storage:for-linux.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

默认创建完target之后就有一个tpg1
/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/
/iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/*
/iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/acls/
/iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/luns/
/iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/portals/

/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/ create tpg2
Created TPG 2.
Default portal not created, TPGs within a target cannot share ip:port.
/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/ delete tpg2
Deleted TPGT 2.

配置target的tpg

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/> ls
o- / ......................................................................................... [...]
o- backstores .............................................................................. [...]
| o- block .................................................................. [Storage Objects: 2]
| | o- for-linux .................................... [/dev/vdb1 (20.0GiB) write-thru deactivated]
| | | o- alua ................................................................... [ALUA Groups: 1]
| | | o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
| | o- for-windows ...................... [/dev/iscsi/iscsi-lvs-1 (5.0GiB) write-thru deactivated]
| | o- alua ................................................................... [ALUA Groups: 1]
| | o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
| o- fileio ................................................................. [Storage Objects: 0]
| o- pscsi .................................................................. [Storage Objects: 0]
| o- ramdisk ................................................................ [Storage Objects: 0]
o- iscsi ............................................................................ [Targets: 1]
| o- iqn.2025-04.com.wangsheng.storage:for-linux ....................................... [TPGs: 1]
| o- tpg1 ............................................................... [no-gen-acls, no-auth]
| o- acls .......................................................................... [ACLs: 0]
| o- luns .......................................................................... [LUNs: 0]
| o- portals .................................................................... [Portals: 1]
| o- 0.0.0.0:3260 ..................................................................... [OK]
o- loopback ......................................................................... [Targets: 0]

# 修改portal
/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/portals/ delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260

/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/portals/ create 10.163.2.106 3260
Using default IP port 3260
Created network portal 10.163.2.106:3260.

# 分配lun
/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/luns create /backstores/block/for-linux
Created LUN 0.

# 配置acl
/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/acls create iqn.2025-04.com.wangsheng.linux:linux
Created Node ACL for iqn.2025-04.com.wangsheng.linux:linux
Created mapped LUN 0.

# 保存退出
/> saveconfig
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json
/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json

创建与配置target-for-windows

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
/> /iscsi/ create iqn.2025-04.com.wangsheng.storage:for-windows
Created target iqn.2025-04.com.wangsheng.storage:for-windows.
Created TPG 1.
Default portal not created, TPGs within a target cannot share ip:port.

/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-windows/tpg1/portals create 10.163.2.106 3260
Using default IP port 3260
Created network portal 10.163.2.106:3260.

/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-windows/tpg1/luns create /backstores/block/for-windows
Created LUN 0.

/> /iscsi/iqn.2025-04.com.wangsheng.storage:for-windows/tpg1/acls create iqn.2025-04.com.wangsheng.windows:windows
Created Node ACL for iqn.2025-04.com.wangsheng.windows:windows
Created mapped LUN 0.

/> saveconfig
Configuration saved to /etc/target/saveconfig.json
/> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json

白名单放通了
iqn.2025-04.com.wangsheng.linux:linux
iqn.2025-04.com.wangsheng.windows:windows

这两个就是一会我配置Initiator时,需要设置的iqn

非交互式配置target

使用方法也很简单,只要在targetcli后面加上要执行的命令就可以

但是就获取不到tab帮助了,适合做过一次之后记录下来做自动化

非交互式需要手动保存targetcli saveconfig

1
2
3
targetcli /iscsi/ create iqn.2025-04.com.wangsheng.storage:for-windows
targetcli /iscsi/iqn.2025-04.com.wangsheng.storage:for-windows/tpg1/portals create 10.163.2.106 3260
targetcli saveconfig

在windows上使用iSCSI启动器

连接iSCSI

  • 打开iSCSI服务

  • 直接在搜索栏输入iSCSI,直接打开

  • 配置本机启动器IQN

  • 将其格式化之后就可以使用了

自动挂载iSCSI

  • 打开Service服务,找到服务Microsoft iSCSI启动器
  • 设置其为自动启动
  • 重启,查看其是否会自动挂载


在linux上使用iSCSI启动器

iscsi启动器可以有软件和硬件两种,

硬件需要使用网卡或HBA卡

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
hostnamectl set-hostname iscsi-client1 && bash

yum -y install iscsi-initiator-utils bash-completion vim

# 配置IQN
vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2025-04.com.wangsheng.linux:linux

systemctl enable iscsid.service --now
systemctl restart iscsid.service

# 发现target
iscsiadm -m discovery -t st -p 10.163.2.106
10.163.2.106:3260,1 iqn.2025-04.com.wangsheng.storage:for-linux
10.163.2.106:3260,1 iqn.2025-04.com.wangsheng.storage:for-windows

# 连接target
iscsiadm -m node -T iqn.2025-04.com.wangsheng.storage:for-linux -l
Logging in to [iface: default, target: iqn.2025-04.com.wangsheng.storage:for-linux, portal: 10.163.2.106,3260] (multiple)
Login to [iface: default, target: iqn.2025-04.com.wangsheng.storage:for-linux, portal: 10.163.2.106,3260] successful.

# 断开连接
iscsiadm -m node -T iqn.2025-04.com.wangsheng.storage:for-linux -u
Logging out of session [sid: 1, target: iqn.2025-04.com.wangsheng.storage:for-linux, portal: 10.163.2.106,3260]
Logout of [sid: 1, target: iqn.2025-04.com.wangsheng.storage:for-linux, portal: 10.163.2.106,3260] successful.

lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 9G 0 part
├─centos-root 253:0 0 8G 0 lvm /
└─centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 500G 0 disk
sdc 8:32 0 500G 0 disk
sdd 8:48 0 500G 0 disk

iscsiadm -m node -T iqn.2025-04.com.wangsheng.storage:for-linux -l

lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
fd0 2:0 1 4K 0 disk
sda 8:0 0 10G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 9G 0 part
├─centos-root 253:0 0 8G 0 lvm /
└─centos-swap 253:1 0 1G 0 lvm [SWAP]
sdb 8:16 0 500G 0 disk
sdc 8:32 0 500G 0 disk
sdd 8:48 0 500G 0 disk
sde 8:64 0 20G 0 disk

可见多了一个sde 20G
重启之后依然可以存在

# 格式化后进行挂载
mkfs.ext4 /dev/sde
mkdir /mnt/iscsi-1

# 开机自动挂载
_netdev表示该挂载为网络设备,会在网络服务启动后再进行挂载
vim /etc/fstab
/dev/sde /mnt/iscsi-1 ext4 defaults,_netdev 0 0

systemctl reboot

df -Th
Filesystem Type Size Used Avail Use% Mounted on
/dev/mapper/centos-root xfs 8.0G 1.7G 6.4G 21% /
devtmpfs devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs tmpfs 3.9G 8.5M 3.9G 1% /run
tmpfs tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 193M 822M 20% /boot
/dev/sde ext4 20G 45M 19G 1% /mnt/iscsi-1
tmpfs tmpfs 799M 0 799M 0% /run/user/0

原文作者:王盛

原文链接:https://akemi.zj.cn/2025/04/17/iSCSI/

发表日期:April 17th 2025, 6:02:22 pm

更新日期:April 17th 2025, 7:05:07 pm

版权声明:本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可

CATALOG
  1. 1. SCSI协议栈
    1. 1.1. SCSI结构
    2. 1.2. SCSI核心组件
    3. 1.3. SCSI工作流程
  2. 2. iSCIS协议
    1. 2.1. iSCSI概念—IQN
    2. 2.2. iSCSI概念—Portal
    3. 2.3. iSCSI概念—TPG
    4. 2.4. 块存储的共享挂载问题
  3. 3. 在Linux上搭建iSCSI target
    1. 3.1. targetcli 的目录结构解析
    2. 3.2. 创建iSCSI—block设备
    3. 3.3. 创建target-for-linux
      1. 3.3.1. 创建一个iqn
      2. 3.3.2. 配置target的tpg
    4. 3.4. 创建与配置target-for-windows
    5. 3.5. 非交互式配置target
  4. 4. 在windows上使用iSCSI启动器
    1. 4.1. 连接iSCSI
    2. 4.2. 自动挂载iSCSI
  5. 5. 在linux上使用iSCSI启动器