RSS訂閱

2014年6月20日 星期五

建置軟體基礎的 iSCSI目標與啟動器連線 (Setup software-based iSCSI target and initiator connections)

企業儲存架構從傳統的直接連接在電腦擴充埠上的直接附加儲存(Direct Attached Storage;DAS),到利用既有區域網路的檔案層級資料存取之網路附加儲存((Network Attached Storage;NAS)架構以及具有獨立網路和區塊存取之儲存區域網路 (Storage Area Network;SAN)架構,採用快速網路的存放方式已經是越來越普及的方式,當然其中又以擁有獨立高速網路和區塊存放架構的SAN為主流儲存技術。

有多種不同的技術可用來建置SAN儲存架構,傳統的主導技術為光纖通道,但近年來IP基礎的技術亦廣泛被應用,而 其中又以iSCSI技術最受矚目,iSCSI 為InterNet SCSI 的縮寫,是一種運作在TCP/IP上的SCSI傳輸協定(SCSI over TCP/IP),近年來已成為 IP SAN的代名詞而被相當廣泛應用,舉凡建置叢集技術的共用儲存區,伺服器虛擬化下的各種高度可用性與移植性存放功能,考慮採用iSCSI協議與架構似乎成為許多企業組織用以取代昂貴光纖通道 SAN的主要替代方案,由於iSCSI的廣泛需求,因此現代主流的作業系統近年來均已內建或整合iSCSI功能,本文除了介紹iSCSI協定與技術基礎外,還將實務探討 Windows Server 2012 R2 與CentOS linux 6.x 這二種作業系統內建的iSCSI功能的建置與連線問題,期望能夠在較低成本需求下就可以建置與提供不錯效能的軟體iSCSI網路存放服務。

 

壹. iSCSI 基礎 (iSCSI Basics)

為了解決專屬光纖通道為基礎的儲存區網路的昂貴、部署不易及擴充性不佳等問題,採用IP儲存(IP Store)架構的儲存區網路在許多應用上為可行替代方案,而目前市場上的IP 網路儲存技術大抵上可分為:

  • Internet Fibre Channel Protocol (iFCP):可透過路由來連接光纖設備或光纖通道儲存區網路。
  • Fibre Channel over IP (FCIP):為一穿隧協定(tunnel protocol)將光纖通道封包封裝成IP封包,並具有光纖通道和IP的透明性。
  • iSCS:iSCSI是一種以IP為基礎的網路儲存標準,用以連結資料儲存放裝置,簡言之,iSCSI 是SCSI命令的傳輸協定,它藉由攜帶SCSI命令通過IP網路以提供經由企業網路的資料遠端存放工作。
  • FC-over-Ethernet:一種直接運作於乙太網路的光纖通道協定而無需IP協定。

下圖顯示了不同IP儲存協定的運作層差異。

ipstore

上述的iSCSI、FCIP和 iFCP三種IP儲存網路傳輸協定提供相同功能:傳輸區塊層級儲存資訊通過IP網路,而其中最廣為採用的iSCSI 儲存協定的主要優點為: 

  • IETF 標準,具高度互通性(Interoperability)與相容性。
  • 直接架設在現有IP架構,無須另外建置網路,方便並節省成本,提供了一個低成本的專屬光纖通道SAN的替代方案。
  • 較佳的資源利用 (因為更多用戶端可以使用共用儲存)。
  • 具備網際網路的擴展能力,無距離限制也容易擴充。
  • 使用現存的儲存應用程式而無需修改(例如備份工具)。

iSCSI 使用TCP (TCP 860和 3260 連接埠)傳輸協定,將SCSI的操作命令與資料封裝在TCP封包來傳送並通過IP網路,封包封裝格式如下圖所示。

iscsi_format

iSCSI 啟動器 (iSCSI Initiator)與iSCSI 目標 (iSCSI Target)

iSCSI 協議標準定義於IETF RFC 3720 ,其連線架構為主從架構,負責提供儲存資源的機器稱為目標(Target)伺服器,而透過TCP/IP網路來使用存放資源的用戶端稱為啟動器(Initiator),相關名稱說明如下:

  • iSCSI 啟動器:為iSCSI架構下的用戶端,用以起始iSCSI工作階段的端點,啟動器會將iSCSI命令請求傳送給伺服端。iSCSI 啟動器可由硬體或軟體實作:
    • iSCSI 硬體啟動器:為一個實作iSCSI協議功能的 PCI-X 或PCI-e卡,常被稱為iSCSI HBA,使用iSCSI HBA卡可將iSCSI協議的封裝工作交由獨立的iSCSI HBA卡硬體處理,因此將不再耗用伺服器上的CPU,減少對伺服器效能的影響,最著名的莫過於QLogic iSCSI Adapter
    • iSCSI 軟體啟動器:
  • iSCSI 目標:iSCSI目標提供用戶主機可識別而被存取的單一儲存單位,它負責等待接收並回應啟動器所請求的SCSI命令,然後提供啟動器所需要的磁碟資料輸入/輸出傳送服務
  • 邏輯單位編號 (logical unit number; LUN):iSCSI 目標通常會提供一個或一個以上的邏輯單位編號,而一個LUN就是代表一個可定址的邏輯SCSI設備,用以識別一個儲存裝置下特定邏輯儲存單位的唯一編號,而這個邏輯儲存單位可能是硬碟的一部份、或整個硬碟或是數個結合在一塊的硬碟,也因此LUN實務上可能是一整個可存取的磁碟陣列、單一磁碟或分割區或者是多個硬碟或多個分割區形成的存放區。
  • 探索 (Discovery):啟動器可透過入口詢問目標所有可用的設備,這也是最簡單的連接目標的方式,又稱為自動探索 (auto-discovery)。

一般而言,企業組織內需要(共用)網路磁碟存放服務的伺服器(如檔案伺服器、高可用性的虛擬主機、叢集伺服器、...等)就扮演 iSCSI 啟動器角色,而典型的 iSCSI 伺服器則是專屬的網路連接儲存資源(如NAS 或SAN 磁碟陣列),並在iSCSI伺服器上建立用戶存取的目標和LUN。而iSCSI目標的IP位址與連接埠(通常為 3260)就形成了iSCSI目標入口 (portal)用來做為iSCSI啟動器探索連線之用。

iscsiarch

一般採用iSCSI儲存裝置的伺服器可能需要二項額外的需求:

  • TCP/IP堆疊需要較高的計算能力
  • 部份或所有iSCSI協議可直接由硬體提供

實務應用上,iSCSI可直接在作業系統的TCP/IP堆疊上運作,也可以卸載至網路介面上,而一般的網路介面雖然就能整合軟體的 iSCSI 目標或啟動器,但是缺點就是會消耗太多的CPU 資源,為了解決這樣的問題所以廠商發展出兩種額外的iSCSI 網路介面,一種是軟體的iSCSI搭配具有TCP卸載引擎(TCP Offload Engine :TOE)功能的網路介面,它可以針對TCP/IP 的封包直接在網路卡上運算,因此就不會佔用太多的系統CPU 的使用率, .另外一種就是具有 iSCSI 和 TOE功能的網路介面,它除了具有TOE 功能外,還可以直接針對iSCSI 的資料進行運算處理,而基本上此種介面就像是一般儲存裝置的HBA,也可以讓您直接經由BIOS 選項選擇從iSCSI 硬體開機的動作。

iscsinic

iSCSI Qualified Name

根據 RFC 3720文件規範, iSCSI 協定採用一種特殊而唯一性的名稱來辨識每一個iSCSI 節點 (可能是啟動器或是目標),稱為 iSCSI 完整格式名稱(iSCSI Qualified Name),此名稱的格式設計如下:

iqn

  • 類別:固定文字 iqn 表示 iSCSI 完整格式名稱 (iSCSI Qualified Name)

  • 日期:格式為 yyyy-mm,為組織取得網域名稱的日期 (naming authority was acquired)

  • 命名授權(naming-authority):通常為組織的反向網域名稱

  • 選擇性唯一名稱:最後位在冒號之後的唯一名稱為選擇,您可使用任何名稱,例如主機名稱。

  • 例如:iqn.2008-03.com.example:storage.tape.sys1.xyz

 iSCSI 連線控制與驗證

基於安全性管理的目的,管理員必需控制與限制每個iSCSI 目標允許連線的啟動器,通常可用之方法有二:

主機為基礎的連線控制

直接利用IP位址、IP網段或 iqn名稱等方式來控制允許連線的啟動器是最直接的方式,不過IP位址與相關名稱容易被偽裝假造,因此並非安全的做法。
CHAP 驗證

CHAP採用三向交握(three-way handshake)協議並以挑戰/回應機制來進行驗證方式,因此密碼並沒真正傳送通過網路,做法是透用二端共用機密(密碼)來進行驗證工作,又可分為二種:

單向 CHAP 驗證(One-way CHAP authentication) 在此安全性等級下,只有 iSCSI 目標會驗證啟動器,因此只需要對iSCSI目標設定密碼,亦即所有想要存取該目標的啟動器均必須使用相同的密碼才可以啟動登入目標的工作階段。
相互 CHAP 驗證 (Mutual CHAP authentication)

在此安全性等級下,iSCSI 目標與啟動器將會彼此驗證,對於每一個目標及每一個啟動器需個別設定機密(密碼),可避免被連線攔截重送等攻擊,較為安全。

一般情況下,建議採用iqn與單向CHAP驗證方式來控制存取。

 iSCSI 多路徑存取 (iSCSI Multipathing)

iSCSI 協議可支援多條實體存取傳輸線路,於iSCSI 啟動器端和目標儲存設備(iSCSI Target端)之間建立多條可存取的通道,如此設計不僅可以避免單一實體通道因任何因素斷線時,仍可由另一條連線繼續存取儲存裝置;平時亦可達成資料傳輸的負載平衡目的,而目前的iSCSI 協議可支援二種多路徑存取機制--多路徑I/O(Multi-Path Input/Output,MPIO)與每工作階段多重連結(Multiple Connections per Session,MC/S),這二者技術都是利用多條實體存取傳輸路徑,在伺服器 (iSCSI 啟動器端)與儲存設備 (iSCSI 目標端)之間建立邏輯的存取通道,但二者間的做法仍有所不同,MPIO是讓 iSCSI 啟動器利用多個工作階段(Session)來登入相同的  iSCSI目標儲存裝置來達到負戴平衡和備援容錯的機制。而MC/S則是在同一個工作階段下讓啟動器和目標建立多個連線(Multiple Connections per Session)來達到相同的目的,其次,MC/S 在iSCSI 層級上實現,而MPIO則實現於較高的iSCSI層上頭的SCSI指令層級,因此MPIO可在所有類型的SCSI傳輸上(光纖通道、SAS),此外,MC/S的負載平衡是同時針對所有的邏輯磁碟機運作,而MPIO 乃是針對個別指定的邏輯磁碟機(LUN)運作,所以MPIO也是目前較為普及並被廣泛支援的做法,總之,若您需要iSCSI儲存架支援負載平衡或容錯備援能力,那麼請使用多路徑I/O機制。

mpioarch

 

底下內容將開始說明如何建置Windows 和Linux 系統上的iSCSI目標伺服器,實務而言,不論在任何軟硬體平台,建立iSCSI目標伺服器其所需的必要組態設定均相去不大,亦即需提供目標iqn名稱、LUN、允許連線的啟動器並且選擇性的設定CHAP驗證,以及設計每個目標內所欲支援的磁碟資源,建置時可以在一部iSCSI伺服器中建立多個連線目標,而每個目標內提供一個或多個磁碟資源(LUN),不過每個目標必需提供各自的啟動器連線控制與驗證資訊,因此可將同一個啟動器所要使用的所有磁碟資源建立在同一個目標之內以方便連線,而需要不同驗證方式的啟動器所需使用的磁碟資源則需要新增另一個連線目標。

貳. 建立 Linux iSCSI 目標伺服器

本節將先實作如何建立 Linux iSCSI伺服器和目標。

Linux SCSI 軟體

首先介紹 Linux上支援 SCSI目標的軟體,較著名的套件包括了:

  • SCST (generic SCSI target subsystem for Linux):SCST 是一套GPL授權的SCSI目標軟體堆疊,實作於核心空間,SCST 軟體堆疊被全球許多知名儲存廠商拿來做為其NAS/SAN產品的基礎軟體。SCST 官網為 http://scst.sourceforge.net/
  • LIO/TCM (Linux I/O Target): LIO為Linux 上的一個開放源始碼的SCSI目標,由Datera 公司所發展,其與SCST一樣均是提供內建於Linux核心的通用SCSI目標模組,亦支援相當豐富的主流儲存架構,包括光纖通道、PCoE、iEEE 1394、iSCSI、iSER、SRP、USB等,支援單一節點管理命令-targetcli和應用程式介面。SUSE Linux Enterprise Server 11 SP3 及更新版本中所支援的目標伺服器軟體。LIO 官網為 http://linux-iscsi.org 。
  • STGT  (SCSI target framework):一個使用者空間,多協議支援希望用以取代IET的SCSI軟體,以 scsi-target-utils 套件名稱提供的iSCSI 目標套件,知名的RHEL、CentOS與 Fedora Linux版本內建支援做為預設的iSCSI目標軟體,不過目前的狀況似乎僅於維護,新開發工作似乎已停止,
  • IET (iSCSI Enterprise Target):為一唯有支援 iSCSI協議且實作為Out-of-tree 核心模組的GPL軟體,某些Linux發行版本提供IET套件(如SUSE and Debian/Ubuntu )
  SCST LIO/TCM IET STGT

架構

核心空間 核心空間 分離 (資料傳送為核心空間,管理為使用者空間) 使用者空間

通用目標引擎

Yes
(iSCSI、FC、FCoE、iSER、SRP)
Yes
(iSCSI、FC、FCoE、iSER、SRP)
iSCSI Only Yes
(iSCSI、FC、iSER、SRP)
多重路徑
(MultiPathing)
MPIO MC/S
MPIO
MC/S
MPIO
MPIO
雙向命令(Bidirectional Commands) Yes Yes No Yes

支援的後端儲存方法
(Support Backstore)

FILEIO (Kernel and User), BLOCKIO FILEIO (Kernel), BLOCKIO, Ramdisk FILEIO (Kernel), BLOCKIO FILEIO (User)

可於核心中處理後端儲存(Backstorage handlers in kernel space)

Yes Yes No No
支援隨需配置 Yes Yes No

Yes(最新版本)

可使用硬體指令進行摘要計算 Yes Yes No No
連線與工作階段還原實作 安全 未安全 未安全 未安全

延伸 CDB (大於16位元組大小)

Yes Yes No Yes
控制每個入口的目標是否可視 Yes No Yes No
控制每個啟動器對於目標是否可視 Yes No Yes Yes

上述的Linux環境下目標軟體中的使用現況中,Linux 2.6.38版之前的標準為 STGT/TGT,現在的標準則為LIO目標,IET則已為一老舊的套件,而其後繼的SCST則有不少知名廠商支援採用。

本文所使用的CentOS 6 Linux 雖然包括LIO套件,但預設上只是用來做為 FCoE目標,STGT才用來做為iSCSI目標,但未來的 RHEL 7 將改採用LIO。

至於Linux 環境下的 iSCSI啟動器軟體則單純許多,open-iscsi 為最普及和廣泛為主流 Linux 發行版本所接受的軟體。

下節將逐步說明如何建立 CentOS 6.x Linux成為iSCSI 目標伺服器,由於 CentOS儲存庫內建STGT iSCSI套件,因此底下直接安裝並使用STGT套件來實作iSCSI 目標。

一. 準備iSCSI 儲存磁碟

Linux 的iSCSI目標可以支援實體或邏輯存放磁碟做為其儲存設備(LUN),包括了:

  • 實體磁碟機 (如:/dev/sdb)
  • 實體分割區 (如:/dev/sdb1)
  • 磁碟陣列 (如: /dev/md0)
  • LVM下的邏輯卷冊 (Logical Volume;LV)
  • 利用dd指令建立的檔案

底下範例特別利用實體分割區、Linux軟體磁碟陣列、LVM邏輯卷冊與映像檔案等三種存放類型來做為iSCSI 目標的儲存設備。

首先,利用dd命令或tgtimg指令檔建立磁碟映像檔案:

dddisk

tgtimg

其次,利用LVM 相關管理指令(pvcreate、vgcreate、lvcreate)建立邏輯卷冊:

lvmcreate

最後,再利用mdadm 指令建立由二個實體磁碟組成之擁有較高效能的 RAID 0:

mdadm

    二. 安裝 stgt 套件 (scsi-target-utils)

    yum -y install scsi-target-utils

    這個 scsi-target-utils 套件內重要的檔案或程式如下:

    • /usr/sbin/tgtd: iSCSI target 服務主程式
    • /etc/tgt/targets.conf:tgt的主要設定檔,使用類似HTML並具有巢狀標籤階層的結構來定義iSCSI目標與LUNs。
    • /usr/sbin/tgt-admin:tgt 的設定工具,用來建立、刪除和顯示iSCSI目標。
    • /usr/sbin/tgt-setup-lun:一個輔助的指令檔,用來建立目標以及目標內的儲存設備並且控制初始器如何連接到目標。
    • /usr/sbin/tgtadm:手動直接設定目標所有組態,但組態設定只會在此工作階段有效,一旦重新啟動tgtd後即需要重設。
    • /usr/sbin/tgtimg:建置與管理tgtd所使用的映像檔案(模擬磁碟)工具。

    三. 設定iSCSI目標組態

    stgt 提供二種設定iSCSI目標組態的方法:

    • 使用 tgtadmin 命令新增iSCSI目標設備並設定初始器連線方式
      tgtadmin命令所建立的LUN組態於機器關機或重新啟動tgtd後即會消失而需要重設,雖然您可以利用 tgt-admin --dump來儲存組態,但並非所有參數均會被儲存在組態檔,一般而言,並不建議採用這種方法。
    • 直接編輯組態檔-- /etc/tgt/targets.conf
      直接編輯組態檔以便讓每次tgtd啟動時皆可以自動經由組態檔的設定來啟動服務,建議採用此法。

    /etc/tgt/targets.conf 組態檔案 <target IQN> 設定段的常用指引命令:

    • backing-store :定義iSCSI目標所提供的儲存邏輯單位(LUN),可指向一般檔案或其它已劃分或建立的區塊裝置 。
    • direct-store: 設定整顆實體儲存硬碟做為目標設備 。
    • initiator-address :定義允許連線的用戶啟動器的IP位址用以控制連線的來源。
    • incominguser <user> <userpassword >: 使用CHAP驗證,後面需輸入帳戶和密碼二個參數,日後合格的啟動器亦需要輸入相同的帳戶與密碼才能夠連線成功,此外,為了能夠接受來自Windows平台的啟動器連線驗證,您需要設定12個字元以上的密碼才行。
    • outgoinguser <user> <userpassword>:如果您規劃相互驗證的功能,則在此還需要輸入啟動器預先所設定的帳戶與密碼
    • write-cache [off|on] :啟用快取功能,tgtd 預設會使用快取來增快存取速度,不過較可能在不當操作或意外當機時會有資料遺失的風險。

    本範例的組態檔中新增了三個連線目標(不同的 iqn),第一個目標內提供了一個LVM邏輯卷冊、第二個目標則支援了一個 RAID0,而第三個目標內新增了三個儲存裝置(LUNs),而且啟動器連線時採用主機控制以及CHAP驗證。

    <target iqn.2014-05.com.lij:target0>
    backing-store /dev/vg1/lv1
    initiator-address 192.168.2.0/24
    incominguser admin 123456123456
    write-cache on
    </target>

    <target iqn.2014-05.com.lij:target1>
    backing-store /dev/md0
    initiator-address 192.168.2.161
    incominguser admin 123456123456
    lun 1
    </target>

    <target iqn.2014-05.com.lij:target2>
    backing-store /storage/diskfile1
    backing-store /dev/sda4
    direct-store /dev/sde
    initiator-address 192.168.2.161
    incominguser admin 123456123456
    </target>

    四.  新增iptables防火牆規則

    由於 iSCSI 透過TCP 3260連接埠連線,因此除非您的機器已停用iptables,否則需要新增一條允許TCP 3260流量連入的規則(您可以下達如下的命令或可直接編輯並寫入/etc/sysconfig/iptables檔案):

    iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 3260 -j ACCEPT

    五. 啟動 tgtd

    一切均已設定完成後,最後請啟動tgtd服務並且設定開機時自動啟動並檢查狀況。

    #service tgtd start
    #chkconfig –level 35 tgtd on
    #tgtadm --mode target --op show

    現在您的Linux iSCSI伺服器已經建立完成,提供了三個連線目標以及五個儲存邏輯單位。

    參. 建立 Windows iSCSI 目標伺服器

    微軟的 Windows Server 2012 (R2) 已經內建iSCSI 目標伺服功能,因此可以直接建置成為 iSCSI伺服器,若您使用較舊版本的Windows Server 2008 R2,仍然可以透過下載並安裝 Microsoft iSCSI Software Target來設定iSCSI目標。本節將說明如何在Windows Server 2012上建立iSCSI伺服器目標並提供邏輯磁碟機。

    本範例中將建立二個iSCSI目標和三個虛擬磁碟機,詳細步驟、說明及圖例如下:

    1. 首先,啟動『伺服器管理員』工具的『新增角色及功能精靈』程式來安裝『iSCSI 目標伺服器』角色服務。
       winsiscsi1
    2. 完成安裝iSCSI目標伺服器後,請由『伺服器管理員』工具內按一下『檔案和存放服務』底下的『iSCSI』以進入iSCSI虛擬磁碟設定頁,然後再按一下中間的『若要建立iSCSI虛擬磁碟,請啟動[新增 iSCSI 虛擬磁碟精靈]』連結以啟動建立iSCSI虛擬磁碟精靈程式。
      winsiscsi2
    3. 接下來的『選取iSCSI虛擬磁碟位置』設定頁中選取新增虛擬磁碟的磁碟區位置與路徑,預設的目錄名稱為iSCSIVirtualDisk,您可以直接選擇磁區後並接受這個預設的目錄或選擇自訂路徑。
       winscsi3
    4. 接下來請輸入虛擬磁碟名稱,精靈程式將會在上個步驟所指定的路徑底下新增一個虛擬磁碟名稱的vhdx檔。
      winsscsi5 
    5. 於『指定iSCSI虛擬磁碟大小』設定頁中輸入輸入虛擬磁碟大小並選擇磁碟空間配置方式,可選擇較佳效能卻一次佔用固定空間的 thick provision方式 (固定大小),或是選擇依用量需求成長、空間能夠較有效利用的thin provision方式(動態擴充)。
      winsscsi6 
    6. 接下來請選擇新增iSCSI目標(如果不存在任何iSCSI目標),並且在次頁輸入iSCSI目標名稱,這個目標將可被iSCSI啟動器探索並做為連線建立之用,然後就可以透過目標連線後來存取指派給目標的虛擬磁碟機。
      winsscsi71
    7. 『指定存取伺服器』設定頁將指定允許探索目標和存取虛擬磁碟的iSCSI啟動器,在此需要把規劃的啟動器加入進來,您可以使用多種不同的名稱方式加入啟動,例如DNS名稱、IQN、IP或MAC位址皆可,不過由於IQN名稱通常較長且需要特別查看獲知 (微軟平台可使用“iscsicli”命令查詢取得,linux系統請查看檔案 /etc/iscsi/initiatorname.iscsi),因此可利用IP位址輸入較為簡單。
      winsscsi8
    8. 接下來決定是否啟用iSCSI標準的連線存取驗證方法-CHAP,它允許啟動器向目標來進行驗證,相反的,也允許目標驗證啟動器,在此需輸入使用者名稱及至少12字元的密碼,而且一旦設定日後將無法取得或變更,因此一旦遺失或忘記就只得重新設定。在此只啟用CHAP驗證以驗證啟動器連線而不做反向CHAP驗證。
      winsscsi9
    9. 最後,確認一切設定無誤後,完成第一個iSCSI目標與虛擬磁碟建立工作。
      winsscsi10
    10. 重複上述建立步驟,本範例最終共新增了二個目標和三個虛擬磁碟機。
      winsscsi11
    11. 日後若需要變更iSCSI目標的設定參數,則可以以滑鼠右鍵按下方的特定 iSCSI目標之內容選項,即可重新變更上述所設定的各項參數,作者通常會變更目標預設的iqn名稱。
      openinitiator7

      winstarget8

     

    肆. Windows 啟動器連接iSCSI目標

    微軟從 Windows Vista及Windows Server 2008作業系統後已經內建Microsoft iSCSI software initiator,可用來連接任何標準的iSCSI目標磁碟機,底下範例為連接Linux iSCSI伺服器和邏輯儲存單位的步驟如下:

    1. 執行『iscsicpl.exe』 命令以啟動 iSCSI啟動器軟體(或由系統管理工具內啟動iSCSI啟動器)。
    2. 若您是第一次執行iSCSI啟動器,畫面會出現是否啟動這項服務的對話方塊,請直接按『是』繼續。
       iscsi1
    3. 於『iSCSI 啟動器 - 內容』對話方塊上,『目標』欄位輸入iSCSI 目標伺服器的主機名稱或IP位址,然後再按一下右側的『快速按鈕』。
      winscsiinit1
    4. 請於『快速連線』對話方塊上,直接按下『完成』按鈕。
      iscsi2
    5. 接下來,請於『探索到的目標』底下選擇特定目標後,並按下『連線』。
      iscsi3
    6. 由於iSCSI目標需要使用CHAP驗證,因此請在『連線到的目標』對話視窗按下『進階』按鈕,再於出現的『進階設定』視窗勾選『啟用CHAP驗證』並輸入『名稱』及『目標密碼』。
      iscsi4
    7. 在本範例中將畫面上的三個Linux iSCSI目標一一成功連線。
      iscsi5
    8. 一旦成功的與iSCSI伺服器目標建立連線後,您就可以透過 diskpart命令或『磁碟管理』工具,檢視機器上是否已出現了額外的離線狀態磁碟機。
      iscsi6 

      iscsi7
    9. 最後,您就可以如同一般新安裝的磁碟一樣,經由連線這些磁碟機、新增分割區並加以格式化後即可開始使用儲存資料。

    伍. Linux啟動器連接iSCSI目標

    本節將利用CentOS Linux的啟動器軟體來連接iSCSI伺服器的目標及磁碟。

    一. 安裝 Open-SCSI 啟動器軟體

    首先,您需要在CentOS Linux上安裝來自Open SCSI專案的  iscsi-initiator-utils 這個套件。

    yum -y install iscsi-initiator-utils
    這個套件內較為重要的檔案或程式如下:

    • /etc/iscsi/iscsid.conf :啟動器的主要設定檔,用來設定如何連結到 iSCSI 目標的各項組態
    • /sbin/iscsid:iSCSI 啟動器的服務程式 (Open-iSCSI daemon)
    • /sbin/iscsiadm:open-iscsi 管理工具,用來探索及登入iSCSI目標並且管理 open-iscsi資料庫
    • /etc/rc.d/init.d/iscsi:啟動 iSCSI啟動器指令檔

    二. 檢視與修改iqn名稱 (選擇性)

    預設的iSCSI啟動器所使用的iqn名稱內有 'com.redhat' 字串,雖然無礙正確的使用,但您可以藉由修改 /etc/iscsi/initiatorname.iscsi 這個檔案內 InitiatorName 設定項的值來自訂所想要的iqn名稱:

    openinitiator2

    三. 編輯 /etc/iscsi/iscsid.conf 組態檔

    接下來需要透過編輯 /etc/iscsi/iscsid.conf 這個組態檔案來建立連接至iSCSI目標的各項參數,由於大部份iSCSI目標只採用單向的CHAP驗證而不需反向驗證,因此組態檔變更如下:

    #輸入登入 iSCSI目標時 CHAP驗證所使用的帳戶與密碼(目標接受啟動器登入驗證)

    #請務必移除註解並輸入先前iSCSI目標上輸入的帳戶與密碼

    node.session.auth.authmethod = CHAP
    node.session.auth.username = username
    node.session.auth.password = password

    #輸入探索連線iSCSI目標時 CHAP驗證所使用的帳戶與密碼(目標接受啟動器探索驗證)

    #請務必移除註解並輸入先前iSCSI目標上輸入的帳戶與密碼

    discovery.sendtargets.auth.authmethod = CHAP
    discovery.sendtargets.auth.username = username
    discovery.sendtargets.auth.password = password

    # 如果iSCSI目標已啟用反向CHAP驗證,則需在目標伺服器輸入與底下相同的帳戶與密碼(啟動器驗證目標伺服器之用)

    #本範例並不做反向驗證,所以保留註解行即可
    #node.session.auth.username_in = username_in
    #node.session.auth.password_in = password_in

    #discovery.sendtargets.auth.username_in = username_in
    #discovery.sendtargets.auth.password_in = password_in

    四. 啟動 iscsid 服務

    接下來請啟動iscsid 服務並設定開機時自動啟動。

    openinitiator4

    五. 探索 iSCSI目標

    下面的步驟需要開始探索iSCSI目標,您需要利用利用「iscsiadm -m discovery -t sendtargets -p 目標伺服器」命令連接至iSCSI伺服器的入口位址並用SendTargets text探索請求方法來查詢目標,這個探索方法也會將收集到的資訊存放在/var/lib/iscsi/nodes/目錄下,例如下圖範例為探索一部IP位址為192.168.2.179的Linux iSCSI目標伺服器之結果,由結果畫面可知其探索到三個目標並將每個目標連線資訊存放在/var/lib/iscsi/nodes下的子目錄。

    openinitiator3

    不過若您探索一部Windows Server 2012 R2的iSCSI目標伺服器,卻發現它會探索到IPv6的連線介面的存在(下圖黃色虛線部份),由於吾人並不打算設定與建立Linux與Windows之間的IPv6連線,因此這些IPv6的目標可能會導致日後登入建立工作階時的錯誤,因此建議應事先將這些代表IPv6目標的子目錄加以移除以避色連線登入時的錯誤。

    openinitiator4

    openinitiator5

    六. 登入iSCSI目標

    一旦探索完成並將資訊存入資料庫之後,您就可以利用「iscsiadm -m node --login」命令來令啟動器服務登入iSCSI目標以建立工作階段來取得磁碟資源。

    openinitiator5

    登入iSCSI目標成功之後,您可以利用 「fdisk –l」命令來檢視iSCSI磁碟機的設備裝置檔案名稱,如下圖例/dev/sdb、/dev/sdc、/dev/sdd 皆是iSCSI裝置。

    openinitiator6

    七. 建立與格式化iSCSI 磁碟

    iSCSI磁碟機的使用與本機磁機並無不同,您可以建立一般的磁碟分割或LVM的邏輯卷冊,甚至磁碟陣列,然後格式化並掛載至特定目錄即可使用,下圖僅簡單的示範如何建立分割、格式化並掛載至目錄的相關命令。

    openinitiator7

    八. 中斷連線並移除/var/lib/iscsi/nodes/目錄資料

    如果您的啟動器不再需要使用iSCSI目標的磁碟,則您需要先利用 "iscsiadm -m node –logout" 登出目標伺服器,然後再執行 "iscsiadm -m node -o delete" 命令來移除存放在/var/lib/iscsi/nodes/目錄下的目標資訊。

    # iscsiadm -m node --logout
    Logging out of session [sid: 10, target: iqn.1991-05.com.lij:serverb-target2-target, portal: 192.168.2.162,3260]
    Logging out of session [sid: 9, target: iqn.1991-05.com.lij:serverb-target1-target, portal: 192.168.2.162,3260]
    Logout of [sid: 10, target: iqn.1991-05.com.lij:serverb-target2-target, portal: 192.168.2.162,3260] successful.
    Logout of [sid: 9, target: iqn.1991-05.com.lij:serverb-target1-target, portal: 192.168.2.162,3260] successful.
    # iscsiadm -m node -o delete

    文章接下來的內容將示範如何實作Linux和Windows的多重路徑I/O功能,不過要能夠使用MPIO功能,您需要具備下列的條件:

    • iSCSI 啟動器需有多張網路卡連接到iSCSI目標。
    • iSCSI 啟動器軟體需支援MPIO功能。
    • iSCSI 目標裝置亦需支援MPIO功能。

    不過不同廠商所支援的MPIO啟動器或目標不見得可以順利建置多重路徑而連結成功,您需要查閱廠商有關於這一部份資料的說明條件、需求或限制,然後再實際測試後才能確認MPIO的連線容錯與負載平衡效果是否可正確達成。在本文的實證案例中,作者刻意設置了四部機器—Windows iSCSI 目標伺服器、Windows iSCSI 啟動器、Linux tgt 目標伺服器、Linux  iSCSI 啟動器,然後分別採用Windows啟動器對Windows目標、Windows 啟動器對Linux目標、Linux啟動器對Windows目標、Linux啟動器對 linux目標等四種建立多重路徑I/O的方式。

    mpiotest1

    陸. 使用Linux 建立多重路徑I/O連線功能

    一. 安裝 device-mapper-multipath 套件

    為了讓Linux伺服器 的iSCSI 啟動器支援多重路徑I/O功能,除了需要安裝 iscsi-initiator-utils套件外,還需要安裝 device-mapper-multipath(DM-multipath) 這個套件。

    # yum -y  install device-mapper-multipath

    device-mapper-multipath 套件包括了一些重要的檔案與程式。

    • multiconf - 用來設定 DM-multipath的工具
    • multipath - 掃描與偵測系統上的多路徑I/O設備並聚合它們。
    • multipathd - multipath daemon,負責偵測檢查路徑是否失效而執行重新設定多路徑的對映與更新。
    • /etc/multipath.conf -  multipathd 雖然有內建的組態表,不過管理員可以利用/etc/multipath.conf 檔案來覆蓋預設的組態 (此檔預設上並不存在,套件預設上亦只提供範例檔,您可以經由拷貝或命令來產生此檔案)。

    根據文件說明,DM-Multipath 可以支援大部分具有 Multipath 功能的儲存裝置陣列。預設的配置值與受支援的裝置可在/usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf.defaults 這個檔案內找到。

    二. 設定並啟動 iSCSI 啟動器

    若您尚設定啟動器組態,則需要如本文前段所述,先編輯iqn名稱(/etc/iscsi/initiatorname.iscsi )並編輯正確啟動器組態檔(/etc/iscsi/iscsid.conf),然後再啟動iscsid (service iscsid force-start ; chkconfig iscsid on)。

    三. 設定multipath

    接下來,管理員可以透過 mpathconf 工具程式來建立multipath 組態檔以便用來設定 multipath,因為CentOS linux 預設上的 /etc/multipath.conf 檔案並不存在,因此 mpathconf 工具程式將會使用 /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf 檔案來作為起始檔案。

    您需要先執行 "mpathconf --enable" 命令以產生 multipath.conf組態檔,接下來您可以編輯 /etc/multipath.conf組態檔以覆寫 DM-Multipath 的預設組態值。如果有需要的話,您還可以新增組態檔預設值裡面目前並不直接支援的儲存陣列,而DM-Multipath 組態檔內的 defaults 段裡面所設定的屬性會被使用,除非它們被 multipath.conf 檔案中的 devices 與 multipaths 兩節裡所指定的屬性予以覆蓋過去。

    lnxmipo1

    底下為本範例所編輯的 multipath,conf 檔案內容如下,defaults 設定段內的重要選項包括了(其它設定項目請自行參考線上輔助文件):

    • path_selector :指定用來決定下一項 I/O 作業請求時,應該要使用哪一條路徑的預設演算法則,有三種選項。
      • round-robin 0  :於路徑群組內的所有路徑之間進行循環傳輸,並將相同的 I/O 數量傳送至各個路徑,此為預設值。
      • queue-length 0:將下個 I/O 量傳送到含有最少未處理之 I/O 請求數量的路徑。
      • service-time 0:將下個 I/O 量傳送到含有最短預估服務時間的路徑,這是將尚未處理的 I/O 總數除以各個路徑的傳輸量所取得的資訊。
    • path_checker: 用來判斷路徑狀態的預設方式。
      • readsector0 :讀取裝置的第一個磁區 ,此為預設值。
      • tur: 發送一項 TEST UNIT READY 命令給裝置。
      • emc_clariion:查詢 EMC Clariion 專屬的 EVPD 分頁 0xC0 以判斷路徑狀況。
      • hp_sw:檢查含有 Active/Standby 軔體之 HP 儲存裝置陣列的路徑狀態。
      • rdac:檢查 LSI/Engenio/NetApp RDAC 儲存控制器的路徑狀態。
      • directio:讀取第一個含有直接 I/O 的磁區。
    • user_friendly_names:如果設為 yes,表示系統應該使用 /etc/multipath/bindings 檔案來指定一個永久性而獨一無二的別名給 multipath 使用,格式為 mpathn。若設為 no,則表示系統應使用 WWID 來作為 multipath 的別名。

    # 首先把下列三行給加以註解掉

    # defaults {
    #  user_friendly_names yes
    # }
     

    # 將下列 defaults 段的註解給移除而變成如下的內容

    defaults {
    udev_dir /dev
    polling_interval 10
    path_selector "round-robin 0"
    path_grouping_policy multibus
    getuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n"
    prio alua
    path_checker directio
    rr_min_io 100
    max_fds 8192
    rr_weight priorities
    failback immediate
    no_path_retry fail
    user_friendly_names yes
    }
     

    # 本機磁碟sda無需使用多重路徑, 故設為黑名單將其排除在外,因此檔案中需存在下列三行

    blacklist {
    devnode "^sda"
    }
     

    四. 啟動 multipathd

    一旦完成設定multipath後,吾人就可以啟動multipath daemon。

    lnxmpio2

    五. 探索並登入 iSCSI目標

    接下來執行iSCSI目標的登入與探索,下圖例為探索一部 Windows iSCSI 目標伺服器的結果,圖中可看出利用iscsiadm –m discovery 探索出同一個目標中有二個連線的IP位址。若iscsiadm探索時未偵測出目標連線的多個IP位址,則您可以各別探索,然後再由multipathd根據組態檔來自動聚合多重線路,不過最後仍需經由連線及流量測試來確認多重線路I/O是否正常運作(作者測試 Linux multipathd以多路徑方式連接Linux tgt 目標似乎就需如此做法 )。

    lnxmpio4

    六 檢查並確認多路徑拓樸相關資訊

    為了確認目前連接至iSCSI目標的多路徑I/O功能是否正確無誤,您需要利用 "multipath -ll"命令來檢查連線設定和拓樸資訊,如下圖所示

    lnxmpio5

    七. 建立、格式化與掛載 iSCSI磁碟

    另一方面,當您執行 "fdisk -l" 命令時亦可看到多出了二個相同大小空間的額磁碟(對映至上述multipath –ll所顯示的sdb, sdc),這二個磁碟代表iSCSI目標磁碟的二個連線,此外,當新裝置被納入 DM-Multipath 的控制下並且設user_friendly_names = yes 組態時,新的多重路徑裝置可能會在 /dev 目錄下的兩個地方看到:/dev/mapper/mpathn 以及 /dev/dm-n

    • /dev/mapper/mpathn 裝置:這個裝置是在開機過程中所建立的使用者易記的名稱,管理員可以使用這些裝置來存取 multipath 裝置,例如建立邏輯卷冊時。
    • /dev/dm-n:所有 /dev/dm-n 類型的裝置都是給內部使用,使用者請不要使用這些裝置名稱。

     lnxmpio6

    所以,吾人將利用/dev/mapper/mpathb裝置來建立與格式化iSCSI 磁碟,利用fdisk新增 /dev/mapper/mpathbp1磁碟分割,再以mkfs格式化,最後建立空目錄並掛載(mount)使用之。

    lnxmpio7

    八. 測試多重路徑的負載平衡與容錯能力

    最後,我們將測試建立完成的多重路徑I/O的負載平衡與容錯能力效果,在此作者採用iftop工具(可透過epel進行安裝)來監控二個網路卡連線至iSCSI磁碟的傳輸狀況,首先,拷貝大量檔案至iSCSI磁碟上,再分別開在二個視窗以 "iftop -B -F 192.168.2.175/32 -i eth0" 和"iftop -B -F 10.0.0.175/32 -i eth1"命令來觀察,如下圖這是二個網路介面的多重路徑以Round-Robin方式傳輸的結果。

    lnxmpio8

    傳輸過程中,作者刻意停用了iSCSI 伺服器的某個介面來測試多重路徑的網路容錯功能,結果發現即使中斷了某一傳輸路徑,另一個介面所形成的路徑依然可以繼續傳輸檔案,如下圖所示:

    lnxmpio9

    一旦重新啟用先前被停用的網路介面後,則很快的又會恢復負載平衡的多重路徑傳輸機制。

    由上述的測試可驗證啟用多重路徑I/O功能的iSCSI連線於正常情況下具有頁載平衡的效能好處,而一旦任一連線出了問題時可提供容錯的能力。

    柒 . 使用Windows 多重路徑I/O功能

    另一方面,利用Windows 啟動器以MPIO方式連接Windows iSCSI目標伺服器的做法及步驟如下:

    首先,您需要在建立iSCSI 目標時,將啟動器的二個網路介面介面的IP位址均新增為允許存取的機器。

    mpio00

    一. 啟動器上安裝並啟用MPIO功能

    其次,執行『伺服器管理員』工具並啟動『新增角色及功能精靈』程式,然後再於『功能』設定頁核選新增『多重路徑I/O』這項功能。
    mpio0

    二. 啟用Microsoft iSCSI for MPIO

    使用微軟的 MPIO功能需要先由iSCSI目標的供應商取得Device Specific Modules (DSM) MPIO 驅動程式。您還需要確認如何安裝儲存廠商所提供的 MPIO DSM。微軟預設上只提供了自己iSCSI實作的MPIO DSM,您需要依據下面的步驟啟用它:

    1. 請由『伺服器管理員-->工具-->MPIO』途徑啟動『MPIO - 內容』對話視窗。
    2. 按一下『探索多重路徑』標籤,然後勾選『新增iSCSI裝置的支援』,最後按『新增』按鈕後並依據出現的對話盒指示立即重新開機。
      mpio1
    3. 重新開機後您需要確認是否已成功啟用並支援Microsoft iSCSI for MPIO功能,您可由MPIO工具中的『MPIO裝置』標籤內查看是否存在 "MSFT2005iSCSIBusType" 字串存在或直接在命令提示字元下輸入命令"mpclaim -h" 。
      mpio2

    三. 建立第一個MPIO連線

    接下來,您需要在iSCSI啟動器建立第一個MPIO連線。

    1. 執行『iSCSI啟動器』工具,先確認目前並無存在無任何連線。
    2. 由『探索』標籤設定頁,按『探索入口』並輸入目標IP位址(下圖為針對一部Windows Server 2012 R2 iSCSI目標伺服器的探索,只需針對其中任一IP位址即可)
      mpio3 
      有些 iSCSI 目標,例如 Linux tgt目標,需要您分別針對二個連線 IP位址執行探索。
      mpiowintolnx
    3. 下一步驟請切換至『目標』標籤,您應該可以看到方才探索到的目標,針對適當的目標請按一下『連線』。
      mpio4
    4. 於出現的『連線的目標』對話視窗中,勾選『啟用多重路徑』並按『進階』按鈕。
      mpio5
    5. 『進階設定』對話視窗內,選擇第一個連線所使用的啟動器與目標IP位址,此外,目標如有啟用CHAP驗證,則您還要勾選『啟用CHAP登入』選項並輸入正確的驗證名稱與密碼,然後按二次『確定』完成設定。
      mpio6

    四. 建立第二個MPIO連線

    接下來,您需要繼續建立第二個工作階段,步驟如下:

    1. 請於『目標』設定頁中按一下『內容』按鈕。
      mpio7
    2. 於『內容』對話視窗中,按一下『新增工作階段』按鈕。
      mpio8
    3. 接下來,請勾選『啟用多重路徑』選項並按『進階』按鈕,然後輸入第二組連線的啟動器與目標IP位址,最後按二次『確定』後完成設定。
      mpio9
      有些iSCSI 目標(例如 Linux tgt)建立第二個連線工作階段時,只需要在『目標入口IP』欄位中選取目標伺服器的第二個連線IP即可。
      mpiowintolnx2
    4. 最後為了確認已成功建立MPIO連線,您可以在 "Windows Powershell"下輸入 "get-iscsisession" 這個cmdlet,就可以看到目前已建立的工作階段。
      mpio10

    五. 設定MPIO原則

    一旦建立二個連線工作階段後,就需要設定MPIO原則,定義MPIO應該採用的負載平衡或容錯方式,不過您需要先了解微軟的MPIO所支援的原則項目:

    • 僅限容錯移轉(Failover Only):同一時間只有「單一」使用路徑,一旦主要路徑失效時,備用之路徑便會接手I/O繼續連線服務。
    • 循環配置資源(Round Robin):採用「Active-Active」機制會平均使用所有可用路徑,即平均分配所有傳入要求。
    • 以子集循環配置資源(Round Robin with Subnet):除了如上的循環配置外,再增加一組備用路徑,例如有1、2、3三條可用路徑,其中A、B為主要路徑,而C為備用路徑,除非負載平衡的1、2路徑都失效,否則不會使用到第3條備用路徑。
    • 最小佇列深度(Least Queue Depth):統計目前所有可用路徑中累積「最少佇列I/O」的路徑,便將後續的I/O分配給該路徑。
    • 加權路徑(Weighted Paths):自行分配「路徑權重」,數值越大,則優先順序越低。
    • 最少區塊(Least Blocks):統計目前可用路徑中累積「最少待處理I/O位元組」的路徑,便可將後續的I/O分配給該路徑。

    設定MPIO原則步驟與說明如下:

    1. 請由『目標』設定頁中按一下『裝置』按鈕。
      mpio11
    2. 於『裝置』對話方塊中,按一下『MPIO』按鈕。
      mpio12
    3. 在『裝置詳細資料』對話視窗中選取適當的負載平衡原則選項,若您選擇『加權路徑』,還需要輸入權數值,最後再按『確定』完成設定。
      mpio13

     

    六. 測試並確認 MPIO的負載平衡與容錯能力

    上述步驟設定完成後,管理員最後需要執行測試工作以確認設定與運作正確無誤。

    1. 請使用『磁碟管理員』,連線、初始化、建立與格式化磁碟區。
      mpio14
    2. 接下來,先執行『工作管理員』工具並進入『效能』標籤頁,然後請拷貝大型檔案或多檔案至iSCSI磁碟,並仔觀察二個網卡的流量狀況。
      mpio15
    3. 另一方面,您可以進一步選取『檢視網路詳細資料』選項來檢視二個網卡的詳細傳送統計。
      mpio16
    4. 接下來您還需要測試MPIO的容錯能力,當正常執行大量複製傳送時,突然中斷一網路介面連線,查看是否還可以利用僅剩的單一網路介面完成磁碟拷貝,而一旦恢復中中斷連線網路介面後是否可以立即偵測到而恢復二個網路介面的負載平衡的複制傳送方式,下圖利用工作管理員的網路詳細資料的連續圖示搜集來驗證iSCSI MPIO除了具有負載平衡傳輸能力外,亦具有避免單一連線失效的容錯能力。
      mpio17

    作者利用Windows 啟動器以多重路徑I/O分別連接Windows Server iSCSI目標和Linux tgt目標的虛擬磁碟,再拷貝大量的檔案後,發現Windows iSCSI目標和Linux tgt目標的多重路徑I/O之效能表現差距很小。

    捌. 結語

    現代資訊環境下對於網路儲存架構的需求越來越高,而採用iSCSI協議的儲存區網路架構通常是在成本、效能和可擴充性等緒多因素考量取捨下的最佳方案,因此無論是應用於叢集技術下的共用儲存區或者是用以支援各種虛擬化技術所需的儲存裝置目前均可看到iSCSI的架構已被相當廣泛的接受及使用,本文以詳細的篇幅來說明如何利用內建於Windows 和Linux這二大現代伺服器平台所支援的 iSCSI用戶端軟體(啟動器)和iSCSI伺服端軟體(目標)來部署企業組織所需的網路儲存架構,包括逐步的iSCSI目標和LUN的建置說明以及啟動器的連接設定方式,讓各位看倌知道即使沒有昂貴的硬體儲存裝置,仍可利用純軟體及虛擬磁碟的方式來建置一個低成本、有效率又具有容錯能力的iSCSI儲存架構,藉以支援各種企業網路存放需求。

    讀者回響 (aohongchen@yahoo.com)