iSCSI 服务器
文章目录
- iSCSI 服务器
- iSCSI 服务介绍
- iSCSI 架构
- 配置 iSCSI 存储
- 配置服务端
- 配置客户端
iSCSI 服务器
iSCSI 服务介绍
SCSI(Small Computer System Interface,小型计算机系统接口):一种用于计算机和智能设备(硬盘、软驱、光驱、打印机、扫描仪等)之间连接的标准。
iSCSI(Internet Small Computer System Interface,Internet 小型计算机系统接口):又称为 IPSAN,是 IBM 公司研究开发的 IP SAN 技术。该技术将现有 SCSI 接口与以太网络(Ethernet)技术结合,基于 TCP/IP 协议连接 iSCSI 服务端(Target)和客户端(Initiator),使封装后的 SCSI 数据包可在互联网传输,最终实现 iSCSI 服务端为客户端提供存储。
性能与安全相关
- 通常,iSCSI 使用专用的 10Gb 以太网或更高速的网络,以最大限度提升性能。
- 从物理服务器到存储的电缆通常封闭在数据中心内,理想情况下不直接连接到 LAN 网络,因此 SAN 流量通常不加密,以最大化性能。若要实现 WAN 安全,iSCSI 管理员可使用 IPsec 加密流量。
iSCSI 架构
iSCSI 服务采用 C/S(客户端 / 服务器)架构。在客户端系统上,访问的 iSCSI 目标会显示为本地且未格式化的 SCSI 块设备,等同于通过 SCSI 布线、FC 直连或 FC 交换光线连接的设备。其核心组件及概念如下:
组件 / 概念 说明 Initiator iSCSI 客户端,通常以软件方式部署,也可使用 iSCSI Host Bus Adapters (HBAs) 硬件。Initiator 必须具有唯一的名称(参见 IQN)。 Target iSCSI 服务器上的 iSCSI 存储资源。Target 必须具有唯一的名称(参见 IQN)。每个目标提供一个或多个块设备或逻辑单元(LUN - Logical Units),多数情况下 Target 仅提供一个设备,但一台服务器可提供多个目标。 IQN(iSCSI Qualified Name) 全球唯一的名称,用于标识发起者和目标,格式为 iqn.YYYY-MM.com.reversed.domain:name_string。其中,YYYY-MM 代表年和月(如 2020 年 6 月为 2020-06),用于确保 IQN 唯一性;com.reversed.domain 为反向域名(如 server.redhat.fun 的反向域名为 cloud.laoma.www);name_string 用于标识所管理的特定目标,若服务器仅有一个目标,有时可省略此名称。 Portal 指定服务器监听的地址和端口,例如 172.25.250.50:3260。 LUN(Logical Unit Number) 代表 Target 提供的块设备,每个目标可提供一个或多个 LUN。 ACL(Access Control List) 使用 Initiator 的 IQN 限制客户端对 Target 的访问。 TPG(Target Portal Group) 目标的完整配置,包含 Portal、LUN 和 ACL。几乎所有目标都使用一个 TPG,但高级配置有时可能定义多个 TPG。 discovery 查询服务器上的 Target 列表。 login 向 Target 进行验证,验证通过后即可使用 Target 服务器提供的块设备。
配置 iSCSI 存储
配置服务端
# 安装软件包
[root@server ~ 17:02:27]# yum install -y targetcli targetd
# 启用并启动服务
[root@server ~ 17:02:27]# systemctl enable target --now
Created symlink from /etc/systemd/system/multi-user.target.wants/target.service to /usr/lib/systemd/system/target.service.
准备共享块设备,server端添加一个200G SATA接口硬盘
创建分区1 100G 空间分享给客户端
# 将/dev/sdb分区设置为gpt
[root@server ~ 17:03:24]# parted /dev/sdb mklabel gpt
# 设置分区名称和大小
[root@server ~ 17:12:21]# parted /dev/sdb unit MiB mkpart dbapp 1 102401
[root@server ~ 17:13:49]# lsblk /dev/sdb
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb 8:16 0 200G 0 disk
└─sdb1 8:17 0 100G 0 part
# 配置共享块存储
[root@server ~ 17:14:26]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.
/> 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]
# /backstores 提供后端存储
# /iscsi 配置如何共享后端存储
# 后端存储添加块设备
/> /backstores/block create dev=/dev/sdb1 name=db01
Created block storage object db01 using /dev/sdb1.
# 创建target,后续客户端 会扫描 target
target名称使用IQN来表示
不管是客户端还是服务端都通过IQN来表示自己。
# 配置共享后端存储
/> /iscsi create iqn.2025-09.wan.server.x8664:db
Created target iqn.2025-09.wan.server.x8664:db.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
/> ls /iscsi/
o- iscsi .................................................. [Targets: 1]
o- iqn.2025-09.wan.server.x8664:db ......................... [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]
# 切换相应目录
/> cd /iscsi/iqn.2025-09.wan.server.x8664:db/tpg1/
/iscsi/iqn.20...x8664:db/tpg1>
# 配置放行客户端(iqn.2025-09.cloud.laoma.server.x8664:db)
/iscsi/iqn.20...x8664:db/tpg1> acls/ create iqn.2025-09.wan.server.x8664:webapp
Created Node ACL for iqn.2025-09.wan.server.x8664:webapp
# 配置客户端可以访问的设备
/iscsi/iqn.20...x8664:db/tpg1> luns/ create /backstores/block/db01
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2025-09.wan.server.x8664:webapp
# 验证配置
/iscsi/iqn.20...x8664:db/tpg1> ls
o- tpg1 ......................................... [no-gen-acls, no-auth]
o- acls .................................................... [ACLs: 1]
| o- iqn.2025-09.wan.server.x8664:webapp ............ [Mapped LUNs: 1]
| o- mapped_lun0 ............................ [lun0 block/db01 (rw)]
o- luns .................................................... [LUNs: 1]
| o- lun0 ................ [block/db01 (/dev/sdb1) (default_tg_pt_gp)]
o- portals .............................................. [Portals: 1]
o- 0.0.0.0:3260 ............................................... [OK]
# 退出配置
/iscsi/iqn.20...x8664:db/tpg1> exit
Global pref auto_save_on_exit=true
Configuration saved to /etc/target/saveconfig.json
配置客户端
# 安装软件包
[root@client ~ 16:50:47]# yum install -y iscsi-initiator-utils
# 设置客户端的IQN
[root@client ~ 17:22:20]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2025-09.wan.server.x8664:webapp
# 扫描目标
[root@client ~ 17:23:27]# iscsiadm -m discovery -t st -p 10.1.8.10
10.1.8.10:3260,1 iqn.2025-09.wan.server.x8664:db
选项说明:
-m discovery: 发现模式
-t st:找 target(sendtarget)
-p 10.1.8.10:服务地址
# 挂载设备
[root@client ~ 17:23:53]# iscsiadm -m node -T iqn.2025-09.wan.server.x8664:db -l
Logging in to [iface: default, target: iqn.2025-09.wan.server.x8664:db, portal: 10.1.8.10,3260] (multiple)
Login to [iface: default, target: iqn.2025-09.wan.server.x8664:db, portal: 10.1.8.10,3260] successful.
选项说明:
-m node:登录模式
-T iqn.2025-09.wan.server.x8664:db:服务器 IQN
-l:login
# 识别为本地硬盘 sdb
[root@client ~ 17:25:08]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 99G 0 part
├─centos-root 253:0 0 50G 0 lvm /
├─centos-swap 253:1 0 2G 0 lvm [SWAP]
└─centos-home 253:2 0 47G 0 lvm /home
sdb 8:16 0 100G 0 disk
sr0 11:0 1 4.4G 0 rom
# 使用存储
[root@client ~ 17:27:14]# mkfs.xfs /dev/sdb
[root@client ~ 17:27:46]# vim /etc/fstab
/dev/sdb /usr/share/nginx/html xfs defaults 0 0
[root@client ~ 17:28:43]# mount -a
[root@client ~ 17:29:00]# df /usr/share/nginx/html/
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sdb 104806400 32992 104773408 1% /usr/share/nginx/html
[root@client ~ 17:29:08]# echo Hello data From iSCSI for nginx > /usr/share/nginx/html/index.html
[root@server ~ 17:21:27]# curl http://10.1.8.11/
Hello data From iSCSI for nginx
重启系统验证
问题: /dev/sdb 挂载超时,系统启动失败。
原因: 操作系统启动,首先挂载设备,然后启动服务。这里 sdb 设备是如何识别到的呢? 是因为我们启动了 iscsi 服务,通过网络识别的吧。
解决方法:
# 在紧急模式下,先注释/dev/sdb挂载条目,确保进入系统
# 进入系统后,设置挂载选项_netdev,表明设备是网络设备。操作系统在启动时候,会等网络相关服务启动完成后再挂载。
[root@client ~ 07:51:50]# vim /etc/fstab
/dev/sdb /usr/share/nginx/html xfs _netdev 0 0
# 重启验证
[root@client ~ 07:52:30]# reboot
思考题:
1.如何存储服务器 target 服务未启动,客户端系统重启,能正常启动吗?
由于客户端无法扫描到该设备,所以挂载失败,进一步到只系统启动失败。2.服务端还可以共享哪些块存储?
raid,lv3.如何控制给多个客户端分享不同的块存储?
使用不同的 tpg 分组











