iSCSI 主要是透過 TCP/IP 的技術,將儲存設備端透過 iSCSI target (iSCSI 目標) 功能,做成可以提供磁盤的服務器端,再透過 iSCSI initiator (iSCSI 初始化用戶) 功能,做成能夠掛載使用 iSCSI target 的客戶端,如此便能透過 iSCSI 協議來進行磁盤的應用了。
也就是說,iSCSI 這個架構主要將儲存裝置與使用的主機分為兩個部分,分別是:
- iSCSI target:就是儲存設備端,存放磁盤或 RAID 的設備,目前也能夠將 Linux 主機仿真成 iSCSI target 了!目的在提供其他主機使用的『磁盤』;
- iSCSI initiator:就是能夠使用 target 的客戶端,通常是服務器。 也就是說,想要連接到 iSCSI target 的服務器,也必須要安裝 iSCSI initiator 的相關功能后才能夠使用 iSCSI target 提供的磁盤就是了。
如下圖所示,iSCSI 是在 TCP/IP 上面所開發出來的一套應用,所以得要有網絡才行啊!
iSCSI target 的設定
能夠完成 iSCSI target/initiator 設定的項目非常多,找的到的就有底下這幾個:
- Linux SCSI target framework (tgt):http://stgt.sourceforge.net/
- Linux-iSCSI Project:http://linux-iscsi.sourceforge.net/
- Open-iSCSI:http://www.open-iscsi.org/
由於被我們 CentOS 6.4 官方直接使用的是 tgt 這個軟件,因此底下我們會使用 tgt 來介紹整個 iSCSI target 的設定喔!
所需軟件與軟件結構
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 的設定吧!
target 的實際設定
從上面的分析來看,iSCSI 就是透過一個網絡接口,將既有的磁盤給分享出去就是了。那么有哪些類型的磁盤可以分享呢? 這包括:
- 使用 dd 指令所建立的大型檔案可供仿真為磁盤 (無須預先格式化);
- 使用單一分割槽 (partition) 分享為磁盤;
- 使用單一完整的磁盤 (無須預先分割);
- 使用磁盤陣列分享 (其實與單一磁盤相同方式);
- 使用軟件磁盤陣列 (software raid) 分享成單一磁盤;
- 使用 LVM 的 LV 裝置分享為磁盤。
建立所需要的磁盤裝置
既然 iSCSI 要分享的是磁盤,那么我們得要准備好啊!目前預計准備的磁盤為:
- 建立一個名為 /srv/iscsi/disk1.img 的 500MB 檔案;
- 使用 /dev/sda10 提供 2GB 作為分享 (從第一章到目前為止的分割數);
- 使用 /dev/server/iscsi01 的 2GB LV 作為分享 (再加入 5GB /dev/sda11 到 server VG 中)。
實際處理的方式如下:
# 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 檔名的定義,基本上,藉由 iSCSI 分享出來的 target 檔名都是以 iqn 為開頭,意思是:『iSCSI Qualified Name (iSCSI 合格名稱)』的意思。那么在 iqn 后面要接啥檔名呢?通常是這樣的:
iqn.yyyy-mm.<reversed domain name>:identifier
iqn.年年-月.單位網域名的反轉寫法 :這個分享的target名稱
我做這個測試的時間是 2014 年 10 月份,然后鳥哥的機器是 www.vlnb.net ,反轉網域寫法為 net.vlnb, 然后,想要的 iSCSI target 名稱是 vdisk ,那么就可以這樣寫:
iqn.2014-010.net.vlnb:vdisk
另外,就如同一般外接式儲存裝置 (target 名稱) 可以具有多個磁盤一樣,我們的 target 也能夠擁有數個磁盤裝置的。 每個在同一個 target 上頭的磁盤我們可以將它定義為邏輯單位編號 (Logical Unit Number, LUN)。我們的 iSCSI initiator 就是跟 target 協調后才取得 LUN 的存取權就是了。在這個簡單案例中,最終的結果,我們會有一個 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.2014-10.net.vlnb:vdisk> 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):
- 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,而且存取時需要帳密分別為 vuser, vpasswd ,此外,不要使用快取,那么原本的配置文件之外,還得要加上這樣的參數才行 (基本上,使用上述的設定即可,底下的設定是多加測試用的,不需要填入你的設定中)。
[root@www ~]# vim /etc/tgt/targets.conf <target iqn.2014-10.net.vlnb:vdisk> 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-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: vuser <==額外的帳戶信息 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 埠口,那么我們就這么進行即可:可以參考http://www.111cn.net/sys/linux/44803.htm
[root@www ~]# vi /etc/sysconfig/iptables iptables -A INPUT -p tcp -s 192.168.100.0/24 --dport 3260 -j ACCEPT
iSCSI initiator 的設定
談完了 target 的設定,並且觀察到相關 target 的 LUN 數據后,接下來就是要來掛載使用啰。使用的方法很簡單, 只不過我們得要安裝額外的軟件來取得 target 的 LUN 使用權就是了。
所需軟件與軟件結構
在前一小節就談過了,要設定 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 啰。 那么就讓我們來處理處理整個過程吧
initiator 的實際設定
首先,我們得要知道 target 提供了啥咚咚啊,因此,理論上,不論是 target 還是 initiator 都應該是要我們管理的機器才對。 而現在我們知道 target 其實有設定賬號與密碼的,所以底下我們就得要修改一下 iscsid.conf 的內容才行。
修改 /etc/iscsi/iscsid.conf 內容,並啟動 iscsi
這個檔案的修改很簡單,因為里面的參數大多已經預設做的不錯了,所以只要填寫 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 這個指令就可以完成所有動作了。
偵測 192.168.100.254 這部 target 的相關數據
雖然我們已經知道 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.2014-10.net.vbnl:vdisk # 192.168.100.254:3260,1 :在此 IP, 端口口上面的 target 號碼,本例中為 target1 #iqn.2014-10.net.vbnl:vdisk :就是我們的 target 名稱啊! [root@clientlinux ~]# ll -R /var/lib/iscsi/nodes/ /var/lib/iscsi/nodes/iqn.2014-10.net.vbnl:vdisk /var/lib/iscsi/nodes/iqn.2014-10.net.vbnl:vdisk/192.168.100.254,3260,1 # 上面的特殊字體部分,就是我們利用 iscsiadm 偵測到的 target 結果!
現在我們知道了 target 的名稱,同時將所有偵測到的信息通通寫入到上述 /var/lib/iscsi/nodes/iqn.2014-10.net.vbnl:vbirddisk/192.168.100.254,3260,1 目錄內的 default 檔案中, 若信息有修訂過的話,那你可以到這個檔案內修改,也可以透過 iscsiadm 的 update 功能處理相關參數的。
開始進行聯機 iSCSI target
因為我們的 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.2014-10.net.vbnl:vdisk 選項與參數: -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.iqn.2014-10.net.vbnl:vdisk \ > --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 恐怕就會出問題。
更新/刪除/新增 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.2014-10.net.vbnl:vdisk
[root@clientlinux ~]# iscsiadm -m node -T iqn.2014-10.net.vbnl:vdisk \
> --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.2014-10.net.vbnl:vdisk, portal: 192.168.100.254,3260] successful.
# 這個時候的 target 連結還是存在的,雖然注銷你還是看的到!
[root@clientlinux ~]# iscsiadm -m node -o delete \
> -T iqn.iqn.2014-10.net.vbnl:vdisk
[root@clientlinux ~]# iscsiadm -m node
iscsiadm: no records found! <==嘿嘿!不存在這個 target 了~
[root@clientlinux ~]# /etc/init.d/iscsi restart
# 你會發現唔!怎么 target 的信息不見了!這樣瞭了乎
如果一切都沒有問題,現在,請回到 discovery 的過程,重新再將 iSCSI target 偵測一次,再重新啟動 initiator 來取得那三個磁盤吧!我們要來測試與利用該磁盤啰!