33.Linux iCSCI 服务
文章目录
- Linux iSCSI 服务
- iSCSI 服务介绍
- iSCSI 架构
- 模型
- 流程
- iSCSI 服务的作用
- iSCSI 服务配置
- 配置服务端target
- 配置客户端Initiator
- 多路径访问
- 实践
- server配置网络
- client配置网络
- 验证
Linux iSCSI 服务
iSCSI 服务介绍
SCSI(小型计算机系统接口),一种用于计算机和智能设备之间(硬盘,软驱,光驱,打印机,扫描仪等)连接标准
iSCSI(Internet 小型计算机系统接口),又称IP-SAN,该技术是将现有SCSI接口与以太网技术结合,基于TCP/IP的协议连接iSCSI服务端(target)和客户端(initiator),使得封装后的SCSI数据包可以在互联网传输,最终实现iSCSI服务端提供存储给客户端。简单来说就是:iSCSI提供了一个标准的、软件层面的通道,让操作系统(比如 Linux)能够和服务器底层的硬件管理控制器(叫做 BMC)进行“对话”
iSCSI 架构
模型
角色 | 官方名称 | 比喻 | 功能 |
---|---|---|---|
客户端 | iSCSI Initiator(启动器) | 你的笔记本电脑 | 它发起连接请求,将远程存储“映射”到本地,使其看起来像一块本地硬盘。 |
存储端 | iSCSI Target(目标器) | 机房的大容量存储柜 | 它提供存储空间(硬盘、LUN),等待客户端的连接。它“暴露”存储资源给网络。 |
网络 | 标准以太网 | 那根超长的虚拟硬盘线 | 在 Initiator 和 Target 之间传输 SCSI 命令和数据。 |
Initiator(客户端)通过网络(IP)去访问 Target(服务器端)提供的存储块。
流程
- 封装: Initiator 将本地的 SCSI 硬盘读写命令和数据,按照 iSCSI 协议打包成标准的 TCP/IP 数据包。
- 传输: 这些数据包通过普通的以太网进行传输。
- 解封装: Target 接收到数据包后,将其拆解,还原出原始的 SCSI 命令,然后执行对后端物理硬盘的读写操作。
- 返回: 操作结果(如读取的数据)再按照同样的流程封装、传回给 Initiator。
iSCSI 服务的作用
- 硬件健康监控: 查看 CPU 温度、风扇转速、电源状态、硬盘健康状况等。这是最主要的功能。
- 远程管理: 在系统层面触发硬件的远程控制,比如远程开机、关机、重启(即使系统已崩溃)。
- 系统日志访问: 读取 BMC 记录的硬件事件日志,帮助诊断死机、重启等硬件相关的问题。
- 传感器数据读取: 获取所有传感器上报的实时数据。
iSCSI 服务配置
配置服务端target
安装软件包
[root@server ~ 11:25:55]# yum install -y targetcli targetd
启用并启动服务
[root@server ~ 11:25:55]# systemctl enable target --now
准备共享块设备
server端添加一个200G SATA接口硬盘
创建分区1将100G 空间分享给客户端
[root@server ~ 11:28:12]# parted /dev/sdb mklabel gpt
[root@server ~ 11:29:15]# parted /dev/sdb unit MiB mkpart dbapp 1 102401
[root@server ~ 11:29:53]# 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 ~ 11:29:56]# 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.
/> ls /backstores/block/
o- block ................................................................ [Storage Objects: 1]o- db01 ...................................... [/dev/sdb1 (100.0GiB) write-thru deactivated]o- alua ................................................................. [ALUA Groups: 1]o- default_tg_pt_gp ..................................... [ALUA state: Active/optimized
配置如何共享后端存储
创建target,后续客户端 会扫描 target
target名称使用IQN来表示
不管是客户端还是服务端都通过IQN来表示自己。
/> /iscsi/ create iqn.2025-09.cloud.hxl.server.x8664:db
Created target iqn.2025-09.cloud.hxl.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.cloud.hxl.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.cloud.hxl.server.x8664:db/tpg1/
/iscsi/iqn.20...x8664:db/tpg1> ls
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
配置放行客户端(iqn.2025-09.cloud.hxl.server.x8664:webapp)
/iscsi/iqn.20...x8664:db/tpg1> acls/ create iqn.2025-09.cloud.hxl.server.x8664:webapp
Created Node ACL for iqn.2025-09.cloud.hxl.server.x8664:webapp
Created mapped LUN 0.
配置客户端可以访问的设备
/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.cloud.hxl.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.cloud.hxl.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
配置客户端Initiator
安装软件包
[root@web ~ 13:52:37]# yum install -y iscsi-initiator-utils
设置客户端的IQN
[root@web ~ 13:43:33]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2025-09.cloud.hxl.server.x8664:webapp
扫描目标
[root@web ~ 13:54:10]# iscsiadm -m discovery -t st -p 10.1.8.10
10.1.8.10:3260,1 iqn.2025-09.cloud.hxl.server.x8664:db
选项说明:
-m discovery 发现模式
-t st 找target(sendtarget)
-p 10.1.8.10 服务地址
挂载设备
[root@web ~ 13:45:50]# iscsiadm -m node -T iqn.2025-09.cloud.hxl.server.x8664:db -l
Logging in to [iface: default, target: iqn.2025-09.cloud.hxl.server.x8664:db, portal: 10.1.8.10,3260] (multiple)
Login to [iface: default, target: iqn.2025-09.cloud.hxl.server.x8664:db, portal: 10.1.8.10,3260] successful.
选项说明:
-m node 登录模式
-T iqn.2025-09.cloud.hxl.server.x8664:db 服务器IQN
-l login
识别为本地硬盘 sdb
[root@web ~ 13:47:31]# 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@web ~ 14:16:53]# mkfs.xfs /dev/sdb
[root@web ~ 14:18:38]# vim /etc/fstab
最后添加一条记录
将相同挂载点的记录注释掉,避免挂载冲突
/dev/sdb /usr/share/nginx/html xfs defaults 0 0
[root@web ~ 14:18:36]# mount -a
[root@web ~ 14:18:43]# df /usr/share/nginx/html/
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/sdb 104806400 32992 104773408 1% /usr/share/nginx/html
[root@web ~ 14:19:30]# echo Hello data From iSCSI for nginx > /usr/share/nginx/html/index.html
[root@server ~ 14:20:47]# curl http://10.1.8.11/
Hello data From iSCSI for nginx
重启系统验证
问题: /dev/sdb 挂载超时,系统启动失败。
原因: 操作系统启动,首先挂载设备,然后启动服务。这里sdb设备是如何识别到的呢? 是因为我们启动了iscsi服务,通过网络识别的吧。
解决方法:
- 在紧急模式下,先注释/dev/sdb挂载条目,确保进入系统
- 进入系统后,设置挂载选项_netdev,表明设备是网络设备。操作系统在启动时候,会等网络相关服务启动完成后再挂载。
defaults 修改为 _netdev - 重启验证
思考题:
-
如何存储服务器target服务未启动,客户端系统重启,能正常启动吗?
答案:由于客户端无法扫描到该设备,所以挂载失败,进一步到只系统启动失败。 -
服务端还可以共享哪些块存储?
raid,lv -
如何控制给多个客户端分享不同的块存储?
使用不同的tpg分组
多路径访问
这里提个问题:如果单个网线断掉之后,还能不能继续呢?
回答:用两个网线。 客户端识别设备,有两个路径。
多路径是指服务器和存储阵列存在多个物理连接方式使用虚拟设备,这种方式可以提供更加弹性的存储连接(一个路径down掉不会影响连接性),也可以聚合存储带宽提供性能。
实践
server配置网络
给server端添加一张新的网卡
[root@server ~ 15:32:15]# nmcli connection modify 有线连接\ 1 con-name ens37 ipv4.method manual ipv4.addresses 10.1.1.10/24
[root@server ~ 15:32:51]# nmcli connection up ens37
client配置网络
给client端也添加一张新的网卡
[root@web ~ 15:33:19]# nmcli connection modify 有线连接\ 1 con-name ens37 ipv4.method manual ipv4.addresses 10.1.1.11/24
[root@web ~ 15:33:29]# nmcli connection up ens37
客户端卸载占用的文件系统,避免冲突
[root@web ~ 15:39:32]# umount /usr/share/nginx/html
通过10.1.1.10扫描,并登录
[root@web ~ 15:39:40]# iscsiadm -m discovery -t st -p 10.1.1.10
10.1.1.10:3260,1 iqn.2025-09.cloud.laoma.server.x8664:db
[root@web ~ 15:58:12]# iscsiadm -m node -T iqn.2025-09.cloud.hxl.server.x8664:db -l
本机额外出现一块硬盘 sdc
[root@web ~ 15:41:03]# 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
sdc 8:32 0 100G 0 disk
sr0 11:0 1 4.4G 0 rom
使用多路径软件识别,安装多路径软件
[root@web ~ 16:41:29]# yum -y install device-mapper-multipath
生成多路径配置文件
[root@web ~ 16:41:51]# mpathconf --enable
启动服务
[root@web ~ 16:42:26]# systemctl start multipathd.service
识别设备
[root@web ~ 16:12:47]# multipath -ll
mpatha (360014053ca8b473ca334210ad17ac1ea) dm-3 LIO-ORG ,db01
size=100G features='0' hwhandler='0' wp=rw
|-+- policy='service-time 0' prio=1 status=active
| `- 32:0:0:0 sdb 8:16 active ready running
`-+- policy='service-time 0' prio=1 status=enabled`- 33:0:0:0 sdc 8:32 active ready running
如果客户端没有识别两个设备为同一个设备,
需要使用iscsiadm登出 (-u选项),然后再次iscsiadm登入(-l选项)
修改 fstab,并挂载
[root@web ~ 16:48:47]# vim /etc/fstab
/dev/mapper/mpatha /usr/share/nginx/html xfs _netdev 0 0
[root@web ~ 16:52:02]# mount -a
[root@web ~ 16:52:42]# df /usr/share/nginx/html/
文件系统 1K-块 已用 可用 已用% 挂载点
/dev/mapper/mpatha 104806400 32996 104773404 1% /usr/share/nginx/html
验证
监视web服务是否正常
[root@server ~ 16:04:13]# watch -n1 'date;curl -s http://10.1.8.11/'