SAN存儲進階,搭建一個自己的SAN環境
學習一項技術最好的方法就是實際操練一把,但是一般人很難接觸到SAN存儲。主要是SAN存儲一般是非常專業的存儲系統,通常比較大型的企業才會使用。而且一般也是用于關鍵業務,所以一般人是很難接觸到SAN存儲的。
如下圖是EMC公司中端存儲Unity的一個GUI界面。左側是導航欄,可以看出功能還是比較豐富的。主要是因為Unity其實不僅僅是一個SAN存儲,而是融合SAN和NAS的統一存儲系統。
前文說了,存儲系統雖然功能豐富,但是我們一般人是接觸不到的。即使一個低配置的Unity都要大幾十萬,所以也不可能自己買一個這樣的存儲系統來學習。那么如果想學習存儲技術怎么辦呢?
圖片
得益于開源社區,我們可以借助一些開源項目來學習存儲相關的技術。如下圖是TrueNAS的一個GUI,可以看出其界面布局和基本功能與Unity有很多相似的地方。TrueNAS是一個免費的存儲系統軟件,我們可以在網上下載其安裝鏡像,并將其安裝在虛擬機當中。TrueNAS基于FreeBSD操作系統,其存儲功能基于ZFS文件系統實現。TrueNAS發源于FreeNAS,最早實現了NAS功能,現在不僅僅NAS,還可以支持SAN。也就是說,其實TrueNAS目前是一個統一存儲系統了。
圖片
TrueNAS的存儲功能基于ZFS文件系統實現,ZFS是一個功能非常強大的文件系統。他不僅僅是一個文件系統,他能對多個硬盤實現池化管理,而且可以在池上創建邏輯卷。同時,他支持快照等高級功能。如圖所示Storage是存儲管理相關的功能,在這里我們可以基于硬盤創建一個存儲池,并且在存儲池的基礎上創建邏輯卷。
圖片
有了邏輯卷就相當于有了存儲資源,然后我們就可以將存儲資源導出,客戶端通過網絡就可以訪問我們的存儲資源了。在GUI的導航欄,Sharing目錄是協議相關的配置功能,通過這里的配置可以將存儲資源導出。我們可以看到這里既包含SAN相關的協議(如iSCSI),也包含NAS相關的協議(如AFP和NFS等)。
圖片
可以說TrueNAS功能是非常強大的,但是我們并不打算深入介紹他,主要是這個系統基于FreeBSD實現,使用不太普遍,不便于后續深入學習。為了方便大家后續學習,我們這里不再繼續介紹TrueNAS,而是以Linux操作系統及其下的軟件為例進行介紹。
在Linux下有很多開源的軟件,完全可以組建一個類似的功能。如果想構建一個IP-SAN環境,主要的軟件是啟動器軟件和目標器軟件。本節我們介紹一下如何基于Linux的開源軟件構建一個IP-SAN存儲系統。
IP-SAN基于以太網構建,所以從拓撲上來說至少應該包含兩臺計算機,一個充當存儲系統的角色,其上運行目標器軟件;另外一個充當計算節點,其上運行啟動器軟件,具體如下圖所示。當然,這兩臺計算機也是可以合并為一臺的。
圖片
Linux環境下開源的目標器軟件很多,比較有名的如LIO、SCST和TGT等。本文就以TGT為例進行介紹,其原因在于TGT是一個用戶態的軟件,門檻比較低,方便我們進一步的學習。大家可以自行從github下載TGT的源代碼并進行編譯(不需要安裝),本文不再贅述。
作者這里代碼在/root/tgt目錄中。同時我們需要用一個100MB文件來模擬存儲端的一個邏輯卷,具體生成文件的方法如下:
dd if=/dev/zero of=./lun bs=1M count=100
完成資源的準備后,我們首先需要將tgt程序運行起來,運行起來也比較簡單,執行編譯完成的程序即可。
./usr/tgtd
軟件啟動起來后,我們就可以進行目標器端的配置了。主要分為三步,分別是創建目標器、創建LUN和關聯目標器與LUN。
1) 創建目標器,具體命令如下
./usr/tgtadm --lld iscsi --op new --mode target --tid 1 -T iqn.1996-05.com.redhat:target.zhang
上述命令的有些選項意義還是比較明確的。這里需要說的的是tid是目標器ID(target ID),T是目標器名稱。
2) 創建LUN,具體命令如下
./usr/tgtadm --lld iscsi --op new --mode logicalunit --tid 1 --lun 1 -b /root/tgt/lun
想目標器添加LUN。這里是想我們前面創建的目標器中添加一個LUN,LUN ID是1,具體存儲數據的單元是一個普通文件/root/tgt/lun。
3)綁定啟動器地址,這個本身相當于權限管理,定義允許訪問該目標器的IP地址。為了簡單,我們這里允許所有的IP訪問該目標器,具體命令如下:
./usr/tgtadm --lld iscsi --mode target --op bind --tid 1 -I ALL
完成上述配置后,啟動器端就可以訪問了。其實啟動器可以是Windows操作系統上的軟件,也可以是Linux上軟件。以Windows上的軟件為例,在啟動器軟件中輸入目標器的IP地址,然后點擊“快速連接”就可以建立與目標器的連接了。
圖片
完成連接后,我們就可以在磁盤管理里面發現系統多出一塊硬盤。打開“磁盤管理”的方法是“Windows” + X。此時可以看到一個菜單,其中某一項為“磁盤管理”。
圖片
如下圖所示為“磁盤管理”的管理界面。從界面上可以看到多出一塊100MB的硬盤。這個硬盤其實就是目標器端我們創建的那個文件。從這里來看,我們看不出這塊硬盤與本地硬盤有任何差異。
圖片
這個硬盤雖然可以在“磁盤管理”里面看到,但是在“我的電腦”里面并看不到。需要我們做一些基本的操作才可以。如下圖所示,右擊左側的文字可以彈出一個菜單,我們可以點擊“初始化磁盤”對該硬盤進行初始化。
圖片
初始化完成后可以基于該硬盤創建一個卷,這樣才能在“我的電腦”看到該硬盤,并可以進行訪問。
圖片
在Linux操作系統下面需要命令行的工具完成相同的功能。這兩行命令的作用是發現目標器,登錄到目標器。
iscsiadm -m discovery -t sendtargets -p 192.168.2.194:3260
iscsiadm -m node –T iqn.1996-05.com.redhat:target.zhang -p 192.168.2.194 -l
登錄成功后可以看到多出一個100MB的硬盤。我們就可以直接使用這個硬盤了。與Windows環境不同,這里不需要對硬盤做初始化的操作。
圖片
經過上述配置后,實際上實現了將服務端的一個文件映射到客戶端變成了一個硬盤,具體可以通過下圖說明說明。
圖片
對于IP-SAN來說,我們集中需要學習的自然是iSCSI協議。有了這個環境,學習iSCSI協議就相對簡單和直觀了。如果沒有這個環境,我們可以通過閱讀RFC來學習iSCSI協議,這種方式過于抽象和單調。有了這個環境,我們就可以通過WireShark來抓包。如下圖是作者抓的登錄過程的數據包,可以看到在該過程中涉及的CDB。
圖片
我們再舉一個具體的例子,比如我們在Linux直接通過dd命令將tgt中的Makefile文件拷貝到硬盤當中。如下是這個Makefile的文件的內容,執行如下命令可以實現數據拷貝。
dd if=./Makefile of=/dev/sdb
圖片
在執行dd命令之前我們需要啟動WireShark來捕獲數據包。如下是我們捕獲到的數據包的內容,可以看到數據包中的內容與文件內容的關系。當然,iSCSI命令本身是比較復雜的,我們后續會對每一個命令和tgt的源代碼進行解析,讓大家對iSCSI有一個比較深入的理解,這里的理解包括命令、體系結構和代碼實現等多個層面。
圖片