示例环境
在这个例子中,我们将使用两个不同的 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 启动器的连接。
通过 iSCSI 目标,我们可以通过网络向客户端 iSCSI 启动器提供对服务器上磁盘存储的访问。
然后,iSCSI 启动器将能够使用来自 iSCSI 目标服务器的存储,就像它是本地磁盘一样。
在这里,我们介绍了如何在 Linux 中设置 iSCSI 目标和 iSCSI 启动器并将它们连接在一起。