要新增 XenServer 的硬碟空間一般方式有3種(不包括 NetApp和 Dell EqualLogic 的 SAN),我最推薦使用的也是透過 iSCSI,不像是 NFS 的缺點 VDI(Virtual disk Image) 硬碟無法放大縮小其使用空間,或是 Hardware HBA 的解決方案,系統必須重新開關機,還需要昂貴的 HBA 和其儲存裝置.而且 XenServer 不一定會支援.
如果採取的是 iSCSI 的解決方案就只需要網卡,但是 XenServer 還是有限制其網卡的種類,通常 Intel 和 Broadcom 都有在其支援列表.如果經費足夠還可以選擇 QLogic 硬體 iSCSI Host Bus Adapter.詳細硬體支援列表請上官方網站查詢 http://hcl.xensource.com/BrowsableNICList.aspx
現在我將使用 RedHat Enterprise Linux 5 作為範例建立一個以 LVM 為基礎的 iSCSI Target.因為 RedHat Enterprise Linux 是為付費的作業系統你也可以考慮 CenOS 或是 Fedoro 做為 iSCSI Target.為什麼要採用 LVM 的格式當作 iSCSI Target 的硬碟裝置,LVM 硬碟的空間是可以放大縮小為了以後可以彈性增加空間,使用 LVM 會比傳統磁區較優.
什麼是 LVM
LVM(Logical Volume Manager)是一種可以動態變更 volume (由 LVM 所切割出來的空間被稱為 volume)大小的方式,可以讓你能更容易利用管理你的硬碟.傳統的硬碟空間在切割完時就決定了大小,如果要重新規劃必須將資料先備份下來,硬碟磁區重新切割才可能有改變原來的硬碟磁區環境.不過 LVM(Logical Volume Manager) 就不同了,如果磁區空間不夠了,你可以隨意將空間放大或是磁區的使用率太低也可以將空間縮小.當我們在放大縮小時這都不影響原先在硬碟上的資料,聽起來很神奇吧!!而且在 RHEL5 提供一隻工具讓 LVM 更方便使用 #system-config-lvm
LVM:重要名詞
下面這一段是直接取用LVM官方說明,這裡只做簡單的中文翻譯.
Physical Volume (PV)
A physical volume is typically a hard disk, though it may well just be a device that 'looks' like a hard disk (eg. a software raid device).
這就是硬碟切割出來的實體partition(/dev/sdb1,/dev/sdc1)
volume group (VG)
The Volume Group is the highest level abstraction used within the LVM. It gathers together a collection of Logical Volumes and Physical Volumes into one administrative unit.
接下來再由多個 PV(/dev/sdb1,/dev/sdc1)建立出的磁區再組合成一個虛擬的磁碟(/dev/volum00,將來使用時這就像是/dev/sda一個真實的磁碟機一樣,但不同於一般磁碟機的是他的大小是可以縮放)
Logical Volume (LV)
The equivalent of a disk partition in a non-LVM system. The LV is visible as a standard block device; as such the LV can contain a file system (eg. /home).
由VG這個虛擬磁碟所切割出來的 partition(/dev/volum00/LVOL1,將來使用時就像/dev/sda1一個真實的磁區一樣,但不同於一般磁區他是可以縮放的)
Physical Extent (PE)
Each physical volume is divided chunks of data, known as physical extents, these extents have the same size as the logical extents for the volume group.
PE就如同是磁碟機在格式化時,每個block的大小.而 PE系統預設大小為4M而一個VG最多可以擁有65534個PE,所以當系統預設時,ㄧ個VG最大尺寸為65534*4M大概為256G.對於現在大硬碟的狀況下很快就無法再延伸了.所以建議在設定PE時指定大小.除了預設的4M外只要是2的倍數在8k-16GB都是可以的範圍.
LVM 的整個架構如下:
整個架構就是將許多的 partition(/dev/sdb1 /dev/sdc1) 組成一個虛擬的磁碟(/dev/vg).之後就可以將它動態切割成你需要大小的 partition(/dev/vg/lv1,/dev/vg/lv2).就可以像一般的 partition 來使用.
系統是否有支援 LVM2
先來檢查檢查你的系統是否有支援 LVM 的功能, RHEL5 預設就包含 LVM 的功能.目前 LVM 是第二版,不過這邊還是稍微談一下 LVM2 ,它是由 3 項東西組合而成.
1. 有將 device-mapper 的功能編譯進核心或是模組,這些功能在中的 Multi-device support (RAID and LVM) 下.
[root@benjr ~]# cat /boot/config-kernel-version | grep -i BLK_DEV_DM CONFIG_BLK_DEV_DM=m
2.device-mapper 的 library (libdevmapper)
[root@benjr ~]# rpm -aq |grep -i device-mapper device-mapper-version
3.LVM2 工具組
[root@benjr ~]# rpm -aq |grep -i lvm lvm2-version
Physical Volume (PV) 的建立
PV 的建立如同切割 partition 使用 #system-config-lvm 選擇要建立 PV 的硬碟 sdb 選擇要 "initialize Entity.這也是可以透過指令來完成 請參考指令版的使用方式 https://benjr.tw/7364
Volume Group (VG) 的建立
有了 PV 就可以開始建立 VG ,在 Unallocated Volumes 找到剛剛建立的 PV,選擇 "Create new Volume Group" 開始建立 VG 主要的選項有5個.
Volume Group Name:
名稱會決定了將來 voulme 裝置名稱(/dev/Volume Group Name/Logical Volume Name).
Maximum Physical Volumes:
通常空間不夠時我們會去串接其他硬碟(PV),這裡就決定了 PV 的最大數量,預設256也絕對夠用了.
Maximum Logical Volumes:
這裡可以設定會來 LV 的多寡,預設是 256,因該都夠使用了不需要特別去修改.
Physical Extent Size:
PE 會限制住 VG 的大小,所以這裡就可以考慮將 PE 設大一點.只要是2的倍數在8k-1GB都是可以的範圍,預設值為 4M.
Clustered:
如果你的 volume 使用在 Cluster 叢集環境才需要勾選,一般我們都是把它當作本地端硬碟所以不需要勾選.
Logical Volume (LV) 的建立
剛建立好 VG 的 vg1 在 Volume Groups 就會看到,現在就可以來建立 LV,點選 "Create New Logical Voumes"
LV name:
名稱會決定了將來 voulme 裝置名稱(/dev/Volume Group Name/Logical Volume Name)
LV Properties:
LVM 提供了三種硬碟對應( mapping )方式,1.Linear 2.Mirrored 3.Striped 預設是 Linear 如果系統只有單獨一個 LVM 時的唯一選擇.如果你系統上 LVM 產生出來的硬碟為多顆時就可以使用另外兩種 2.Mirrored 3.Striped 他們跟 RAID 的概念一致,你可以把它想像成 Soft RAID 的 方式.Mirrored 就像是 RAID 1 ,Striped 就像是 RAID 0
1.Linear
我的環境是利用兩個硬碟 sdb1,sdc1組合成一個 Linear LVM Disk,資料的讀寫時系統會依序下去,當 sdb1 空間用完時才會寫到 sdc1 的硬碟裡面.
2.Mirrored
我的環境是利用兩個硬碟 sdb1,sdc1組合成一個 Mirrored LVM Disk,當資料的讀寫時系統會同時在 sdb1 sdc1 都寫入相同的資料.這就像是 RAID 1.適用於當資料不能遺失的重要資料.
3.Striped
我的環境是利用兩個硬碟 sdb1,sdc1組合成一個 Striped LVM Disk,當資料的讀寫時系統會依序sdb1 ,sdc1 交錯寫入.這就像是 RAID 0.因為資料是交錯的寫入所以在讀寫時可以快速從不同硬碟讀到所需的資料.也因此適用於當負載比較重的資料儲存庫.
Size:
就要這一個 LV(Logic Volume) 需要多大的空間,因為 LVM 的空間是可以依據實據需求做大小的改變,所以這邊你可以隨時做修改.單位有:1.Extents 2.Gigabytes 3.Megabytes 4.Kilobytes.除了 Extents 外其他都是依據我們常在規劃的資料單位(G/M/K Bytes,1G=109 ,1M=1061K=103) 還記得剛剛在切割 Physical Extent Size 時有設定一個大小,Extents 就是用這為單位.剛剛預設單位為 4MBytes.
User remaining:
就是將VG(volume group)所有剩下的空間都規劃成 LV(Logical Volume)
Filesystem:
在切割完成 LV 需要格式化這邊就是可以選擇格式化的檔案格式,預設是不做格式化 None,其他的可以使用的有 Ext3 / Ext2 / GFS(local) / GFS(Clusterd) ,Global File System 不做本範疇的討論中,用最一般的 Ext3 即可.
Mount point:
這邊還可以選擇在格式劃完成後要將這 LV(Logical Volume) 掛載(mount)到哪個目錄下面."mount when rebooted" 直是在下一次開機後還是會自動幫我們這一個 LV(Logical Vloume) 掛載到指定的目錄下,主要他也是將他寫入到 /etc/fstab 檔案中.當目錄不存在時系統會詢問是否要產生 say "yes" 就會幫我們所有的動作都做完.
我們需要的只是一個 raw device 所以不需要格式化或是將它掛載起來,LVM 裝置名稱會因為 VG 和 LV 的命名而有所不同,目前我定義出來的 LV(Logical Volume) 裝置為 /dev/vg1/iscsi ,我們可以在 Volume Groups 可以看到設定好的裝置名稱,現在就要將這一個 LV(Logical Volume) 給 iSCSI Target 當作分享的硬碟裝置.
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
安裝 iSCSI Target /
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 硬體開機的動作.
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) 有興趣的可以參考一下之前的文章 https://benjr.tw/216
安裝啟動 iSCSI target:
在 RHEL5 光碟中的 /ClusterStorage/ 目錄會找到 scsi-target-utils-0.0-0.20070620snap.el5.i386.rpm 檔案這就是 iSCSI Target 的程式.
[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 建立 iSCSI Target controller device
目前我的環境如下所示:
1. RHEL5 Server – 當作 iSCSI Target 端,
2顆硬碟,一個是 OS 另外一個就是給 iSCSI 當做分享出來的 raw devices 所使用.
2. XenServer – 當作 iSCSI Initiator 端.
3.Switch – 因為是 IP-SAN 所以不需要 Fiber switch,原來的 Network Switch 即可使用.建議使用 1Gb 以上的環境.
第一步是新增 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,是自動產生而且一但建立就無法移除.
iSCSI指定硬碟空間給 iSCSI Target
剛剛建立好了 iqn 接下來就是要 指定硬碟空間給 iSCSI Target.
[root@benjr ~]# tgtadm –lld iscsi –op new –mode logicalunit –tid 1 –lun 1 -b /dev/vg1/iscsi
–tid 1 : 還記得剛剛設定的 tid 吧!!
–lun 1 : 除了剛剛自動建立好的 lun 0 ,第一個指定為 lun1,以此類推.
通常 SCSI RAID 會用多顆 SCSI HD 組合成一個邏輯裝置(LUN),SCSI 控制器就可以使用單一的邏輯裝置來做存取. https://benjr.tw/7336
-b /dev/vg1/iscsi : 透過 iSCSI 分享出來的硬碟裝置.我使用的是 LVM 格式.
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 必須都為大寫才會生效))
不過沒人希望什麼阿貓阿狗的 initiators 都來使用我這一台 iSCSI Target.先把 "ALL" 移除.ALL 比較適合使用在 iSCSI Boot.下面使用幾個範例來說明 ACL IP 的指定方式:
[root@benjr ~]# tgtadm –lld iscsi –op unbind –mode target –tid 1 -I ALL [root@benjr ~]# tgtadm –lld iscsi –op bind –mode target –tid 1 -I 192.8.1.126
你除了可以指定特定 IP : 192.8.1.126 的 initiator 可以存取此 iSCSI Target device 外還可以針對相同網域的 IP: 192.8.1.0/24 來設定.
iSCSI CHAP 身分驗證
除了指定 IP 做 ACL 還可以透過 user / password (CHAP-Challenge Handshake Authentication Protocol 使用 MD5 的加密驗證) 來做身分驗證.
CHAP 有很多種除了
1.單向 CHAP 驗證:在此安全性等級,只有目標 Target 會做驗證.另外一種是
2.相互 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 只是多加上一層保護.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: 50G Backing store: /dev/vg1/iscsi Account information: benjr ACL information: ALL
新增儲存裝置 – iSCSI
因為我們只需設定好 iSCSI Target 加上本身的網卡就可以新增硬碟空間,在新增硬碟中的方式是最佳也最方便的選擇.就連 Advanced StorageLink technology 的 NetApp 和 Dell EqualLogic 也是提供 iSCSI Target 的服務給 XenServer.現在選擇新增 "New Storage" 並在 "virtual Disk Storage" 選擇 iSCSI 來新增剛剛設定好的iSCSI Target.
輸入 iSCSI target 的 IP:192.8.115 ,要依實際你的 iSCSI Target IP 輸入. iSCSI 預設使用的 port 是 3260.剛剛有設定 CHAP 的身分驗證 CHAP user : benjr CHAP secret: benjr ,Target IQN 和 LUN 就使用他提供的 Discover IQNs 和 Discover LUNs 讓系統自動去偵測.
之後你在新增 VDI(Virtual disk Image) 就會多了這一個 iSCSI virtual disk storage 的選擇.
當 iSCSI Target 端系統硬碟空間要增加時你可以將 iSCSI Target 的 LVM 磁區變大,但是步驟有點煩雜
第一步需要在 iSCSI virtual disk storage 按右鍵選擇 "Destory Storage Repository" 先將 iSCSI storage 離線.
第二步回到 iSCSI Target 端移除 iSCSI Target 端所分享出來的 /dev/vg1/iscsi 硬碟.
第三步到 LVM 將 /dev/vg1/iscsi 的空間放大.之後重複之前新增 iSCSI Storage Repository 的步驟即可.
你會覺得怎麼這麼麻煩阿!!這是 free 的解決方案,很多步驟都需要自己手動設定.如果經費許可可以考慮 NetApp 和 Dell EqualLogic 的 SAN 解決方案.這兩套都已經直接整合在 XenServer 使用上就不會這麼礙手礙腳的.