RHEL5 - iSCSI(一) 什麼是 SAN / IP-SAN
什麼是 SAN (Storage area Network),他是一種資料儲存裝置(Raw Device),不過他不像是 NAS 可以直接提供存取.他只提供給 Server 資料儲存裝置,讓 Server 能夠有額外的硬碟裝置.因為它可以很彈性的提供給不同的 serve 大小不同的空間,所以常用在大企業中.最早的 SAN 傳輸介面為光纖,但是隨著 1G,10Gb 網卡(有一種專門用在 iSCSI 的網卡,因為有 TOE:TCP/IP offload engine,它具有運算的功能所以不會因此佔用系統上的 CPU 的使用率)的上市,網卡的傳輸頻寬增加,網卡也可以擔任光纖提供的頻寬(光纖的頻寬為 2G,4Gb,光纖短波-850 mm,長波-1310 mm),這個技術稱為 iSCSI(Internet SCSI),也因此以網卡為傳輸為介質的 SAN,被稱為 IP-SAN.
相關廠商 : EMC / NetApp / FalconStor
常見的 IP-SAN 有 iSCSI / FCoE / FCP / AoE
![RHEL5 - iSCSI IP-SAN_san](http://benjr.tw/files/p_w_picpaths/iscsi/ip-san.png)
RHEL5 - iSCSI(二) 安裝 iSCSI Target / initiator
Initiator 指的是 "使用磁碟" 的主機端, Target 指的是 "提供磁碟" 的伺服器端.
iSCSI Target
iSCSI 是一種 SAN的裝置而 SAN的裝置主要是提供 Server 儲存體的空間.相較於傳統的 SAN 是以光纖為傳輸媒體而 iSCSI(Internet SCSI)他是 IP-based 的資料儲存的裝置.使得他能更容易應用在企業中. 1.一般的網卡就能當作 iSCSI Target 但是缺點就是會消耗太多的 CPU 資源,針對這樣的問題所以發展出另外兩種的 iSCSI Target 網卡.2.一種是軟體的 iscsi + TOE (TOE:TCP/IP offload engine),它可以針對 TCP/IP 的封包直接在網路卡上運算所以不會因此佔用系統上的 CPU 的使用率, 3.另外一種就是硬體式的 iSCSI + TOE. 它除了具有 TOE 還可以直接針對 iSCSI 的資料做運算.基本上它的使用上就像是一般儲存裝置 HBA.你可以直接在 BIOS 選項作 iSCSI 硬體開機的動作.
![RHEL5 - iSCSI IP-SAN_休闲_02](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi01.png)
note: SCSI Port - SCSI Protocol
在 RedHat 5 之前的版本是不支援 iSCSI Target 的,所以建議大家使用 iet(iSCSI Enterprise Target) : http://iscsitarget.sourceforge.net/ 但是這一版本的 iSCSI Target 現在看起來已經沒有在更新了加上 RHEL5 已經包含了 iSCSI Target 的服務.所以現在就不再使用 iet(iSCSI Enterprise Target) 有興趣的可以參考一下之前的文章 http://benjr.tw/?q=node/74
安裝啟動 iSCSI target:
在 RHEL5 光碟中的 /ClusterStorage/ 目錄會找到 scsi-target-utils-0.0-0.20070620snap.el5.i386.rpm 檔案這就是 iSCSI Target 的程式.一開始沒選擇全部安裝還需要 perl-Config-General 這一個套件.
[root@benjr ~]# rpm -ivh /media/cdrom/ClusterStorage/scsi-target-utils-0.0-0.20070620snap.el5.i386.rpm |
[root@benjr ~]# service tgtd start |
[root@benjr ~]# chkconfig tgtd on |
安裝啟動 iSCSI initiator:
在 RHEL5 光碟中的 /Server/ 目錄會找到 iscsi-initiator-utils-6.2.0.868-0.18.el5 檔案這就是 iSCSI initiator 的程式
[root@localhost ~]# rpm -ivh iscsi-initiator-utils-6.2.0.868-0.18.el5 |
[root@localhost ~]# service iscsi start |
[root@localhost ~]# chkconfig iscsi on |
RHEL5 - iSCSI(三) 建立 iSCSI Target controller device
目前我的環境如下所示:
1. RHEL5 Server - 當作 iSCSI Target 端,
2顆硬碟,一個是 OS 另外一個就是給 iSCSI 當做分享出來的 raw devices 所使用.
2. RHEL5 Client - 當作 iSCSI Initiator 端.
3.Switch - 因為是 IP-SAN 所以不需要 Fiber switch,原來的 Network Switch 即可使用.建議使用 1Gb 以上的環境.
![RHEL5 - iSCSI IP-SAN_iscsi_03](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_target_initiator.png)
第一步是新增 controller device 其中的 iqn(iSCSI Qualified Name)格式如下 iqn.yyyy-mm.<reversed domain name>[:identifier] 名稱最好是根據 iqn 來命名.不像是 iet(iSCSI Enterprise Target) 是將設定寫在檔案,要使用 tgtd 必須使用指令來完成設定動作.不過很貼心的是你在 /usr/share/doc/scsi-target-utils-0.0/README.iscsi 檔案都可以找到範例.
[root@benjr ~]# tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.2009-4.tw.benjr:storage |
--tid : 這個 id 必須唯一,當我們在指派硬體資源(如硬碟空間)時就是依據此 id 來看是指派給哪一個 iqn.
-T : iqn(iSCSI Qualified Name)
先來看一下剛剛的指令做了什麼.
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store Account information: ACL information: |
lun0 是個用來管理的 controller device,是自動產生而且一但建立就無法移除.
RHEL5 - iSCSI(四) 指定硬碟空間給 iSCSI Target
剛剛建立好了 iqn 接下來就是要 指定硬碟空間給 iSCSI Target.
[root@benjr ~]# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /dev/sdb1 |
--tid 1 : 還記得剛剛設定的 tid 吧!!
--lun 1 : 除了剛剛自動建立好的 lun 0 ,第一個指定為 lun1,以此類推.
通常 SCSI RAID 會用多顆 SCSI HD 組合成一個邏輯裝置(LUN),SCSI 控制器就可以使用單一的邏輯裝置來做存取. http://benjr.tw/?q=node/352
-b /dev/sdb1 : 除了一般 partition 外還可以用 LVM.一般系統廠商所提供的 iSCSI Target 也都是配合 LVM 來運作.
LVM(Logical Volume Manager)是一種可以動態變更磁區大小的方式,可以讓你能更容易利用管理你的硬碟. http://benjr.tw/?q=node/55
除了可以指定一般的 partition 當作 iSCSI Target 端的 Lun 之外還可以使用 file 當作 block device.方式一樣原先指定 partition 給他換成 file 就可以了!不過先要建立一個檔案是空的.
[root@benjr ~]# dd if=/dev/zero of=iscsidisk bs=1M count=1024 1024+0 records in 1024+0 records out 1073741824 bytes (1.1 GB) copied, 18.005 seconds, 59.6 MB/s |
沒有出現錯誤訊息你會看到和我一樣的 lun1 對應到 /dev/sdb1 ,lun2 對應到 /root/iscsidisk
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 LUN: 2 Type: disk SCSI ID: deadbeaf1:2 SCSI SN: beaf12 Size: 1G Backing store: /root/iscsidisk Account information: ACL information: |
先移除掉 lun 2 一開始還不需要這麼多的 lun,移除的指令會在後面說明.
[root@benjr ~]# tgtadm --lld iscsi --op delete --mode logicalunit --tid 1 --lun 2 |
RHEL5 - iSCSI(伍) iSCSI Target ACL
iSCSI Target 預設是不讓任何人存取,除非設定了 ACL(Access Control List). 一開始在實驗階段可以用 ALL 讓任意的 Initiator 都可以存取.
[root@benjr ~]# tgtadm --lld iscsi --op bind --mode target --tid 1 -I ALL |
--tid 1 : 還記得剛剛設定的 tid 吧!!
-I ALL : 不限制任何 IP 的 initiators 都可以來存取這個 iSCSI Target. (-I : 大寫的 i;ALL 必須都為大寫才會生效))
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 Account information: ACL information: ALL |
不過沒人希望什麼阿貓阿狗的 initiators 都來使用我這一台 iSCSI Target.先把 "ALL" 移除.ALL 比較適合使用在 iSCSI Boot.
[root@benjr ~]# tgtadm --lld iscsi --op unbind --mode target --tid 1 -I ALL |
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 Account information: ACL information: |
下面使用幾個範例來說明 ACL IP 的指定方式:
[root@benjr ~]# tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.8.1.121 |
[root@benjr ~]# tgtadm --lld iscsi --op bind --mode target --tid 1 -I 192.8.1.0/24 |
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 Account information: ACL information: 192.8.1.121 192.8.1.0/24 |
你除了可以指定特定 IP : 192.8.1.121 的 initiator 可以存取此 iSCSI Target device外還可以針對相同網域的 IP: 192.8.1.0/24 來設定.
RHEL5 - iSCSI(六) iSCSI initiator
目前 RHEL5 提供一支程式 "iscsiadm" 我們只要透過這一支程式就可以讓 initiator 去連接 Target 端的硬碟. iscsiadm 原自於 open-iscsi 關於指令問題可以參考 http://www.open-iscsi.org/docs/README 的詳細說明.
[root@localhost ~]# iscsiadm -m discovery -t sendtargets -p 192.8.1.55:3260 192.8.1.55:3260,1 iqn.2009-4.tw.benjr:storage |
"iqn.2009-4.tw.benjr:storage" 這就是192.8.1.55:3260 的 iqn.
-p : iSCSI target 的 IP . iSCSI 預設使用的 port 是 3260.
-T : 指定 target_iqn_name
-l: login
[root@localhost ~]# iscsiadm -m node -T iqn.2009-4.tw.benjr:storage -p 192.8.1.55:3260 -l Logging in to [iface: default, target: iqn.2009-4.tw.benjr:storage, portal: 192.8.1.55,3260] Login to [iface: default, target: iqn.2009-4.tw.benjr:storage, portal: 192.8.1.55,3260]: successful |
[root@localhost ~]# iscsiadm -m session tcp: [1] 192.8.1.55:3260,1 iqn.2009-4.tw.benjr:storage |
在 iSCSI Target 端也會看到 iSCSI Initiator 是否有連接.
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: I_T nexus: 4 Initiator: iqn.1994-05.com.redhat:116f23e2ef8 Connection: 0 IP Address: 192.8.1.121 LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 Account information: ACL information: 192.8.1.121 192.8.1.0/24 |
如果成功連接上 iSCSI target它使用的方式就如同一般的硬碟.
[root@localhost ~]# fdisk -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes Device Boot Start End Blocks Id System Disk /dev/sdb: 10.0 GB, 10010133504 bytes Device Boot Start End Blocks Id System |
想登出或是移除 iSCSI initiator 設定時使用:
-u: (logout) 相同 Login 的指令但使用參數 -u
-o delete : 可以移除掉 Target 的連結.只會在下一次重新啟動 iSCSI 才有效.
[root@localhost ~]# iscsiadm -m node -T iqn.2009-4.tw.benjr:storage -p 192.8.1.55:3260 -u Logging out of session [sid: 1, target: iqn.2009-4.tw.benjr:storage, portal: 192.8.1.55,3260] Logout of [sid: 1, target: iqn.2009-4.tw.benjr:storage, portal: 192.8.1.55,3260]: successful |
[root@localhost ~]# iscsiadm -m node -T iqn.2009-4.tw.benjr:storage -p 192.8.1.55:3260 -o delete |
RHEL5 - iSCSI(七) 從 iSCSI Target 移除硬碟
剛剛我們指定了一個硬碟 /dev/sdb1 給 iSCSI Target ,現在我們再透過指令新增另外一個硬碟 /dev/sdb2 ,後面就是這一次的重點如何移除指定好的硬碟.
[root@benjr ~]# tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 2 -b /dev/sdb2 |
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: I_T nexus: 3 Initiator: iqn.1994-05.com.redhat:116f23e2ef8 Connection: 0 IP Address: 192.8.1.121 LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 LUN: 2 Type: disk SCSI ID: deadbeaf1:2 SCSI SN: beaf12 Size: 9G Backing store: /dev/sdb2 Account information: ACL information: 192.8.1.121 192.8.1.0/24 |
透過參數 --op delete 去移除 --lun2 也就是 /dev/sdb2 的硬碟空間.
[root@benjr ~]# tgtadm --lld iscsi --op delete --mode logicalunit --tid 1 --lun 2 |
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: I_T nexus: 3 Initiator: iqn.1994-05.com.redhat:116f23e2ef8 Connection: 0 IP Address: 192.8.1.121 LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 Account information: ACL information: 192.8.1.121 192.8.1.0/24 |
很好 --lun 2 已經不存在了.不過很可惜是剛剛所有使用 tgtadm 指令設定 iSCSI Target 在重新開機後就不存在了,所以建議將剛剛幾個指令寫在 /etc/rc.local 檔案中.
RHEL5 - iSCSI(八) CHAP 身分驗證
除了指定 IP 做 ACL 還可以透過 user / password (CHAP-Challenge Handshake Authentication Protocol 使用 MD5 的加密驗證) 來做身分驗證.
CHAP 有很多種除了
1.單向 CHAP 驗證:在此安全性等級,只有目標 Target 會做驗證.另外一種是
2.相互(Mutual) CHAP 驗證:在此安全性等級,目標 Target 與啟動器 Initiator 皆會被彼此做驗證.最後是
3.Reverse CHAP驗證:一般的 CHAP 使用 one-way hash,密碼檔無法回朔,但是使用 Reverse CHAP 是可以的.關於 Reverse CHAP 目前網路上我還查不太到很多的資料所以無法做說明.
https://fedoraproject.org/wiki/Scsi-target-utils_Quickstart_Guide
先來說明第一種 單向 CHAP 驗證CHAP(Challenge Handshake Authentication Protocol)
預設 iSCSI 採用了 單向 CHAP(Challenge Handshake Authentication Protocol) 的身分驗證方式,基本上是一種以 MD5 的加密驗證方式.方式如下:
1. 在雙方(Target / Initiator) 建立連線後,Target 送出 "challenge" 的訊息告知 Initiator 要做身分驗證.
2. Initiator 會將使用者密碼使用 md5 做 one-way hash 並送出去給 Target 端.
假如使用者密碼是 :123456 ,md5 做過 one-way hash 之後變成 : f447b20a7fcbf53a5d5be013ea0b15af
3. Target 端將以經過 md5 的密碼和 Initiator 做比對,如果比對正確,這身份驗證及成立要不然就會將此次連結做中斷.
Target 端並沒有將原先密碼儲存下來,而是將密碼紀錄成做過 one-way hash 的 f447b20a7fcbf53a5d5be013ea0b15af.如果兩邊的 md5 一樣即代表成立.
4. 在正常連線過程中會不時重復做 1~3 的 CHAP 身分驗證.
為什麼身分驗證會採用 One Way Hashes 其優點是原資料已經不存在,傳送在網路上不需怕密碼檔被盜取.
note : One Way Hashes
One Way Hashes 主要會產生一組固定長度字串(fingerprint or message digests),這組字串用來比對原資料是否遭到修改,它的特性如下
1.原資料輸入長度為可變
2.輸出的 fingerprint 為固定長度
3.當資料任何 byte 改變時, fingerprint 也會變的完全不同
4.我們無法依據 fingerprint 來回推成原資料,這也是為什麼稱為 One Way hash(單方向的資料運算,函數多對一的特性)
既然無法回推成原資料,那怎知資料是否正確, One Way hash 會再將資料再做一次 One Way hash 然後直接比對 fingerprint 是否一樣.
不過所有的連線還是會受到 ACL 的限制, CHAP 只是多加上一層保護.先將之前設定先取消,將 ACL 改成 ALL.
[root@benjr ~]# tgtadm --lld iscsi --op unbind --mode target --tid 1 -I 192.8.1.121 |
[root@benjr ~]# tgtadm --lld iscsi --op unbind --mode target --tid 1 -I 192.8.1.0/24 |
[root@benjr ~]# tgtadm --lld iscsi --op unbind --mode target --tid 1 -I ALL |
iSCSI 的帳號跟本地端的 Linux 帳號密碼無關,所以必須透過 "tgtadm" 來建立.
[root@benjr ~]# tgtadm --lld iscsi --op new --mode account --user benjr --password benjr |
[root@benjr ~]# tgtadm --lld iscsi --op show --mode account Account list: benjr |
帳號是建立好了還要將他指定到哪一個 target.
[root@benjr ~]# tgtadm --lld iscsi --op bind --mode account --tid 1 --user benjr #使用 --op unbind 可以將這使用者從這 iqn 移除. |
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: I_T nexus: 4 Initiator: iqn.1994-05.com.redhat:116f23e2ef8 Connection: 0 IP Address: 192.8.1.121 LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 Account information: benjr ACL information: ALL |
iSCSI initiator 如要使用 CHAP 登入 Target,我們需要修改 /etc/iscsi/iscsid.conf, node.session.auth.username 和 node.session.auth.password 都要修改剛剛設定好的 --user benjr --password benjr .
incoming 或是 outgoing 的 password 和 username 的最大限制是 256 字元.
[root@localhost~]# cat /etc/iscsi/iscsid.conf node.session.auth.username = benjr node.session.auth.password = benjr |
RHEL5 - iSCSI(九) 相互(Mutual) CHAP incoming / outgoing 驗證
相互(Mutual) CHAP 驗證:CHAP 的認證端可為 Target(Incoming Authentication) 或是 Initiator(Outgoing Authentication) 任一端來認證.也就是說 Target(Incoming Authentication) 是由 Target 端為 Initiator 認證.這樣的認證方式可以允許多個 Initiator 來連接到 Target.而 Initiator(Outgoing Authentication) 是由 Initiator 來認證 Target 端.
之前我們都是在 Target 端設定帳號密碼,這就是使用 Incoming Authentication 是由 Target 端為 Initiator 認證.要同時使用 Outgoing Authentication 也很簡單.只要指定 outgoing 的 user 和 password
剛剛已經設定過 Incoming 的認證方式,現在要透過 "tgtadm" 來建立 Outgoing 的認證.
[root@benjr ~]# tgtadm --lld iscsi --op new --mode account --user in_benjr --password in_benjr --outgoing |
[root@benjr ~]# tgtadm --lld iscsi --op show --mode account Account list: benjr in_benjr |
帳號是建立好了還要將他指定到哪一個 target.
[root@benjr ~]# tgtadm --lld iscsi --op bind --mode account --tid 1 --user benjr --outgoing |
[root@benjr ~]# tgtadm --lld iscsi --op show --mode target Target 1: iqn.2009-4.tw.benjr:storage System information: Driver: iscsi Status: running I_T nexus information: I_T nexus: 4 Initiator: iqn.1994-05.com.redhat:116f23e2ef8 Connection: 0 IP Address: 192.8.1.121 LUN information: LUN: 0 Type: controller SCSI ID: deadbeaf1:0 SCSI SN: beaf10 Size: 0 Backing store: No backing store LUN: 1 Type: disk SCSI ID: deadbeaf1:1 SCSI SN: beaf11 Size: 9G Backing store: /dev/sdb1 Account information: benjr in_benjr (outgoing) ACL information: ALL |
iSCSI initiator 如要使用 Outgoing CHAP ,我們需要修改 /etc/iscsi/iscsid.conf, node.session.auth.username_in 和 node.session.auth.password_in 都要修改剛剛設定好的
[root@localhost ~]# cat /etc/iscsi/iscsid.conf node.session.auth.username = benjr node.session.auth.password = benjr node.session.auth.username_in = in_benjr node.session.auth.password _in= in_benjr |
參考文件 : http://linux.vbird.org/somepaper/20081205-rhel5-iscsi.pdf
RHEL5 - iSCSI(十) Intel NIC + iSCSI Remote Boot ROM
一般的網卡可以擔當 iSCSI initiator 的工作,市面上很多的作業系統(Windows, RHEL , SLES) 都以軟體的方式去支援.但是如果你想將作業系統透過遠端的 iSCSI SAN 來啟動,是需要透過硬體的 iSCSI 網卡才有辦法做到.
雖然 RHEL5 在安裝時就可以選擇由 iSCSI Boot . 不過很可惜的是,如果你的 BIOS 不支援從 iSCSI Boot,那安裝完系統後就再也開不了機,因為一般 BIOS 只能從當地端的硬碟開機(硬體的 iSCSI 會被視為當地硬碟),目前只有 EFI(Extensible Firmware Interface,目前是由 Intel 主導,主要目的是取代現前使用的 BIOS) 的系統會支援從 iSCSI Boot ,所以呢!!!一般的網卡是軟體的 iSCSI + TOE 還要有 EFI 才能實現由 iSCSI Boot (硬體的 iSCSI 不在此限).
![RHEL5 - iSCSI IP-SAN_san_04](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_boot01.png)
但是最近在查詢 iSCSI 的資料時發現了 Intel 出了 Intel? iSCSI Remote Boot 這個 ROM 就包含了 iSCSI Boot 的功能.它可以讓你原先的 Intel 網卡直接透過他提供的功能能夠從遠端的 iSCSI 直接開機.下載點在 http://support.intel.com/support/network/iscsi/remoteboot/ 方式也不難.
不過在使用這 Intel? iSCSI Remote Boot 有其限制,它主要是針對Intel PCI-Express Server 等級的 Gigabit family 網卡所設計的.所以如果你手上有下面這幾張卡就可以使用.
- Intel? Gigabit CT Desktop Adapter(Controller:82574L)
- Intel? Gigabit ET Dual Port Server Adapter(Controller:82576)
- Intel? Gigabit EF Dual Port Server Adapter(Controller:82576)
- Intel? Gigabit ET Quad Port Server Adapter(Controller:82576)
- Intel? PRO/1000 PT Quad Port Server Adapter(Controller:82571EB)
- Intel? PRO/1000 PT Quad Port LP Server Adapter(Controller:82571EB)
- Intel? PRO/1000 PF Quad Port Server Adapter(Controller:82571EB)
- Intel? PRO/1000 PT Dual Port Server Adapter(Controller:82571EB)
- Intel? PRO/1000 PF Dual Port Server Adapter(Controller:82571EB)
- Intel? PRO/1000 PT Server Adapter(Controller:82572EI)
- Intel? PRO/1000 PF Server Adapter(Controller:82572EI)
- Intel? Gigabit PT Quad Port Server ExpressModule(Controller:82571)
- Intel? 10 Gigabit AF DA Dual Port Server Adapter(Controller:82598EB)
- Intel? 10 Gigabit AT Server Adapter(Controller:82598EB)
- Intel? 10 Gigabit XF SR Server Adapter(Controller:82598EB)
- Intel? 10 Gigabit XF LR Server Adapter(Controller:82598EB)
- Intel? 10 Gigabit XF SR Dual Port Server Adapter(Controller:82598EB)
- Intel? 10 Gigabit CX4 Dual Port Server Adapter(Controller:82598EB)
這下載檔案中還包含了 iSCSI Remote Boot 的 driver,幾乎是市面上常用的作業系統都包含在裡面.
- Microsoft* Windows* Server 2003 SP1, SP2, R2 x86
- Microsoft Windows Server 2008 x86
- Red Hat* Enterprise Linux 4 U3, Red Hat* Enterprise Linux 5
- Novell SUSE* Linux Enterprise 9 SP3, Novell SUSE* Linux Enterprise 10
更新 iSCSI Remote Boot ROM:
Intel 提供的這一之工具 Intel iSCSI Network Adapter Boot Configuration Utility (iSCSIUtl) 是一隻 DOS 的程式,所以第一步就是先回到 DOS 先行更新 Intel NIC firmware 的 iSCSI Remote Boot ROM.在剛剛下載的檔案中解開後會發現目錄 iSCSIUtl\DOS\iscsiutl.exe 就是更新 Intel NIC 的 iSCSI Remote Boot ROM 的主程式.使用方式也很簡單:
iSCSIUtl -[OPTION] or -[OPTION]=[VALUE]
C:\iscsiutl -all -up
Intel(R) iSCSI Boot Utility
iSCSIUtl version 2.3.17.00
Copyright (C) 2003-2009 Intel Corporateion
Programming flash on part 1 with iSCSI Boot p_w_picpath
An Intel(R) Boot Agent setting has been detected on this device. Programming
this device with Intel(R) iSCSI Boot will erase this setting.
Would you like to continue? (Y)es or (N)o:Y
*
Flash update successful.
Flash not enabled on port 2
Use the "-FLASHENABLE" parameter to enable to flash
Port Network Address Series WOL Boot ROM Type Version
==== =============== ====== === ======================= =======
1 001517785DD6 Gigabit YES iSCSI Enabled 2.3.17
2. 001517785DD7 Gigabit N/A FLASH Disabled 2.3.17
|
上面的指令會找出任何包含 pre-installed Intel Boot Agent p_w_picpath 的網卡,通常兩個埠的網卡第一個埠會被更新.系統會詢問你是否更新回答 Y(yes) 系統就會開始更新,如果你需要更新其他的網路埠時可以指定埠來更新.
ISCSIUTL -NIC=1 -FLASHENABLE
等系統重新開機後你會發現 Intel 的網卡的 Option ROM 變的不一樣.
Intel(R) iSCSI Boot version 2.3.17 Copyright (c) 2003-2009 Intel Corporation. All rights reserved. Press ESC key to skip iSCSI boot initialization. Press <Ctrl-D> to run setup... |
按下 <Ctrl-D> 就可以進入 Intel iSCSI Remote Boot 的 Option ROM.針對 iSCSI initiator 端作設定.
設定 iSCSI Remote Boot
接下來我們就可以直接在 Intel 的 Option ROM 上設定 iSCSI Target 所指定的 Lun ,如果你沒有硬體的 iSCSI Target 端也沒關係,你可以先用 RHEL5 的 iSCSI Target 端的功能 RHEL5 - iSCSI IP-SAN 先進入 Intel iSCSI Remote Boot 的 option ROM.
![RHEL5 - iSCSI IP-SAN_休闲_05](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_remote_boot02.png)
進入 iSCSI Remote Boot Port Selection Menu 你可以看到目前系統所有的 Intel iSCSI Remote Boot-capable adapters.你可以在此頁面看到系統上 Intel 網卡的 PCI device ID, PCI bus/device/function 以及 MAC Address
這裡最多可以顯示出來 10 iSCSI Remote Boot-capable ports ,超過系統就顯示不出來了,我想一台 Server 要超過 10 個網路埠的機會不大.這裡需要做說明的是 iSCSI Remote Boot status ,也就是顯示在最後的 BOOT:PRIMARY, BOOT:DISABLED
Boot 的選項可以分成下面幾種.
- Primary:
當網路埠選擇成 Primary(按 'P' 鍵可以把狀態改變成 Primary) Intel iSCSI Remote Boot 會以此當作連上 iSCSI Target 為第一優先設定值.當系統有多個網路埠時只能有一個 Primary.
- secondary:
當網路埠選擇成 secondary(按 'S' 鍵可以把狀態改變成 secondary) , 只有當 Primary 連線失敗時 secondary 才會向 iSCSI Target 要求連線.當系統有多個網路埠時只能有一個 secondary.
- 按 'D' 鍵可以把 iSCSI Remote Boot 網路埠的功能暫停使用.
- 按 'B' 鍵可以讓網路埠的 LED 閃爍.
- 按 'ESC' 鍵可以離開設定.
前面更新 iSCSI Boot ROM 時我只針對一個 port 做更新,所以我們只會看到一個狀態是 PRIMARY 另外一個是 DISABLED.
![RHEL5 - iSCSI IP-SAN_职场_06](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_remote_boot03.png)
- iSCSI Remote Boot Configuration
這邊的設定就是 iSCSI Remote Boot initiator 和 target 的選項包括了 IP ,name 以及 Boot Lun 皆是在裡設定.
- CHAP Configuration
預設 iSCSI 採用了 CHAP(Challenge Handshake Authentication Protocol) 的身分驗證方式,基本上是一種以 MD5 的加密驗證方式.如果你的系統有採用密碼的保護就需要在這裡做設定.
- Discard Changes and Exit
如果剛剛在 iSCSI Remote Boot Configuration 或是 CHAP Configuration 設定不滿意選擇"Discard Changes and Exit" 系統就不儲存剛剛所有的設定了.並且回到上一層 "iSCSI Remote Boot Port Selection Menu
- Save Changes and Exit
選擇 "Save Changes and Exit" 就可以將剛剛在 iSCSI Remote Boot Configuration 或是 CHAP Configuration 所設定的記錄下來,並且回到上一層 "iSCSI Remote Boot Port Selection Menu
我們先來設定 "SCSI Boot Configuration"
![RHEL5 - iSCSI IP-SAN_iscsi_07](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_remote_boot04.png)
設定可以分成 "Initiator" 和 "Target" 端,上面那一部分就是本機 "Intel iSCSI Remote Boot " 也就是 "Initiator" 端的設定.
- Use Dynamic IP Configuration (DHCP)
如果你的 DHCP 有針對 iSCSI 設定你只要直接勾選由 DHCP 指派 client IP address, subnet mask, and gateway IP address.
- Initiator Name
這裡就是設定 iSCSI initiator name 主要是為了讓 iSCSI target 可以辨識 Intel iSCSI Remote Boot 的名稱.
- Initiator IP
設定固定的 IP 這 IP 必須要和 Target 同網段也必須能和 Target 建立連線.
- Subnet Mask
IP 的 subnet-mask 取決於你的網路 IP 的網段.
- Gateway IP
當你的 Target 和 Initiator 處於不同網段時需要 gateway 來轉送封包.
下面半步就是 Target 端的設定,除了 Target Name(就是 IQN ) 輸入時注意不要打錯外,其他就是 iSCSI Target 端的 IP.
- Use DHCP for iSCSI Target Information
如果你的 DHCP 有針對 iSCSI 設定你只要直接勾選由 DHCP 指派 iSCSI target's IP address, IP port number, iSCSI target name, and SCSI LUN ID.
- Target Name
Target 端的 IQN (iSCSI Qualified Name)格式如下 iqn.yyyy-mm.<reversed domain name>[:identifier] .
- Target IP
iSCSI Target 端的 IP 位置.
- Target Port
iSCSI 所使用的 TCP Port Number(預設為 3260).
- Boot LUN
通常 SCSI RAID 會用多顆 SCSI HD 組合成一個邏輯裝置(LUN),SCSI 控制器就可以使用單一的邏輯裝置來做存取,通常 LUN 是由 0 開始但是 RHEL5 的 iSCSI Target 的 lun0 是用來當作管理控制 controller device.
iSCSI 採用 CHAP-Challenge Handshake Authentication Protocol(以 MD5 為基礎的加密驗證),來做身分驗證. 單向 CHAP 驗證:在此安全性等級,只有目標 Target 會做驗證.
![RHEL5 - iSCSI IP-SAN_休闲_08](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_remote_boot05.png)
- User Name
iSCSI target 端所設定的 CHAP 使用者名稱.
- Target Secret
iSCSI target 端所設定的 CHAP 密碼. 這密碼不可和 Initiator Secret 端所設定的密碼相同.
- Use Mutual CHAP
相互(Mutual) CHAP 驗證,在此安全性等級,目標 Target 與啟動器 Initiator 皆會被彼此做驗證
- Initiator Secret
iSCSI Initiator Mutual CHAP 密碼.這密碼不可和 Target Secret 端所設定的密碼相同.
如果沒有設定上的錯誤登出之後你可以看到系統會多出一個 iSCSI 的 drive.
Intel(R) iSCSI Boot version 2.3.17 Copyright (c) 2003-2009 Intel Corporation. All rights reserved. Press ESC key to skip iSCSI boot initialization. Initializing adapter configuration - MAC address(001517785DD6). Attempting to connect to target disk using MAC address(001517785DD6) |
BIOS Boot Menu
更新完 Intel iSCSI Remote Boot 後在 BIOS 的 Boot Menu 會多出一個 Intel? iSCSI Remote Boot 的選項.下面你看到的是我 IBM 的 Server 每一家的 Boot Menu 顯示出來的都不盡相同.
![RHEL5 - iSCSI IP-SAN_休闲_09](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_remote_boot01.png)
自從 RHEL5 開始安裝的時候多了一個選項 "Advanced Storage Configuration" ,這選項就是可以讓你從 iSCSI 開機.步驟如下:
選擇 "Add iSCSI Target" 如果你網路環境沒有 iSCSI Target 可以使用 RHEL5 建立出 iSCSI Target 端的服務 http://benjr.tw/?q=node/434
![RHEL5 - iSCSI IP-SAN_职场_10](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_boot01.png)
Target IP Address :這就是 iSCSI Target 端的 IP
iSCSI initiator Name : iSCSI Target 所指定的 iqn(iSCSI Qualified Name)
![RHEL5 - iSCSI IP-SAN_休闲_11](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_boot02.png)
如果順利完成即刻就會看到 iSCSI Target 所指派的硬碟空間.
![RHEL5 - iSCSI IP-SAN_休闲_12](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_boot03.png)
![RHEL5 - iSCSI IP-SAN_iscsi_13](http://benjr.tw/files/p_w_picpaths/iscsi/iscsi_boot02_0.png)
RHEL5 - iSCSI(十一) MPIO
iSCSI remote boot 可以透過 MPIO(multipath I/O) 來確保他的連線不會因為單一的網路斷線而失去連線,但是這功能是不是用 teaming (teaming 是一個為通過由多個網卡創建的 team,多張網卡視同一張,可以提供負載平衡 load-balancing,容錯 fault-tolerance 的功能) 一樣就可以解決了.為什麼還會用到 MPIO 這東西.
![RHEL5 - iSCSI IP-SAN_iscsi_14](http://benjr.tw/files/p_w_picpaths/iscsi/dm2.png)
圖片出自於 http://www.redhat.com/docs/en-US/Red_Hat_Enterprise_Linux/5/html/DM_Multipath/index.html
關於這一點在 Intel 的官方網站文件 Intel? PRO/1000 Server Adapter iSCSI and iSCSI Remote Boot Frequently Asked Questions -
http://www.intel.com/network/connectivity/products/316975.pdf 有提到,這裡面提到的都屬於硬體的 iSCSI remote boot.
Q18: Does Intel iSCSI boot support adapter teaming?
A18: Adapter teaming is not supported on ports configured for iSCSI remote boot due to limitations in the OS stack, which does not support teaming for iSCSI traffic. Storage failover and load balancing support is provided by using MPIO.
Q16: Is Multipath I/O (MPIO) supported by Intel iSCSI boot?
A16: Intel iSCSI boot solutions use the standard OS iSCSI boot initiators to provide remote boot support, so MPIO and other advanced features are supported for iSCSI boot via the OS initiator once the OS boots.
![RHEL5 - iSCSI IP-SAN_san_15](http://benjr.tw/files/p_w_picpaths/iscsi/dm3.png)
配置 iSCSI 多路境 MPIO(Multipath),需要同網段的網卡兩個埠,目前我的 iSCSI Target 端為 192.8.1.55
[root@benjr ~]# ifconfig | grep 192.8 inet addr:192.8.1.214 Bcast:192.8.1.255 Mask:255.255.255.0 inet addr:192.8.1.85 Bcast:192.8.1.255 Mask:255.255.255.0 |
先確定這兩個埠和 iSCSI Target 互通.
[root@benjr ~]# ping -I eth0 192.8.1.55 |
[root@benjr ~]# ping -I eth1 192.8.1.55 |
iSCSI initiator 預設會依據網路狀態只和 iSCSI Target 建立一個 session,雖然你的網路上同網段的埠有兩個以上.他還是只會建立一個 session.如果我們要使用 iSCSI interfaces (iface) binding 的功能必須要在 /var/lib/iscsi/ifaces 指定多個網路埠.我們可以使用 iscsiadm 的指令來建立.建立 ieth0 和 ieth1
[root@benjr ~]# iscsiadm -m iface -I ieth0 --op=new |
[root@benjr ~]# iscsiadm -m iface -I ieth1 --op=new |
ieth0 和 ieth1 真實會指向實體裝置 eth0 和 eth1
[root@benjr ~]# iscsiadm -m iface -I ieth0 --op=update -n iface.net_ifacename -v eth0 |
[root@benjr ~]# iscsiadm -m iface -I ieth1 --op=update -n iface.net_ifacename -v eth1 |
除了可以指定網路裝置名稱外 ethx 還可以依據網卡的 MAC address 來指定 "iface.hwaddress",確定一下剛剛建立出來的 ieth0 和 ieth1
[root@benjr ~]# iscsiadm -m iface ieth0 tcp,default,eth0 ieth1 tcp,default,eth1 |
iscsiadm 主要會在 /var/lib/iscsi/ifaces 目錄下面建立剛剛所設定的 iface 裝置, iscsiadm 會依據這邊的設定同時向 iSCSI Target 建立連線.
[root@benjr ~]# cat /var/lib/iscsi/ifaces/ieth0 iface.iscsi_ifacename = ieth0 iface.net_ifacename = eth0 iface.hwaddress = default iface.transport_name = tcp |
[root@benjr ~]# cat /var/lib/iscsi/ifaces/ieth1 iface.iscsi_ifacename = ieth1 iface.net_ifacename = eth1 iface.hwaddress = default iface.transport_name = tcp |
當我們只要透過 iscsiadm 這一支程式去向 iSCSI Target 端建立連線時,要特別去指定剛剛我們建立好的 iSCSI interfaces (iface) binding 裝置,這樣就可以讓 iSCSI Initiator 和 iSCSI Target 端建立多條連線.
[root@benjr ~]# iscsiadm -m discovery -t sendtargets -p 192.8.1.55 -I ieth0 -I ieth1 192.8.1.55:3260,1 iqn.2009-4.tw.benjr:storage 192.8.1.55:3260,1 iqn.2009-4.tw.benjr:storage |
"iqn.2009-4.tw.benjr:storage" 這就是192.8.1.55:3260 iSCI Target 的 iqn.
[root@benjr ~]# iscsiadm -m node --loginall=all Logging in to [iface: ieth1, target: iqn.2009-4.tw.benjr:storage, portal: 192.8.1.55,3260] Logging in to [iface: ieth0, target: iqn.2009-4.tw.benjr:storage, portal: 192.8.1.55,3260] Login to [iface: ieth1, target: iqn.2009-4.tw.benjr:storage, portal: 192.8.1.55,3260]: successful Login to [iface: ieth0, target: iqn.2009-4.tw.benjr:storage, portal: 192.8.1.55,3260]: successful |
登入 iSCSI Target 之後我們會發現多出來兩顆硬碟,不管是大小還是狀態都一樣,這就是 iSCSI Initiator 已經和 Target 端透過兩條路徑建立了不同的連線.接下來就需要設定一下所謂的 MPIO , 在 Linux 下是被稱為 device-mapper multipath
[root@benjr ~]# fdisk -l Disk /dev/sda: 500.1 GB, 500107862016 bytes 255 heads, 63 sectors/track, 60801 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System Disk /dev/sdb: 20.0 GB, 20012106240 bytes Device Boot Start End Blocks Id System Disk /dev/sdc: 20.0 GB, 20012106240 bytes Device Boot Start End Blocks Id System |
DM(Device-Mapper) multipath 的設定檔儲存在 /etc/multipath.conf ,我們只需要將系統預設的 blacklist - devnode,將他用 "#"註解掉.讓系統自己來偵測即可.
[root@benjr ~]# vi /etc/multipath.conf blacklist { # devnode "*" } |
DM(Device-Mapper) multipath 的服務名稱為 multipathd ,開機啟動時設定 chkconfig ,立即啟用服務使用 service 程式.
[root@benjr ~]# chkconfig multipathd on Start multipathd:
|
[root@benjr ~]# service multipathd start List multipath devices: |
當我將 "multipathd" 的服務啟動之後使用 multipath 指定來觀看可以發現剛剛由 iSCSI Initiator 連線所建立出來的 2 顆硬碟已經其實是指向同一個 SCSI ID 而 DM-Multipath 也確認的出來.
[root@benjr ~]# multipath -ll mpath1 (16465616462656166313a3100000000000000000000000000) dm-2 IET,VIRTUAL-DISK [size=19G][features=0][hwhandler=0] \_ round-robin 0 [prio=1][active] \_ 7:0:0:1 sdb 8:16 [active][ready] \_ round-robin 0 [prio=1][enabled] \_ 6:0:0:1 sdc 8:32 [active][ready] |
我們也可以透過指令 scsi_id 來檢視硬碟裝置的 ID 是否相同.
[root@benjr ~]# scsi_id -x -g -u -s /block/sdb ID_VENDOR=IET ID_MODEL=VIRTUAL-DISK ID_REVISION=0001 ID_SERIAL=16465616462656166313a3100000000000000000000000000 ID_TYPE=disk ID_BUS=scsi |
[root@benjr ~]# scsi_id -x -g -u -s /block/sdc ID_VENDOR=IET ID_MODEL=VIRTUAL-DISK ID_REVISION=0001 ID_SERIAL=16465616462656166313a3100000000000000000000000000 ID_TYPE=disk ID_BUS=scsi |
我們透過系統就可以觀看到 /dev/dm 的裝置了.這個裝置就如同一般的硬碟裝置,如同 /dev/sda 你可以針對他做分割,格式化,讀寫等動作.而且還具備 MPIO 的功能.
[root@benjr ~]# fdisk -l Disk /dev/dm-2: 20.0 GB, 20012106240 bytes 255 heads, 63 sectors/track, 2433 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Device Boot Start End Blocks Id System |
如果系統沒有自動產生 /dev/dm 的裝置時可以透過程式 kpartx 來產生.
[root@benjr ~]# kpartx -a /dev/mapper/16465616462656166313a3100000000000000000000000000 |
參考資料 : http://blog.chinaunix.net/u3/92556/showart_1842981.html