iSCSI简介

iSCSI(Internet Small Computer System Interface,发音为/аɪskʌzi/),Internet小型计算机系统接口,又称为IP-SAN,是一种基于因特网及SCSI-3协议下的存储技术,由IETF提出,并于2003年2月11日成为正式的标准。

iSCSI是一种基于TCP/IP 的协议,用来建立和管理IP存储设备、主机和客户机等之间的相互连接,并创建存储区域网络(SAN)。

SAN使得SCSI 协议应用于高速数据传输网络成为可能,这种传输以数据块级别(block-level)在多个数据存储网络间进行。SCSI 

结构基于C/S模式,其通常应用环境是:设备互相靠近,并且这些设备由SCSI 总线连接。

iSCSI 的主要功能是在TCP/IP 网络上的主机系统(启动器 initiator)和存储设备(目标器target)

与传统的SCSI技术比较起来,iSCSI技术有以下三个革命性的变化:

  1. 把原来只用于本机的SCSI协义通过TCP/IP网络发送,使连接距离可作无限的地域延伸;

  2. 连接的服务器数量无限(原来的SCSI-3的上限是15);

  3. 由于是服务器架构,因此也可以实现在线扩容以至动态部署。

环境介绍

  1. Vmware创建两台node1和node2的centos7的虚拟机,磁盘类型选择SCSI;

  2. node01准备用来配置iSCSI target(磁盘共享提供端),为了配置多路径,配有两块网卡eth33eth37,ip分别是192.168.191.130192.168.191.132

  3. node02用来配置iSCSI initiator(磁盘挂载端),只有一块网卡eth33,ip为192.168.191.131;

  4. node01和node02都带有/dev/sdb/dev/sdc两块硬盘,接下来的配置,将会把node01的/dev/sdb作为iSCSI块设备共享给node02。

安装前准备

  • 关闭selinux

    setenforce 0
    sed -i '/^SELINUX=.*/ s//SELINUX=disabled/' /etc/selinux/config
  • 关闭防火墙

    systemctl stop firewalld.service
    systemctl disable firewalld.service
  • 安装epel扩展包

    yum install -y epel-release


target设置

安装 scsi-target-utils

yum --enablerepo=epel -y install scsi-target-utils

配置

vim /etc/tgt/target.conf
添加一下配置
  #test12可选设置    
    # 把/dev/sdc作为块设备共享出去
    backing-store /dev/sdc
    # 可选,iSCSI Initiator限制
    initiator-address 192.168.191.131    
    # 可选,认证配置,username和password配置成你自己的信息
    incominguser username password

开启服务

systemctl enable tgtd.service
systemctl start tgtd.service
查看tgtd启动的服务状态:

[root@test ~]# systemctl  status  tgtd.service 
● tgtd.service - tgtd iSCSI target daemon
   Loaded: loaded (/usr/lib/systemd/system/tgtd.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-07-19 17:05:12 CST; 11min ago
  Process: 2646 ExecStop=/usr/sbin/tgtadm --op delete --mode system (code=exited, status=0/SUCCESS)
  Process: 2640 ExecStop=/usr/sbin/tgt-admin --update ALL -c /dev/null (code=exited, status=0/SUCCESS)
  Process: 2638 ExecStop=/usr/sbin/tgtadm --op update --mode sys --name State -v offline (code=exited, status=0/SUCCESS)
  Process: 2686 ExecStartPost=/usr/sbin/tgtadm --op update --mode sys --name State -v ready (code=exited, status=0/SUCCESS)
  Process: 2658 ExecStartPost=/usr/sbin/tgt-admin -e -c $TGTD_CONFIG (code=exited, status=0/SUCCESS)
  Process: 2656 ExecStartPost=/usr/sbin/tgtadm --op update --mode sys --name State -v offline (code=exited, status=0/SUCCESS)
  Process: 2650 ExecStartPost=/bin/sleep 5 (code=exited, status=0/SUCCESS)
 Main PID: 2649 (tgtd)
   CGroup: /system.slice/tgtd.service
           └─2649 /usr/sbin/tgtd -f

Jul 19 17:05:07 test systemd[1]: Starting tgtd iSCSI target daemon...
Jul 19 17:05:07 test tgtd[2649]: tgtd: iser_ib_init(3436) Failed to initialize RDMA; load kernel modules?
Jul 19 17:05:07 test tgtd[2649]: tgtd: work_timer_start(146) use timer_fd based scheduler
Jul 19 17:05:07 test tgtd[2649]: tgtd: bs_init_signalfd(267) could not open backing-store module directory /usr/li...-store
Jul 19 17:05:07 test tgtd[2649]: tgtd: bs_init(386) use signalfd notification
Jul 19 17:05:12 test tgtd[2649]: tgtd: device_mgmt(246) sz:14 params:path=/dev/sdb
Jul 19 17:05:12 test tgtd[2649]: tgtd: bs_thread_open(408) 16
Jul 19 17:05:12 test systemd[1]: Started tgtd iSCSI target daemon.

使用yum安装的target在启动的时候会有如下提示:
    systemd: Configuration file /usr/lib/systemd/system/tgtd.service is marked executable. Please remove executable permission bits. Proceeding anyway
    
    修改改文件的权限即可
    chmod 700 /usr/lib/systemd/system/tgtd.service

查看服务

[root@test ~]# tgtadm --mod target  --op show 
Target 1: test12
    System information:
        Driver: iscsi
        State: ready
    LUN information:
        LUN: 0
            Type: controller
            SCSI ID: IET     00010000
            SCSI SN: beaf10
            Size: 0 MB, Block size: 1
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: No
            Backing store type: null
            Backing store path: None
            Backing store flags: 
        LUN: 1
            Type: disk
            SCSI ID: IET     00010001
            SCSI SN: beaf11
            Size: 5369 MB, Block size: 512
            Online: Yes
            Removable media: No
            Prevent removal: No
            Readonly: No
            SWP: No
            Thin-provisioning: No
            Backing store type: rdwr
            Backing store path: /dev/sdb
            Backing store flags: 
    Account information:
    ACL information:
        192.168.191.131

Initiator配置(挂载磁盘端)

安装

yum -y install iscsi-initiator-utils

配置

# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=test12  #与target端的/etc/tgt/target.conf中名称一样
# vim /etc/iscsi/iscsi.conf
# 以下配置,如果你target没有配置ACL限制,可以直接跳过,使用默认配置即可
# 57行:取消注释node.session.auth.authmethod = CHAP
# 61,62行:取消注释,用户名和密码设置成前面在target里面设置好的
node.session.auth.username = username
node.session.auth.password = password

扫描设备并展示设备

[root@accur-test ~]# iscsiadm  -m discovery -t st -p 192.168.191.130   
192.168.191.130:3260,1 test12
[root@accur-test ~]# iscsiadm  -m discovery -t st -p 192.168.191.132 
192.168.191.132:3260,1 test12


[root@accur-test ~]# iscsiadm  -m node -o show
# BEGIN RECORD 6.2.0.874-10
node.name = test12
node.tpgt = 1
node.startup = automatic
node.leading_login = No
iface.hwaddress = 
.........
iface.vlan_id = 0
iface.vlan_priority = 0
iface.vlan_state = 
iface.iface_num = 0
iface.mtu = 0
iface.port = 0
iface.bootproto = 
iface.dhcp_alt_client_id_state = 
iface.dhcp_alt_client_id = 
iface.dhcp_dns = 
iface.dhcp_learn_iqn = 
.............
iface.strict_login_compliance = 
iface.discovery_auth = 
iface.discovery_logout = 
node.discovery_address = 192.168.191.130
node.discovery_port = 3260
....................
node.conn[0].iscsi.HeaderDigest = None
node.conn[0].iscsi.IFMarker = No
node.conn[0].iscsi.OFMarker = No
# END RECORD
# BEGIN RECORD 6.2.0.874-10
node.name = test12
.
node.conn[0].iscsi.IFMarker = No
node.conn[0].iscsi.OFMarker = No
# END RECORD

登陆

[root@accur-test ~]# iscsiadm -m node -l  #或者 -l 替换成--login
Logging in to [iface: default, target: test12, portal: 192.168.191.130,3260] (multiple)
Logging in to [iface: default, target: test12, portal: 192.168.191.132,3260] (multiple
Login to [iface: default, target: test12, portal: 192.168.191.130,3260] successful.
Login to [iface: default, target: test12, portal: 192.168.191.132,3260] successful.

退出:
[root@accur-test ~]# iscsiadm -m node -u
Logging out of session [sid: 7, target: test12, portal: 192.168.191.130,3260]
Logging out of session [sid: 8, target: test12, portal: 192.168.191.132,3260]
Logout of [sid: 7, target: test12, portal: 192.168.191.130,3260] successful.
Logout of [sid: 8, target: test12, portal: 192.168.191.132,3260] successful.

确认信息

[root@accur-test ~]# iscsiadm  -m session -o show
tcp: [10] 192.168.191.130:3260,1 test12 (non-flash)
tcp: [11] 192.168.191.132:3260,1 test12 (non-flash)

确认分区信息

[root@accur-test ~]# cat /proc/partitions 
major minor  #blocks  name

   8        0   20971520 sda
   8        1    1048576 sda1
   8        2   19921920 sda2
   8       16   10485760 sdb
  11        0    4415488 sr0
 253        0   17821696 dm-0
 253        1    2097152 dm-1
   8       32    5242880 sdc
 253        2    5242880 dm-2
   8       48    5242880 sdd

可以看到,sddsde就是通过iSCSI挂载得到的磁盘,此时通过fdisk -l命令,你可以发现这两块磁盘和node01的/dev/sdb完全一样,为了正常使用这块磁盘,我们还需要配置磁盘多路径。

如果查看initiator端的磁盘信息没有target端同步的磁盘信息,在initiator端可以查看iscsid的服务状态信息(本次验证时就出现无法连接target端的情况),如

[root@accur-test ~]# systemctl status   iscsid.service 

● iscsid.service - Open-iSCSI

   Loaded: loaded (/usr/lib/systemd/system/iscsid.service; disabled; vendor preset: disabled)

   Active: active (running) since Fri 2019-07-19 16:44:40 CST; 5h 1min ago

     Docs: man:iscsid(8)

           man:iscsiadm(8)

  Process: 983 ExecStart=/usr/sbin/iscsid (code=exited, status=0/SUCCESS)

 Main PID: 1001 (iscsid)

   CGroup: /system.slice/iscsid.service

           ├─1000 /usr/sbin/iscsid

           └─1001 /usr/sbin/iscsid


Jul 19 21:35:31 accur-test iscsid[1000]: Connection6:0 to [target: test12, portal: 192.168.191.132,3260] through [...tdown.

Jul 19 21:35:31 accur-test iscsid[1000]: Connection5:0 to [target: test12, portal: 192.168.191.130,3260] through [...tdown.

Jul 19 21:35:38 accur-test iscsid[1000]: Connection7:0 to [target: test12, portal: 192.168.191.130,3260] through [...al now

Jul 19 21:35:38 accur-test iscsid[1000]: Connection8:0 to [target: test12, portal: 192.168.191.132,3260] through [...al now

Jul 19 21:35:59 accur-test iscsid[1000]: Connection7:0 to [target: test12, portal: 192.168.191.130,3260] through [...tdown.

Jul 19 21:35:59 accur-test iscsid[1000]: Connection8:0 to [target: test12, portal: 192.168.191.132,3260] through [...tdown.

Jul 19 21:36:02 accur-test iscsid[1000]: Connection9:0 to [target: test12, portal: 192.168.191.130,3260] through [...al now

Jul 19 21:38:37 accur-test iscsid[1000]: Connection9:0 to [target: test12, portal: 192.168.191.130,3260] through [...tdown.

Jul 19 21:38:42 accur-test iscsid[1000]: Connection10:0 to [target: test12, portal: 192.168.191.130,3260] through ...al now

Jul 19 21:38:42 accur-test iscsid[1000]: Connection11:0 to [target: test12, portal: 192.168.191.132,3260] through ...al now

Hint: Some lines were ellipsized, use -l to show in full.

配置多路径软件(Multipath)

什么是多路径?

普通的电脑主机都是一个硬盘挂接到一个总线上,这里是一对一的关系。而到了有光纤组成的SAN环境,或者由iSCSI组成的IPSAN环境,由于主机和存储通过了光纤交换机或者多块网卡及IP来连接,这样的话,就构成了多对多的关系。也就是说,主机到存储可以有多条路径可以选择。主机到存储之间的IO由多条路径可以选择。每个主机到所对应的存储可以经过几条不同的路径,如果是同时使用的话,I/O流量如何分配?其中一条路径坏掉了,如何处理?还有在操作系统的角度来看,每条路径,操作系统会认为是一个实际存在的物理盘,但实际上只是通向同一个物理盘的不同路径而已,这样是在使用的时候,就给用户带来了困惑。多路径软件就是为了解决上面的问题应运而生的。

多路径的主要功能就是和存储设备一起配合实现如下功能:

  1. 故障的切换和恢复

  2. IO流量的负载均衡

  3. 磁盘的虚拟化

为了主机可以使用 iSCSI 多路径访问存储设备,我们需要在主机上安装多路径设备映射器 (DM-Multipath)。多路径设备映射器可以实现主机节点和后端存储之间的多个 I/O 路径配置为一个单一逻辑设备,从而可以提供链路冗余和提高性能。主机通过访问包含多个 I/O 路径的逻辑设备,就可以有效提高后端存储系统的可靠性。

multipath相关工具和参数介绍:

1、device-mapper-multipath:即multipath-tools。主要提供multipathd和multipath等工具和 multipath.conf等配置文件。

这些工具通过device mapper的ioctr的接口创建和配置multipath,设备创建的多路径设备映射会在/dev /mapper中。

2、 device-mapper:主要包括两大部分:内核部分和用户部分。内核部分主要由device mapper核心(dm.ko)和一些target driver(md-multipath.ko)。

核心完成设备的映射,而target根据映射关系和自身特点具体处理从mappered device 下来的i/o。

同时,在核心部分,提供了一个接口,用户通过ioctr可和内核部分通信,以指导内核驱动的行为,比如如何创建mappered device,这些divece的属性等。

linux device mapper的用户空间部分主要包括device-mapper这个包。其中包括dmsetup工具和一些帮助创建和配置mappered device的库。

这些库主要抽象,封装了与ioctr通信的接口,以便方便创建和配置mappered device。multipath-tool的程序中就需要调用这些库

安装在initiator服务器上

yum install device-mapper-multipath  -y

设置开机启动

systemctl enable multipathd.service

添加配置文件

需要multipath正常工作只需要如下配置即可,如果想要了解详细的配置,请参考Multipath

# vi /etc/multipath.conf
blacklist {
    devnode "^sda"}
defaults {
    user_friendly_names yes
    path_grouping_policy multibus
    failback immediate
    no_path_retry fail
}

启动服务

systemctl start multipathd.service

查看服务

[root@accur-test ~]# multipath -ll
mpatha (360000000000000000e00000000010001) dm-2 IET     ,VIRTUAL-DISK    
size=5.0G features='0' hwhandler='0' wp=rw
`-+- policy='service-time 0' prio=1 status=active
  |- 12:0:0:1 sdc 8:32 active ready running
  `- 13:0:0:1 sdd 8:48 active ready running

此时,执行lsblk命令就可以看到多路径磁盘mpatha了:

[root@accur-test ~]# lsblk
NAME            MAJ:MIN RM  SIZE RO TYPE  MOUNTPOINT
sda               8:0    0   20G  0 disk  
├─sda1            8:1    0    1G  0 part  /boot
└─sda2            8:2    0   19G  0 part  
  ├─centos-root 253:0    0   17G  0 lvm   /
  └─centos-swap 253:1    0    2G  0 lvm   [SWAP]
sdb               8:16   0   10G  0 disk  
sdc               8:32   0    5G  0 disk  
└─mpatha        253:2    0    5G  0 mpath 
sdd               8:48   0    5G  0 disk  
└─mpatha        253:2    0    5G  0 mpath 
sr0              11:0    1  4.2G  0 rom

对挂载磁盘进行分区

# parted /dev/sdc

格式化为GPT分区格式:

(parted) mklabel gpt

将所有容量划为一个主分区

(parted) mkpart primary xfs 0% 100%

退出

(parted) q

进行上述分区操作后出现/dev/sdc1文件(使用lsblk查看)

格式化分区

# mkfs.xfs /dev/sdc1

挂载分区

# mkdir /data (创建挂载目录)
# mount -t xfs /dev/sdc1 /data
# df -h (查看分区结果)

开机自动挂载

1) fstab文件中自动挂载
很多文章说开机挂载修改/etc/fstab文件,并在最后添加

/dev/sdc1   /data    xfs    defaults    0 0

但我在操作过程中发现,如上修改不能成功启动和挂载系统。因为iSCSI是网络设备因此正确的挂载应该如下:

/dev/sdc1  /data    xfs    default,_netdev    0 0

2)自启动脚本实现:
在/etc/profile最后一行添加

mount -t xfs /dev/sdc1 /data

或者按/etc/profile文件首部建议,将挂载操作写成脚本,放入/etc/profile.d目录中。
脚本名:mount_iscsi.sh
内容:

#!/bin/bash
mount -t xfs /dev/sdc1 /data