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 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 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] /> /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. /> /iscsi/iqn.2025-04.com.wangsheng.storage:for-linux/tpg1/luns create /backstores/block/for-linux Created LUN 0. /> /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
打开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 vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2025-04.com.wangsheng.linux:linux systemctl enable iscsid.service --now systemctl restart iscsid.service 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 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 -ThFilesystem 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