在 CentOS 7 中部署 iSCSI


本文纯属个人学习经验分享。如有错误,请尽管提出,非常感谢!


一、iSCSI 简介

我们都知道 SCSI(小型计算机系统接口)是一种硬盘接口(标准)。

而 iSCSI 的作用简单来说就是把这种硬盘接口 TCP/IP 化。

通过 iSCSI,我们可以把一个本地块设备(可以是虚拟的也可以是真实的)共享给远程主机。

而这个共享的块设备会被远程主机看作是插在它身上的一块普通 SCSI 硬盘。


二、iSCSI 的一些术语

2.1 Initiator(发起者)

它指的是 iSCSI 客户端。

Initiator 可由纯软件实现(本文就是),也可由带有专用芯片的 HBA(主机总线适配器)卡实现。

2.2 Target(目标)

它指的是 iSCSI 服务器。

2.3 IQN (iSCSI Qualified Name)

全称:iSCSI 合格名称。

它用来标识 Initiator 和 Target。

它的格式为:

iqn.<年份>-<月份>.<反向域名>:<标识符>

例如:

iqn.2018-05.com.zenandidi:server

2.4 LUN (Logical Unit Number)

全称:逻辑单元号码。

它用来标识 Target 中参与 iSCSI 共享的本地块设备。


三、系统环境

3.1 服务器(Target)

  • 操作系统:CentOS 7.5.1804
  • IP 地址:10.0.0.101
  • 要共享的块设备:/dev/sda(1G)、/dev/sdb(1G)
  • IQN:iqn.2018-05.com.zenandidi:server

3.2 客户端(Initiator)

  • 操作系统:CentOS 7.5.1804
  • IP 地址:10.0.0.102
  • IQN:iqn.2018-05.com.zenandidi:client

四、服务器(Target)的配置

4.1 安装相关软件

执行以下命令:

yum -y install targetcli

4.2 清空配置文件

执行以下命令:

targetctl clear

4.3 进入 targetcli 交互式配置页面

执行以下命令:

targetcli

运行结果:

targetcli shell version 2.1.fb46
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/>

说明
• targetcli 采用类似目录结构的树形菜单进行配置。在配置过程中,可使用 lscd 命令列出配置项、切换层级。且命令支持自动补全。

4.4 添加参与 iSCSI 共享的本地块设备

命令用法

/backstores/block create <标识符> <设备文件路径>

说明
• 这里的 <标识符> 随意即可,用于接下来指定 LUN。

例如:

/backstores/block create disk1 /dev/sda
/backstores/block create disk2 /dev/sdb

运行结果:

Created block storage object disk1 using /dev/sda.
Created block storage object disk2 using /dev/sdb.

4.5 设置 Target 的 IQN

命令用法

/iscsi create <Target 的 IQN>

例如:

/iscsi create iqn.2018-05.com.zenandidi:server

运行结果:

Created target iqn.2018-05.com.zenandidi:server.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

4.6 指定 iSCSI 共享的块设备的 LUN

命令用法

/iscsi/<Target 的 IQN>/tpg1/luns create /backstores/block/<本地块设备标识符>

例如:

/iscsi/iqn.2018-05.com.zenandidi:server/tpg1/luns create /backstores/block/disk1
/iscsi/iqn.2018-05.com.zenandidi:server/tpg1/luns create /backstores/block/disk2

运行结果:

Created LUN 0.
Created LUN 1.

4.7 添加 Initiator 白名单

命令用法

/iscsi/<Target 的 IQN>/tpg1/acls create <Initiator 的 IQN>

例如:

/iscsi/iqn.2018-05.com.zenandidi:server/tpg1/acls create iqn.2018-05.com.zenandidi:client

运行结果:

Created Node ACL for iqn.2018-05.com.zenandidi:client
Created mapped LUN 1.
Created mapped LUN 0.

4.8 检查配置

命令用法

ls /

运行结果:

o- / ......................................................................................... [...]
  o- backstores .............................................................................. [...]
  | o- block .................................................................. [Storage Objects: 2]
  | | o- disk1 ............................................ [/dev/sda (1.0GiB) write-thru activated]
  | | | o- alua ................................................................... [ALUA Groups: 1]
  | | |   o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
  | | o- disk2 ............................................ [/dev/sdb (1.0GiB) write-thru activated]
  | |   o- alua ................................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp ....................................... [ALUA state: Active/optimized]
  | o- fileio ................................................................. [Storage Objects: 0]
  | o- pscsi .................................................................. [Storage Objects: 0]
  | o- ramdisk ................................................................ [Storage Objects: 0]
  o- iscsi ............................................................................ [Targets: 1]
  | o- iqn.2018-05.com.zenandidi:server .................................................. [TPGs: 1]
  |   o- tpg1 ............................................................... [no-gen-acls, no-auth]
  |     o- acls .......................................................................... [ACLs: 1]
  |     | o- iqn.2018-05.com.zenandidi:client ..................................... [Mapped LUNs: 2]
  |     |   o- mapped_lun0 ................................................. [lun0 block/disk1 (rw)]
  |     |   o- mapped_lun1 ................................................. [lun1 block/disk2 (rw)]
  |     o- luns .......................................................................... [LUNs: 2]
  |     | o- lun0 ...................................... [block/disk1 (/dev/sda) (default_tg_pt_gp)]
  |     | o- lun1 ...................................... [block/disk2 (/dev/sdb) (default_tg_pt_gp)]
  |     o- portals .................................................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ..................................................................... [OK]
  o- loopback ......................................................................... [Targets: 0]

4.9 退出 & 保存设置

在交互式界面中直接按下 Ctrl + D 即可保存设置并退出。

说明
• 配置文件位置:/etc/target/saveconfig.json

4.10 启动 Target 服务

执行以下命令:

systemctl start target

如需开机启动,请执行:

systemctl enable target

4.11 防火墙放行端口(可选)

iptables 为例,端口为默认的 3260

iptables -A INPUT -p tcp --dport 3260 -j ACCEPT

五、客户端(Initiator)的配置

5.1 安装相关软件

执行以下命令:

yum -y install iscsi-initiator-utils

5.2 设置 Initiator 的 IQN

请使用 vim 之类的文本编辑器打开 /etc/iscsi/initiatorname.iscsi

把文件清空,然后根据以下格式添加一行:

InitiatorName=<Initiator 的 IQN>

例如:

InitiatorName=iqn.2018-05.com.zenandidi:client

然后保存退出。

5.3 重新启动 Initiator 服务

执行以下命令:

systemctl restart iscsi

说明
• 该服务安装之后会自动启动且默认开机启动。

5.4 发现 Target

命令用法

iscsiadm -m discovery -t sendtargets -p <Target 的 IP 地址>

例如:

iscsiadm -m discovery -t sendtargets -p 10.0.0.101

运行结果:

10.0.0.101:3260,1 iqn.2018-05.com.zenandidi:server

5.5 检查现有块设备

说明
• 该步骤用于跟下面做对比。

执行以下命令:

lsblk

运行结果(基于上面的环境):

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sr0              11:0    1 1024M  0 rom  
fd0               2:0    1    4K  0 disk 
vda             252:0    0   10G  0 disk 
├─vda2          252:2    0    9G  0 part /
├─vda3          252:3    0  829M  0 part 
│ └─centos-swap 253:0    0  828M  0 lvm  [SWAP]
└─vda1          252:1    0  200M  0 part /boot

5.6 登录到 Target

命令用法

iscsiadm -m node -T <Target 的 IQN> -p <Target 的 IP 地址> -l

例如:

iscsiadm -m node -T iqn.2018-05.com.zenandidi:server -p 10.0.0.101 -l

运行结果:

Logging in to [iface: default, target: iqn.2018-05.com.zenandidi:server, portal: 10.0.0.101,3260] (multiple)
Login to [iface: default, target: iqn.2018-05.com.zenandidi:server, portal: 10.0.0.101,3260] successful.

5.7 检查现有块设备(对比 5.5)

执行以下命令:

lsblk

运行结果(基于上面的环境):

NAME            MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sdb               8:16   0    1G  0 disk                ← 多出来的块设备
sr0              11:0    1 1024M  0 rom  
fd0               2:0    1    4K  0 disk 
sda               8:0    0    1G  0 disk                ← 多出来的块设备
vda             252:0    0   10G  0 disk 
├─vda2          252:2    0    9G  0 part /
├─vda3          252:3    0  829M  0 part 
│ └─centos-swap 253:0    0  828M  0 lvm  [SWAP]
└─vda1          252:1    0  200M  0 part /boot

可以看出多出了 sdasdb 两个块设备,这正是 Target 共享出来的。

您可以自由地在上面分区、创建文件系统,就跟插在它身上的一块普通 SCSI 硬盘一样!

5.8 注销 Target(可选)

说明
• 如果不想使用 iSCSI 或者想修改 Target 的话,要先把已登录的 Target 注销,最后把 Target 删除。

命令用法

iscsiadm -m node -T <Target 的 IQN> -p <Target 的 IP 地址> -u

例如:

iscsiadm -m node -T iqn.2018-05.com.zenandidi:server -p 10.0.0.101 -u

运行结果:

Logging out of session [sid: 1, target: iqn.2018-05.com.zenandidi:server, portal: 10.0.0.101,3260]
Logout of [sid: 1, target: iqn.2018-05.com.zenandidi:server, portal: 10.0.0.101,3260] successful.

5.9 删除 Target(可选)

命令用法

iscsiadm -m node -T <Target 的 IQN> -p <Target 的 IP 地址> -o delete

例如:

iscsiadm -m node -T iqn.2018-05.com.zenandidi:server -p 10.0.0.101 -o delete

5.10 ⚠️ 注意事项

如需在多个 Initiator 上使用同一个文件系统,请使用集群专用文件系统(如 GFS2),否则可能会出现文件系统错乱的问题。


六、参考文献

  1. iSCSI – Wikipedia
  2. Configure iSCSI Target & Initiator on CentOS 7 / RHEL7 – ITzGeek
  3. [SCSI/iSCSI 及 SAS、NAS、SAN 的基本介绍 – 51CTO 博客]http://blog.51cto.com/11107124/1884637()
  4. 网络驱动器装置:iSCSI 服务器 – 鳥哥的 Linux 私房菜

发表评论