透過 iscsi 的使用,來提供網路磁碟~
如果你的系統需要大量的磁碟容量,但是身邊卻沒有 NAS 或外接的儲存設備,僅有個人電腦時,那該如何是好? 此時,透過網路的 SCSI 磁碟 (iSCSI) 就能夠有大大的幫助啦!這個 iSCSI 是將來自網路的資料模擬成本機的 SCSI 設備, 因此可以進行諸如 LVM 等方面的實作,而不是單純使用伺服器端提供的檔案系統而已,相當的有幫助喔!
做為伺服器的系統通常是需要儲存設備的,而儲存設備除了可以使用系統內建的磁碟之外,如果內建的磁碟容量不夠大, 而且也沒有額外的磁碟插槽 (SATA 或 IDE) 可用時,那麼常見解決的方案就是增加 NAS (網路附加儲存伺服器) 或外接式儲存設備。再高檔一點的系統,可能就會用到 SAN (儲存區域網路) 這個高貴的玩意兒 (註1)。
不過,不論是哪一種架構,基本上,它們的內部硬碟通常是以磁碟陣列 (RAID) 作為基礎的。磁碟陣列我們在基礎篇第三版的第十五章談過了,這裡就不再囉唆。這裡想要瞭解的是,啥是 NAS 又啥是 SAN ? 這兩者有何不同?與本章主題有關的 iSCSI 又是啥呢?底下就讓我們來談一談。
由於企業的資料量越來越大,而且重要性與保密性越來越高,尤其類似資料庫的內容,常常容量單位是以 TB (1TB = 1024GB) 在進行計算的。哇!真可怕!所以囉,磁碟陣列的應用就很重要了。那麼磁碟陣列通常是在哪裡呢? 磁碟陣列通常是 (1)主機內部有磁碟陣列控制卡,可以自行管理磁碟陣列。不過想要提供磁碟陣列的容量, 得要透過額外的網路服務才行; (2)外接式磁碟陣列設備,就是單純的磁碟陣列設備,必須透過某些介面連結到主機上, 主機也要安裝適當的驅動程式後,才能捉到這個設備所提供的磁碟容量。
不過,以目前的資訊社會來說,你應該很少聽到內建或外接的 RAID 了,常常聽到的應該是 NAS 與 SAN ,那這是啥咚咚? 讓我們簡單的來說說:
基本上,NAS 其實就是一部客制化好的主機了,只要將 NAS 連接上網路,那麼在網路上面的其他主機就能夠存取 NAS 上頭的資料了。簡單的說,NAS 就是一部 file server 囉~不過,NAS 由於也是接在網路上面,所以,如果網路上有某個用戶大量存取 NAS 上頭的資料時,是很容易造成網路停頓的問題的,這個比較麻煩點~低階的 NAS 通常會使用 Linux 系統搭配軟體磁碟陣列來提供大容量檔案系統。不過效能嘛就有待加強啦!此外,NAS 也通常支援 TCP/IP ,並會提供 NFS, SAMBA, FTP 等常見的通訊協定來提供用戶端取得檔案系統。
那為什麼不要直接使用個人電腦安裝 Linux 再搭配相關的服務,即可提供 NAS 預計要提供的大容量空間啦!幹嘛需要 NAS 呢? 因為,通常 NAS 還會包括很多組態的介面,通常是利用 Web 介面來控制磁碟陣列的設定狀況、提供 IP 或其他相關網路設定, 以及是否提供某些特定的服務等等。因為具有較為親和的操作與控制介面,對於非 IT 的人員來說,控管較為容易啦。 這也是 NAS 存在的目的。
不過,目前倒是有類似 FreeNAS 的軟體開發專案 (http://sourceforge.net/projects/freenas/, 註2),可以讓你的 Linux PC 變成一部可透過 Web 控管的 NAS 哩!不過不是本章的重點,有興趣的朋友可以自行前往下載與安裝該軟體來玩玩~
從上面的說明來看,其實那個 NAS 就是一部可以提供大容量檔案系統的主機嘛! 那我們知道單部主機能夠提供的插槽再怎麼說也是有限的! 所以並不能無限制的安插磁碟在同一部實體主機上面。但是如果偏偏你就是有大量磁碟使用的需求,那時該如何是好? 這時就得要使用到 SAN 這玩意兒啦!
最簡單的看法,就是將 SAN 視為一個外接式的儲存設備。只是單純的外接式儲存設備僅能透過某些介面 (如 SCSI 或 eSATA) 提供單一部主機使用,而 SAN 卻可以透過某些特殊的介面或通道來提供區域網路內的所有機器進行磁碟存取。要注意喔,SAN 是提供『磁碟 (block device)』給主機用,而不是像 NAS 提供的是『網路協定的檔案系統 (NFS, SMB...)』!這兩者的差異挺大的喔!因此,掛載使用 SAN 的主機會多出一個大磁碟,並可針對 SAN 提供的磁碟進行分割與格式化等動作。想想看,你能對 NAS 提供的檔案系統格式化嗎?不行吧!這樣瞭解差異否?
另外,既然 SAN 可以提供磁碟,而 NAS 則是提供相關的網路檔案系統,那麼 NAS 能不能透過網路去使用 SAN 所提供的磁碟呢?答案當然是可以啊!因為 SAN 最大的目的就是在提供磁碟給伺服器主機使用,NAS 也是一部完整的伺服器, 所以 NAS 當然可以使用 SAN 啦!同時其他的網路伺服器也能夠使用這個 SAN 來進行資料存取。
此外,既然 SAN 開發的目的是要提供大量的磁碟給使用者,那麼傳輸的速度當然是非常重要的。因此,早期的 SAN 大多配合光纖通道 (Fibre Channel) 來提供高速的資料傳輸。目前標準的光纖通道是速度是 2GB ,未來還可能到達 10GB 以上呢~不過,使用光纖等技術較高的設備,當然就比較貴一些。
拜乙太網路盛行,加上技術成熟之賜,現今的乙太網路媒體 (網路卡、交換器、路由器等等設備) 已經可以達到 GB 的速度了,離 SAN 的光纖通道速度其實差異已經縮小很多啦~那麼是否我們可以透過這個 GB 的乙太網路介面來連接到 SAN 的設備呢?這就是我們接下來要提到的 iSCSI 架構啦! ^_^
早期的企業使用的伺服器若有大容量磁碟的需求時,通常是透過 SCSI 來串接 SCSI 磁碟,因此伺服器上面必須要加裝 SCSI 介面卡,而且這個 SCSI 是專屬於該伺服器的。後來這個外接式的 SCSI 設備被上述提到的 SAN 的架構所取代, 在 SAN 的標準架構下,雖然有很多的伺服器可以對同一個 SAN 進行存取的動作,不過為了速度需求,通常使用的是光纖通道。 但是光纖通道就是貴嘛!不但設備貴,伺服器上面也要有光纖介面,很麻煩~所以光纖的 SAN 在中小企業很難普及啊~
後來網路實在太普及,尤其是以 IP 封包為基礎的 LAN 技術已經很成熟,再加上乙太網路的速度越來越快, 所以就有廠商將 SAN 的連接方式改為利用 IP 技術來處理。然後再透過一些標準的訂定,最後就得到 Internet SCSI (iSCSI) 這玩意的產生啦!iSCSI 主要是透過 TCP/IP 的技術,將儲存設備端透過 iSCSI target (iSCSI 標的) 功能,做成可以提供磁碟的伺服器端,再透過 iSCSI initiator (iSCSI 初始化用戶) 功能,做成能夠掛載使用 iSCSI target 的用戶端,如此便能透過 iSCSI 協定來進行磁碟的應用了 (註3)。
也就是說,iSCSI 這個架構主要將儲存裝置與使用的主機分為兩個部分,分別是:
如下圖所示,iSCSI 是在 TCP/IP 上面所開發出來的一套應用,所以得要有網路才行啊!
由上面的說明中,我們可以知道一部伺服器如何取得磁碟或者是檔案系統來利用呢?基本上就是:
這三個東西與伺服器主機能用的檔案系統之間可以用維基百科的圖示來展示:
從上圖中,我們可以發現在一般的主機環境下,磁碟裝置 (SATA, SAS, FC) 可以透過主機的介面 (DAS) 來直接進行檔案系統的建立 (mkfs 進行格式化),如果想要使用外部的磁碟,那可以透過 SAN (內含多個磁碟的設備),然後透過 iSCSI 等介面來連線, 當然,還是得要進行格式化等動作 (假設這個 SAN 尚未被使用時)。最後,如果是 NAS 的條件下,那麼 NAS 必須要先透過自己的作業系統將磁碟裝置進行檔案系統的建立後,再以 NFS/CIFS 等方式來提供其他主機掛載使用。
接下來,網路伺服器、用戶端系統、NAS 與 SAN 的角色在區網裡面又是如何呢?我們依舊使用維基百科的圖示來說明一下 (DAS 是每部主機內部的磁碟,即底下圖示中的圓柱體):
NAS 可以使用自己的磁碟,也能夠透過光纖或乙太網路取得 SAN 所提供的磁碟來製作成為網路檔案系統,提供其他人的使用。 Server 可以透過 NFS/CIFS 等方式取得 NAS 的檔案系統,當然也能夠直接存取 SAN 的磁碟。用戶端主要則是透過網路檔案系統, 並且直接使用 Server 提供的網路資源 (如 FTP, WWW, mail 等等)。
能夠完成 iSCSI target/initiator 設定的專案非常多 (註4),鳥哥找的到的就有底下這幾個:
由於被我們 CentOS 6.x 官方直接使用的是 tgt 這個軟體,因此底下我們會使用 tgt 來介紹整個 iSCSI target 的設定喔!
CentOS 將 tgt 的軟體名稱定義為 scsi-target-utils ,因此你得要使用 yum 去安裝他才行。至於用來作為 initiator 的軟體則是使用 linux-iscsi 的專案,該專案所提供的軟體名稱則為 iscsi-initiator-utils 。所以,總的來說,你需要的軟體有:
那麼 scsi-target-utils 主要提供哪些檔案呢?基本上有底下幾個比較重要需要注意的:
其實 CentOS 已經將很多功能都設定好了,因此我們只要修訂設定檔,然後啟動 tgtd 這個服務就可以囉! 接下來,就讓我們實際來玩一玩 iSCSI target 的設定吧!
從上面的分析來看,iSCSI 就是透過一個網路介面,將既有的磁碟給分享出去就是了。那麼有哪些類型的磁碟可以分享呢? 這包括:
其實沒有那麼複雜,我們大概知道可以透過 (1)大型檔案; (2)單一分割槽; (3)單一裝置 (包括磁碟、陣列、軟體磁碟陣列、LVM 的 LV 裝置檔名等等) 來進行分享。在本小節當中,我們將透過新的分割產生新的沒有用到的分割槽、LVM 邏輯捲軸、大型檔案等三個咚咚來進行分享。既然如此,那就得要先來搞定這些咚咚囉! 要注意喔,等一下我們要分享出去的資料,最好不要被使用,也最好不要開機就被掛載 (/etc/fstab 當中沒有存在記錄的意思)。 那麼就來玩玩看囉!
既然 iSCSI 要分享的是磁碟,那麼我們得要準備好啊!目前預計準備的磁碟為:
實際處理的方式如下:
# 1. 建立大型檔案: [root@www ~]# mkdir /srv/iscsi [root@www ~]# dd if=/dev/zero of=/srv/iscsi/disk1.img bs=1M count=500 [root@www ~]# chcon -Rv -t tgtd_var_lib_t /srv/iscsi/ [root@www ~]# ls -lh /srv/iscsi/disk1.img -rw-r--r--. 1 root root 500M Aug 2 16:22 /srv/iscsi/disk1.img <==容量對的! # 2. 建立實際的 partition 分割: [root@www ~]# fdisk /dev/sda <==實際的分割方式自己處理吧! [root@www ~]# partprobe <==某些情況下得 reboot 喔! [root@www ~]# fdisk -l Device Boot Start End Blocks Id System /dev/sda10 2202 2463 2104483+ 83 Linux /dev/sda11 2464 3117 5253223+ 8e Linux LVM # 只有輸出 /dev/sda{10,11} 資訊,其他的都省略了。注意看容量,上述容量單位 KB [root@www ~]# swapon -s; mount | grep 'sda1' # 自己測試一下 /dev/sda{10,11} 不能夠被使用喔!若有被使用,請 umount 或 swapoff # 3. 建立 LV 裝置 : [root@www ~]# pvcreate /dev/sda11 [root@www ~]# vgextend server /dev/sda11 [root@www ~]# lvcreate -L 2G -n iscsi01 server [root@www ~]# lvscan ACTIVE '/dev/server/myhome' [6.88 GiB] inherit ACTIVE '/dev/server/iscsi01' [2.00 GB] inherit
iSCSI 有一套自己分享 target 檔名的定義,基本上,藉由 iSCSI 分享出來的 target 檔名都是以 iqn 為開頭,意思是:『iSCSI Qualified Name (iSCSI 合格名稱)』的意思(註5)。那麼在 iqn 後面要接啥檔名呢?通常是這樣的:
iqn.yyyy-mm.<reversed domain name>:identifier
iqn.年年-月.單位網域名的反轉寫法 :這個分享的target名稱
鳥哥做這個測試的時間是 2011 年 8 月份,然後鳥哥的機器是 www.centos.vbird ,反轉網域寫法為 vbird.centos, 然後,鳥哥想要的 iSCSI target 名稱是 vbirddisk ,那麼就可以這樣寫:
另外,就如同一般外接式儲存裝置 (target 名稱) 可以具有多個磁碟一樣,我們的 target 也能夠擁有數個磁碟裝置的。 每個在同一個 target 上頭的磁碟我們可以將它定義為邏輯單位編號 (Logical Unit Number, LUN)。我們的 iSCSI initiator 就是跟 target 協調後才取得 LUN 的存取權就是了 (註5)。在鳥哥的這個簡單案例中,最終的結果,我們會有一個 target ,在這個 target 當中可以使用三個 LUN 的磁碟。
接下來我們要開始來修改設定檔了。基本上,設定檔就是修改 /etc/tgt/targets.conf 啦。這個檔案的內容可以改得很簡單, 最重要的就是設定前一點規定的 iqn 名稱,以及該名稱所對應的裝置,然後再給予一些可能會用到的參數而已。 多說無益,讓我們實際來實作看看:
[root@www ~]# vim /etc/tgt/targets.conf # 此檔案的語法如下: <target iqn.相關裝置的target名稱> backing-store /你的/虛擬裝置/完整檔名-1 backing-store /你的/虛擬裝置/完整檔名-2 </target> <target iqn.2011-08.vbird.centos:vbirddisk> backing-store /srv/iscsi/disk1.img <==LUN 1 (LUN 的編號通常照順序) backing-store /dev/sda10 <==LUN 2 backing-store /dev/server/iscsi01 <==LUN 3 </target>
事實上,除了 backing-store 之外,在這個設定檔當中還有一些比較特別的參數可以討論看看 (man tgt-admin):
上面的設定值要怎麼用呢?現在,假設你的環境中,僅允許 192.168.100.0/24 這個網段可以存取 iSCSI target,而且存取時需要帳密分別為 vbirduser, vbirdpasswd ,此外,不要使用快取,那麼原本的設定檔之外,還得要加上這樣的參數才行 (基本上,使用上述的設定即可,底下的設定是多加測試用的,不需要填入你的設定中)。
[root@www ~]# vim /etc/tgt/targets.conf <target iqn.2011-04.vbird.centos:vbirddisk> backing-store /home/iscsi/disk1.img backing-store /dev/sda7 backing-store /dev/server/iscsi01 initiator-address 192.168.100.0/24 incominguser vbirduser vbirdpasswd write-cache off </target>
再來則是啟動、開機啟動,以及觀察 iSCSI target 所啟動的埠口囉:
[root@www ~]# /etc/init.d/tgtd start [root@www ~]# chkconfig tgtd on [root@www ~]# netstat -tlunp | grep tgt Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:3260 0.0.0.0:* LISTEN 26944/tgtd tcp 0 0 :::3260 :::* LISTEN 26944/tgtd # 重點就是那個 3260 TCP 封包啦!等一下的防火牆務必要開放這個埠口。 # 觀察一下我們 target 相關資訊,以及提供的 LUN 資料內容: [root@www ~]# tgt-admin --show Target 1: iqn.2011-08.vbird.centos:vbirddisk <==就是我們的 target System information: Driver: iscsi State: ready I_T nexus information: LUN information: LUN: 0 Type: controller <==這是個控制器,並非可以用的 LUN 喔! ....(中間省略).... LUN: 1 Type: disk <==第一個 LUN,是磁碟 (disk) 喔! SCSI ID: IET 00010001 SCSI SN: beaf11 Size: 2155 MB <==容量有這麼大! Online: Yes Removable media: No Backing store type: rdwr Backing store path: /dev/sda10 <==磁碟所在的實際檔名 LUN: 2 Type: disk SCSI ID: IET 00010002 SCSI SN: beaf12 Size: 2147 MB Online: Yes Removable media: No Backing store type: rdwr Backing store path: /dev/server/iscsi01 LUN: 3 Type: disk SCSI ID: IET 00010003 SCSI SN: beaf13 Size: 524 MB Online: Yes Removable media: No Backing store type: rdwr Backing store path: /srv/iscsi/disk1.img Account information: vbirduser <==額外的帳號資訊 ACL information: 192.168.100.0/24 <==額外的來源 IP 限制
請將上面的資訊對照一下我們的設定檔呦!看看有沒有錯誤就是了!尤其注意每個 LUN 的容量、實際磁碟路徑! 那個項目不能錯誤就是了。(照理說 LUN 的數字應該與 backing-store 設定的順序有關,不過,在鳥哥的測試中, 出現的順序並不相同!因此,還是需要使用 tgt-admin --show 去查閱查閱才好!)
不論你有沒有使用 initiator-address 在 targets.conf 設定檔中,iSCSI target 就是使用 TCP/IP 傳輸資料的, 所以你還是得要在防火牆內設定可以連線的用戶端才行!既然 iSCSI 僅開啟 3260 埠口,那麼我們就這麼進行即可:
[root@www ~]# vim /usr/local/virus/iptables/iptables.allow iptables -A INPUT -p tcp -s 192.168.100.0/24 --dport 3260 -j ACCEPT [root@www ~]# /usr/local/virus/iptables/iptables.rule [root@www ~]# iptables-save | grep 3260 -A INPUT -s 192.168.100.0/24 -p tcp -m tcp --dport 3260 -j ACCEPT # 最終要看到上述的輸出字樣才是 OK 的呦!若有其他用戶需要連線, # 自行複製 iptables.allow 內的語法,修改來源端即可。
談完了 target 的設定,並且觀察到相關 target 的 LUN 資料後,接下來就是要來掛載使用囉。使用的方法很簡單, 只不過我們得要安裝額外的軟體來取得 target 的 LUN 使用權就是了。
在前一小節就談過了,要設定 iSCSI initiator 必須要安裝 iscsi-initiator-utils 才行。安裝的方法請使用 yum 去處理,這裡不再多講話。那麼這個軟體的結構是如何呢?
老實說,因為 /etc/init.d/iscsi 腳本已經包含了啟動 /etc/init.d/iscsid 的步驟在裡面,所以,理論上, 你只要啟動 iscsi 就好啦!此外,那個 iscsid.conf 裡面大概只要設定好登入 target 時的帳密即可, 其他的 target 搜尋、設定、取得的方法都直接使用 iscsiadm 這個指令來完成。由於 iscsiadm 偵測到的結果會直接寫入 /var/lib/iscsi/nodes/ 當中,因此只要啟動 /etc/init.d/iscsi 就能夠在下次開機時,自動的連結到正確的 target 囉。 那麼就讓我們來處理處理整個過程吧 (註6)!
首先,我們得要知道 target 提供了啥咚咚啊,因此,理論上,不論是 target 還是 initiator 都應該是要我們管理的機器才對。 而現在我們知道 target 其實有設定帳號與密碼的,所以底下我們就得要修改一下 iscsid.conf 的內容才行。
這個檔案的修改很簡單,因為裡面的參數大多已經預設做的不錯了,所以只要填寫 target 登入時所需要的帳密即可。 修改的地方有兩個,一個是偵測時 (discovery) 可能會用到的帳密,一個是連線時 (node) 會用到的帳密:
[root@clientlinux ~]# vim /etc/iscsi/iscsid.conf node.session.auth.username = vbirduser <==在 target 時設定的 node.session.auth.password = vbirdpasswd <==約在 53, 54 行 discovery.sendtargets.auth.username = vbirduser <==約在 67, 68 行 discovery.sendtargets.auth.password = vbirdpasswd [root@clientlinux ~]# chkconfig iscsid on [root@clientlinux ~]# chkconfig iscsi on
由於我們尚未與 target 連線,所以 iscsi 並無法讓我們順利啟動的!因此上面只要 chkconfig 即可,不需要啟動他。 要開始來偵測 target 與寫入系統資訊囉。全部使用 iscsiadm 這個指令就可以完成所有動作了。
雖然我們已經知道 target 的名字,不過,這裡假設還不知道啦!因為有可能哪一天你的公司有錢了, 會去買實體的 iSCSI 陣列嘛!所以這裡還是講完整的偵測過程好了!你可以這樣使用:
[root@clientlinux ~]# iscsiadm -m discovery -t sendtargets -p IP:port 選項與參數: -m discovery :使用偵測的方式進行 iscsiadmin 指令功能; -t sendtargets :透過 iscsi 的協定,偵測後面的設備所擁有的 target 資料 -p IP:port :就是那部 iscsi 設備的 IP 與埠口,不寫埠口預設是 3260 囉! 範例:偵測 192.168.100.254 這部 iSCSI 設備的相關資料 [root@clientlinux ~]# iscsiadm -m discovery -t sendtargets -p 192.168.100.254 192.168.100.254:3260,1 iqn.2011-08.vbird.centos:vbirddisk # 192.168.100.254:3260,1 :在此 IP, 埠口上面的 target 號碼,本例中為 target1 # iqn.2011-08.vbird.centos:vbirddisk :就是我們的 target 名稱啊! [root@clientlinux ~]# ll -R /var/lib/iscsi/nodes/ /var/lib/iscsi/nodes/iqn.2011-08.vbird.centos:vbirddisk /var/lib/iscsi/nodes/iqn.2011-08.vbird.centos:vbirddisk/192.168.100.254,3260,1 # 上面的特殊字體部分,就是我們利用 iscsiadm 偵測到的 target 結果!
現在我們知道了 target 的名稱,同時將所有偵測到的資訊通通寫入到上述 /var/lib/iscsi/nodes/iqn.2011-08.vbird.centos:vbirddisk/192.168.100.254,3260,1 目錄內的 default 檔案中, 若資訊有修訂過的話,那你可以到這個檔案內修改,也可以透過 iscsiadm 的 update 功能處理相關參數的。
因為我們的 initiator 可能會連接多部的 target 設備,因此,我們得先要瞧瞧目前系統上面偵測到的 target 有幾部, 然後再找到我們要的那部 target 來進行登入的作業。不過,如果你想要將所有偵測到的 target 全部都登入的話, 那麼整個步驟可以再簡化:
範例:根據前一個步驟偵測到的資料,啟動全部的 target [root@clientlinux ~]# /etc/init.d/iscsi restart 正在停止 iscsi: [ 確定 ] 正在啟動 iscsi: [ 確定 ] # 將系統裡面全部的 target 通通以 /var/lib/iscs/nodes/ 內的設定登入 # 上面的特殊字體比較需要注意啦!你只要做到這裡即可,底下的瞧瞧就好。 範例:顯示出目前系統上面所有的 target 資料: [root@clientlinux ~]# iscsiadm -m node 192.168.100.254:3260,1 iqn.2011-08.vbird.centos:vbirddisk 選項與參數: -m node:找出目前本機上面所有偵測到的 target 資訊,可能並未登入喔 範例:僅登入某部 target ,不要重新啟動 iscsi 服務 [root@clientlinux ~]# iscsiadm -m node -T target名稱 --login 選項與參數: -T target名稱:僅使用後面接的那部 target ,target 名稱可用上個指令查到! --login :就是登入啊! [root@clientlinux ~]# iscsiadm -m node -T iqn.2011-08.vbird.centos:vbirddisk \ > --login # 這次進行會出現錯誤,是因為我們已經登入了,不可重複登入喔!
接下來呢?呵呵!很棒的是,我們要來開始處理這個 iSCSI 的磁碟了喔!怎麼處理?瞧一瞧!
[root@clientlinux ~]# fdisk -l Disk /dev/sda: 8589 MB, 8589934592 bytes <==這是原有的那顆磁碟,略過不看 ....(中間省略).... Disk /dev/sdc: 2147 MB, 2147483648 bytes 67 heads, 62 sectors/track, 1009 cylinders Units = cylinders of 4154 * 512 = 2126848 bytes Sector size (logical/physical): 512 bytes / 512 bytes Disk /dev/sdb: 2154 MB, 2154991104 bytes 67 heads, 62 sectors/track, 1013 cylinders Units = cylinders of 4154 * 512 = 2126848 bytes Sector size (logical/physical): 512 bytes / 512 bytes Disk /dev/sdd: 524 MB, 524288000 bytes 17 heads, 59 sectors/track, 1020 cylinders Units = cylinders of 1003 * 512 = 513536 bytes Sector size (logical/physical): 512 bytes / 512 bytes
你會發現主機上面多出了三個新的磁碟,容量與剛剛在 192.168.100.254 那部 iSCSI target 上面分享的 LUN 一樣大。 那這三顆磁碟可以怎麼用?你想怎麼用就怎麼用啊!只是,唯一要注意的,就是 iSCSI target 每次都要比 iSCSI initiator 這部主機還要早開機,否則我們的 initiator 恐怕就會出問題。
如果你的 iSCSI target 可能因為某些原因被拿走了,或者是已經不存在於你的區網中,或者是要送修了~ 這個時候你的 iSCSI initiator 總是得要關閉吧!但是,又不能全部關掉 (/etc/init.d/iscsi stop), 因為還有其他的 iSCSI target 在使用。這個時候該如何取消不要的 target 呢?很簡單!流程如下:
[root@clientlinux ~]# iscsiadm -m node -T targetname --logout [root@clientlinux ~]# iscsiadm -m node -o [delete|new|update] -T targetname 選項與參數: --logout :就是登出 target,但是並沒有刪除 /var/lib/iscsi/nodes/ 內的資料 -o delete:刪除後面接的那部 target 連結資訊 (/var/lib/iscsi/nodes/*) -o update:更新相關的資訊 -o new :增加一個新的 target 資訊。 範例:關閉來自鳥哥的 iSCSI target 的資料,並且移除連結 [root@clientlinux ~]# iscsiadm -m node <==還是先秀出相關的 target iqn 名稱 192.168.100.254:3260,1 iqn.2011-08.vbird.centos:vbirddisk [root@clientlinux ~]# iscsiadm -m node -T iqn.2011-08.vbird.centos:vbirddisk \ > --logout Logging out of session [sid: 1, target: iqn.2011-08.vbird.centos:vbirddisk, portal: 192.168.100.254,3260] Logout of [sid: 1, target: iqn.2011-08.vbird.centos:vbirddisk, portal: 192.168.100.254,3260] successful. # 這個時候的 target 連結還是存在的,雖然登出你還是看的到! [root@clientlinux ~]# iscsiadm -m node -o delete \ > -T iqn.2011-08.vbird.centos:vbirddisk [root@clientlinux ~]# iscsiadm -m node iscsiadm: no records found! <==嘿嘿!不存在這個 target 了~ [root@clientlinux ~]# /etc/init.d/iscsi restart # 你會發現唔!怎麼 target 的資訊不見了!這樣瞭了乎!
如果一切都沒有問題,現在,請回到 discovery 的過程,重新再將 iSCSI target 偵測一次,再重新啟動 initiator 來取得那三個磁碟吧!我們要來測試與利用該磁碟囉!
到底 iSCSI 可以怎麼用?我們就來玩一玩。假設:
那麼,整體的流程是:
# 1. 啟動 iscsi ,並且開始偵測及登入 192.168.100.254 上面的 target 名稱 [root@clientlinux ~]# /etc/init.d/iscsi restart [root@clientlinux ~]# chkconfig iscsi on [root@clientlinux ~]# iscsiadm -m discovery -t sendtargets -p 192.168.100.254 [root@clientlinux ~]# /etc/init.d/iscsi restart [root@clientlinux ~]# iscsiadm -m node 192.168.100.254:3260,1 iqn.2011-08.vbird.centos:vbirddisk # 2. 開始處理 LVM 的流程,由 PV, VG, LV 依序處理喔! [root@clientlinux ~]# fdisk -l <==出現的資料中你會發現 /dev/sd[b-d] [root@clientlinux ~]# pvcreate /dev/sd{b,c,d} <==建立 PV 去! Wiping swap signature on /dev/sdb Physical volume "/dev/sdb" successfully created Physical volume "/dev/sdc" successfully created Physical volume "/dev/sdd" successfully created [root@clientlinux ~]# vgcreate iscsi /dev/sd{b,c,d} <==建立 VG 去! Volume group "iscsi" successfully created [root@clientlinux ~]# vgdisplay <==要找到可用的容量囉! --- Volume group --- VG Name iscsi ....(中間省略).... Act PV 3 VG Size 4.48 GiB PE Size 4.00 MiB Total PE 1148 <==就是這玩意兒!共 1148 個! Alloc PE / Size 0 / 0 Free PE / Size 1148 / 4.48 GiB ....(底下省略).... [root@clientlinux ~]# lvcreate -l 1148 -n disk iscsi Logical volume "disk" created [root@clientlinux ~]# lvdisplay --- Logical volume --- LV Name /dev/iscsi/disk VG Name iscsi LV UUID opR64B-Zeoe-C58n-ipN2-em3O-nUYs-wjEZDP LV Write Access read/write LV Status available # open 0 LV Size 4.48 GiB <==注意一下容量對不對啊! Current LE 1148 Segments 3 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:2 # 3. 開始格式化,並且進行開機自動掛載的動作! [root@clientlinux ~]# mkfs -t ext4 /dev/iscsi/disk [root@clientlinux ~]# mkdir -p /data/iscsi [root@clientlinux ~]# vim /etc/fstab /dev/iscsi/disk /data/iscsi ext4 defaults,_netdev 1 2 [root@clientlinux ~]# mount -a [root@clientlinux ~]# df -Th 檔案系統 類型 Size Used Avail Use% 掛載點 /dev/mapper/iscsi-disk ext4 4.5G 137M 4.1G 4% /data/iscsi
比較特殊的是 /etc/fstab 裡面的第四個欄位,加上 _netdev (最前面是底線) 指的是,因為這個 partition 位於網路上, 所以得要網路開機啟動完成後才會掛載的意思。現在,請讓你的 iSCSI initiator 重新開機看看, 試看看重新啟動系統後,你的 /data/iscsi 是否還存在呢? ^_^
然後,讓我們切回 iSCSI target 那部主機,研究看看到底誰有使用我們的 target 呢?
[root@www ~]# tgt-admin --show Target 1: iqn.2011-08.vbird.centos:vbirddisk System information: Driver: iscsi State: ready I_T nexus information: I_T nexus: 2 Initiator: iqn.1994-05.com.redhat:71cf137f58f2 <==不是很喜歡的名字! Connection: 0 IP Address: 192.168.100.10 <==就是這裡連線進來囉! LUN information: ....(後面省略)....
明明是 initiator 怎麼會是那個 redhat 的名字呢?如果你不介意那就算了,如果挺介意的話,那麼修改 initiator 那部主機的 /etc/iscsi/initiatorname.iscsi 這個檔案的內容,將它變成類似如下的模樣即可:
# 1. 先在 iSCSI initiator 上面進行如下動作: [root@clientlinux ~]# vim /etc/iscsi/initiatorname.iscsi InitiatorName=iqn.2011-08.vbird.centos:initiator [root@clientlinux ~]# /etc/init.d/iscsi restart # 2. 在 iSCSI target 上面就可以發現如下的資料修訂了: [root@www ~]# tgt-admin --show Target 1: iqn.2011-08.vbird.centos:vbirddisk System information: Driver: iscsi State: ready I_T nexus information: I_T nexus: 5 Initiator: iqn.2011-08.vbird.centos:initiator Connection: 0 IP Address: 192.168.100.10 ....(後面省略)....