iSCSI 服务

NAS 与 SAN

网络附加储存服务器(NAS,Network Attached Storage)其实就是一台定制好的文件服务器,将 NAS 连上网络,在网络内的主机就能访问 NAS 上的数据。

储存局域网(SAN,Storage Area Networks)可以被视为一个外接式的储存设备,可以为局域网内所有主机提供磁盘而不是文件系统访问。

iSCSI 接口

通过 TCP/IP 技术而不是光纤接口来连接 SAN 就是 iSCSI(Internet SCSI)。iSCSI 分为两部分:

  • iSCSI target:储存设备端,存放磁盘或 RAID 的设备。
  • iSCSI initiator:使用 target 的客户端,通常是服务器。

iSCSI 服务安装

iSCSI 所需的软件有下面两个:

  • scsi-target-utils:用来将 Linux 系统仿真成为 iSCSI target 的功能。
  • iscsi-initiator-utils:挂载来自 target 的磁盘到本地。

直接使用 yum 安装:

[root@server2 ~]$ yum install -y scsi-target-utils
[root@server2 ~]$ yum install -y iscsi-initiator-utils

iSCSI target 设置

建立一个 100 MB 大小的文件 /srv/iscsi/disk.img

[root@server2 ~]$ mkdir /srv/iscsi
[root@server2 ~]$ dd if=/dev/zero of=/srv/iscsi/disk.img bs=1M count=100
[root@server2 ~]$ chcon -Rv -t tgtd_var_lib_t /srv/iscsi

建立一个 200 MB 大小实际的分区 /dev/sda3

[root@server2 ~]$ fdisk /dev/sda
[root@server2 ~]$ partprobe
[root@server2 ~]$ fdisk -l
   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048      411647      204800   83  Linux
/dev/sda2          411648    33187839    16388096   8e  Linux LVM
/dev/sda3        33187840    33579007      195584   83  Linux
/dev/sda4        33579008    41943039     4182016    5  Extended
/dev/sda5        33581056    34195455      307200   8e  Linux LVM

建立一个 300 MB 大小的 LV 设备 /dev/centos/iscsi01

[root@server2 ~]$ pvcreate /dev/sda5
[root@server2 ~]$ vgextend centos /dev/sda5
[root@server2 ~]$ lvcreate -L 296M  -n iscsi01 centos
[root@server2 ~]$ lvscan
  ACTIVE            '/dev/centos/home' [4.88 GiB] inherit
  ACTIVE            '/dev/centos/iscsi01' [296.00 MiB] inherit

iSCSI target 文件名以 iqn(iSCSI Qualified Name)开头,命名格式为 iqn.yyyy-mm.<reversed domain>:id。这里使用名称 iqn.2000-01.server2:mydisk

每个 target 能够拥有数个磁盘设备,这些磁盘被叫做逻辑单位编号(LUN,Logical Unit Number)。iSCSI initiator 就是跟 target 协调后才取得 LUN 的访问权。

tgt 的配置文件 /etc/tgt/targets.conf 可以很简单,将上面新建的三个 LUN 加入到 iqn 中即可:

[root@server2 ~]$ vi /etc/tgt/targets.conf 
<target iqn.2000-01.server2:mydisk>
        backing-store /srv/iscsi/disk.img
        backing-store /dev/sda3
        backing-store /dev/centos/iscsi01
        initiator-address 10.1.1.0/24
        incominguser iuser ipass
        write-cache off
</target>

参数说明如下:

  • backing-store/direct-store:一般用 backing-store 设置虚拟设备,想整块硬盘都被使用可以用 direct-store
  • initiator-address:限制客户端地址,一般也不用设置而用 iptables 来规划。
  • incominguser:设置通过账号密码来使用 iSCSI target。
  • write-cache:是否使用缓存,默认使用缓存来提高读写速度,有数据丢失风险。

如果没有使用 initiator-address 参数,使用 ipbatles 防火墙来规定只有 10.1.1.0/24 可以访问 target 设置如下:

[root@server2 ~]$ iptables -A INPUT -p tcp -s 10.1.1.0/24 --dport 3260 -j ACCEPT

iSCSI target 启动

启动 tgtd 服务:

[root@server2 ~]$ systemctl enable --now tgtd
[root@server2 ~]$ netstat -ntulp |grep tgt
tcp        0      0 0.0.0.0:3260            0.0.0.0:*         LISTEN      23981/tgtd   

使用 tgt-admin 命令查看运行状态:

[root@server2 ~]$ tgt-admin --show
Target 1: iqn.2000-01.server2:mydisk
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
        I_T nexus: 2
            Initiator: iqn.1994-05.com.redhat:bf38cf4ccf5 alias: server3
            Connection: 0
                IP Address: 10.1.1.2
    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: 310 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/centos/iscsi01
            Backing store flags: 
        LUN: 2
            Type: disk
            SCSI ID: IET     00010002
            SCSI SN: beaf12
            Size: 200 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/sda3
            Backing store flags: 
        LUN: 3
            Type: disk
            SCSI ID: IET     00010003
            SCSI SN: beaf13
            Size: 105 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: /srv/iscsi/disk.img
            Backing store flags: 
    Account information:
        iuser
    ACL information:
        10.1.1.0/24

可以看到和配置文件设定的一致,并且有一个已经连接的主机10.1.1.2

iSCSI initiator 设置

安装好 iscsi-initiator-utils 之后,修改配置文件 /etc/iscsi/iscsid.conf 内容,主要是设置访问账号密码:

[root@server3 ~]$ vi /etc/iscsi/iscsid.conf
node.session.auth.username = iuser
node.session.auth.password = ipass
discovery.sendtargets.auth.username = iuser
discovery.sendtargets.auth.password = ipass

iSCSI initiator 操作

设置好之后,使用 iscsiadm 命令来检测 10.1.1.1 中的 iSCSI 设备:

[root@server3 ~]$ iscsiadm -m discovery -t sendtargets -p 10.1.1.1
10.1.1.1:3260,1 iqn.2000-01.server2:mydisk

启动 iscsi 程序:

[root@server3 ~]$ systemctl start iscsi

登录目标 target:

[root@server3 ~]$ iscsiadm -m node
10.1.1.1:3260,1 iqn.2000-01.server2:mydisk
[root@server3 ~]$ iscsiadm -m node -T iqn.2000-01.server2:mydisk --login
Logging in to [iface: default, target: iqn.2000-01.server2:mydisk, portal: 10.1.1.1,3260] (multiple)
Login to [iface: default, target: iqn.2000-01.server2:mydisk, portal: 10.1.1.1,3260] successful.

查询 iSCSI 磁盘:

[root@server3 ~]$ fdisk -l

Disk /dev/sdb: 310 MB, 310378496 bytes, 606208 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdc: 200 MB, 200278016 bytes, 391168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/sdd: 104 MB, 104857600 bytes, 204800 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes

注销 target,但并不删除连接:

[root@server3 ~]$ iscsiadm -m node -T iqn.2000-01.server2:mydisk --logout
Logging out of session [sid: 1, target: iqn.2000-01.server2:mydisk, portal: 10.1.1.1,3260]
Logout of [sid: 1, target: iqn.2000-01.server2:mydisk, portal: 10.1.1.1,3260] successful.

删除 target 连接:

[root@server3 ~]$ iscsiadm -m node -o delete -T iqn.2000-01.server2:mydisk
[root@server3 ~]$ iscsiadm -m node
iscsiadm: No records found

直接将 target 中的磁盘组成 LV 并格式化:

[root@server3 ~]$ pvcreate /dev/sd{b,c,d}
  Physical volume "/dev/sdb" successfully created.
  Physical volume "/dev/sdc" successfully created.
  Physical volume "/dev/sdd" successfully created.
[root@server3 ~]$ vgcreate iscsi /dev/sd{b,c,d}
  Volume group "iscsi" successfully created
[root@server3 ~]$ vgdisplay
[root@server3 ~]$ lvcreate -l 144 -n disk iscsi
  Logical volume "disk" created.
[root@server3 ~]$ lvdisplay
[root@server3 ~]$ mkfs -t ext4 /dev/iscsi/disk
[root@server3 ~]$ mkdir -p /data/iscsi
[root@server3 ~]$ echo "/dev/iscsi/disk /data/iscsi ext4 defaults,_netdev 1 2" >> /etc/fstab
[root@server3 ~]$ mount -a
[root@server3 ~]$ df -Th
/dev/mapper/iscsi-disk  ext4      551M  876K  510M   1% /data/iscsi

挂载时使用 _netdev 参数的意思是,开机后需要网络启动完毕后再挂载。