天天看點

iscsi網絡存儲介紹及用戶端配置操作1. iscsi介紹與initiator安裝2. 初次挂載網絡存儲3. 維護操作4. iscsi的其它常用操作

本文不介紹iscsi服務端的搭建過程,不然就會很累贅。主題就是怎麼去完成iscsi網絡存儲的挂載過程,并順帶介紹一些必要的概念。

iscsi簡單來說,就是把scsi指令通過tcp/ip協定封裝起來,在以太網中傳輸。iscsi 可以實作在ip網絡上傳遞和運作scsi協定,使其能夠在諸如高速千兆以太網上進行資料存取,實作了資料的網際傳遞和管理。基于iscsi建立的存儲區域網(san)與基于光纖的fc-san相比,具有很好的成本效益。

iscsi屬于端到端的會話層協定,它定義的是scsi到tcp/ip的映射(如下圖),即initiator将scsi指令和資料封裝成iscsi協定資料單元,向下送出給tcp層,最後封裝成ip資料包在ip網絡上傳輸,到達target後通過解封裝還原成scsi指令和資料,再由存儲控制器發送到指定的驅動器,進而實作scsi指令和資料在ip網絡上的透明傳輸。它整合了現有的存儲協定scsi和網絡協定tcp/ip,實作了存儲與tcp/ip網絡的無縫融合。在本文中,将把發起器initiator稱為用戶端,将目标器target稱為服務端以友善了解。

iscsi網絡存儲介紹及用戶端配置操作1. iscsi介紹與initiator安裝2. 初次挂載網絡存儲3. 維護操作4. iscsi的其它常用操作

iscsi 服務端和用戶端的通訊就是一個在網絡上封包和解包的過程,在網絡的一端,資料包被封裝成包括tcp/ip頭、iscsi 識别包和scsi 資料三部分内容,傳輸到網絡另一端時,這三部分内容分别被順序地解開。為了保證安全,iscsi 有約定操作順序。在首次運作時,用戶端(initiator)裝置需要登入到服務端(target)中。任何一個接收到沒有執行登入過程的用戶端的iscsi pdu (iscsi rotocol data units,iscsi 協定資料單元)服務端都将生成一個協定錯誤,并且關閉連接配接。在關閉會話之前,服務端可能發送回一個被駁回的iscsi pdu。

在工作時,iscsi使scsi資料塊由原來的scsi總線連接配接擴充到internet上,這一過程有些産品通過硬體來實作,這種硬體産品被簡稱為toe(tcp offload engine),随着近年來伺服器晶片技術的不斷發展,伺服器處理能力日益強勁,目前更為普遍的是通過軟體來實作scsi資料塊的封裝過程。這種軟體通常被稱為iscsi initiator軟體/驅動。initiator軟體可以将以太網卡虛拟為iscsi卡,接受和發送iscsi資料封包,通過普通以太網卡來進行網絡連接配接,但是需要占用cpu資源。另外的toe和hba連接配接轉換方式都需要專門的硬體裝置來完成,雖然相對昂貴但執行效率高,也可以減輕主機cpu的負載。本文用戶端采用initiator驅動的連接配接方式。

在linux 2.6核心中提供了iscsi驅動,iscsi 驅動(driver)使主機擁有了通過ip網絡通路存儲的能力,但還需要一個具體的用戶端工具(linux使用者空間元件)初始化iscsi驅動,即<code>iscsi-initiator-utils</code>,也是大家常說的open-iscsi。

這個安裝将<code>iscsid</code>、<code>iscsiadm</code>安裝到 /sbin 目錄下,它還将把預設的配置檔案安裝到<code>/etc/iscsi/</code>目錄下:

<code>/etc/iscsi/iscsid.conf</code>:所有剛發起的iscsi session預設都将使用這個檔案中的參數設定。

<code>/etc/iscsi/initiatorname.iscsi</code>:軟體iscsi initiator的intiator名稱配置檔案。

確定iscsid和iscsi兩個伺服器開機自啟動,<code>chkconfig --list |grep iscsi</code>,在iscsi啟動的時候,iscsid和iscsiadm會讀取這兩個配置檔案。

service iscsid [status|start]

service iscsi status 檢視iscisi的資訊,隻有在連接配接成功後才輸出

這裡可能遇到start始終沒有啟動成功的資訊輸出,請繼續往下執行discovery,一般會啟動iscsid。

open-iscsi包括兩個守護程序iscsid和iscsi,其中iscsid是主程序,iscsi程序則主要負責根據配置在系統啟動時進行發起端(initiator)到服務端(target)的登入,建立發起端與服務端的會話,使主機在啟動後即可使用通過iscsi提供服務的儲存設備。

iscsid程序實作iscsi協定的控制路徑以及相關管理功能。例如守護程序(指iscsid)可配置為在系統啟動時基于持久化的iscsi資料庫内容,自動重新開始發現(discovery)目标裝置。

open-iscsi是通過以下iscsi資料庫檔案來實作永久配置的:

discovery (<code>/var/lib/iscsi/send_targets</code>)

在 /var/lib/iscsi/send_targets 目錄下包含iscsi portals的配置資訊,每個portal對應一個檔案,檔案名為“iscsi portal ip,端口号”(例如<code>172.29.88.61,3260</code>)。

node (<code>/var/lib/iscsi/nodes</code>)

在 /var/lib/iscsi/nodes 目錄下,生成一個或多個以iscsi存儲伺服器上的target名命名的檔案夾如<code>iqn.2000-01.com.synology:themain-3rd.ittest</code>,在該檔案夾下有一個檔案名為“iscsi portal ip,編号” (例如<code>172.29.88.62,3260,0</code>)的配置參數檔案default,該檔案中是initiator登入target時要使用的參數,這些參數的設定是從<code>/etc/iscsi/iscsi.conf</code>中的參數設定繼承而來的,可以通過iscsiadm對某一個參數檔案進行更改(需要先登出到target的登入)。

<code>iscsiadm</code>是用來管理(更新、删除、插入、查詢)iscsi配置資料庫檔案的指令行工具,使用者能夠用它對iscsi nodes、sessions、connections和discovery records進行一系列的操作。

iscsi node是一個在網絡上可用的scsi裝置辨別符,在open-iscsi中利用術語node表示目标(target)上的門戶(portal)。一個target可以有多個portal,portal 由ip位址和端口構成。

initiator名稱用來唯一辨別一個iscsi initiator端。儲存此名稱的配置檔案為<code>/etc/iscsi/initiatorname.iscsi</code>:

注意大小寫,同時,必須頂格寫,xxxx代表要設定的initiator名稱,請遵循iqn命名規範,格式為iqn.domaindate.reverse.domain.name:optional_name。

iscsi initiator的配置檔案為<code>/etc/iscsi/iscsid.conf</code>,在iscsi initiator的iscsid程序啟動和執行iscsiadm指令時,将讀取這個配置檔案的内容,擷取與scsi目标進行互動的相關資訊。

本組下的各個設定項主要用來指定initiator與target驗證方式。

上面是在我的環境中最為簡單的一種chap(challenge handshake authentication protocol)認證方式,而且隻驗證的節點會話initiator端。其實iscsi驗證可以是雙向的,根據服務端的設定,可以驗證節點會話的target端(username_in),驗證發現會話的chap initiator,驗證發現會話的chap target。(節點會話node.session即登入認證,發現會話discovery.sendtargets即檢視)

處理chap認證需要關注外,其它的都保持預設即可,但是你需要知道可以修改如:

設定initiator與target端互動的逾時時間

設定iscsid重試登入節點的次數

是否開機啟動iscsid等待

open-iscsi initiator-utils提供的管理指令為<code>iscsiadm</code>,此指令包括discovery、node、session幾種模式,分别處理不同的情況。在用戶端使用target提供的存儲空間前,必須在伺服器上通過initiator軟體執行以下步驟:發現目标裝置 --&gt; 登入目标裝置 --&gt; 與目标裝置建立會話,下面分别說明通過各個指令進行說明。

可以通過sendtargets方式(根據iscsi伺服器端使用的方式不同還有slp、isns)發現屬于你的iqn(iscsi qualified name):

預設端口3260。discovery之前會自動啟動iscsid服務,有時候<code>service iscsid start</code>啟動沒反應,可以通過這種方式啟動服務。

此指令查詢目标門戶(portal)為172.29.88.62:3260上的目标,查找成功後,傳回相應的target id,同時在<code>/var/lib/iscsi/send_targets</code>和 <code>/var/lib/iscsi/nodes</code>目錄下記錄相應的門戶和節點資訊。使用<code>iscsiadm -m node</code>指令,可以檢視到發現的節點記錄。

在完成目标發現後,即可以登入到相應的節點,使用目标裝置提供的存儲空間:

<code>-t</code>後面跟target名稱,<code>--login</code>等同于<code>-l</code>,

登入目标節點成功後,即建立了initiator與target之間的會話(session),同時target提供的儲存設備也挂載到主機中,在/dev目錄下生成一個新的裝置檔案類似于sdb、sdc等。使用<code>iscsiadm -m session -p 3</code>(與<code>service iscsi status</code>相同)來檢視連接配接會話資訊。

lvm是非常流行的可修改磁盤分區大小的管理方式,可以根據你的需要使用使用lvm管理磁盤。

假設新存儲的裝置路徑為<code>/dev/sdb</code>

在vg_ittest卷組上建立名為lv_static的邏輯卷,-l可指定分區大小,此處-l表示使用全部空間

格式化完畢後,使用mount指令挂載即可:

也可以根據需求劃分成多個分區挂載。

開機自動挂載

因為磁盤上就是資料(一般網絡存儲用于備份),是以盡量減少異常斷開存儲的可能性,是以保險起見先解除安裝,再斷開連接配接(<code>-u</code>)。

如果使用lvm管理磁盤,由于網絡中斷,或主機突然關機,會導緻網絡存儲異常斷開,下次啟動後重新連接配接可能會報如下錯誤:

産生原因就是,在卷組(vg)失活(deactivate)之前就移除了外部的lvm裝置。在你斷開連接配接之前,需要保證以下指令被執行:

解決方案就是,(假設你已經用<code>vgchange -ay vg</code>指令來激活卷組,但仍有 input/output error 的錯誤資訊。)執行指令<code>vgchange -an volume group name</code>,移除外部裝置,稍候幾分鐘後再執行以下指令:

iscsi存儲使用正常,但<code>ps -ef|grep iscsi</code>則包含200+以上的類似于<code>[iscsi_q_112]</code>程序,并且無法kill,使用<code>service iscsi status</code>不斷輸出類似:

這個問題很糾結,但重新開機伺服器是可以解決的。網上資料很少,我猜想是iscsid服務端設定認證方面的問題。

列出所有target

<code>iscsiadm -m node</code>

連接配接所有target

<code>iscsiadm -m node -l all</code>

連接配接指定target

<code>iscsiadm -m node -t iqn.... -p 172.29.88.62 --login</code>

使用如下指令可以檢視配置資訊

<code>iscsiadm -m node -o show -t iqn.2000-01.com.synology:rackstation.exservice-bak</code>

檢視目前 iscsi target 連接配接狀态

<code>iscsiadm -m session</code>

iscsiadm: no active sessions.

(目前沒有已連接配接的 iscsi target)

斷開所有target

<code>iscsiadm -m node -u all</code>

斷開指定target

<code>iscsiadm -m node -t iqn... -p 172.29.88.62 --logout</code>

删除所有node資訊

<code>iscsiadm -m node --op delete</code>

删除指定節點(/var/lib/iscsi/nodes目錄下,先斷開session)

<code>iscsiadm -m node -o delete -name iqn.2012-01.cn.nayun:test-01</code>

删除一個目标(/var/lib/iscsi/send_targets目錄下)

<code>iscsiadm --mode discovery -o delete -p 172.29.88.62:3260</code>