示例环境

在这个例子中,我们将使用两个不同的 Linux 服务器,它们都运行 CentOS 7.

  • 客户端:192.168.1.100:这个 Linux 系统充当 iSCSI 启动器,它将通过网络连接到服务器上的 iSCSI 目标。
  • 服务器:192.168.1.200:该 Linux 系统充当 iSCSI 目标服务器,它为客户端提供可通过网络访问的磁盘空间。

配置 iSCSI 启动器

现在已经配置并设置了 iSCSI 目标,我们可以继续在客户端配置 iSCSI 启动器以连接到 iSCSI 目标。

启动器在连接之前需要安装 iscsi-initiator-utils 包,首先安装它,如下所示。

yum install iscsi-initiator-utils -y

接下来一定要启动并启用 iscsid 和 iscsi。
请注意,如果我们稍后编辑启动器的 IQN,我们可能需要重新启动这些。

systemctl enable iscsid iscsi
systemctl start iscsid iscsi

我们将使用 /etc/iscsi/initiatorname.iscsi 文件中指定的启动器名称进行连接,如果我们修改它,我们还需要更新 iSCSI 目标上的 ACL,因为它需要在两侧相同。

接下来,我们可以对目标服务器的 IP 地址执行发现,以查看提供的 iSCSI 目标。
在本例中,192.168.1.200 是我们的 iSCSI 目标服务器。

[jack@onitroad ~]# iscsiadm --mode discovery --type sendtargets --portal 192.168.1.200
192.168.1.200:3260,1 iqn.2014-01.com.example:target

从客户端系统我们可以看到可用的目标,接下来我们要登录它才能使用它。

[jack@onitroad ~]# iscsiadm -m node -T iqn.2014-01.com.example:target -l
Logging in to [iface: default, target: iqn.2014-01.com.example:target, portal: 192.168.1.200,3260] (multiple)
Login to [iface: default, target: iqn.2014-01.com.example:target, portal: 192.168.1.200,3260] successful.

从客户端我们可以查看所有活动的 iSCSI 会话,如下所示。

[jack@onitroad mnt]# iscsiadm -m session -P 0
tcp: [1] 192.168.1.200:3260,1 iqn.2014-01.com.example:target (non-flash)

我们还可以将 -P 0 更改为 1,2 或者 3 以增加信息级别。

从 iSCSI 目标共享的文件磁盘和块磁盘现在可供 iSCSI 启动器使用,如下所示。
在这种情况下,本地磁盘 /dev/sdb 是目标服务器上的 fileio 文件 /tmp/fileio,而本地磁盘 /dev/sdc 是目标服务器上的块磁盘 /dev/sdc。

[jack@onitroad ~]# lsblk --scsi
NAME HCTL       TYPE VENDOR   MODEL             REV  TRAN
sda  2:0:0:0    disk VMware,  VMware Virtual S 1.0   spi
sdb  3:0:0:0    disk LIO-ORG  testfile         4.0   iscsi
sdc  3:0:0:1    disk LIO-ORG  block            4.0   iscsi
sr0  1:0:0:0    rom  NECVMWar VMware IDE CDR10 1.00  ata

这两个磁盘现在都可以使用,就好像它们是客户端系统的普通本地添加磁盘一样。

[jack@onitroad ~]# fdisk -l
Disk /dev/sdb: 524 MB, 524288000 bytes, 409600 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 8388608 bytes
Disk /dev/sdc: 1073 MB, 1073741824 bytes, 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 4194304 bytes

我们可以将文件系统分区或者放入它们,就好像它们是本地磁盘一样。

[jack@onitroad ~]# mkfs.xfs /dev/sdb
meta-data=/dev/sdb               isize=256    agcount=4, agsize=12800 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0        finobt=0
data     =                       bsize=4096   blocks=51200, imaxpct=25
         =                       sunit=0      swidth=0 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=853, version=2
         =                       sectsz=512   sunit=0 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[jack@onitroad ~]# mkfs.xfs /dev/sdc
...

从那里我们可以根据需要将它们挂载到任何地方,在这里我们挂载到 /mnt 进行测试并查看它是否可用。

[jack@onitroad ~]# mount /dev/sdb /mnt
[jack@onitroad ~]# mkdir /mnt2
[jack@onitroad ~]# mount /dev/sdc /mnt2
[jack@onitroad ~]# df -h | grep mnt
Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb        497M   11M  486M   6% /mnt
/dev/sdc       1014M   33M  982M   4% /mnt2

然后我们可以将这些添加到 /etc/fstab 中,以便在系统引导期间自动挂载它们。

要注销 iSCSI 目标,请先卸载磁盘。

[jack@onitroad /]# umount /mnt
[jack@onitroad /]# umount /mnt2

然后执行实际注销,在此之后我们确认没有活动会话。

[jack@onitroad ~]# iscsiadm -m node -u
Logging out of session [sid: 1, target: iqn.2014-01.com.example:target, portal: 192.168.1.200,3260]
Logout of [sid: 1, target: iqn.2014-01.com.example:target, portal: 192.168.1.200,3260] successful.
[jack@onitroad ~]# iscsiadm -m session -P 0
iscsiadm: No active sessions.

此时,如果我们重新启动客户端系统,它将自动重新登录到 iSCSI 目标,因此如果我们确实通过 /etc/fstab 设置了自动挂载,它应该正确挂载。
如果我们然后重新启动 iSCSI 目标服务器,它应该会自动启动目标服务,使 iSCSI 目标在系统启动时可用。

配置 iSCSI 目标

首先,我们将在我们的服务器上配置 iSCSI 目标,该目标将通过网络向我们的客户端(即 iSCSI 启动器)提供其磁盘空间。

我们想在服务器上安装“targetcli”包,它提供了一个用于查看和修改目标配置的shell,以便我们可以将本地存储资源(如文件、卷或者 内存 磁盘)导出到外部系统。
布局是基于树的,导航的工作方式类似于使用“cd”和“ls”等命令在文件系统中移动。

yum install targetcli -y

安装后,我们要启动目标服务,并启用它,以便它在系统启动时自动启动。

systemctl start target
systemctl enable target

现在我们可以运行 targetcli 命令,然后在 targetcli 提示符下运行 ls 来了解可用的内容。

[jack@onitroad ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb41
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]

targetcli 命令提供 tab 补全功能,因此如果我们遇到困难,只需按几次 tab 即可查看可用选项。
这些将根据我们所在层次结构的级别而变化,就像文件系统一样,我们总是可以使用“cd ..”。

创建一个Backstore

第一件事是Backstore。

Backstores 提供了在本地存储将导出到外部系统的数据的不同方式。
可用的选项有块、fileio、pscsi 和 ramdisk。
在我们的示例中,我们将演示 block 和 fileio 选项,因为它们很常见。

块后备存储只是一个 Linux 块设备,例如 /dev/sdc 之类的硬盘驱动器。

一个fileio backstore是文件系统上已经创建好的一个预先定义好的大小的文件,一般单个文件的性能不如block backstore。

要创建后备存储,执行后跟要创建的类型的 backstores 命令,例如 fileio。
如果我们遇到困难,请使用选项卡完成功能。
这里我们正在创建 testfile fileio backstore,这将在磁盘上创建一个 500MB /tmp/fileio 文件,其中 write_back=false 只是表示不使用任何缓存,这会降低性能但会减少可能的数据丢失,这是生产环境中更好的选择.

/> backstores/fileio create testfile /tmp/fileio 500M write_back=false
Created fileio testfile with size 524288000

如果我们使用的是块设备而不是文件,则该命令将如下所示。
在这个例子中,我们使用磁盘 /dev/sdc 作为我们的后备存储。

/> backstores/block create name=block dev=/dev/sdc
Created block storage object block using /dev/sdc.

一旦完成,如果我们再次发出 'ls' 命令并且应该列出回溯存储。

/> ls
o- / ...................................................... [...]
  o- backstores ........................................... [...]
  | o- block ............................... [Storage Objects: 1]
  | | o- block ....... [/dev/sdc (1.0GiB) write-thru deactivated]
  | o- fileio .............................. [Storage Objects: 1]
  | | o- testfile .. [/tmp/fileio (500.0MiB) write-thru deactivated]
  | o- pscsi ............................... [Storage Objects: 0]
  | o- ramdisk ............................. [Storage Objects: 0]
  o- iscsi ......................................... [Targets: 0]
  o- loopback ...................................... [Targets: 0]

创建 iSCSI 目标和门户

接下来我们要创建实际的 iSCSI 目标本身,首先进入 iSCSI 路径,如下所示。
我们不需要在 'cd' 命令之前添加它来访问它,但是它也能工作。

/> iscsi/

进入此处后,我们可以使用特定的 IQN (iqn.2014-01.com.example) 和 iSCSI 目标名称 (target) 创建 iSCSI 目标。

/iscsi> create iqn.2014-01.com.example:target
Created target iqn.2014-01.com.example:target.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

或者,我们可以单独输入“create”,它会自动使用默认的 IQN 和目标名称,我们不必手动选择这些,但该选项很好。

现在,如果我们再次运行“ls”,我们应该会看到列出的 iSCSI 目标。

/iscsi> ls
o- iscsi ............................. [Targets: 1]
  o- iqn.2014-01.com.example:target ..... [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]

正如我们在这里看到的,一个门户已经创建。
从 RHEL 7.1 开始,一旦设置了目标,还将配置一个默认门户,该门户将侦听 0.0.0.0 上的 TCP 端口 3260。

创建 LUN

接下来,我们要使用我们之前定义的后备存储创建一个 LUN。

首先进入刚刚创建的目标门户组 (TPG)。

/iscsi> iqn.2014-01.com.example:target/tpg1/

在此之后,我们可以创建 LUN,指定我们之前创建的任何后备存储。
默认情况下,以这种方式创建的 LUN 将应用读写权限。
在这里,我们为我们的 fileio 和 block backstore 创建了一个 LUN。

/iscsi/iqn.20...e:target/tpg1> luns/ create /backstores/fileio/testfile
Created LUN 0.
/iscsi/iqn.20...e:target/tpg1> luns/ create /backstores/block/block
Created LUN 1.

现在,如果我们执行“ls”,我们应该会看到我们的两个 LUN 都存在。

/iscsi/iqn.20...e:target/tpg1> ls
o- tpg1 .................... [no-gen-acls, no-auth]
  o- acls ............................... [ACLs: 0]
  o- luns ............................... [LUNs: 2]
  | o- lun0 ....... [fileio/testfile (/tmp/fileio)]
  | o- lun1 .............. [block/block (/dev/sdc)]
  o- portals ......................... [Portals: 1]
    o- 0.0.0.0:3260 .......................... [OK]

创建 ACL

现在我们需要配置一个访问控制列表 (ACL) 来定义实际允许连接到 iSCSI 目标的启动器。

为此,请转到将成为 iSCSI 启动器的客户端系统并获取 /etc/iscsi/initiatorname.iscsi 文件的内容,我们可以根据需要编辑此文件,否则默认即可。
只要我们在 iSCSI 目标服务器上的 ACL 中配置的内容与 iSCSI 启动器客户端上的此文件的内容相同,这就会起作用。

[jack@onitroad ~]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:5bf95f78165

现在我们从客户端系统获得了发起者的名称,我们在 TPG 中输入服务器上的 ACL 部分。

/iscsi/iqn.20...e:target/tpg1> acls/

现在通过指定在客户端系统上找到的启动器名称来创建 ACL。

/iscsi/iqn.20...get/tpg1/acls> create iqn.1994-05.com.redhat:5bf95f78165
Created Node ACL for iqn.1994-05.com.redhat:5bf95f78165
Created mapped LUN 1.
Created mapped LUN 0.

请注意,在此 iSCSI 目标中创建的所有 LUN 将自动映射到 ACL。

/iscsi/iqn.20...get/tpg1/acls> ls
o- acls ........................................ [ACLs: 1]
  o- iqn.1994-05.com.redhat:5bf95f78165 ..[Mapped LUNs: 2]
    o- mapped_lun0 .............. [lun0 fileio/file1 (rw)]
    o- mapped_lun1 ............... [lun1 block/block (rw)]

这就是所需的所有配置,我们可以使用“cd”进入 iSCSI 目标的根目录,然后使用“ls”查看所有配置。

/iscsi/iqn.20...get/tpg1/acls> cd ../..
/iscsi/iqn.20...xample:target> ls
o- iqn.2014-01.com.example:target .......................... [TPGs: 1]
  o- tpg1 ..................................... [no-gen-acls, no-auth]
    o- acls ................................................ [ACLs: 1]
    | o- iqn.1994-05.com.redhat:5bf95f78165 ......... [Mapped LUNs: 2]
    |   o- mapped_lun0 ................... [lun0 fileio/testfile (rw)]
    |   o- mapped_lun1 ....................... [lun1 block/block (rw)]
    o- luns ................................................ [LUNs: 2]
    | o- lun0 ........................ [fileio/testfile (/tmp/fileio)]
    | o- lun1 ............................... [block/block (/dev/sdc)]
    o- portals .......................................... [Portals: 1]
      o- 0.0.0.0:3260 ........................................... [OK]

保存更改

要保存配置,只需退出,这会将所有内容写入 /etc/target/saveconfig.json 文件,如下所示。

/iscsi/iqn.20...xample:target> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json

iSCSI 防火墙规则

完成后,目标服务器现在应该正在侦听 TCP 端口 3260,如下所示。

[jack@onitroad ~]# netstat -antup | grep 3260
tcp        0      0 0.0.0.0:3260            0.0.0.0:*               LISTEN      

现在我们需要允许流量通过此端口上的 firewalld。

[jack@onitroad ~]# firewall-cmd --permanent --add-port=3260/tcp
success
[jack@onitroad ~]# firewall-cmd --reload
success

我们的 iSCSI 目标现在已准备好接受来自客户端系统 (iqn.1994-05.com.redhat:5bf95f78165) 上的 iSCSI 启动器的连接。

如何在 Linux 中配置 iSCSI 目标和启动器

通过 iSCSI 目标,我们可以通过网络向客户端 iSCSI 启动器提供对服务器上磁盘存储的访问。
然后,iSCSI 启动器将能够使用来自 iSCSI 目标服务器的存储,就像它是本地磁盘一样。

在这里,我们介绍了如何在 Linux 中设置 iSCSI 目标和 iSCSI 启动器并将它们连接在一起。

日期:2020-07-07 20:54:37 来源:oir作者:oir