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
相关推荐
一位代码1 分钟前
一些常用的通用 mysql 命令详解及注意事项
数据库·mysql
杜子不疼.1 分钟前
【Linux】 进程控制(二):进程等待(wait/waitpid) 与 子进程获取(status)
linux·运维·服务器
炮院李教员3 分钟前
Ubuntu 24.04 安装common-extensions
linux·运维·ubuntu
YJlio6 分钟前
ZoomIt 学习笔记(11.9):绘图模式——演示时“手写板”:标注、圈画、临时白板
服务器·笔记·学习
满天星83035778 分钟前
【Linux】信号(下)
android·linux·运维·服务器·开发语言·性能优化
拾贰_C10 分钟前
【Ubuntu】怎么查询Nvidia显卡信息
linux·运维·ubuntu
牛老师讲GIS12 分钟前
2025年前端开发的未来:服务器优先、人工智能驱动、更贴近底层
运维·服务器·人工智能
曹牧13 分钟前
Oracle:五笔码
数据库·oracle
百锦再14 分钟前
【无标题】
服务器·ai·k8s·京东云·core·net·云鼎
苹果醋314 分钟前
JAVA设计模式之观察者模式
java·运维·spring boot·mysql·nginx