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]:
要啟用 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 節點(racnode1 和 racnode2)。注意,本節稍後將會創建 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 節點後的結果:
物理存儲
在本節中,我們將創建三個 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]:
對物理磁盤進行分區
我們要執行的第一步是在 /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 ):
圖 9:對物理卷進行分區
卷組管理
下一步是創建卷組。我們將創建一個名為 racdbvg 的卷組,其中包含新創建的主分區。從 Openfiler Storage Control Center 中轉到 [Volumes] / [Volume Groups]。我們將看到所有現有的卷組,或者什麼也看不到(我們的情況就是這樣)。在 Volume Group Management 屏幕中,輸入新卷組的名稱 (racdbvg),單擊 /dev/sdb1 前面的復選框以選中該分區,最後單擊“Add volume group”按鈕。之後,我們會看到一個列表,其中顯示出我們新創建的這個名為“racdbvg”的卷組:
邏輯卷
現在,我們可以在新創建的卷組 (racdbvg) 中創建三個邏輯卷。從 Openfiler Storage Control Center 中轉到 [Volumes] / [Add Volume]。我們將看到新創建的卷組 (racdbvg) 及其塊存儲統計信息。該屏幕底部還提供了一個選項,用於在選定的卷組中創建一個新卷 —(在“racdbvg”中創建一個卷)。使用該屏幕創建以下三個邏輯 (iSCSI) 卷。在創建每個邏輯卷之後,應用程序將轉至“Manage Volumes”屏幕。然後,您需要單擊後退到“Add Volume”選項卡以創建下一個邏輯卷,直至三個 iSCSI 卷全部創建完畢:
iSCSI / 邏輯卷卷名卷描述所需空間 (MB)文件系統類型racdb-crs1
racdb - ASM CRS Volume 12,208iSCSIracdb-data1
racdb - ASM Data Volume 133,888iSCSIracdb-fra1
racdb - ASM FRA Volume 133,888iSCSI實際上,我們已經創建了三個 iSCSI 磁盤,現在可以將它們呈現給網絡上的 iSCSI 客戶端(racnode1 和 racnode2)。“Manage Volumes”屏幕應如下所示:
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.crs1
racdb-crs1
racdb - ASM CRS Volume 1iqn.2006-01.com.openfiler:racdb.data1
racdb-data1
racdb - ASM Data Volume 1iqn.2006-01.com.openfiler:racdb.fra1
racdb-fra1
racdb - 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
”:
我喜歡用更具含義的字串來替換這個默認目標 IQN 最後一段。對於第一個 iSCSI 目標(Oracle Clusterware/racdb-crs1),我將這樣來修改默認的目標 IQN:將字符串“tsn.ae4683b67fd3
”替換為“racdb.crs1
”,如下圖所示:
對新的目標 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”按鈕後,您的屏幕應如下圖所示:
網絡 ACL
需要先授予 iSCSI 客戶端相應的權限,它才能訪問新創建的 iSCSI 目標。在前面,我們已通過 Openfiler 對兩個主機(Oracle RAC 節點)進行網絡訪問配置。這兩個節點需要通過存儲(專用)網絡訪問新的 iSCSI 目標。現在,我們需要授予這兩個 Oracle RAC 節點訪問新 iSCSI 目標的權限。
單擊名為“Network ACL”的灰色子選項卡(在“LUN Mapping”子選項卡旁)。對當前的 iSCSI 目標,將兩個主機的“Access”值由“Deny”更改為“Allow”,然後單擊“Update”按鈕。
返回到創建新的目標 IQN 一節,對其余兩個 ISCSI 邏輯卷執行這三個任務,同時替換“iSCSI 目標/邏輯卷映射”表中找到的值。
在 Oracle RAC 節點上配置 iSCSI 卷
在集群中的兩個 Oracle RAC 節點上配置 iSCSI 啟動器。而創建分區只應在 RAC 集群的一個節點上執行。
iSCSI 客戶端可以是提供 iSCSI 支持(驅動程序)的任何系統(Linux、Unix、MS Windows、Apple Mac 等)。在我們的示例中,客戶端是兩個 Linux 服務器(racnode1 和 racnode2),它們運行的是 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