Linux ... ...
分类: LINUX
2008-11-21 15:26:46
本文主要介紹 iSCSI:一種在 TCP/IP 網路中使用 SCSI 命令來傳輸資料的標準通訊協定。
以及介紹 Linux 在 iSCSI 方面應用實作。
談到 iSCSI 就會先談到儲存區域網路(Storage Area Network, 簡稱 SAN),這是個專門用來傳輸磁碟資料的網路,以別於一般 TCP/IP 網路,通常預設 SAN 是使用光纖(FC,Fibre Channel)設備,不同的是 iSCSI 預設使用 Gigabit Ethernet(通常是乙太網路銅線)來作傳輸媒介,促使 iSCSI 價格上比 Fibre Channel 低廉許多,這使得 iSCSI 讓許多中小企業能夠以較低門檻就可以實現 SAN 的應用。
在 SAN 中通常有兩個角色「Target」與「Initiator」分別敘述如下:
稱為 Target 的通常是「儲存設備」(Storage Device),也就是存放資料的磁碟(以磁碟陣列居多),在我們使用 iSCSI 期間,會在 iSCSI 儲存設備上去建立 LUN(Logical Unit Number)來提供給有 iSCSI Initiator 功能的主機來存取 iSCSI 儲存設備。
Initiator 主要功能是提供電腦主機連線到 Target 作磁碟存取。這個 Initiator 可使用硬體方式 Initiator 或者軟體方式 Initiator,底下在 Linux iSCSI 實做,皆是使用軟體方式 Target 與 Initiator。
iSCSI(Internet SCSI):一種主要應用在儲存區域網路(SAN)通訊協定,iSCSI 將 SCSI 命令運行在 TCP/IP 網路上,用以傳輸磁碟資料。iSCSI 在 OSI 七層模型中屬於傳輸層(Transport Layer)的通訊協定,提供給 iSCSI Target 與 iSCSI Initiator 之間溝通。
經由 iSCSI 技術,我們能夠提供 Block-Level I/O 給 Initiator 主機,其目的不外乎是「將磁碟排線網路化」、「把這台主機(Target 主機)幻化成另一台主機(Initiator 主機)的磁碟」以達成更大空間、更高 I/O 速度及具有冗餘與高延展度的應用,類似 iSCSI 技術還有 Fibre Channel、AoE(ATA Over Ethernet)。
這次測試主機共三台(實際上只有兩台硬體),一台 Windows XP、一台 Linux 利用 Xen 虛擬機器技術偽裝成兩台 Fedora Core 5 Linux,相關資訊如下:
用途(作業系統) | 主機 IP 位址 |
Target 主機(Linux) | 172.16.2.101 |
Initiator 主機(Linux) | 172.16.7.120 |
Initiator 主機(Windows XP) | 172.16.7.101 |
這次用來當作 iSCSI Target 主機是一台標準安裝的 Fedora Core 5 主機,因為 Fedora Core 5 沒有內建 iSCSI Target 軟體,所以我們只好手動編譯一個名為「iSCSI Enterprise Target」軟體來使用。
我們使用的軟體簡稱為「iscsitarget」網址「」此軟體可於本頁 超連結『sourceforge site』連到「」下載 到,終至筆者截稿前(2006年9月),最新的是 0.4.13 版,下載到的檔案名稱為「iscsitarget-0.4.13.tar.gz」。
第一步:使用指令「 tar -zxf iscsitarget-0.4.13.tar.gz」解開下載的 tar.gz 檔並生成「iscsitarget-0.4.13」這個目錄與其下許多檔案。
第二步:使用指令「 cd iscsitarget-0.4.13」切換至剛才產生的 iscsi 原始碼目錄內,接著使用指令「make」來編譯程式。
下圖為 gcc 還沒安裝前發生編譯錯誤的畫面。
筆者使用指令「rpm -ivh gcc-4.1.0-3.i386.rpm binutils-2.16.91.0.6-4.i386.rpm glibc-devel-2.4-4.i386.rpm glibc-headers-2.4-4.i386.rpm libgomp-4.1.0-3.i386.rpm」將 gcc 與其相依套件,包括 binutils、glibc-devel、glibc-headers 和 libgomp 都一併裝起來。
安裝 gcc 與其相依軟體的畫面
裝好 gcc 後,繼續執行編譯動作,也就是回到 iscsi 原始碼目錄執行「make」命令。
於編譯期間因缺少 openssl-devel 套件發生錯誤的快照
與缺少 gcc 套件的解決方法類似,使用指令「rpm -ivh openssl-devel-0.9.8a-5.2.i386.rpm krb5-devel-1.4.3-4.1.i386.rpm zlib-devel-1.2.3-1.2.1.i386.rpm e2fsprogs-devel-1.38-12.i386.rpm」將 openssl-devel 與其相依套件,包括 krb5-devel、zlib-devel 和 e2fsprogs-devel 都一併裝起來。
安裝 openssl-devel 與其相依軟體的畫面
於編譯期間因缺少核心原始碼『kernel-devel』套件發生錯誤的快照。
將 kernel-devel 套件與相依的 hardlink 套件裝起來,注意到 kernel-devel 有許多版本,請選擇與您的主機執行命令「uname -r」顯示出來的相同版本安裝即可,通常安裝 i686 版,鮮少發生有 i686 版本卻安裝 i586 版本的情形,因為不能使用 i686 版本卻只能使用 i586 版本軟體的電腦主機(586 規格)已經不常見。
安裝 kernel-devel 與其相依軟體的畫面
繼續執行「make」命令,這一回應該不會出錯了。
第三步:執行「make install」將編譯好的程式安裝到系統內,包括『iSCSI Target 程式』以及『iSCSI Target 核心模組』。
在安裝完畢 iscsitarget 軟體後,接著需了解其相關程式、設定檔、啟停方式、規格與所使用埠號,來完成最簡易版的 iSCSI Enterprise Target 設定。
iscsitarget 支援 Linux 常用 InitScripts 方式,也就是使用「/etc/init.d/iscsi-target」來控制 iscsi-target 服務,只要在執行「/etc/init.d/iscsi-target」最後面補上 start 或 stop 即可作啟動與停止的動作,在 RedHat / Fedora 系列 Linux 也可以使用「service iscsi-target」來控制啟停。
至於開機預設啟動 iscsi-target 則是使用 chkconfig 來調整,使用指令「chkconfig --add iscsi-target」將 iscsi-target 加入服務列表;使用「chkconfig --list iscsi-target」列出開機預設是啟動還是停用;使用「chkconfig iscsi-target on」來設定開機預設啟動(on 啟動,off 關閉)。
InitScripts、service 與 chkconfig 的指令操作畫面
iSCSI Target 端主機預設使用 tcp 埠號 3260 來服務,這項資訊可用來「設定防火牆」,使用封包過濾(Packet Filter)防火牆來規範來源端主機 IP 也算是的方法,另外 iscsitarget 也有內建「以主機為基礎」(Host-Based)防護機制,這機制類似 Linux/Unix 上常用 TCP Wrapper 方式(/etc/hosts.allow、/etc/hosts.deny)。我們使用的 Fedora Core 5 內建防火牆是不開放這個 3260 埠號,所以有啟動防火牆功能請記得放行(若不熟悉防火牆的讀者請先暫時關閉防火牆)。
開啟「/etc/sysconfig/iptables」(Fedora Core 5 防火牆設定檔),仿造 --dport 22 那一行(這行就是放行 sshd 服務,埠號 22),新增一行開放 3260 埠號,接著使用指令「service iptables restart」來重新啟動 iptables 服務即完成放行 iSCSI Target 服務埠號 3260。
檔案「/etc/sysconfig/iptables」修改情形
iSCSI Enterprise Target Daemon 名稱 ietd 使用 /etc/ietd.conf 當作設定檔,您可以在原始碼目錄(iscsitarget-0.4.13)內的 etc 目錄下找到設定範本,範本內大多是「#」字號開頭的註解,有需要用到這些設定時再將註解拿掉設定調整即可。
將範本設定檔拷貝一份到 /etc 再來設定 /etc/ietd.conf 是個不錯的開始。接著開啟 /etc/ietd.conf 內容,看到這一行「Target iqn.2001-04.com.example:storage.disk2.sys1.xyz」這是 Target 名稱,稱作『iSCSI Qualified Name』(簡稱:iqn),這格式在 iSCSI 規格書中有詳細說明,筆者簡介如下:
iqn.yyyy-mm.
格式 | 意義 | 範例 |
yyyy-mm | 年份-月份 | 2001-04 |
reversed domain name | 倒過來的網域名稱 | com.example |
identifier | 識別代號 | storage.disk2.sys1.xyz |
接下來就是要設定 LUN(Logical Unit Number),找到「#Lun 0 Path=/dev/sdc,Type=fileio」這一行並複製貼上後,將『#』註解拿掉並將 Path 改成您提供的磁碟名稱,此例為「Path=/root/test.iso」。
ietd.conf 設定情形
下一步就是製作方才設定 /root/test.iso 檔案
使用指令「dd if=/dev/zero of=/root/test.iso count=1 seek=1048576」製作出一個約 512 MB 、檔名為 test.iso 檔案於 /root 目錄下。指令的參數解釋如下,若對「dd」指令想要進一步了解,可執行指令「man dd」參考 dd 指令的說明文件。
if 指向來源檔案 /dev/zero
of 指向目的檔案 /root/test.iso
count 次數
seek 目的忽略幾個 blocks
製作好 /root/test.iso 檔案後,使用指令「/etc/init.d/iscsi-target start」來啟動 iscsi-target Daemon。
設定到此,Target 主機調整的部份也告一個段落,接下來介紹 Windows 與 Linux 如何裝上 iSCSI Initiator 軟體來使用 iSCSI Target 所提供出去的區塊裝置(磁碟裝置)。
/root/test.iso 檔案製作情形與啟動 iSCSI Target Daemon
微軟自 2003 年就已經完成 iSCSI Initiator 相關軟體支援,網址「http: //」 可以看到微軟對於 iSCSI 支援不遺餘力。
下載 iSCSI Initiator for Windows 軟體,可從此頁面中間「iSCSI Software Initiator v2.0 iSCSI Software Initiator v2.0」超連結來到下載頁面,接著以下載並安裝 Initiator-2.02-QFE-bld1895-x86fre.exe 為例,來說明 Windows 如何連接 iSCSI Target。
下載完成 Initiator-2.02-QFE-bld1895-x86fre.exe 後,緊接著就是執行她來安裝 Initiator,依照安裝精靈指示,一步一步來完成安裝程序即可。
安裝完成 iSCSI Initiator 後,在桌面上就會發現啟動圖示(或是在程式集內也有),啟動後先選擇第二個分頁標籤『Discovery』上半框『Target Portals』點選『Add』跳出『Add Target Portal』視窗後,將之前 Linux 作成 iSCSI Target「 IP 位址或 DNS 主機名稱」輸入到『IP address or DNS name』欄位中,再點選『OK』即可。
接下來切換到第三個分頁標籤『Targets』,偵測到「iqn」且現在狀態是 inactive(還沒運作),點選下方『Log On』按鈕跳出『Log On to Target』視窗接著按下『OK』按鈕來使這個 Target active(運作)。
得到這個區塊裝置後(Block Device)再來就是使用『磁碟管理』來管理這顆磁碟。
由下圖中可看到磁碟 2 是一個還沒切割、還沒格式化且容量 512 MB 左右的硬碟。
後續於 Windows 做「切割硬碟」、「格式化分割區」以及「掛載分割區」與一般新增硬碟沒什麼差別,故在此就不再贅述。
Linux 在 iSCSI Initiator 支援稍稍比微軟晚些,但由於 iSCSI、Linux 通常都是搭配應用在中、大型系統環境下,所以販售 iSCSI 硬體廠商都會提供驅動程式給 Linux 使用,尤以 RedHat、SuSE 這些 Linux 知名廠商支援度最高,直到最近 2006 年左右,iSCSI 技術日趨成熟、使用機會亦大大提昇下,現在 Linux 都漸漸已經內建 iSCSI Initiator 相關軟體,像是 Fedora Core 5 與 SuSE Linux Enterise Server 10 都不約而同的內建 iSCSI Initiator 軟體,接下來以 Fedora Core 5 為例,來介紹如何在 Linux 實做 iSCSI Initiator。
在 Fedore Core 5 軟體內就有 iSCSI Initiator 檔名為「iscsi-initiator-utils-5.0.5.476-0.1.i386.rpm」
使用指令「rpm -ivh iscsi-initiator-utils-5.0.5.476-0.1.i386.rpm」把她裝起來即可。
使用指令「rpm -qlp iscsi-initiator-utils-5.0.5.476-0.1.i386.rpm」可看到這個套件包含那些檔案與程式,接下來就從這些檔案下手。
第一步:iSCSI Daemon 與啟停方式
iSCSI Initiator Daemon 名稱為 iscsid 可以透過 InitScripts 「/etc/init.d/iscsi start」來啟動,至於停止 iscsid 及設定開機自動啟動 iscsid 與一般 InitScripts 類似就不再多說。
第二步:給 iSCSI Initiator 主機一個名字
當我們第一次執行「/etc/init.d/iscsi start」時,Fedora Core 5 貼心的使用 iscsi-name 指令亂數產生一個 iqn 並設定至 /etc/initiatorname.iscsi 檔案內,就是這台 iSCSI Initiator 主機的 iqn。
第三步:使用 iscsiadm 指令管理連線
使用指令「iscsiadm -m discovery --type sendtargets --portal 172.16.2.101」向 iSCSI Target 主機詢問 Target Record 資訊,其中 172.16.2.101 為 Target 主機 IP 或 DNS 名稱。
使用指令「iscsiadm -m node --record 0aa8ed --login」登入使用這個紀錄(Record),其中 0aa8ed 是之前指令所查出 Record 名稱。
接下來類似「Windows 發現新硬體」的方式,在 Linux 則是使用「dmesg」指令觀看最後部份,發現一顆磁碟大小為 512 MB 左右硬碟(例如,sda)。
若是不小心產生多餘磁碟連線,可使用「iscsiadm -m node --record 0aa8ed --logout」來移除連線,指令「fdisk -l」(參數是小寫 L 不是一)列出當下所有能夠使用的磁碟。
接下來在 Linux 「切割磁碟」、「格式化分割區」與「掛載分割區」筆者已於本刊 NetAdmin 第七期-實戰應用篇「ATA+Linux+Ethernet,打造 AoE SAN 實戰攻略」中介紹過。
在此整理一些相關指令提供參考:
切割磁碟 | 格式化分割區 | 掛載與卸載 |
fdisk | mkfs -j(ext3 格式) mkreiserfs(ReiserFS 格式) |
mount / umount |
只要 iSCSI Initiator 主機曾經 sendtargets 過並且 login 相關 record 後(取得磁碟),iSCSI Initiator 會將紀錄寫到 /var/db/iscsi/ 目錄內的 db 檔中(分別為 discovery.db 與 node.db),所以只要在 Initiator 主機使用指令「chkconfig iscsi on」設定下次開機自動啟動 iSCSI Initiator Daemon,就可以辦到『下次開機自動取得 iSCSI Target 磁碟』功能。
筆者這次所使用到 iscsiadm 相關應用指令如下:
『172.16.2.101』為 Target 主機的 IP;『0aa8ed』為 sendtargets 後,所得到的 Record。
用來發現 Target 主機上的 Record | iscsiadm -m discovery --type sendtargets --portal 172.16.2.101 |
用於登入使用這個 Record(取得磁碟) | iscsiadm -m node --record 0aa8ed --login |
用於登出停用這個 Record(釋放磁碟) | iscsiadm -m node --record 0aa8ed --logout |
用來刪除多餘的 Record | iscsiadm -m node --op delete --record 0aa8ed |
使用指令「hdparm -t /dev/sda」,筆者得到數據大約 10 MB/sec 左右,應該是受限於 10/100 Mbps 網路關係,若是應用「Gigabit Ethernet」並且搭配「磁碟陣列」所分配出來 iSCSI 磁碟,應該會有 100 MB/sec 左右的效能。
iSCSI 在安全管理方面有著不錯優勢,能夠使用「以主機為基礎」(Host-Based Allow / Deny)也就是以 IP 為基礎(IP-Based Allow / Deny)設定允許或拒絕存取;除了用 Host-Based Allow / Deny 外,iSCSI 還提供「使用者為基礎」(User-Based)也就是利用帳號密碼認證來完成允許或拒絕存取的設定。
之前我們設定 iSCSI Target 是分享給所有 Initiator 主機都能夠存取(不需帳號密碼),先前有提到能使用 iptables(Linux 防火牆)將 iSCSI Target Daemon 預設連接埠 3260 設定防火牆達到限制 Initiator 主機連線;其實 iSCSI Enterprise Target 軟體本身有內建類似 TCP Wrapper(/etc/hosts.allow、/etc/hosts.deny)的 /etc/initiators.allow、/etc/initiators.deny,接下來示範設定這兩個檔案來限制 Initiator 主機存取。
下表為 TCP Wrapper 與 iSCSI Enterprise Target 相對應檔案(兩者皆位於 /etc 目錄下):
軟體名稱 | 允許列表檔案 | 拒絕列表檔案 |
TCP Wrapper | hosts.allow | hosts.deny |
iSCSI Enterprise Target | initiators.allow | initiators.deny |
邏輯上來說:Allow > Deny > 都沒設定到的預設是「允許」
例一:某台主機在 Allow 列表裡,同時也出現在 Deny 列表裡,結果仍是「允許」(因為 Allow > Deny)
例二:某台主機沒有出現在 Allow 列表裡,但有出現在 Deny 裡,結果是「拒絕」(因為 Deny > 沒設定到」
例三:某台主機沒有出現在 Allow 列表裡,也沒有出現在 Deny 裡,結果是「允許」(因為都沒設定到預設是「允許」)
實戰操作:設定 /etc/initiators.allow、/etc/initiators.deny
從安裝 iSCSI Target 原始碼目錄中(iscsitarget-0.4.13),於 etc 目錄下發現有 /etc/initiators.allow、/etc/initiators.deny 這兩個檔案的範本檔,從內容不難看出其設定方式(#為註解),所以只要將其拷貝到 /etc/(根目錄的 etc)下,再設定即可。
底下列出範本為「只允許 172.16.7.120 這台 Initiator」並「拒絕全部」設定
/etc/initiators.allow 內容,最後一行允許 172.16.7.120(其他三行被#註解)
# Some exmaples
#iqn.2001-04.com.example:storage.disk1.sys1.xyz 192.168.22.2, 192.168.3.8
#iqn.2001-04.com.example:storage.disk1.sys4.xyz [3ffe:302:11:1:211:43ff:fe31:5ae2], [3ffe:505:2:1::]/64
iqn.2001-04.com.example:storage.disk2.sys1.xyz 172.16.7.120
/etc/initiators.deny 內容,最後一行拒絕全部(其他四行被#註解)
# Some exmaples
#iqn.2001-04.com.example:storage.disk1.sys1.xyz ALL
#iqn.2001-04.com.example:storage.disk1.sys2.xyz 192.168.12.2, 192.168.3.0/24, 192.167.1.16/28
#iqn.2001-04.com.example:storage.disk1.sys4.xyz [3ffe:302:11:1:211:43ff:fe31:5ae2], [3ffe:505:2:1::]/64
iqn.2001-04.com.example:storage.disk2.sys1.xyz ALL
為了確保設定正確,請使用不同 IP 之 Initiator 主機連連看是否設定生效,例如另一台 Linux 或是 Windows。
iSCSI Target 使用帳號密碼方式認證分成兩階段:
第一階段是 Discovery 時認證所使用的帳號密碼(SendTargets 用的)。
第二階段是登入各別 Target / iqn / Lun 時所使用的帳號密碼(Login 用的)。
由下圖的上半個視窗可以看到在 Target 主機於 /etc/ietd.conf 設定兩個 Target / iqn / Lun,而下半個視窗可看到 Initiator 主機使用 iscsiadm 指令發現兩個 Target。
帳號密碼層級 | Target 主機設定 /etc/ietd.conf |
Initiator 主機設定 /etc/iscsid.conf |
Discovery 時使用的帳號密碼 (SendTargets 用的) |
IncomingUser joe secret (獨立於 Target 區段外) |
discovery.sendtargets.auth.username = joe discovery.sendtargets.auth.password = secret |
連接 Target / iqn / Lun 時使用的帳號密碼 (Login 用的) |
IncomingUser joe2 secret2 (置於 Target 區段內) |
node.session.auth.username = joe2 node.session.auth.password = secret2 |
Target 主機設定 /etc/ietd.conf 畫面
Initiator 主機設定 /etc/iscsid.conf 畫面
一般若是需要用到 Fibre Channel 等級的設備,無疑是個講求高效能、高穩定度應用;倘若您有「真的需要用到那麼好?」的疑惑,iSCSI 與 AoE 都是較為便宜的方案,這三者雖然都是提供 Block Level I/O 磁碟存取,卻分別在「Target I/O 速度」、「穩定度/成熟度」、「安全管理」與「建置費用及設定難易度」上,有著不同的優勢。
評比項目 | Fibre Channel | iSCSI | AoE(ATA Over Ethernet) |
I/O 速度 | ***** | *** | *** |
穩定度/成熟度 | ***** | **** | **** |
安全管理 | **** | ***** | **** |
知名度 | ***** | **** | *** |
建置費用及 設定難易度 |
*** 設備最貴 設定複雜度中等 |
**** 設備中等價碼 但設定較複雜 |
***** 設備最便宜 設定簡易方便 |
安全管理說明 | 設定光纖交換器 (類似 VLAN 技術) |
以 TCP/IP 為基礎的 Host-Based Allow / Deny 可搭配使用者認證機制 |
實體 Ethernet 區隔 可搭配應用 VLAN 技術 |
歷史淵源與簡介 | 出現時間最早 最為成熟穩定 |
近幾年來流行(2003 年至今) 經常被視為光纖設備取代方案 多家知名廠商大力支援 |
出現時較晚(2004 年左右) 知名度較低,主推簡單與便宜 |
關於 SAN 架構與其相關技術應用未來只會越來越廣,底下舉幾個簡單的應用實例,提供參考:
例一:配合叢集(Cluster)與叢集檔案系統(Cluster File System)的高階應用,像是 RedHat GFS 或是 Oracle OCFS2 檔案系統,提供分享(Shared)Block Level I/O 給多台主機。
例二:配合資料庫叢集應用,像是 Oracle RAC(需運行在 GFS 或 OCFS2 上)。
例三:快速的資料存取,能夠快速的備份/回存資料磁碟,另外若搭配 Xen / VMWare 等等虛擬機器軟體更能夠快速備份/回存作業系統磁碟,達到不需拆卸機殼內硬碟即可快速切換硬碟配置。
例四:對於「肚量不大」主機,像是筆記型電腦、刀鋒伺服器、1U機架型主機或準系統(像是 Mac Mini)一遇到有磁碟 I/O 量大或磁碟空間需求量大時,應用 SAN 架構來擴充磁碟空間以及增加磁碟 I/O 速度不失為一個好方法。