伺服器架設篇 - CentOS 5.x

第十八章、網路磁碟裝置:iSCSI 伺服器

透過 iscsi 的使用,來提供網路磁碟~

最近更新時間: 2011/04/25

本文資料主要針對 CentOS 5.x 的系統進行說明,而 CentOS 5.x 已經在 2017 年 3 月份正式不再進行維護,事實上,在 2012 年底幾乎就不再維護了。 因此,建議您前往本站查詢最新版本的 Linux distribution 文章來閱讀,比較不會浪費時間。那為何還需要編輯 CentOS 5 的資料呢? 鳥哥只想要做個自己曾經撰寫過的文件內容保存而已囉! ^_^!最新文章請前往鳥站首頁查閱囉!
如果你的系統需要大量的磁碟容量,但是身邊卻沒有 NAS 或外接的儲存設備,僅有個人電腦時,那該如何是好? 此時,透過網路的 SCSI 磁碟 (iSCSI) 就能夠有大大的幫助啦!這個 iSCSI 是將來自網路的資料模擬成本機的 SCSI 設備, 因此可以進行諸如 LVM 等方面的實作,而不是單純使用伺服器端提供的檔案系統而已,相當的有幫助喔!

18.1 網路檔案系統還是網路磁碟

做為伺服器的系統通常是需要儲存設備的,而儲存設備除了可以使用系統內建的磁碟之外,如果內建的磁碟容量不夠大, 而且也沒有額外的磁碟插槽 (SATA 或 IDE) 可用時,那麼常見解決的方案就是增加 NAS (網路附加儲存伺服器) 或外接式儲存設備。再高檔一點的系統,可能就會用到 SAN (儲存區域網路) 這個高貴的玩意兒 (註1)。

不過,不論是哪一種架構,基本上,它們的內部硬碟通常是以磁碟陣列 (RAID) 作為基礎的。磁碟陣列我們在基礎篇第三版的第十五章談過了,這裡就不再囉唆。這裡想要瞭解的是,啥是 NAS 又啥是 SAN ? 這兩者有何不同?與本章主題有關的 iSCSI 又是啥呢?底下就讓我們來談一談。

18.1.1 NAS 與 SAN

由於企業的資料量越來越大,而且重要性與保密性越來越高,尤其類似資料庫的內容,常常容量單位是以 TB (1TB = 1024GB) 在進行計算的。哇!真可怕!所以囉,磁碟陣列的應用就很重要了。那麼磁碟陣列通常是在哪裡呢? 磁碟陣列通常是 (1)主機內部有磁碟陣列控制卡,可以自行管理磁碟陣列。不過想要提供磁碟陣列的容量, 得要透過額外的網路服務才行; (2)外接式磁碟陣列設備,就是單純的磁碟陣列設備,必須透過某些介面連結到主機上, 主機也要安裝適當的驅動程式後,才能捉到這個設備所提供的磁碟容量。

不過,以目前的資訊社會來說,你應該很少聽到內建或外接的 RAID 了,常常聽到的應該是 NAS 與 SAN ,那這是啥咚咚? 讓我們簡單的來說說:


  • NAS (Network Attached Storage, 網路附加儲存伺服器)

基本上,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 哩!不過不是本章的重點,有興趣的朋友可以自行前往下載與安裝該軟體來玩玩~


  • SAN (Storage Area Networks, 儲存區域網路)

從上面的說明來看,其實那個 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 架構啦! ^_^

18.1.2 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 target:就是儲存設備端,存放磁碟或 RAID 的設備,目前也能夠將 Linux 主機模擬成 iSCSI target 了!目的在提供其他主機使用的『磁碟』;

  • iSCSI initiator:就是能夠使用 target 的用戶端,通常是伺服器。 也就是說,想要連接到 iSCSI target 的伺服器,也必須要安裝 iSCSI initiator 的相關功能後才能夠使用 iSCSI target 提供的磁碟就是了。

如下圖所示,iSCSI 是在 TCP/IP 上面所開發出來的一套應用,所以得要有網路才行啊!

iSCSI 與 TCP/IP 相關性
圖 18.1-1、iSCSI 與 TCP/IP 相關性

18.1.3 各元件相關性

由上面的說明中,我們可以知道一部伺服器如何取得磁碟或者是檔案系統來利用呢?基本上就是:

  • 直接存取 (direct-attached storage):例如本機上面的磁碟,就是直接存取設備;
  • 透過儲存區域網路 (SAN):來自區網內的其他儲存設備提供的磁碟;
  • 網路檔案系統 (NAS):來自 NAS 提供的檔案系統,只能立即使用,不可進行格式化。

這三個東西與伺服器主機能用的檔案系統之間可以用維基百科的圖示來展示:

伺服器取得檔案系統的三個來源
圖 18.1-2、伺服器取得檔案系統的三個來源 (資料來源為註1)

從上圖中,我們可以發現在一般的主機環境下,磁碟裝置 (SATA, SAS, FC) 可以透過主機的介面 (DAS) 來直接進行檔案系統的建立 (mkfs 進行格式化),如果想要使用外部的磁碟,那可以透過 SAN (內含多個磁碟的設備),然後透過 iSCSI 等介面來連線, 當然,還是得要進行格式化等動作 (假設這個 SAN 尚未被使用時)。最後,如果是 NAS 的條件下,那麼 NAS 必須要先透過自己的作業系統將磁碟裝置進行檔案系統的建立後,再以 NFS/CIFS 等方式來提供其他主機掛載使用。

接下來,網路伺服器、用戶端系統、NAS 與 SAN 的角色在區網裡面又是如何呢?我們依舊使用維基百科的圖示來說明一下 (DAS 是每部主機內部的磁碟,即底下圖示中的圓柱體):

各元件之間的相關性
圖 18.1-3、各元件之間的相關性 (資料來源為註1)

NAS 可以使用自己的磁碟,也能夠透過光纖或乙太網路取得 SAN 所提供的磁碟來製作成為網路檔案系統,提供其他人的使用。 Server 可以透過 NFS/CIFS 等方式取得 NAS 的檔案系統,當然也能夠直接存取 SAN 的磁碟。用戶端主要則是透過網路檔案系統, 並且直接使用 Server 提供的網路資源 (如 FTP, WWW, mail 等等)。

18.2 iSCSI target 的設定

能夠完成 iSCSI target/initiator 設定的專案非常多 (註4),鳥哥找的到的就有底下這幾個:

由於被我們 CentOS 5.x 官方直接使用的是 tgt 這個軟體,因此底下我們會使用 tgt 來介紹整個 iSCSI target 的設定喔!

18.2.1 所需軟體與軟體結構

CentOS 將 tgt 的軟體名稱定義為 scsi-target-utils ,因此你得要使用 yum 去安裝他才行。至於用來作為 initiator 的軟體則是使用 linux-iscsi 的專案,該專案所提供的軟體名稱則為 iscsi-initiator-utils 。所以,總的來說,你需要的軟體有:

  • scsi-target-utils:用來將 Linux 系統模擬成為 iSCSI target 的功能;
  • iscsi-initiator-utils:掛載來自 target 的磁碟到 Linux 本機上。

那麼 scsi-target-utils 主要提供哪些檔案呢?基本上有底下幾個比較重要需要注意的:

  • /etc/tgt/targets.conf:主要設定檔,設定要分享的磁碟格式與哪幾顆;
  • /usr/sbin/tgt-admin:線上查詢、刪除 target 等功能的設定工具;
  • /usr/sbin/tgt-setup-lun:建立 target 以及設定分享的磁碟與可使用的用戶端等工具軟體。
  • /usr/sbin/tgtadm:手動直接管理的管理員工具 (可使用設定檔取代);
  • /usr/sbin/tgtd:主要提供 iSCSI target 服務的主程式;
  • /usr/sbin/tgtimg:建置預計分享的映像檔裝置的工具 (以映像檔模擬磁碟);

其實 CentOS 已經將很多功能都設定好了,因此我們只要修訂設定檔,然後啟動 tgtd 這個服務就可以囉! 接下來,就讓我們實際來玩一玩 iSCSI target 的設定吧!

18.2.2 target 的實際設定

從上面的分析來看,iSCSI 就是透過一個網路介面,將既有的磁碟給分享出去就是了。那麼有哪些類型的磁碟可以分享呢? 這包括:

  • 使用 dd 指令所建立的大型檔案可供模擬為磁碟 (無須預先格式化);
  • 使用單一分割槽 (partition) 分享為磁碟;
  • 使用單一完整的磁碟 (無須預先分割);
  • 使用磁碟陣列分享 (其實與單一磁碟相同方式);
  • 使用軟體磁碟陣列 (software raid) 分享成單一磁碟;
  • 使用 LVM 的 LV 裝置分享為磁碟。

其實沒有那麼複雜,我們大概知道可以透過 (1)大型檔案; (2)單一分割槽; (3)單一裝置 (包括磁碟、陣列、軟體磁碟陣列、LVM 的 LV 裝置檔名等等) 來進行分享。在本小節當中,我們將透過新的分割產生新的沒有用到的分割槽、LVM 邏輯捲軸、大型檔案等三個咚咚來進行分享。既然如此,那就得要先來搞定這些咚咚囉! 要注意喔,等一下我們要分享出去的資料,最好不要被使用,也最好不要開機就被掛載 (/etc/fstab 當中沒有存在記錄的意思)。 那麼就來玩玩看囉!


  • 建立所需要的磁碟裝置

既然 iSCSI 要分享的是磁碟,那麼我們得要準備好啊!目前預計準備的磁碟為:

  • 建立一個名為 /home/iscsi/disk1.img 的 2GB 大型檔案;
  • 使用 /dev/sda7 作為分享 (此分割槽預設為 swap 已經改為未使用狀態);
  • 使用 /dev/server/iscsi01 的 2GB LV 作為分享。

實際處理的方式如下:

# 1. 建立大型檔案:
[root@www ~]# mkdir /home/iscsi
[root@www ~]# dd if=/dev/zero of=/home/iscsi/disk1.img bs=1M count=1024
[root@www ~]# ls -lh /home/iscsi/disk1.img
-rw-r--r-- 1 root root 1.0G  4月 22 13:24 /home/iscsi/disk1.img  <==容量對的!

# 2. 建立實際的 partition 分割:
[root@www ~]# fdisk /dev/sda  <==實際的分割方式自己處理吧!
[root@www ~]# fdisk -l
   Device Boot      Start         End      Blocks   Id  System
/dev/sda7            1950        2076     1020096   83  Linux
# 只有輸出 /dev/sda7 資訊,其他的都省略了。注意看容量,上述容量單位 KB

[root@www ~]# swapon -s; mount | grep 'sda7'
# 你得要自己測試一下 /dev/sda7 不能夠被使用喔!若有被使用,請 umount 或 swapoff

# 3. 建立 LV 裝置 :
[root@www ~]# lvcreate -L 2G -n iscsi01 server
[root@www ~]# lvscan
  ACTIVE            '/dev/server/server' [25.00 GB] inherit
  ACTIVE            '/dev/server/iscsi01' [2.00 GB] inherit

  • 規劃分享的 iSCSI target 檔名

iSCSI 有一套自己分享 target 檔名的定義,基本上,藉由 iSCSI 分享出來的 target 檔名都是以 iqn 為開頭,意思是:『iSCSI Qualified Name (iSCSI 合格名稱)』的意思(註5)。那麼在 iqn 後面要接啥檔名呢?通常是這樣的:

iqn.yyyy-mm.<reversed domain name>:identifier
iqn.年年-月.單位網域名的反轉寫法  :這個分享的target名稱

鳥哥做這個測試的時間是 2011 年 4 月份,然後鳥哥的機器是 www.centos.vbird ,反轉網域寫法為 vbird.centos, 然後,鳥哥想要的 iSCSI target 名稱是 vbirddisk ,那麼就可以這樣寫:

  • iqn.2011-04.vbird.centos:vbirddisk

另外,就如同一般外接式儲存裝置 (target 名稱) 可以具有多個磁碟一樣,我們的 target 也能夠擁有數個磁碟裝置的。 每個在同一個 target 上頭的磁碟我們可以將它定義為邏輯單位編號 (Logical Unit Number, LUN)。我們的 iSCSI initiator 就是跟 target 協調後才取得 LUN 的存取權就是了 (註5)。在鳥哥的這個簡單案例中,最終的結果,我們會有一個 target ,在這個 target 當中可以使用三個 LUN 的磁碟。


  • 設定 tgt 的設定檔 /etc/tgt/targets.conf

接下來我們要開始來修改設定檔了。基本上,設定檔就是修改 /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-04.vbird.centos:vbirddisk>
    backing-store /home/iscsi/disk1.img <==LUN 1 (LUN 的編號通常照順序)
    backing-store /dev/sda7             <==LUN 2
    backing-store /dev/server/iscsi01   <==LUN 3
</target>

事實上,除了 backing-store 之外,在這個設定檔當中還有一些比較特別的參數可以討論看看 (man tgt-admin):

  • backing-store (虛擬的裝置), direct-store (實際的裝置): 設定裝置時,如果你的整顆磁碟是全部被拿來當 iSCSI 分享之用,那麼才能夠使用 direct-store 。不過,根據網路上的其他文件, 似乎說明這個設定值有點危險的樣子。所以,基本上還是建議單純使用模擬的 backing-store 較佳。例如鳥哥的簡單案例中,就通通使用 backing-store 而已。

  • initiator-address (使用者端位址): 如果你想要限制能夠使用這個 target 的用戶端來源,才需要填寫這個設定值。基本上,不用設定它 (代表所有人都能使用的意思), 因為我們後來會使用 iptables 來規範可以連線的客戶端嘛!

  • incominguser (使用者帳號密碼設定): 如果除了來源 IP 的限制之外,你還想要讓使用者輸入帳密才能使用你的 iSCSI target 的話,那麼就加用這個設定項目。 此設定後面接兩個參數,分別是帳號與密碼囉。

  • write-cache [off|on] (是否使用快取): 在預設的情況下,tgtd 會使用快取來增快速度。不過,這樣可能會有遺失資料的風險。所以,如果你的資料比較重要的話, 或許不要使用快取,直接存取裝置會比較妥當一些。

上面的設定值要怎麼用呢?現在,假設你的環境中,僅允許 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 以及觀察相關埠口與磁碟資訊

再來則是啟動、開機啟動,以及觀察 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-04.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: 1045 MB       <==容量有這麼大!
            Online: Yes
            Removable media: No
            Backing store type: rdwr
            Backing store path: /dev/sda7 <==磁碟所在的實際檔名
            Backing store flags:
        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
            Backing store flags:
        LUN: 3
            Type: disk
            SCSI ID: IET     00010003
            SCSI SN: beaf13
            Size: 1074 MB
            Online: Yes
            Removable media: No
            Backing store type: rdwr
            Backing store path: /home/iscsi/disk1.img
            Backing store flags:
    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/255.255.255.0 -p tcp -m tcp --dport 3260 -j ACCEPT
# 最終要看到上述的輸出字樣才是 OK 的呦!若有其他用戶需要連線,
# 自行複製 iptables.allow 內的語法,修改來源端即可。

18.3 iSCSI initiator 的設定

談完了 target 的設定,並且觀察到相關 target 的 LUN 資料後,接下來就是要來掛載使用囉。使用的方法很簡單, 只不過我們得要安裝額外的軟體來取得 target 的 LUN 使用權就是了。

18.3.1 所需軟體與軟體結構

在前一小節就談過了,要設定 iSCSI initiator 必須要安裝 iscsi-initiator-utils 才行。安裝的方法請使用 yum 去處理,這裡不再多講話。那麼這個軟體的結構是如何呢?

  • /etc/iscsi/iscsid.conf:主要的設定檔,用來連結到 iSCSI target 的設定;
  • /sbin/iscsid:啟動 iSCSI initiator 的主要服務程式;
  • /sbin/iscsiadm:用來管理 iSCSI initiator 的主要設定程式;
  • /etc/init.d/iscsid:讓本機模擬成為 iSCSI initiater 的主要服務;
  • /etc/init.d/iscsi:在本機成為 iSCSI initiator 之後,啟動此腳本,讓我們可以登入 iSCSI target。所以 iscsid 先啟動後,才能啟動這個服務。為了防呆,所以 /etc/init.d/iscsi 已經寫了一個啟動指令, 啟動 iscsi 前尚未啟動 iscsid ,則會先呼叫 iscsid 才繼續處理 iscsi 喔!

老實說,因為 /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)!

18.3.2 initiator 的實際設定

首先,我們得要知道 target 提供了啥咚咚啊,因此,理論上,不論是 target 還是 initiator 都應該是要我們管理的機器才對。 而現在我們知道 target 其實有設定帳號與密碼的,所以底下我們就得要修改一下 iscsid.conf 的內容才行。


  • 修改 /etc/iscsi/iscsid.conf 內容,並啟動 iscsi

這個檔案的修改很簡單,因為裡面的參數大多已經預設做的不錯了,所以只要填寫 target 登入時所需要的帳密即可。 修改的地方有兩個,一個是偵測時 (discovery) 可能會用到的帳密,一個是連線時 (node) 會用到的帳密:

[root@client ~]# vim /etc/iscsi/iscsid.conf
node.session.auth.username = vbirduser   <==在 target 時設定的
node.session.auth.password = vbirdpasswd <==約在 38, 39 行
discovery.sendtargets.auth.username = vbirduser  <==約在 52, 53 行
discovery.sendtargets.auth.password = vbirdpasswd

[root@client ~]# /etc/init.d/iscsid start
[root@client ~]# /etc/init.d/iscsi start
iscsid (pid  9840) 正在執行...
正在設置 iSCSI 目標(targets): iscsiadm: No records found!  [  確定  ]
# 因為我們尚未偵測 target 的相關資訊,所以顯示找不到 (no record) 是正常的!

[root@client ~]# chkconfig iscsid on
[root@client ~]# chkconfig iscsi on

啟動了 iscsi 之後,要開始來偵測 target 與寫入系統資訊囉。全部使用 iscsiadm 這個指令就可以完成所有動作了。


  • 偵測 192.168.100.254 這部 target 的相關資料

雖然我們已經知道 target 的名字,不過,這裡假設還不知道啦!因為有可能哪一天你的公司有錢了, 會去買實體的 iSCSI 陣列嘛!所以這裡還是講完整的偵測過程好了!你可以這樣使用:

[root@client ~]# 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@client ~]# iscsiadm -m discovery -t sendtargets -p 192.168.100.254
192.168.100.254:3260,1  iqn.2011-04.vbird.centos:vbirddisk
# 192.168.100.254:3260,1 :在此 IP, 埠口上面的 target 號碼,本例中為 target1
# iqn.2011-04.vbird.centos:vbirddisk :就是我們的 target 名稱啊!

[root@client ~]# ll -R /var/lib/iscsi/nodes/
/var/lib/iscsi/nodes/iqn.2011-04.vbird.centos:vbirddisk
/var/lib/iscsi/nodes/iqn.2011-04.vbird.centos:vbirddisk/192.168.100.254,3260,1
# 上面的特殊字體部分,就是我們利用 iscsiadm 偵測到的 target 結果!

現在我們知道了 target 的名稱,同時將所有偵測到的資訊通通寫入到上述 /var/lib/iscsi/nodes/iqn.2011-04.vbird.centos:vbirddisk/192.168.100.254,3260,1 目錄內的 default 檔案中, 若資訊有修訂過的話,那你可以到這個檔案內修改,也可以透過 iscsiadm 的 update 功能處理相關參數的。


  • 開始進行連線 iSCSI target

因為我們的 initiator 可能會連接多部的 target 設備,因此,我們得先要瞧瞧目前系統上面偵測到的 target 有幾部, 然後再找到我們要的那部 target 來進行登入的作業。不過,如果你想要將所有偵測到的 target 全部都登入的話, 那麼整個步驟可以再簡化:

範例:根據前一個步驟偵測到的資料,啟動全部的 target
[root@client ~]# /etc/init.d/iscsi restart
Stopping iSCSI daemon:
iscsid 已停止                                    [  確定  ]
Starting iSCSI daemon:                           [  確定  ]
正在設置 iSCSI 目標(targets): Logging in to [iface: default, 
target: iqn.2011-04.vbird.centos:vbirddisk, portal: 192.168.100.254,3260]
Login to [iface: default, target: iqn.2011-04.vbird.centos:vbirddisk, 
portal: 192.168.100.254,3260] successful.        [  確定  ]
# 將系統裡面全部的 target 通通以 /var/lib/iscs/nodes/ 內的設定登入
# 上面的特殊字體比較需要注意啦!你只要做到這裡即可,底下的瞧瞧就好。

範例:顯示出目前系統上面所有的 target 資料:
[root@client ~]# iscsiadm -m node
192.168.100.254:3260,1 iqn.2011-04.vbird.centos:vbirddisk
選項與參數:
-m node:找出目前本機上面所有偵測到的 target 資訊,可能並未登入喔

範例:僅登入某部 target ,不要重新啟動 iscsi 服務
[root@client ~]# iscsiadm -m node -T target名稱 --login
選項與參數:
-T target名稱:僅使用後面接的那部 target ,target 名稱可用上個指令查到!
--login      :就是登入啊!

[root@client ~]# iscsiadm -m node -T iqn.2011-04.vbird.centos:vbirddisk \
>  --login
# 這次進行會出現錯誤,是因為我們已經登入了,不可重複登入喔!

接下來呢?呵呵!很棒的是,我們要來開始處理這個 iSCSI 的磁碟了喔!怎麼處理?瞧一瞧!

[root@client ~]# fdisk -l
Disk /dev/sda: 8589 MB, 8589934592 bytes  <==這是原有的那顆磁碟,略過不看
....(中間省略)....

Disk /dev/sdb: 1044 MB, 1044578304 bytes
33 heads, 61 sectors/track, 1013 cylinders
Units = cylinders of 2013 * 512 = 1030656 bytes
Disk /dev/sdb doesn't contain a valid partition table

Disk /dev/sdc: 2147 MB, 2147483648 bytes
67 heads, 62 sectors/track, 1009 cylinders
Units = cylinders of 4154 * 512 = 2126848 bytes
Disk /dev/sdc doesn't contain a valid partition table

Disk /dev/sdd: 1073 MB, 1073741824 bytes
34 heads, 61 sectors/track, 1011 cylinders
Units = cylinders of 2074 * 512 = 1061888 bytes
Disk /dev/sdd doesn't contain a valid partition table

你會發現主機上面多出了三個新的磁碟,容量與剛剛在 192.168.100.254 那部 iSCSI target 上面分享的 LUN 一樣大。 那這三顆磁碟可以怎麼用?你想怎麼用就怎麼用啊!只是,唯一要注意的,就是 iSCSI target 每次都要比 iSCSI initiator 這部主機還要早開機,否則我們的 initiator 恐怕就會出問題。


  • 更新/刪除/新增 target 資料的方法

如果你的 iSCSI target 可能因為某些原因被拿走了,或者是已經不存在於你的區網中,或者是要送修了~ 這個時候你的 iSCSI initiator 總是得要關閉吧!但是,又不能全部關掉 (/etc/init.d/iscsi stop), 因為還有其他的 iSCSI target 在使用。這個時候該如何取消不要的 target 呢?很簡單!流程如下:

[root@client ~]# iscsiadm -m node -T targetname --logout
[root@client ~]# 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@client ~]# iscsiadm -m node   <==還是先秀出相關的 target iqn 名稱
192.168.100.254:3260,1 iqn.2011-04.vbird.centos:vbirddisk
[root@client ~]# iscsiadm -m node -T iqn.2011-04.vbird.centos:vbirddisk \
>  --logout
Logging out of session [sid: 1, target: iqn.2011-04.vbird.centos:vbirddisk,
   portal: 192.168.100.254,3260]
Logout of [sid: 1, target: iqn.2011-04.vbird.centos:vbirddisk, portal: 
   192.168.100.254,3260] successful.
# 這個時候的 target 連結還是存在的,雖然登出你還是看的到!

[root@client ~]# iscsiadm -m node -o delete \
<  -T iqn.2011-04.vbird.centos:vbirddisk
[root@client ~]# iscsiadm -m node
iscsiadm: no records found! <==嘿嘿!不存在這個 target 了~

[root@client ~]# /etc/init.d/iscsi restart
# 你會發現唔!怎麼 target 的資訊不見了!這樣瞭了乎!

如果一切都沒有問題,現在,請回到 discovery 的過程,重新再將 iSCSI target 偵測一次,再重新啟動 initiator 來取得那三個磁碟吧!我們要來測試與利用該磁碟囉!

18.3.3 一個測試範例

到底 iSCSI 可以怎麼用?我們就來玩一玩。假設:

  1. 你剛剛如同鳥哥的整個運作流程,已經在 initiator 上面將 target 資料清除了;
  2. 現在我們只知道 iSCSI target 的 IP 是 192.168.100.254 ,而需要的帳密是 vbirduser, vbirdpasswd;
  3. 帳密資訊你已經寫入 /etc/iscsi/iscsid.conf 裡面了;
  4. 假設我們預計要將 target 的磁碟拿來當作 LVM 內的 PV 使用;
  5. 並且將所有的磁碟容量都給一個名為 /dev/iscsi/disk 的 LV 使用;
  6. 這個 LV 會被格式化為 ext3 ,且掛載在 /data/iscsi 內。

那麼,整體的流程是:

# 1. 啟動 iscsi ,並且開始偵測及登入 192.168.100.254 上面的 target 名稱
[root@client ~]# /etc/init.d/iscsi restart
[root@client ~]# chkconfig iscsi on
[root@client ~]# iscsiadm -m discovery -t sendtargets -p 192.168.100.254
[root@client ~]# /etc/init.d/iscsi restart
[root@client ~]# iscsiadm -m node
192.168.100.254:3260,1 iqn.2011-04.vbird.centos:vbirddisk

# 2. 開始處理 LVM 的流程,由 PV, VG, LV 依序處理喔!
[root@client ~]# fdisk -l    <==出現的資料中你會發現 /dev/sd[b-d]
[root@client ~]# 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@client ~]# vgcreate iscsi /dev/sd{b,c,d}  <==建立 VG 去!
  Volume group "iscsi" successfully created

[root@client ~]# vgdisplay  <==要找到可用的容量囉!
  --- Volume group ---
  VG Name               iscsi
....(中間省略)....
  Act PV                3
  VG Size               3.96 GB
  PE Size               4.00 MB
  Total PE              1015  <==就是這玩意兒!共 1015 個!
  Alloc PE / Size       0 / 0
  Free  PE / Size       1015 / 3.96 GB
....(底下省略)....

[root@client ~]# lvcreate -l 1015 -n disk iscsi
  Logical volume "disk" created

[root@client ~]# lvdisplay
  --- Logical volume ---
  LV Name                /dev/iscsi/disk
  VG Name                iscsi
  LV UUID                4dVHGL-JCNL-I09S-9McZ-c9HX-TEI1-Cdvzwg
  LV Write Access        read/write
  LV Status              available
  # open                 0
  LV Size                3.96 GB  <==注意一下容量對不對啊!
  Current LE             1015
  Segments               3
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     256
  Block device           253:2

# 3. 開始格式化,並且進行開機自動掛載的動作!
[root@client ~]# mkfs -t ext3 /dev/iscsi/disk
[root@client ~]# mkdir -p /data/iscsi
[root@client ~]# vim /etc/fstab
/dev/iscsi/disk   /data/iscsi   ext3   defaults,_netdev   1   2

[root@client ~]# mount -a
[root@client ~]# df -Th
檔案系統      類型    容量  已用 可用 已用% 掛載點
/dev/mapper/iscsi-disk
              ext3    4.0G   72M  3.7G   2% /data/iscsi

比較特殊的是 /etc/fstab 裡面的第四個欄位,加上 _netdev (最前面是底線) 指的是,因為這個 partition 位於網路上, 所以得要網路開機啟動完成後才會掛載的意思。現在,請讓你的 iSCSI initiator 重新開機看看, 試看看重新啟動系統後,你的 /data/iscsi 是否還存在呢? ^_^

然後,讓我們切回 iSCSI target 那部主機,研究看看到底誰有使用我們的 target 呢?

[root@www ~]# tgt-admin --show
Target 1: iqn.2011-04.vbird.centos:vbirddisk
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
        I_T nexus: 3
            Initiator: iqn.1994-05.com.redhat:f0c38480f211 <==不是很喜歡的名字!
            Connection: 0
                IP Address: 192.168.100.100   <==就是這裡連線進來囉!
    LUN information:
....(後面省略)....

明明是 initiator 怎麼會是那個 redhat 的名字呢?如果你不介意那就算了,如果挺介意的話,那麼修改 initiator 那部主機的 /etc/iscsi/initiatorname.iscsi 這個檔案的內容,將它變成類似如下的模樣即可:

Tips 鳥哥 不過,這個動作最好在使用 target 的 LUN 之前就進行,否則,當你使用了 LUN 的磁碟後,再修改這個檔案後, 你的磁碟檔名可能會改變。例如鳥哥的案例中,改過 initiatorname 之後,原本的磁碟檔名竟變成 /dev/sd[efg] 了!害鳥哥的 LV 就不能再度使用了...
# 1. 先在 iSCSI initiator 上面進行如下動作:
[root@client ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2011-04.vbird.centos:initiator
[root@client ~]# /etc/init.d/iscsi restart

# 2. 在 iSCSI target 上面就可以發現如下的資料修訂了:
[root@www ~]# tgt-admin --show
Target 1: iqn.2011-04.vbird.centos:vbirddisk
    System information:
        Driver: iscsi
        State: ready
    I_T nexus information:
        I_T nexus: 5
            Initiator: iqn.2011-04.vbird.centos:initiator
            Connection: 0
                IP Address: 192.168.100.100
....(後面省略)....

18.4 重點回顧

  • 如果需要大容量的磁碟,通常會使用 RAID 磁碟陣列的架構;
  • 取得外部磁碟容量的作法,主要有 NAT 及 SAN 兩大類的方式;
  • NAT 可以想成是一部已經客製化的伺服器,主要提供 NFS, SMB 等網路檔案系統;
  • SAN 則是一種外接是儲存設備,可以透過 SAN 取得外部的磁碟裝置 (非檔案系統);
  • SAN 早期使用光纖通道,由於乙太網路的發展,近來使用 iSCSI 協定在 TCP/IP 架構上面實作;
  • iSCSI 協定主要分為 iSCSI target (提供磁碟裝置者) 及 iSCSI initiator (存取 target 磁碟);
  • iSCSI target 主要使用 scsi-target-utils 軟體達成主要利用 tgt-admin 及 tgtadm 指令完成:
  • 一般定義 target 名稱為:iqn.yyyy-mm.<reversed domain name>:identifier
  • 一部 target 裡面可分享多個磁碟,每個磁碟都是一個 LUN;
  • iSCSI initiator 主要透過 iscsi-initiator-utils 軟體達成連結到 target 的任務;
  • iscsi-initiator-utils 主要提供 iscsiadm 來完成所有的動作。

18.5 本章習題

18.6 參考資料與延伸閱讀

修改歷史:
2011/04/08:重新編輯本資料哩!
2011/04/25:歷經多個禮拜的雜事雜務纏身,終於完成這篇 iSCSI 的模擬應用。應該是挺好玩的一個咚咚~
其他連結
環境工程模式篇
鳥園討論區
鳥哥舊站

今日 人數統計
昨日 人數統計
本月 人數統計
上月 人數統計