Linux搭建iSCSI服务挂载到windows server

由于需要扩展一台windows服务器上现有的磁盘的磁盘空间,决定采用将某个Linux上的lvm分区导出为iSCSI lun的方式,直接挂载到window服务器上形成一个本地磁盘的方式来实现。由于windows上需要扩展的磁盘本身是一个跨区卷,因此可以将导出的isci初始化为一个动态磁盘,然后加入到原有的跨区卷上。这样做的好处就对于应用层面是没有任何感知的,也能解决磁盘空间的问题,当然,这是因为现有硬件资源的问题,最好还是直接挂载一个光纤信道的存储或者扩展原有存储服务器等方式。这里记录整个实现过程。

1.基本概念

1.1 iSCSI简介

iSCSI(internet SCSI)技术由IBM公司研究开发,是一个供硬件设备使用的、可以在IP协议的上层运行的SCSI指令集,这种指令集合可以实现在IP网络上运行SCSI协议,使其能够在诸如高速千兆以太网上进行路由选择。iSCSI技术是一种新储存技术,该技术是将现有SCSI接口与以太网络(Ethernet)技术结合,使服务器可与使用IP网络的储存装置互相交换资料。

iSCSI是一种基于TCP/IP 的协议,用来建立和管理IP存储设备、主机和客户机等之间的相互连接,并创建存储区域网络(SAN)。SAN使得SCSI 协议应用于高速数据传输网络成为可能,这种传输以数据块级别(block-level)在多个数据存储网络间进行。SCSI结构基于C/S模式,其通常应用环境是:设备互相靠近,并且这些设备由SCSI 总线连接。

iSCSI 的主要功能是在TCP/IP 网络上的主机系统(启动器 initiator)和存储设备(目标器
完整的iSCSI系统的拓扑结构如下

2.相关配置

2.1. 网络环境

客户端:10.10.10.11 (windows server 2008 R2)

服务端:10.10.10.10 (Centos 7)

通过交换机直连,同一网段可以正常通讯。

2.2. 服务端(CentOS 7 Linux)

2.2.1 安装targeted

yum -y install targetcli

2.2.2 配置

targetcli
/backstores/block create data /dev/centos/vg-data ## 创建一个块存储
iscsi/ create  ## 创建一个新的isci target
iscsi/ create iqn.2021-11.com.njbidding.iscsi.data:data ## if you want to create by your own name
# create lun
/backstores/block create name=LUN1 dev=/dev/centos/vg-data
cd /iscsi/iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ea09363176e3/tpg1/luns
create /backstores/block/LUN1 lun1
# create acls
create iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ea09363176e3/
cd iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ea09363176e3/
# set username and password for CHAP
set auth userid=username
set auth password=pwd
# save config
cd /
saveconfig

启动:

service target start
systemctl enable target

防火墙设置

firewall-cmd --permanent --add-port=3260/tcp
firewall-cmd --reload

2.3. 客户端(CentOS 7 Linux)

2.3.1 添加iscsi 发现

从开始菜单打开isci 发现程序

修改配置选项卡中的Initator Name为Linux服务器上配置的target name 如:iqn.2003-01.org.linux-iscsi.localhost.x8664:sn.ea09363176e3

添加发现portal,切换到该选项卡,单击发现门户按钮

填入ip地址:10.10.10.10
高级选项中可以配置发现时候的CHAP认证,这里由于服务端没有添加可以跳过,单击确定成功后,可以从目标选项卡中看到target lun。

选中已经发现的目标,单击连接按钮

由于刚才在服务器端ACLS中做了CHAP认证,所以需要输入CHAP的userid和密码,单击高级选项

完成后点击确定,如果一切顺利就会显示已经连接

链接后的iSCSI已经是一个本地磁盘了,可以从磁盘管理中被看到。

注意:windows要求password必须在12位到16位之间,数字字母符合都有,这是个坑,可能和组策略有关,没有深究。

3. 磁盘配置

3.1. 磁盘分区

如果仅仅需要挂载作为一个普通硬盘分区,只需要初始化磁盘后格式化为分区,也可以转换为动态磁盘或者GPT分区表后建立简单卷。

本次目标是加入一个跨区卷中,此时初始化磁盘后,转化为动态磁盘,选择已有跨区卷然后选择扩展将该硬盘加入就可以了。在跨区卷空间没有被用到时候可以进行收缩处理。

3.2. 故障

对于一个挂载的iSCSI设备,如果iSCSI服务器意外离线,windows内核会自动重试链接,磁盘会消失并从资源管理器中消失,重试成功后磁盘会自动出现,数据不会丢失。对于有iSCSI的跨区卷,丢失一个会消失整个跨区卷,同样的如果链接恢复数据会自动恢复。

4. 调优

官方解决采用万兆网络设备来优化传输速率

更新:

5 排错

记录一次排错,线上生产环境中突发客户端频繁断开重试的问题,并在windows日志中出现大量如下图日志:

长时间后出现挂在的磁盘丢失的错误。

同时在服务器端/var/log/message陆续出现如下图错误:

当磁盘丢失后,会发生如下错误:

Sep 23 17:30:55 localhost kernel: [<ffffffffb4d89179>] schedule+0x29/0x70
Sep 23 17:30:55 localhost kernel: [<ffffffffb4d86e41>] schedule_timeout+0x221/0x2d0
Sep 23 17:30:55 localhost kernel: [<ffffffffb46b1176>] ? __send_signal+0x56/0x490
Sep 23 17:30:55 localhost kernel: [<ffffffffb4d8952d>] wait_for_completion+0xfd/0x140
Sep 23 17:30:55 localhost kernel: [<ffffffffb46dadf0>] ? wake_up_state+0x20/0x20
Sep 23 17:30:55 localhost kernel: [<ffffffffc0a07b7e>] iscsit_cause_connection_reinstatement+0x9e/0x100 [iscsi_target_mod]
Sep 23 17:30:55 localhost kernel: [<ffffffffc0a1ace1>] iscsit_stop_session+0x121/0x1e0 [iscsi_target_mod]
Sep 23 17:30:55 localhost kernel: [<ffffffffc0a0b903>] iscsi_check_for_session_reinstatement+0x213/0x280 [iscsi_target_mod]
Sep 23 17:30:55 localhost kernel: [<ffffffffc0a0e725>] iscsi_target_check_for_existing_instances+0x35/0x40 [iscsi_target_mod]
Sep 23 17:30:55 localhost kernel: [<ffffffffc0a0ea65>] iscsi_target_do_login+0x335/0x640 [iscsi_target_mod]
Sep 23 17:30:55 localhost kernel: [<ffffffffc0a0f816>] iscsi_target_do_login_rx+0x276/0x390 [iscsi_target_mod]
Sep 23 17:30:55 localhost kernel: [<ffffffffc0a0dd00>] ? iscsi_target_check_login_request+0x1a0/0x1a0 [iscsi_target_mod]
Sep 23 17:30:55 localhost kernel: [<ffffffffb46bde8f>] process_one_work+0x17f/0x440
Sep 23 17:30:55 localhost kernel: [<ffffffffb46befa6>] worker_thread+0x126/0x3c0
Sep 23 17:30:55 localhost kernel: [<ffffffffb46bee80>] ? manage_workers.isra.26+0x2a0/0x2a0
Sep 23 17:30:55 localhost kernel: [<ffffffffb46c5e61>] kthread+0xd1/0xe0
Sep 23 17:30:55 localhost kernel: [<ffffffffb46c5d90>] ? insert_kthread_work+0x40/0x40
Sep 23 17:30:55 localhost kernel: [<ffffffffb4d95df7>] ret_from_fork_nospec_begin+0x21/0x21
Sep 23 17:30:55 localhost kernel: [<ffffffffb46c5d90>] ? insert_kthread_work+0x40/0x40

开始怀疑Linux内核或者网络的问题:tcp_sendpage()是linux socket函数,在iSCSI内核模块中的代码如下:

判断网络问题居多,也有说需要内核补丁的,尝试升级了内核,错误依旧。

也通过lsof -i:3260判断端口是否正常监听,意外的是没有,但是客户端可以telnet到,通过搜索了解到这个端口是由内核程序打开的,lsof处于用户态,不能查看到。

netstat -an后突然发现

Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0    192 localhost.localdoma:ssh 111.0.0.29:58119        ESTABLISHED
tcp        0      0 localhost.localdoma:ssh 111.0.0.29:58120        ESTABLISHED
tcp        0      0 localhost.:i3260 10.10.10.11:59183 TIME_WAIT
tcp        0      0 localhost.:i3260 10.10.10.11:59183 TIME_WAIT
tcp        0      0 localhost.:i3260 10.10.10.11:59183 TIME_WAIT
tcp        0      0 localhost.:i3260 111.0.0.29:58120 TIME_WAIT

其中111.0.0.29 10.10.10.11两个地址都链接了iSCSI,似乎是多重链接的问题。10.10.10.11是正常的服务器,那 111.0.0.29来自那里不得而知,查询防火墙日志,发现是通过vpn的链接,来自一个测试环境上,登录发现这个服务器也链接了这个target,之前由于vpn断开没有发生问题,而因为一些因此这个vpn被打开,造成了对一个target的多重链接后出错。从TCP代码上来看也能说得通。彻底断开后问题得以解决。

原来是需要启动一个target 多个会话设置才可以的。

Lokie博客
请先登录后发表评论
  • 最新评论
  • 总共0条评论
  • 本博客使用免费开源的 laravel-bjyblog v5.5.1.1 搭建 © 2014-2018 lokie.wang 版权所有 ICP证:沪ICP备18016993号
  • 联系邮箱:kitche1985@hotmail.com