欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  科技

利用openfiler实现iSCSI原理分析

程序员文章站 2022-03-16 20:36:41
openfiler 是一个功能强大,可以用它来iscsi 来存储,今天装了一个,大家如果装过esx,那么这个和它基本一样,都是一个linux,用centos。本文将介绍利用openfiler实现iSCSI... 12-11-27...

iscsi概述
iscsi:internet 小型计算机系统接口 (iscsi:internet small computer system interface)。
internet 小型计算机系统接口(iscsi)是一种基于 tcp/ip的协议,用来建立和管理ip存储设备、主机和客户机等之间的相互连接,并创建存储区域网络(san)。san 使得 scsi 协议应用于高速数据传输网络成为可能,这种传输以数据块级别(block-level)在多个数据存储网络间进行。
scsi 结构基于客户/服务器模式,其通常应用环境是:设备互相靠近,并且这些设备由scsi总线连接。iscsi的主要功能是在 tcp/ip 网络上的主机系统(启动器 initiator)和存储设备(目标器 target)之间进行大量数据的封装和可靠传输过程。此外,iscsi 提供了在 ip 网络封装 scsi 命令,且运行在 tcp 上。
iscsi(internet scsi)是2003年ietf(internetengineering task force,互联网工程任务组)制订的一项
bcm5722 iscsi网卡标准,用于将scsi数据块映射成以太网数据包。scsi(small computer system interface)是块数据传输协议,在存储行业广泛应用,是存储设备最基本的标准协议。从根本上说,iscsi协议是一种利用ip网络来传输潜伏时间短的scsi数据块的方法,iscsi使用以太网协议传送scsi命令、响应和数据。iscsi可以用我们已经熟悉和每天都在使用的以太网来构建ip存储局域网。通过这种方法,iscsi克服了直接连接存储的局限性,使我们可以跨不同服务器共享存储资源,并可以在不停机状态下扩充存储容量。
iscsi的工作过程
当iscsi主机应用程序发出数据读写请求后,操作系统会生成一个相应的scsi命令,该scsi命令在iscsi initiator层被封装成iscsi消息包并通过tcp/ip传送到设备侧,设备侧的iscsi target层会解开iscsi消息包,得到scsi命令的内容,然后传送给scsi设备执行;设备执行scsi命令后的响应,在经过设备侧iscsi target层时被封装成iscsi响应pdu,通过tcp/ip网络传送给主机的iscsi initiator层,iscsi initiator会从iscsi响应pdu里解析出scsi响应并传送给操作系统,操作系统再响应给应用程序。
iscsi 启动器
从本质上说,iscsi 启动器是一个客户端设备,它连接到服务器提供的某一服务,并发起对该服务的请求。如果利用iscsi创建rac,iscsi 启动器软件需要安装在每个 oracle rac 节点上。
iscsi 启动器可以用软件实现,也可以用硬件实现。软件 iscsi 启动器可用于大部分主要操作系统平台,可以使用 iscsi-initiator-utils rpm中提供的免费 linux open-iscsi 软件驱动程序。iscsi 软件启动器通常与标准网络接口卡 (nic)(大多数情况下是千兆位以太网卡)配合使用。硬件启动器是一个 iscsi hba(或 tcp 卸载引擎 (toe) 卡),它本质上只是一个专用以太网卡,其上的 scsi asic 可以从系统 cpu 内卸载所有工作(tcp 和 scsi 命令)。iscsi hba 可以从许多供应商处购买,包括 adaptec、alacritech、intel 和 qlogic。
iscsi 目标
iscsi 目标是 iscsi 网络的“服务器”组件。它通常是一个存储设备,包含您所需的信息并响应来自(一个或多个)启动器的请求。对于本文,节点 openfiler1 将是 iscsi 目标。
openfiler
openfiler是一个基于浏览器的网络存储管理工具。来自于linux系统。openfiler在一个网络架构里面里面支持文件级的nas和数据块级的san,支持cifs,nfs,htt/dav,ftp 和iscsi协议。openfiler是一个存储管理操作系统,基于linux 2.6内核和其他开源程序比如apache,samba,lvm2,ext3,linux nfs和iscsi企业级target。他把这些所有的技术集成在一个很小的,易于管理的强大的web界面里。

配置openfiler

openfiler的安装和安装linux类似,十分简单这里不做过多介绍,不明白的读者可以自行查阅资料。以下配置环境是以rac配置为基础,目标是将openfiler上的存储空间已共享存储的方式划分给rac1和rac2两个节点。

浏览器:firefox3.6(不推荐用ie进行此设置,下面会讲原因)
客户端操作系统:rhel 5.4
iscsi客户端:open-iscsi-2.0-871

要将 openfiler 用作 iscsi 存储服务器,我们需要执行六个主要任务:设置 iscsi 服务、配置网络访问、指定物理存储器并对其分区、创建新的卷组、创建所有逻辑卷,最后,为每个逻辑卷创建新的 iscsi 目标。

服务

在浏览器输入https://192.168.2.195:446/ 开启openfiler的web界面,这里192.168.2.195为openfiler系统的ip,446为服务端口。openfiler的默认用户名为openfiler,密码为password。

要控制服务,我们使用 openfiler storage control center 并转到 [services] / [manage services]: 利用openfiler实现iSCSI原理分析

要启用 iscsi 服务,单击“iscsi target server”服务名称后面的“enable”链接。之后,“iscsi target server”状态应变为“enabled”。

ietd 程序将实现 iscsi enterprise target 软件的用户级部分,以便在 linux 上构建 iscsi 存储系统。启用 iscsi target 之后,我们应该能够通过 ssh 登录到 openfiler 服务器,并且可看到 iscsi-target 服务正在运行:

[root@openfiler1 ~]# service iscsi-target status

ietd (pid 14243) is running...

网络访问配置

下一步是配置 openfiler 中的网络访问,指定需要通过存储(专用)网络访问 iscsi 卷的两个 oracle rac 节点(racnode1racnode2)。注意,本节稍后将会创建 iscsi 卷。另请注意,本步骤并不实际授予两个 oracle rac 节点访问 iscsi 逻辑卷所需的相应权限。授予权限的操作将在本节稍后通过对每个新逻辑卷更新 acl 来进行。

如同上一节,我们使用 openfiler storage control center 并转到 [system] / [network setup] 来完成网络访问配置。通过页面底部的“network access configuration”部分,管理员可以设置网络和/或主机以允许其访问 openfiler appliance 导出的资源。就本文而言,我们希望单独添加两个 oracle rac 节点,而不是允许整个 192.168.2.0 网络访问 openfiler 资源。

输入每个 oracle rac 节点时,请注意“name”域只是一个逻辑名称,仅供参考。根据输入节点的惯例,我仅使用了为该 ip 地址定义的节点名称。接下来,在“network/host”域中输入实际节点时,始终使用其 ip 地址,即使其主机名已经在 /etc/hosts 文件或 dns 中定义。最后,在我们的 c 类网络中输入实际主机时,使用子网掩码 255.255.255.255

记住,您要为集群中的每个 rac 节点输入专用 网络 (eth1) 的 ip 地址,这一点很重要。

下图显示了添加两个 oracle rac 节点后的结果:
利用openfiler实现iSCSI原理分析

物理存储

在本节中,我们将创建三个 iscsi 卷,以供集群中的两个 oracle rac 节点用作共享存储。这将在连接到 openfiler 服务器的内置 73gb 15k scsi 硬盘驱动器上执行多个步骤。

存储设备(如内置 ide/sata/scsi/sas 磁盘、存储阵列、外置 usb 驱动器、外置 firewire 驱动器或者任何其他存储设备)可以连接到 openfiler 服务器,并供客户端使用。如果在操作系统级发现了这些设备,就可以使用 openfiler storage control center 设置和管理所有这些存储设备。

在本例中,我们有一个 73gb 的内置 scsi 硬盘驱动器用于满足共享存储之需。在 openfiler 服务器上,该驱动器显示为 /dev/sdb (maxtor atlas15k2_73sca)。要看到该驱动器并启动 iscsi 卷的创建过程,请从 openfiler storage control center 转到 [volumes] / [block devices]:利用openfiler实现iSCSI原理分析

对物理磁盘进行分区
我们要执行的第一步是在 /dev/sdb 内置硬盘上创建一个主分区。单击 /dev/sdb 链接,我们会看到“edit”或“create”选项,分别用于编辑和创建分区。由于我们将创建一个跨整个磁盘的主分区,因此可以将大多数选项保留为默认设置,唯一的修改是将“partition type ”由“extended partition”更改为“physical volume ”。下面是我为了在 /dev/sdb 上创建主分区而指定的值:
模式: primary
分区类型: physical volume
开始柱面: 1
结束柱面: 8924
现在,大小将显示 68.36 gb。要接受该设置,单击“create”按钮。这将在我们的内置硬盘上生成一个新的分区 (/dev/sdb1 ):

利用openfiler实现iSCSI原理分析
图 9:对物理卷进行分区

卷组管理

下一步是创建卷组。我们将创建一个名为 racdbvg 的卷组,其中包含新创建的主分区。从 openfiler storage control center 中转到 [volumes] / [volume groups]。我们将看到所有现有的卷组,或者什么也看不到(我们的情况就是这样)。在 volume group management 屏幕中,输入新卷组的名称 (racdbvg),单击 /dev/sdb1 前面的复选框以选中该分区,最后单击“add volume group”按钮。之后,我们会看到一个列表,其中显示出我们新创建的这个名为“racdbvg”的卷组:
利用openfiler实现iSCSI原理分析 逻辑卷

现在,我们可以在新创建的卷组 (racdbvg) 中创建三个逻辑卷。从 openfiler storage control center 中转到 [volumes] / [add volume]。我们将看到新创建的卷组 (racdbvg) 及其块存储统计信息。该屏幕底部还提供了一个选项,用于在选定的卷组中创建一个新卷 —(在“racdbvg”中创建一个卷)。使用该屏幕创建以下三个逻辑 (iscsi) 卷。在创建每个逻辑卷之后,应用程序将转至“manage volumes”屏幕。然后,您需要单击后退到“add volume”选项卡以创建下一个逻辑卷,直至三个 iscsi 卷全部创建完毕:

iscsi / 逻辑卷卷名卷描述所需空间 (mb)文件系统类型racdb-crs1racdb - asm crs volume 12,208iscsiracdb-data1racdb - asm data volume 133,888iscsiracdb-fra1racdb - asm fra volume 133,888iscsi

实际上,我们已经创建了三个 iscsi 磁盘,现在可以将它们呈现给网络上的 iscsi 客户端(racnode1racnode2)。“manage volumes”屏幕应如下所示:
利用openfiler实现iSCSI原理分析

iscsi 目标

现在,我们有了三个 iscsi 逻辑卷。但是,为了使 iscsi 客户端可以访问这些逻辑卷,首先需要为这三个卷中的每个卷创建一个 iscsi 目标。每个 iscsi 逻辑卷将映射 到一个特定的 iscsi 目标,并将为两个 oracle rac 节点授予对该目标的相应网络访问权限。对于本文,在 iscsi 逻辑卷和 iscsi 目标之间将会有一一映射的关系。

创建和配置 iscsi 目标的过程包括三步:创建一个唯一的目标 iqn(实质上是新的 iscsi 目标的通用名称),将上一节中创建的一个 iscsi 逻辑卷映射到新创建的 iscsi 目标,最后,授予两个 oracle rac 节点访问该新 iscsi 目标的权限。请注意,需要对上一节中创建的三个 iscsi 逻辑卷中的每个卷都执行一次此过程。

对于本文,下表列出了新的 iscsi 目标名称(目标 iqn)及其将映射到的 iscsi 逻辑卷:

iscsi 目标/逻辑卷映射目标 iqniscsi 卷名卷描述iqn.2006-01.com.openfiler:racdb.crs1racdb-crs1racdb - asm crs volume 1iqn.2006-01.com.openfiler:racdb.data1racdb-data1racdb - asm data volume 1iqn.2006-01.com.openfiler:racdb.fra1racdb-fra1racdb - asm fra volume 1

现在我们来创建三个新的 iscsi 目标 — 为每个 iscsi 逻辑卷创建一个。下面举例说明通过创建 oracle clusterware/racdb-crs1 目标 ( iqn.2006-01.com.openfiler:racdb.crs1) 来创建新的 iscsi 目标时所需执行的三个步骤。这个三步过程需要对上表中列出的三个新 iscsi 目标中的每一个都重复执行一遍。

创建新目标 iqn

从 openfiler storage control center 中转到 [volumes] / [iscsi targets]。确保选择了灰色子选项卡“target configuration”。您可在此选项卡页中创建一个新的 iscsi 目标。系统会自动生成一个默认值,作为新 iscsi 目标的名称(常称为“目标 iqn”)。目标 iqn 的一个示例是“iqn.2006-01.com.openfiler:tsn.ae4683b67fd3”:


利用openfiler实现iSCSI原理分析

我喜欢用更具含义的字串来替换这个默认目标 iqn 最后一段。对于第一个 iscsi 目标(oracle clusterware/racdb-crs1),我将这样来修改默认的目标 iqn:将字符串“tsn.ae4683b67fd3”替换为“racdb.crs1”,如下图所示: 利用openfiler实现iSCSI原理分析

对新的目标 iqn 满意之后,单击“add”按钮。这将会创建一个新的 iscsi 目标,然后会出现一个页面,您可以在该页面中修改新 iscsi 目标的一系列设置。对于本文,无需更改新 iscsi 目标的任何设置。

lun 映射

创建新的 iscsi 目标之后,下一步是将相应的 iscsi 逻辑卷映射到该目标。在“target configuration”子选项卡下,验证在“select iscsi target”部分中选择了正确的 iscsi 目标。如果不是这样,使用下拉菜单选择正确的 iscsi 目标,然后单击“change”按钮。

接下来,单击名为“lun mapping”的灰色子选项卡(在“target configuration”子选项卡旁)。找到相应的 iscsi 逻辑卷(本例中为 /dev/racdbvg/racdb-crs1),然后单击“map”按钮。无需更改此页面中的任何设置。对卷 /dev/racdbvg/racdb-crs1 单击“map”按钮后,您的屏幕应如下图所示:
利用openfiler实现iSCSI原理分析

网络 acl

需要先授予 iscsi 客户端相应的权限,它才能访问新创建的 iscsi 目标。在前面,我们已通过 openfiler 对两个主机(oracle rac 节点)进行网络访问配置。这两个节点需要通过存储(专用)网络访问新的 iscsi 目标。现在,我们需要授予这两个 oracle rac 节点访问新 iscsi 目标的权限。

单击名为“network acl”的灰色子选项卡(在“lun mapping”子选项卡旁)。对当前的 iscsi 目标,将两个主机的“access”值由“deny”更改为“allow”,然后单击“update”按钮。 利用openfiler实现iSCSI原理分析

返回到创建新的目标 iqn 一节,对其余两个 iscsi 逻辑卷执行这三个任务,同时替换“iscsi 目标/逻辑卷映射”表中找到的值。

在 oracle rac 节点上配置 iscsi 卷

在集群中的两个 oracle rac 节点上配置 iscsi 启动器。而创建分区只应在 rac 集群的一个节点上执行。

iscsi 客户端可以是提供 iscsi 支持(驱动程序)的任何系统(linux、unix、ms windows、apple mac 等)。在我们的示例中,客户端是两个 linux 服务器(racnode1racnode2),它们运行的是 oracle enterprise linux 5.4。

在本节中,我们将在两个 oracle rac 节点上配置 iscsi 软件启动器。oracle enterprise linux 5.4 包括 open-iscsi iscsi 软件启动器,该软件启动器位于 iscsi-initiator-utils rpm 中。这是对早期版本 oracle enterprise linux (4.x) 的一个更改,这些早期版本中包含作为 linux-iscsi 项目的一部分而开发的 linux iscsi-sfnet 软件驱动程序。所有 iscsi 管理任务(如发现和登录)将使用 open-iscsi 中包含的命令行接口 iscsiadm

iscsi 软件启动器将配置为自动登录网络存储服务器 (openfiler1),并发现 上一节中创建的 iscsi 卷。之后,我们将逐步使用 udev 为发现的每个 iscsi 目标名称创建永久性本地 scsi 设备名称(即 /dev/iscsi/crs1)。拥有一致的本地 scsi 设备名称及其映射到的 iscsi 目标,有助于在配置 asm 时能够区分三个卷。但是,在此之前,我们首先必须安装 iscsi 启动器软件。

安装 iscsi(启动器)服务

就 oracle enterprise linux 5.4 来说,默认情况下不会安装 open-iscsi iscsi 软件启动器。该软件包含在 1 号 cd 上的 iscsi-initiator-utils 程序包中。要确定该程序包是否已安装(大多数情况下没有安装),在两个 oracle rac 节点上执行以下命令:

[root@racnode1 ~]# rpm -qa --queryformat "%{name}-%{version}-%{release} (%{arch})\n"| grep iscsi-initiator-utils

如果 iscsi-initiator-utils 程序包未安装,将 1 号 cd 加载到每个 oracle rac 节点中并执行以下命令

[root@racnode1 ~]# mount -r /dev/cdrom /media/cdrom
[root@racnode1 ~]# cd /media/cdrom/server
[root@racnode1 ~]# rpm -uvh iscsi-initiator-utils-*
[root@racnode1 ~]# cd /
[root@racnode1 ~]# eject

确认 iscsi-initiator-utils 程序包现在已安装:

[root@racnode1 ~]# rpm -qa --queryformat "%{name}-%{version}-%{release} (%{arch})\n"| grep iscsi-initiator-utils
iscsi-initiator-utils-6.2.0.871-0.10.el5 (x86_64)  

配置 iscsi(启动器)服务

验证 iscsi-initiator-utils 程序包已经安装到两个 oracle rac 节点之后,启动 iscsid 服务,并使其在系统引导时自动启动。我们还将配置 iscsi 服务在系统启动时自动启动,自动登录到所需的 iscsi 目标。

[root@racnode1 ~]# service iscsid start
turning off network shutdown. starting iscsi daemon: [ ok]
 [ ok ]
[root@racnode1 ~]# chkconfig iscsid on

[root@racnode1 ~]# chkconfig iscsi on

现在 iscsi 服务已经启动,下面使用 iscsiadm 命令行接口发现网络存储服务器上的所有可用目标。这应该在两个 oracle rac 节点上执行,以检验配置是否正常工作:

[root@racnode1 ~]# iscsiadm -m discovery -t sendtargets -p openfiler1-priv
192.168.2.195:3260,1 iqn.2006-01.com.openfiler:racdb.crs1
192.168.2.195:3260,1 iqn.2006-01.com.openfiler:racdb.fra1
192.168.2.195:3260,1 iqn.2006-01.com.openfiler:racdb.data1

 

手动登录到 iscsi 目标

此时,iscsi 启动器服务已经启动,每个 oracle rac 节点都能够从网络存储服务器中发现可用目标。下一步是手动登录每个可用目标,这可以使用 iscsiadm 命令行接口完成。这需要在两个 oracle rac 节点上运行。注意,我必须指定网络存储服务器的 ip 地址而非其主机名 (openfiler1-priv) — 我认为必须这么做,因为上述发现使用 ip 地址显示目标。

[root@racnode1 ~]# iscsiadm -m node -t iqn.2006-01.com.openfiler:racdb.crs1 -p 192.168.2.195 -l
[root@racnode1 ~]# iscsiadm -m node -t iqn.2006-01.com.openfiler:racdb.data1 -p 192.168.2.195 -l
[root@racnode1 ~]# iscsiadm -m node -t iqn.2006-01.com.openfiler:racdb.fra1 -p 192.168.2.195 -l  

如果此时更新了openfiler服务器上的资源配置,可以使用如下命令更新相关配置

iscsiadm -m node -t iqn.2006-01.com.openfiler:racdbcrs1 -p 192.168.0.201 -r

配置自动登录

下一步是确保在计算机引导(或 iscsi 启动器服务启动/重启)时,客户端将自动登录到上面列出的每个目标。如同上面描述的手动登录过程,在两个 oracle rac 节点上执行以下命令:

[root@racnode1 ~]# iscsiadm -m node -t iqn.2006-01.com.openfiler:racdb.crs1 -p 192.168.2.195 --op update -n node.startup -v automatic
[root@racnode1 ~]# iscsiadm -m node -t iqn.2006-01.com.openfiler:racdb.data1 -p 192.168.2.195 --op update -n node.startup -v automatic
[root@racnode1 ~]# iscsiadm -m node -t iqn.2006-01.com.openfiler:racdb.fra1 -p 192.168.2.195 --op update -n node.startup -v automatic      

创建永久性本地 scsi 设备名称

在本节中,我们将逐步为每个 iscsi 目标名称创建永久性本地 scsi 设备名称。我们将使用 udev 来完成该任务。拥有一致的本地 scsi 设备名称及其映射到的 iscsi 目标,有助于在配置 asm 时能够区分三个卷。尽管并未严格要求这么做(因为我们将对所有卷使用 asmlib 2.0),这提供了一种自我文档编制的方法,有助于快速确定每个 iscsi 卷的名称和位置。

如果任一 oracle rac 节点引导并且 iscsi 启动器服务启动,它会以一种随机的方式自动登录到配置的每个目标,并将这些目标映射到下一个可用的本地 scsi 设备名称。例如,目标 iqn.2006-01.com.openfiler:racdb.crs1 可能会映射到 /dev/sdb。实际上,我可以通过查看 /dev/disk/by-path 目录来确定所有目标的当前映射:

[root@racnode1 ~]# (cd /dev/disk/by-path; ls -l *openfiler* | awk '{fs=" ";
print $9 " " $10 " " $11}')
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.crs1-lun-0 -> ../../sdb
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.data1-lun-0 -> ../../sdd
ip-192.168.2.195:3260-iscsi-iqn.2006-01.com.openfiler:racdb.fra1-lun-0 -> ../../sdc

使用上述 ls 命令的输出结果,我们可以建立以下当前映射:

iscsi 目标名称到本地 scsi 设备名称的当前映射iscsi 目标名称scsi 设备名称iqn.2006-01.com.openfiler:racdb.crs1/dev/sdbiqn.2006-01.com.openfiler:racdb.data1/dev/sddiqn.2006-01.com.openfiler:racdb.fra1/dev/sdc

但是,每次重新引导 oracle rac 节点时,该映射都可能有所不同。例如,重新引导之后,可能会决定将 iscsi 目标 iqn.2006-01.com.openfiler:racdb.crs1 映射到本地 scsi 设备 /dev/sdc。由于您无法预测重新引导后的 iscsi 目标映射,依赖于使用本地 scsi 设备名称是不现实的。

我们需要的是可引用的一致的设备名称(即 /dev/iscsi/crs1),该设备名称在重新引导后将始终指向相应的 iscsi 目标。这就是引入名为 udev动态设备管理 工具的原因。 udev 提供了一个动态设备目录,使用一组可配置的规则通过符号链接指向实际设备。当 udev 收到设备事件(例如,客户端登录到 iscsi 目标)时,就会根据 sysfs 中提供的可用设备属性匹配其配置好的规则以便识别设备。匹配规则可以提供其他设备信息或指定设备节点名和多个符号链接名,并指示 udev 运行其他程序(例如,一个 shell 脚本)作为设备事件处理过程的一部分。

第一步是创建一个新的规则文件。该文件将命名为 /etc/udev/rules.d/55-openiscsi.rules,并且只包含一行用于接收我们感兴趣事件的名称=值对。它还将定义一个调出 shell 脚本 (/etc/udev/scripts/iscsidev.sh),用于处理事件。

在两个 oracle rac 节点上创建以下规则文件 /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/part%n"

现在,我们需要创建在接收该事件时将调用的 unix shell 脚本。我们首先在两个 oracle rac 节点上创建一个单独的目录,用于存储 udev 脚本:

[root@racnode1 ~]# mkdir -p /etc/udev/scripts

接下来,在两个 oracle rac 节点上创建 unix shell 脚本 /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

# check if qnap drive
check_qnap_target_name=${target_name%%:*}
if [ $check_qnap_target_name = "iqn.2004-04.com.qnap" ]; then
    target_name=`echo "${target_name%.*}"`
fi

echo "${target_name##*.}"

创建 unix shell 脚本后,将其更改为可执行文件:

[root@racnode1 ~]# chmod 755 /etc/udev/scripts/iscsidev.sh

既然已经配置了 udev,下面将在两个 oracle rac 节点上重新启动 iscsi 服务:

[root@racnode1 ~]# service iscsi stop
logging out of session [sid: 6, target: iqn.2006-01.com.openfiler:racdb.crs1, portal: 192.168.2.195,3260]
logging out of session [sid: 7, target: iqn.2006-01.com.openfiler:racdb.fra1, portal: 192.168.2.195,3260]
logging out of session [sid: 8, target: iqn.2006-01.com.openfiler:racdb.data1, portal: 192.168.2.195,3260]
logout of [sid: 6, target: iqn.2006-01.com.openfiler:racdb.crs1, portal: 192.168.2.195,3260]: successful
logout of [sid: 7, target: iqn.2006-01.com.openfiler:racdb.fra1, portal: 192.168.2.195,3260]: successful
logout of [sid: 8, target: iqn.2006-01.com.openfiler:racdb.data1, portal: 192.168.2.195,3260]: successful
stopping iscsi daemon:                               [ ok ]
[root@racnode1 ~]# service iscsi start
iscsid dead but pid file exists
turning off network shutdown. starting iscsi daemon: [ ok ]
                                                     [ ok ]
setting up iscsi targets: logging in to [iface: default, target: iqn.2006-01.com.openfiler:racdb.crs1, portal: 192.168.2.195,3260]
logging in to [iface: default, target: iqn.2006-01.com.openfiler:racdb.fra1, portal: 192.168.2.195,3260]
logging in to [iface: default, target: iqn.2006-01.com.openfiler:racdb.data1, portal: 192.168.2.195,3260]
login to [iface: default, target: iqn.2006-01.com.openfiler:racdb.crs1, portal: 192.168.2.195,3260]: successful
login to [iface: default, target: iqn.2006-01.com.openfiler:racdb.fra1, portal: 192.168.2.195,3260]: successful
login to [iface: default, target: iqn.2006-01.com.openfiler:racdb.data1, portal: 192.168.2.195,3260]: successful [ ok ]

下面,我们来看一下我们的辛勤工作是否得到了回报:

[root@racnode1 ~]# ls -l /dev/iscsi/*
/dev/iscsi/crs1:
total 0
lrwxrwxrwx 1 root root 9 nov  3 18:13 part -> ../../sdc
/dev/iscsi/data1:
total 0
lrwxrwxrwx 1 root root 9 nov  3 18:13 part -> ../../sde
/dev/iscsi/fra1:
total 0
lrwxrwxrwx 1 root root 9 nov  3 18:13 part -> ../../sdd

上面的清单显示, udev 所做的工作正是我们所期待的!现在,我们拥有了一组一致的本地设备名称,可用于引用 iscsi 目标。例如,我们可以安全地认为设备名称 /dev/iscsi/crs1/part 将始终引用 iscsi 目标 iqn.2006-01.com.openfiler:racdb.crs1。现在,我们拥有了一致的 iscsi 目标名称到本地设备名称的映射,如下表所示:

iscsi 目标名称到本地设备名称的映射iscsi 目标名称本地设备名称iqn.2006-01.com.openfiler:racdb.crs1/dev/iscsi/crs1/partiqn.2006-01.com.openfiler:racdb.data1/dev/iscsi/data1/partiqn.2006-01.com.openfiler:racdb.fra1/dev/iscsi/fra1/part