作者:独笔孤行
官网:​​ ​http://anyamaze.com​​
公众号:云实战

前言

iSCSI又称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术,iSCSI利用了TCP/IP的port 860 和 3260 作为沟通的渠道。透过两部计算机之间利用iSCSI的协议来交换SCSI命令,让计算机可以透过高速的局域网集线来把SAN模拟成为本地的储存装置。iSCSI的实现方法主要有tgtd、LIO、SCST、IET等几种方式。

一、iSCSI存储简介

ISCSI 基于TCP/IP协议,将存储设备通过ISCSI target 功能,配置成可提供共享磁盘空间的服务端,再通过ISCSI initator功能,将服务端ISCSI磁盘映射到本地使用。

ISCSI 主要分为两部分,分别是:

  • ISCSI target :存储设备端,存放磁盘或RAID的设备,通过tgtd将Linux主机仿真成ISCSI target,提供其他主机使用的磁盘。
  • ISCSI initiator: 存储客户端,通常是普通服务器,安装iscsi initiator后,使用ISCSI target 提供磁盘空间。

角色

IP

系统

服务端

192.168.1.10

CentOS7.6

客户端

192.168.1.11

CentOS7.6

二、iSCSI服务端配置

1.关闭防火墙和selinux

systemctl stop firewalld
systemctl disable firewalld
sed -i "s/SELINUX=enforcing/SELINUX=disabled/g" /etc/selinux/config
setenforce 0

注意:必须关闭selinux,否则tgt服务无法启动

2.安装服务端

yum install epel-release -y
yum install scsi-target-utils –y

3.创建虚拟磁盘文件

mkdir -p /data/iscsi
truncate /data/iscsi/disk1 -s 10G
chmod 777 /data/iscsi/disk1

4.创建target

cat <<EOF > /etc/tgt/conf.d/disk1.conf 
<target iqn.2023-05.com.example:disk1>
backing-store /data/iscsi/disk1
scsi_id e087acc9-5ef0-4c01-87a7-b9c2e0598468
</target>
EOF

注意:其它详细配置规范和说明,可参考文件/etc/tgt/conf.d/sample.conf内容

5.启动服务

systemctl start tgtd
systemctl enable tgtd

注意:如果tgt服务无法启动,需检查selinux是否关闭

三、客户端配置

1.安装客户端

yum install iscsi-initiator-utils –y

2.映射iscsi

iscsiadm -m discovery -t st -p 192.168.1.10
iscsiadm -m node -T iqn.2023-03.org:disk1.test -p 192.168.1.10:3260 -l

3.检查iscsi映射磁盘

iscsiadm -m node
lsscsi
lsblk

CentO S7配置iSCSI共享-tgtd_服务端

4.格式化iscsi并挂载使用

mkdir /data/sdc -p
mkfs.xfs /dev/sdc

5.配置/etc/fstab文件,设置开机后自动挂载,末尾写入如下内容

UUID=38c7beff-a88a-4a9b-b078-c2992600c5dd /data/sdc/ xfs defaults,_netdev 0 0

注意:挂载的时候一定要加_netdev参数,否则重启会卡住

_netdev是针对iscsi设备的特殊mount 选项,此挂载选择指示将在网络启动后挂载卷,在关闭网络前卸载掉卷。

建议通过文件系统UUID来挂载,防止盘符会变,可通过blkid /dev/sdc命令获取磁盘UUID

6.挂载磁盘

mount -a

注意:挂载失败,则说明/etc/fstab文件内容配置错误,需要进行检查

四、问题记录

问题复现步骤:

客户端通过iscsi映射磁盘后,格式化为xfs,并进行挂载,之后向挂载点用fio写入数据。

发现报错:

Tgt服务端报错:

Jun 28 13:25:50 node1 kernel: XFS: tgtd(30339) possible memory allocation deadlock size 524304 in kmem_realloc (mode:0x250)
Jun 28 13:25:52 node1 kernel: XFS: tgtd(30339) possible memory allocation deadlock size 524304 in kmem_realloc (mode:0x250)
Jun 28 13:25:54 node1 kernel: XFS: tgtd(30339) possible memory allocation deadlock size 524304 in kmem_realloc (mode:0x250)
Jun 28 13:25:56 node1 kernel: XFS: tgtd(30339) possible memory allocation deadlock size 524304 in kmem_realloc (mode:0x250)
Jun 28 13:25:58 node1 kernel: XFS: tgtd(30339) possible memory allocation deadlock size 524304 in kmem_realloc (mode:0x250)

解答1:是内核bug,需要升级为 kernel-3.10.0-1062.el7