CentOS 将 tgt 的软件名称定义为 scsi-target-utils ,因此你得要使用 yum 去安装他才行。至于用来作为 initiator
的软件则是使用 linux-iscsi 的项目,该项目所提供的软件名称则为 iscsi-initiator-utils 。所以,总的来说,你需要的软件有:
- scsi-target-utils:用来将 Linux 系统仿真成为 iSCSI target 的功能;
- iscsi-initiator-utils:挂载来自 target 的磁盘到 Linux 本机上。
那么 scsi-target-utils 主要提供哪些档案呢?基本上有底下几个比较重要需要注意的:
- /etc/tgt/targets.conf:主要配置文件,设定要分享的磁盘格式与哪几颗;
- /usr/sbin/tgt-admin:在线查询、删除 target 等功能的设定工具;
- /usr/sbin/tgt-setup-lun:建立 target
以及设定分享的磁盘与可使用的客户端等工具软件。
- /usr/sbin/tgtadm:手动直接管理的管理员工具 (可使用配置文件取代);
- /usr/sbin/tgtd:主要提供 iSCSI target 服务的主程序;
- /usr/sbin/tgtimg:建置预计分享的映像文件装置的工具 (以映像文件仿真磁盘);
其实 CentOS 已经将很多功能都设定好了,因此我们只要修订配置文件,然后启动 tgtd 这个服务就可以啰!
接下来,就让我们实际来玩一玩 iSCSI target 的设定吧!
从上面的分析来看,iSCSI 就是透过一个网络接口,将既有的磁盘给分享出去就是了。那么有哪些类型的磁盘可以分享呢?
这包括:
- 使用 dd 指令所建立的大型档案可供仿真为磁盘 (无须预先格式化);
- 使用单一分割槽 (partition) 分享为磁盘;
- 使用单一完整的磁盘 (无须预先分割);
- 使用磁盘阵列分享 (其实与单一磁盘相同方式);
- 使用软件磁盘阵列 (software raid) 分享成单一磁盘;
- 使用 LVM 的 LV 装置分享为磁盘。
其实没有那么复杂,我们大概知道可以透过 (1)大型档案; (2)单一分割槽; (3)单一装置 (包括磁盘、数组、软件磁盘阵列、LVM
的 LV 装置文件名等等) 来进行分享。在本小节当中,我们将透过新的分割产生新的没有用到的分割槽、LVM
逻辑滚动条、大型档案等三个咚咚来进行分享。既然如此,那就得要先来搞定这些咚咚啰!
要注意喔,等一下我们要分享出去的数据,最好不要被使用,也最好不要开机就被挂载 (/etc/fstab 当中没有存在记录的意思)。
那么就来玩玩看啰!
既然 iSCSI 要分享的是磁盘,那么我们得要准备好啊!目前预计准备的磁盘为:
- 建立一个名为 /srv/iscsi/disk1.img 的 500MB 档案;
- 使用 /dev/sda10 提供 2GB 作为分享 (从第一章到目前为止的分割数);
- 使用 /dev/server/iscsi01 的 2GB LV 作为分享 (再加入 5GB /dev/sda11 到 server VG 中)。
实际处理的方式如下:
# 1. 建立大型档案:
[root@www ~]# mkdir /srv/iscsi
[root@www ~]# dd if=/dev/zero of=/srv/iscsi/disk1.img bs=1M count=500
[root@www ~]# chcon -Rv -t tgtd_var_lib_t /srv/iscsi/
[root@www ~]# ls -lh /srv/iscsi/disk1.img
-rw-r--r--. 1 root root 500M Aug 2 16:22 /srv/iscsi/disk1.img <==容量对的!
# 2. 建立实际的 partition 分割:
[root@www ~]# fdisk /dev/sda <==实际的分割方式自己处理吧!
[root@www ~]# partprobe <==某些情况下得 reboot 喔!
[root@www ~]# fdisk -l
Device Boot Start End Blocks Id System
/dev/sda10 2202 2463 2104483+ 83 Linux
/dev/sda11 2464 3117 5253223+ 8e Linux LVM
# 只有输出 /dev/sda{10,11} 信息,其他的都省略了。注意看容量,上述容量单位 KB
[root@www ~]# swapon -s; mount | grep 'sda1'
# 自己测试一下 /dev/sda{10,11} 不能够被使用喔!若有被使用,请 umount 或 swapoff
# 3. 建立 LV 装置 :
[root@www ~]# pvcreate /dev/sda11
[root@www ~]# vgextend server /dev/sda11
[root@www ~]# lvcreate -L 2G -n iscsi01 server
[root@www ~]# lvscan
ACTIVE '/dev/server/myhome' [6.88 GiB] inherit
ACTIVE '/dev/server/iscsi01' [2.00 GB] inherit
|
iSCSI 有一套自己分享 target 档名的定义,基本上,藉由 iSCSI 分享出来的 target 檔名都是以 iqn 为开头,意思是:『iSCSI
Qualified Name (iSCSI 合格名称)』的意思(注5)。那么在 iqn 后面要接啥档名呢?通常是这样的:
iqn.yyyy-mm.<reversed domain name>:identifier
iqn.年年-月.单位网域名的反转写法 :这个分享的target名称
|
鸟哥做这个测试的时间是 2011 年 8 月份,然后鸟哥的机器是 www.centos.vbird ,反转网域写法为 vbird.centos,
然后,鸟哥想要的 iSCSI target 名称是 vbirddisk ,那么就可以这样写:
- iqn.2011-08.vbird.centos:vbirddisk
另外,就如同一般外接式储存装置 (target 名称) 可以具有多个磁盘一样,我们的 target 也能够拥有数个磁盘装置的。
每个在同一个 target 上头的磁盘我们可以将它定义为逻辑单位编号
(Logical Unit Number, LUN)。我们的 iSCSI initiator 就是跟 target 协调后才取得 LUN 的存取权就是了
(注5)。在鸟哥的这个简单案例中,最终的结果,我们会有一个 target ,在这个 target
当中可以使用三个 LUN 的磁盘。
设定 tgt 的配置文件 /etc/tgt/targets.conf
接下来我们要开始来修改配置文件了。基本上,配置文件就是修改 /etc/tgt/targets.conf 啦。这个档案的内容可以改得很简单,
最重要的就是设定前一点规定的 iqn 名称,以及该名称所对应的装置,然后再给予一些可能会用到的参数而已。
多说无益,让我们实际来实作看看:
[root@www ~]# vim /etc/tgt/targets.conf
# 此档案的语法如下:
<target iqn.相关装置的target名称>
backing-store /你的/虚拟设备/完整檔名-1
backing-store /你的/虚拟设备/完整檔名-2
</target>
<target iqn.2011-08.vbird.centos:vbirddisk>
backing-store /srv/iscsi/disk1.img <==LUN 1 (LUN 的编号通常照顺序)
backing-store /dev/sda10 <==LUN 2
backing-store /dev/server/iscsi01 <==LUN 3
</target>
|
事实上,除了 backing-store 之外,在这个配置文件当中还有一些比较特别的参数可以讨论看看 (man tgt-admin):
- backing-store (虚拟的装置), direct-store (实际的装置):
设定装置时,如果你的整颗磁盘是全部被拿来当 iSCSI 分享之用,那么才能够使用 direct-store 。不过,根据网络上的其他文件,
似乎说明这个设定值有点危险的样子。所以,基本上还是建议单纯使用模拟的 backing-store
较佳。例如鸟哥的简单案例中,就通通使用 backing-store 而已。
- initiator-address (用户端地址):
如果你想要限制能够使用这个 target 的客户端来源,才需要填写这个设定值。基本上,不用设定它 (代表所有人都能使用的意思),
因为我们后来会使用 iptables 来规范可以联机的客户端嘛!
- incominguser (用户账号密码设定):
如果除了来源 IP 的限制之外,你还想要让使用者输入账密才能使用你的 iSCSI target 的话,那么就加用这个设定项目。
此设定后面接两个参数,分别是账号与密码啰。
- write-cache [off|on] (是否使用快取):
在预设的情况下,tgtd 会使用快取来增快速度。不过,这样可能会有遗失数据的风险。所以,如果你的数据比较重要的话,
或许不要使用快取,直接存取装置会比较妥当一些。
上面的设定值要怎么用呢?现在,假设你的环境中,仅允许 192.168.100.0/24 这个网段可以存取 iSCSI
target,而且存取时需要帐密分别为
vbirduser, vbirdpasswd ,此外,不要使用快取,那么原本的配置文件之外,还得要加上这样的参数才行
(基本上,使用上述的设定即可,底下的设定是多加测试用的,不需要填入你的设定中)。
[root@www ~]# vim /etc/tgt/targets.conf
<target iqn.2011-04.vbird.centos:vbirddisk>
backing-store /home/iscsi/disk1.img
backing-store /dev/sda7
backing-store /dev/server/iscsi01
initiator-address 192.168.100.0/24
incominguser vbirduser vbirdpasswd
write-cache off
</target>
|
启动 iSCSI target 以及观察相关端口与磁盘信息
再来则是启动、开机启动,以及观察 iSCSI target 所启动的埠口啰:
[root@www ~]# /etc/init.d/tgtd start
[root@www ~]# chkconfig tgtd on
[root@www ~]# netstat -tlunp | grep tgt
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 26944/tgtd
tcp 0 0 :::3260 :::* LISTEN 26944/tgtd
# 重点就是那个 3260 TCP 封包啦!等一下的防火墙务必要开放这个埠口。
# 观察一下我们 target 相关信息,以及提供的 LUN 数据内容:
[root@www ~]# tgt-admin --show
Target 1: iqn.2011-08.vbird.centos:vbirddisk <==就是我们的 target
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller <==这是个控制器,并非可以用的 LUN 喔!
....(中间省略)....
LUN: 1
Type: disk <==第一个 LUN,是磁盘 (disk) 喔!
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 2155 MB <==容量有这么大!
Online: Yes
Removable media: No
Backing store type: rdwr
Backing store path: /dev/sda10 <==磁盘所在的实际文件名
LUN: 2
Type: disk
SCSI ID: IET 00010002
SCSI SN: beaf12
Size: 2147 MB
Online: Yes
Removable media: No
Backing store type: rdwr
Backing store path: /dev/server/iscsi01
LUN: 3
Type: disk
SCSI ID: IET 00010003
SCSI SN: beaf13
Size: 524 MB
Online: Yes
Removable media: No
Backing store type: rdwr
Backing store path: /srv/iscsi/disk1.img
Account information:
vbirduser <==额外的帐户信息
ACL information:
192.168.100.0/24 <==额外的来源 IP 限制
|
请将上面的信息对照一下我们的配置文件呦!看看有没有错误就是了!尤其注意每个 LUN 的容量、实际磁盘路径!
那个项目不能错误就是了。(照理说 LUN 的数字应该与 backing-store 设定的顺序有关,不过,在鸟哥的测试中,
出现的顺序并不相同!因此,还是需要使用 tgt-admin --show 去查阅查阅才好!)
不论你有没有使用 initiator-address 在 targets.conf 配置文件中,iSCSI target 就是使用 TCP/IP 传输数据的,
所以你还是得要在防火墙内设定可以联机的客户端才行!既然 iSCSI 仅开启 3260 埠口,那么我们就这么进行即可:
[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -p tcp -s 192.168.100.0/24 --dport 3260 -j ACCEPT
[root@www ~]# /usr/local/virus/iptables/iptables.rule
[root@www ~]# iptables-save | grep 3260
-A INPUT -s 192.168.100.0/24 -p tcp -m tcp --dport 3260 -j ACCEPT
# 最终要看到上述的输出字样才是 OK 的呦!若有其他用户需要联机,
# 自行复制 iptables.allow 内的语法,修改来源端即可。
|