三. 服务器端(initiator) 配置
           iSCSI 客户端可以是提供 iSCSI 支持(驱动程序)的任何系统(Linux、Unix、MS Windows、Apple Mac 等)。
 
 
3.1安装 iSCSI(启动器)服务
           这个安装包在系统的安装包里。 找到iscsi-initiator-utils-6.2.0.871-0.10.el5.x86_64.rpm包。 安装上。
 
[root@centos ~]# rpm -Uvh iscsi-initiator-utils-6.2.0.871-0.10.el5.x86_64.rpm
warning: iscsi-initiator-utils-6.2.0.871-0.10.el5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID e8562897
Preparing...                ########################################### [100%]
   1:iscsi-initiator-utils ########################################### [100%]
[root@centos ~]# rpm -qa | grep iscsi-initiator-utils
iscsi-initiator-utils-6.2.0.871-0.10.el5
 
 
3.2  配置 iSCSI(启动器)服务
       刚才已经安装了initiator 包。 现在我们来启动initiator 服务(iscsid),并使其在系统引导时自动启动。在配置 iscsi 服务自动启动,使其在系统启动时自动登录 iSCSI 目标。
 
[root@centos ~]# service iscsid start
[ OK ]off network shutdown. Starting iSCSI daemon: [ OK ]
[ OK ]
[root@centos ~]# chkconfig iscsid on
[root@centos ~]# chkconfig iscsi on
 
 
用iscsiadm命令检查网络存储服务器上的所有可用目标:
[root@centos ~]# iscsiadm -m discovery -t sendtargets -p 192.168.1.1
192.168.1.1:3260,1 iqn.2006-01.com.san
 
手动登录 iSCSI 目标
[root@centos ~]# iscsiadm -m node -T iqn.2006-01.com.san -p 192.168.1.1 -l
Logging in to [iface: default, target: iqn.2006-01.com, portal: 192.168.1.1,3260]
Login to [iface: default, target: iqn.2006-01.com, portal: 192.168.1.1,3260]: successful
 
 
配置自动登录
在计算机引导(或 iSCSI 启动器服务启动/重新启动)时,客户端将自动登录上面列出的每个目标。和上面描述的手动登录过程一样,不过在这里加了2个参数。
[root@centos ~]# iscsiadm -m node -T iqn.2006-01.com.san -p 192.168.1.1 --op update -n node.startup -v automatic
 
 
3.3 创建永久性本地 SCSI 设备名称
 
查看/dev/disk/by-path 文件,来确定文件被映射到了哪个文件上:
[root@centos by-path]# ls /dev/disk/by-path -al
total 0
drwxr-xr-x 2 root root 180 Oct 28 12:48 .
drwxr-xr-x 6 root root 120 Oct 28 05:54 ..
lrwxrwxrwx 1 root root   9 Oct 28 12:48 ip-192.168.1.1:3260-iscsi-iqn.2006-01.com-lun-0 -> ../../sdc
lrwxrwxrwx 1 root root   9 Oct 28 05:54 pci-0000:00:07.1-ide-0:0 -> ../../hdc
lrwxrwxrwx 1 root root   9 Oct 28 05:54 pci-0000:00:10.0-scsi-0:0:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 Oct 28 05:54 pci-0000:00:10.0-scsi-0:0:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Oct 28 05:54 pci-0000:00:10.0-scsi-0:0:0:0-part2 -> ../../sda2
lrwxrwxrwx 1 root root   9 Oct 28 05:54 pci-0000:00:10.0-scsi-0:0:1:0 -> ../../sdb
lrwxrwxrwx 1 root root 10 Oct 28 05:54 pci-0000:00:10.0-scsi-0:0:1:0-part1 -> ../../sdb1
 
         通过上面,我们可以看到这个文件被挂到了sdc下。 但是每次重新引导服务器时,该映射都可能有所不同。它是自动登录到以随机方式配置的每个目标,并将这些目标映射到下一个可用的本地 SCSI 设备名称。 所以对于有个多target的时候,target1现在是/dev/sdc,下一次可能就是/dev/sdd . 因此,如果无法预测重新引导后的 iSCSI 目标映射,依赖于使用本地 SCSI 设备名称是不现实的。
 
在这里,我们就需要使用udev的动态管理工具。udev 提供了一个动态设备目录,使用一组可配置的规则通过符号链接指向实际设备。当 udev 收到设备事件(例如,客户端登录到 iSCSI 目标)时,就会根据 sysfs 中提供的可用设备属性匹配其配置好的规则以便识别设备。匹配规则可以提供其他设备信息或指定设备节点名和多个符号链接名,并指示 udev 运行其他程序(例如,一个 SHELL 脚本)作为设备事件处理过程的一部分。
 
 
3.3.1. 创建新的规则文件
创建文件 /etc/udev/rules.d/55-openiscsi.rules,它只包含一行用于接收事件的名称-值对。还将定义一个调出 SHELL 脚本 (/etc/udev/scripts/iscsidev.sh),用于处理事件。
 
[root@centos ~]# more /etc/udev/rules.d/55-openiscsi.rules
# /etc/udev/rules.d/55-openiscsi.rules
KERNEL=="sd*", BUS=="scsi", PROGRAM="/etc/udev/scripts/iscsidev.sh %b",SYMLINK+="iscsi/%c"
 
3.3.2. 创建在接收该事件时将调用的 UNIX SHELL 脚本
 
(1)先在服务器上创建一个目录,用于存储 udev 脚本:
[root@centos ~]# mkdir -p /etc/udev/scripts
 
(2)在服务器上创建 UNIX shell 脚本 /etc/udev/scripts/iscsidev.sh:
[root@centos ~]# more /etc/udev/scripts/iscsidev.sh
#!/bin/sh
# FILE: /etc/udev/scripts/iscsidev.sh
BUS=${1}
HOST=${BUS%%:*}
[ -e /sys/class/iscsi_host ] || exit 1
file="/sys/class/iscsi_host/host${HOST}/device/session*/iscsi_session*/targetname"
target_name=$(cat ${file})
# This is not an open-scsi drive
if [ -z "${target_name}" ]; then
   exit 1
fi
echo "${target_name##*.}"
 
说明:我们先看一下这个脚本的作用:
[root@centos]# more /sys/class/iscsi_host/host2/device/session1/iscsi_session:session1/targetname
iqn.2006-01.com.san
 
从这个命令,我们可以看出,这个脚本就是获取target 的名称的。 而规则将根据这个脚本返回的target 名称的最后一个字符串,来在相应的目录的下建立对应的文件。 简单点就是根据target来做一个映射。 因为target 名称是唯一的,所以这个映射名称也是唯一的。 这就避免了映射到不同的系统目录,而到时共享数据不可用。
 
 
(3)将刚才创建的shell脚本修改为可执行文件:
# chmod 755 /etc/udev/scripts/iscsidev.sh
 
(4)在服务器上重新启动 iSCSI 服务:
[root@centos ~]# service iscsi stop
Logging out of session [sid: 1, target: iqn.2006-01.com, portal: 192.168.1.1,3260]
Logout of [sid: 1, target: iqn.2006-01.com, portal: 192.168.1.1,3260]: successful
Stopping iSCSI daemon:
 
[root@centos ~]# service iscsi start
iscsid dead but pid file exists
[ OK ]off network shutdown. Starting iSCSI daemon: [ OK ]
[ OK ]
Setting up iSCSI targets: Logging in to [iface: default, target: iqn.2006-01.com, portal: 192.168.1.1,3260]
Login to [iface: default, target: iqn.2006-01.com, portal: 192.168.1.1,3260]: successful
[ OK ]
 
(5)验证
[root@centos]# ls -l /dev/iscsi/*
lrwxrwxrwx 1 root root 6 Oct 28 14:16 /dev/iscsi/san -> ../sdc
 
因为这里我们用udev 配置,它就保证了iscsi目标映射到唯一的设备。 我们在使用的时候使用这个唯一的映射/dev/iscsi/san 即可。
 
 
对客户端这个映射做一个解释。 因为开始对这块也有点模糊。
存储的配置只干一件事,就是给我提供一个target。 这个target 是在存储上做的映射。 服务器通过initiator 去连存储。 然后把这个target 映射到自己的下一个可用设备上,如 /dev/sdc。 如果只有一个target. 那么没有任何问题。 每次initiator连上后都会把这个target 映射到/dev/sdc上。 但是如果有多个target, 那么这里就出了问题。 因为initiator的连接是随机的。 可能A先连接,那A就会映射到/dev/sdc上。 如果B先连接,B就会映射到/dev/sdc上。 这就是问题的所在。
 
Udev 的动态管理很好的解决了这个问题。 我们通过脚本加规则的设置,用脚本来获取每个target的名称,然后在规则里用每个target 最后一个字符串,在我们指定的目录创建一个设备。 这样,因为规则是唯一的。 所以每个设备都是唯一的。 我们就可以使用这个唯一的设备,而不会出现问题。 比如实验中的/dev/iscsi/san. 这个就是一个绝地位置。