4.iSCSI 服务器

4.iSCSI 服务器

iSCSI 服务介绍

SCSI(Small Computer System Interface,小型计算机系统接口),一种用于计算机和智能设备之间(硬盘、软驱、光驱、打印机、扫描仪等)连接标准。

iSCSI (Internet Small Computer System Interface,Internet 小型计算机系统接口),又称为IP-SAN,是IBM公司研究开发的IP SAN技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,基于TCP/IP的协议连接iSCSI服务端(Target)和客户端(Initiator),使得封装后的SCSI数据包可以在互联网传输,最终实现iSCSI服务端提供存储给客户端。

通常,iSCSI使用专用的10 Gb以太网或更好的网络,以最大程度地提高性能。

从物理服务器到存储的电缆通常封闭在数据中心内,并且理想情况下不直接连接到LAN网络,所以SAN流量通常不加密,以最大程度地提高性能。 为了实现WAN安全,iSCSI管理员可以使用IPsec加密流量。

iSCSI 架构

iSCSI服务是C/S架构。访问的iSCSI目标在客户端系统上显示为本地且未格式化的SCSI快设备,等同于通过SCSI布线、FC直连或FC交换光线连接的设备。

  • Initiator ,iSCSI客户端,通常以软件方式部署,也可以使用iSCSI Host Bus Adapters (HBAs) (HBA)硬件。 Initiator必须具有唯一的名称(请参见IQN)。

  • Target,iSCSI服务器上的iSCSI存储资源。 Target必须具有唯一的名称(请参见IQN)。 每个目标都提供一个或多个块设备或逻辑单元(LUN-logical units)。 在大多数情况下,Target只提供一个设备,但一台服务器可以提供多个目标。

  • IQN(iSCSI Qualified Name)全球唯一的名称,用于标识发起者和目标。 IQN具有以下格式:

    bash 复制代码
    iqn.YYYY-MM.com.reversed.domain:name_string
    • YYYY-MM ,年和月。示例,2020年6月为2020-06。该日期有助于确保IQN唯一性。
    • com.reversed.domain ,反向域名。 例如,server.redhat.fun的反向域名为cloud.zhang.www
    • name_string,用于标识您管理的特定目标。 如果服务器只具有一个目标,则有时会省略此名称。
  • Portal,指定服务器监听的地址和端口,例如,172.25.250.50:3260。

  • LUN (Logical Unit Number),代表Target 提供的块设备。 每个目标可以提供一个或多个LUN

  • ACL (Access Control List),使用InitiatorIQN 限制客户端访问Target

  • TPG (Target Portal Group),是目标的完整配置,包括PortalLUNACL 。 几乎所有目标都使用一个TPG ,但是高级配置有时可能会定义多个TPG

  • discovery ,查询服务器上有Target列表。

  • login ,向Target 验证,验证通过后即可以使用Target服务器提供的块设备。

配置 iSCSI Targets

配置 iSCSI Targets需要安装以下软件:

  • targetd,服务端软件。
  • targetcli,targetd服务配置工具。
bash 复制代码
#安装
[root@storage ~ 13:41:29]# yum install -y targetcli targetd
#启动服务
[root@storage ~ 13:44:07]# systemctl enable target --now
Created symlink from /etc/systemd/system/multi-user.target.wants/target.service to /usr/lib/systemd/system/target.service.
[root@storage ~ 13:44:18]# systemctl status target  
● target.service - Restore LIO kernel target configuration
   Loaded: loaded (/usr/lib/systemd/system/target.service; enabled; vendor preset: disabled)
   Active: active (exited) since Fri 2025-11-21 13:43:45 CST; 34s ago
 Main PID: 1449 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/target.service

配置 backstore 对象

backstore类型:

**block:**服务器中的块设备,例如磁盘驱动器,磁盘分区或逻辑卷。

**fileio:**本地文件系统中的常规文件。targetcli将该文件用作磁盘映像。

pscsi:物理SCSI设备。 这种类型的存储允许客户端通过网络访问服务器上的物理SCSI设备。

ramdisk:内存中的磁盘设备。 这种类型的存储不会持久存储数据。 服务器重新启动后,数据将丢失。

要使用targetcli 创建后备存储,请使用其create命令。 该命令的行为取决于您在配置树中的当前位置。

交互式使用targetcli

bash 复制代码
#创建卷组
[root@storage ~ 13:47:05]# vgcreate webapp /dev/sdb
#创建逻辑卷
[root@storage ~ 13:47:35]# lvcreate -n webapp01 -L 50G webapp
  
#创建后备存储
[root@storage ~ 13:44:20]# 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]
  #物理scsi
  | o- pscsi ................ [Storage Objects: 0]
  #内存空间
  | o- ramdisk .............. [Storage Objects: 0]
  o- iscsi .......................... [Targets: 0]
  o- loopback ....................... [Targets: 0]

/> cd /backstores/block 
/backstores/block> create webapp01 /dev/webapp/webapp01
Created block storage object webapp01 using /dev/webapp/webapp01.
/backstores/block> ls
   .....
  o- webapp01  [/dev/webapp/webapp01 (50.0GiB) write-thru deactivated]
   ...... 


#创建一个模板
/> cd /iscsi 
/iscsi> create 
/iscsi> ls
o- iscsi ............................ [Targets: 1]
  o- iqn.2003-01.org.linux-iscsi.storage.x8664:sn.247ab4f6f63f  [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]
# 删除示例
/iscsi> delete iqn.2003-01.org.linux-iscsi.storage.x8664:sn.994569e7db00
        
# 创建自己的IQN
 /iscsi> create iqn.2025-11.cloud.zhang.storage.x8664:webapp01

#配置sisc
/iscsi/iqn.20...8664:webapp01> cd /iscsi/iqn.2025- 11.cloud.zhang.storage.x8664:webapp01/tpg1

# 设置具备特定iqn的客户端可以访问
/iscsi/iqn.20...webapp01/tpg1> acls/ create iqn.2025-11.cloud.zhang.storage.x8664:nginx

# 设置可以访问的设备
/iscsi/iqn.20...webapp01/tpg1> luns/  create /backstores/block/webapp01 


#删除默认的portals
/iscsi/iqn.20...webapp01/tpg1> portals/ delete 0.0.0.0 3260 

# 设置只允许通过10.1.8.10:3260
/iscsi/iqn.20...webapp01/tpg1> portals/ create 10.1.8.10 3260

#
/iscsi/iqn.20...webapp01/tpg1> ls
o- tpg1 ................... [no-gen-acls, no-auth]
  o- acls .............................. [ACLs: 1]
  | o- iqn.2025-11.cloud.zhang.storage.x8664:nginx  [Mapped LUNs: 1]
  |   o- mapped_lun0 .. [lun0 block/webapp01 (rw)]
  o- luns .............................. [LUNs: 1]
  | o- lun0  [block/webapp01 (/dev/webapp/webapp01) (default_tg_pt_gp)]
  o- portals ........................ [Portals: 1]
    o- 10.1.8.10:3260 ....................... [OK]
    
# exit退出,自动保存
# 也可以手动saveconfig
Configuration saved to /etc/target/saveconfig.json
清理
bash 复制代码
/> /iscsi/ delete iqn.2025-11.cloud.zhang.storage.x8664:webapp01
/> /backstores/block/ delete webapp01 
/> exit

非交互方式

命令行模式必须显式运行saveconfig子命令以保存配置。

bash 复制代码
targetcli /backstores/block create webapp01 /dev/webapp/webapp01
targetcli /iscsi create iqn.2025-11.cloud.zhang.storage.x8664:webapp
targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp/tpg1/acls/ \
          create iqn.2025-11.cloud.zhang.storage.x8664:nginx
targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp/tpg1/luns/ \
          create /backstores/block/webapp01
targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp/tpg1/portals/ \
          delete 0.0.0.0 3260           
targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp/tpg1/portals/ \
          create 10.1.8.10 3260         
targetcli saveconfig

配置客户端

配置客户端 nginx 服务访问存储

bash 复制代码
[root@nginx ~ 15:00:30]#  echo InitiatorName=iqn.2025-11.cloud.zhang.storage.x8664:nginx > /etc/iscsi/initiatorname.iscsi
[root@nginx ~ 15:01:11]# iscsiadm -m discovery -t st -p 10.1.8.10
10.1.8.10:3260,1 iqn.2025-11.cloud.zhang.storage.x8664:webapp01

[root@nginx ~ 15:01:18]# iscsiadm -m node -T iqn.2025-11.cloud.zhang.storage.x8664:webapp01 -l
Logging in to [iface: default, target: iqn.2025-11.cloud.zhang.storage.x8664:webapp01, portal: 10.1.8.10,3260] (multiple)
Login to [iface: default, target: iqn.2025-11.cloud.zhang.storage.x8664:webapp01, portal: 10.1.8.10,3260] successful.

#不成功重启
[root@nginx ~ 15:05:37]# systemctl restart iscsid

[root@nginx ~ 15:14:31]# mkfs.xfs /dev/sdb
[root@nginx ~ 15:15:12]# mount /dev/sdb /usr/share/nginx/html/
[root@nginx ~ 15:15:13]# echo Hello World From iSCSI > /usr/share/nginx/html/index.html

[root@storage ~ 15:09:14]# curl http://10.1.8.11
Hello World From iSCSI

多路径访问

什么是多路径

多路径是指服务器和存储阵列存在多个物理连接方式使用虚拟设备,这种方式可以提供更加弹性的存储连接(一个路径down掉不会影响连接性),也可以聚合存储带宽提供性能。

示例:

多路径由dm-multipath子系统提供,使用内核device mapper系统获得虚拟设备,有multipathd进程和multipath命令行工具管理。

软件包device-mapper-multipath提供必要的binaries daemon和kernel modules。安装、配置、启动后,多路径设备节点会创建在两个位置。

出于管理目的,multipath设备创建在/dev/mapper,如果选择了user-friendly名称,这些设备也可以命名为mpathN [pM],或者配置在World Wide ID(WWID)之后。管理员也可以自定义多路径设备名,这些自定义名称在multipaths配置文件的multipaths部分使用alias选项定义。

多路径设备也会创建在/dev目录,格式/dev/dm-N与/dev/mapper下的文件匹配。这些设备提供给系统内部使用,禁止管理目的直接使用。

重要:多路径提供存储访问路径down情况的保护。如果存储本身不可用,访问访问存储也会不可用。

创建多路径设备,不同的路径将会合并到组中,取决于/etc/multipath.conf配置。典型情况,同一时刻只能激活一个组,一个组可以包含多个路径。当某个组故障,多路径进程将切换流量到不同组中。

配置多路径

bash 复制代码
# 配置多路径
# storage和nginx各添加一块vmnet1网卡

# 在 server 端添加 portals
[root@storage ~ 16:28:58]# targetcli /iscsi/iqn.2025-11.cloud.zhang.storage.x8664:webapp01/tpg1/portals/ create 10.1.1.10 3260
Using default IP port 3260
Created network portal 10.1.1.10:3260.

#保存
[root@storage ~ 16:31:03]# targetcli saveconfig
Last 10 configs saved in /etc/target/backup/.
Configuration saved to /etc/target/saveconfig.json

#查看
[root@storage ~ 16:31:16]# targetcli ls /iscsi
o- iscsi ............................ [Targets: 1]
  o- iqn.2025-11.cloud.zhang.storage.x8664:webapp01  [TPGs: 1]
    o- tpg1 ............... [no-gen-acls, no-auth]
      o- acls .......................... [ACLs: 1]
      | o- iqn.2025-11.cloud.zhang.storage.x8664:nginx  [Mapped LUNs: 1]
      |   o- mapped_lun0  [lun0 block/webapp01 (rw)]
      o- luns .......................... [LUNs: 1]
      | o- lun0  [block/webapp01 (/dev/webapp/webapp01) (default_tg_pt_gp)]
      o- portals .................... [Portals: 2]
        o- 10.1.1.10:3260 ................... [OK]
        o- 10.1.8.10:3260 ................... [OK]
        
    
bash 复制代码
#  安装多路径软件
[root@nginx ~ 16:34:45]# yum install -y device-mapper-multipath

# 生成配置文件
[root@nginx ~ 17:10:59]# mpathconf --enable
[root@nginx ~ 17:11:06]# ls /etc/multipath.conf 
/etc/multipath.conf
[root@nginx ~ 17:11:13]# systemctl enable multipathd.service
[root@nginx ~ 17:11:21]# systemctl restart multipathd
bash 复制代码
[root@nginx ~ 16:44:06]# lsblk /dev/sdb /dev/sdc
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sdb    8:16   0  50G  0 disk /usr/share/nginx/html
sdc    8:32   0  50G  0 disk 

[root@nginx ~ 17:25:21]# lsblk /dev/sdb /dev/sdc
NAME     MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
sdb        8:16   0  50G  0 disk  
└─mpatha 253:3    0  50G  0 mpath 
sdc        8:32   0  50G  0 disk  
└─mpatha 253:3    0  50G  0 mpath 

# 查看多路径设备
[root@nginx ~ 17:25:33]# multipath -ll
mpatha (360014056537adbca9984c91acfb68aa1) dm-3 LIO-ORG ,webapp01        
size=50G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 3:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled
  `- 4:0:0:0 sdc 8:32 active ready running


# 通过设备编号wwn确保sdb和sdc是同一设备
[root@nginx ~ 17:08:00]#  /usr/lib/udev/scsi_id -g -u /dev/sdb
360014056537adbca9984c91acfb68aa1
[root@nginx ~ 17:09:50]# /usr/lib/udev/scsi_id -g -u /dev/sdc
360014056537adbca9984c91acfb68aa1


[root@nginx ~ 08:52:48]# lsblk
NAME                    MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                       8:0    0   200G  0 disk  
├─sda1                    8:1    0     1G  0 part  /boot
└─sda2                    8:2    0   199G  0 part  
  ├─centos_centos7-root 253:0    0    50G  0 lvm   /
  ├─centos_centos7-swap 253:1    0   3.9G  0 lvm   [SWAP]
  └─centos_centos7-home 253:2    0 145.1G  0 lvm   /home
sdb                       8:16   0    50G  0 disk  
└─mpatha                253:3    0    50G  0 mpath 
sdc                       8:32   0    50G  0 disk  
└─mpatha                253:3    0    50G  0 mpath 
sr0                      11:0    1   4.4G  0 rom   



[root@nginx ~ 08:53:57]# lsblk /dev/mapper/mpatha 
NAME   MAJ:MIN RM SIZE RO TYPE  MOUNTPOINT
mpatha 253:3    0  50G  0 mpath 


# 多路径设备识别有问题,需要重启系统再挂载
[root@nginx ~ 08:54:11]# mount /dev/mapper/mpatha /usr/share/nginx/html/
[root@nginx ~ 08:54:27]# df /usr/share/nginx/html
Filesystem                      1K-blocks    Used Available Use% Mounted on
/dev/mapper/centos_centos7-root  52403200 1677284  50725916   4% /
[root@nginx ~ 08:54:38]# reboot

[root@nginx ~ 08:56:55]# mount /dev/mapper/mpatha /usr/share/nginx/html/
[root@nginx ~ 08:57:04]# df /usr/share/nginx/html
Filesystem         1K-blocks  Used Available Use% Mounted on
/dev/mapper/mpatha  52403200 32996  52370204   1% /usr/share/nginx/html
[root@nginx ~ 08:57:06]#  cat /usr/share/nginx/html/index.html 
Hello World From iSCSI


# 修改设备名称
[root@nginx ~ 08:57:20]# umount /usr/share/nginx/html/


[root@nginx ~ 08:59:08]# vim /etc/multipath.conf
# 文件末尾添加
multipaths {
        multipath {
                wwid           360014056537adbca9984c91acfb68aa1         
                alias                   webapp
                path_grouping_policy    failover
        }
}


[root@nginx ~ 09:00:19]# systemctl restart mult
[root@nginx ~ 09:01:20]# mount -a

#查看多路径名称变更为 webapp
[root@nginx ~ 09:01:32]# multipath -ll
webapp (360014056537adbca9984c91acfb68aa1) dm-3
size=50G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=acti
| `- 3:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=0 status=enab
  `- 4:0:0:0 sdc 8:32 failed faulty running


# 记得修正/etc/fstab中设备名称

# 高可用测试
web服务器监控设备状态
[root@nginx ~ 09:12:35]# watch multipath -ll

# 存储端断第二个网络
[root@nginx ~ 09:13:03]# nmcli device disconnect ens33
Device 'ens33' successfully disconnected.

# 稍等片刻发现设备状态为 failed faulty
webapp (360014056537adbca9984c91acfb68aa1) dm-
size=50G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=act
| `- 3:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=0 status=ena
  `- 4:0:0:0 sdc 8:32 failed faulty running





 #不影响服务访问
[root@storage ~ 08:49:47]#  curl http://10.1.8.11/hello word from iscsi
相关推荐
稻谷君W18 分钟前
Ubuntu 远程访问 Win11 WSL2 并固定访问教程
linux·运维·ubuntu
胡八一22 分钟前
解决PHP未检测到您服务器环境的sqlite3数据库扩展报错
服务器·数据库·php
不解不惑33 分钟前
OpenAI whisper 语音识别服务器搭建
服务器·whisper·语音识别
gaize121342 分钟前
适合业务规模较大的场景的服务器测评
服务器
Wang's Blog1 小时前
MongoDB小课堂: 游标操作与文档投影技术深度解析
数据库·mongodb
q***42051 小时前
使用Django Rest Framework构建API
数据库·django·sqlite
悠悠121381 小时前
告别Zabbix?我用Netdata只花10分钟就搞定了50台服务器的秒级监控(保姆级实战)
运维·服务器·zabbix
共享家95271 小时前
QT-界面优化(下)
开发语言·数据库·qt
天庭鸡腿哥2 小时前
大小只有4K的软件,可让系统瞬间丝滑!
运维·服务器·windows·microsoft·everything