iscsi搭建ip存儲網絡

偶然看到高俊峯老師講“iscsi搭建ip存儲網絡”的視頻,閒着沒事兒學習了下,視頻很長,看着感覺太浪費時間,不過我還是堅持看完了,內容很少。

以下是我從視頻中總結的有用的內容,以及自己試驗的整個過程。不過我試驗用的是centos6的系統,源碼包編譯的時候遇到了問題,還是小折騰了一會兒,最後讓我明白做事還是得注重細節啊!

 

######操作系統
CentOS release 6.3 (Final)
2.6.32-431.el6.x86_64

######實驗機器
服務端 192.168.1.248
客戶端 192.168.1.249

######存儲類型
SCSI:小型計算機系統接口(Small Computer System Interface)
FC:光纖通道(Fibre Channel)
DAS:直連式存儲(Direct-Attached Storage)
NAS:網絡接入存儲(Network-Attached Storage)
SAN:存儲區域網絡(Storage Area Network)

iscsi定義:
iSCSI是一種在Internet協議上,特別是以太網上進行數據塊傳輸的標準,它是一種基於IP Storage理論的新型存儲技術,該技術是將存儲行業廣泛應用的SCSI接口技術與IP網絡技術相結合,可以在IP網絡上構建SAN存儲區域網,簡單地說,iSCSI就是在IP網絡上運行SCSI協議的一種網絡存儲技術

######iscsi架構類型
控制器架構

採用專用的數據傳輸芯片、專用的RAID數據校驗芯片、專用的高性能cache緩存和專用的嵌入式系統平臺,是一個核心全硬件的設備。
 優點:具有較高的安全性和和穩定性。
 缺點:核心處理器全部採用硬件,製造成本較高,因而售價也很高。
 適用環境:可以用於對性能的穩定性和高可用性具有較高要求的在線存儲系統,例如:中小型數據庫系統、大型數據庫備份系統、遠程容災系統等。

######iSCSI連接橋架構
連接橋構架分爲另個部分:
前端協議轉換設備
後端存儲
 前端協議轉換部分一般是硬件設備,只有協議轉換功能,沒有RAID校驗和快照、卷複製等功能,因此,創建RAID組、創建LUN等操作必須在存儲設備上完成。
 後端存儲一般採用SCSI磁盤陣列和FC存儲設備。
 隨着iscsi技術的日益成熟,連接橋架構的iSCSI設備越來越少

PC架構
也就是將存儲設備搭建在PC服務器上,通俗的說就是選擇一個性能良好、可支持多塊硬盤的PC 服務器,然後選擇一款成熟的存儲端管理軟件(iSCSI Target),並將軟件安裝在這臺PC服務器上,這樣就將一個普通的PC服務器變成了一臺ISCSI存儲設備了。最後通過PC服務器的以太網卡對外提供ISCSI數據傳輸服務。
 客戶端主機可以安裝iscsi客戶端軟件(iSCSI initiator)通過以太網連接PC服務器共享出來的存儲空間。

######iscsi存儲鏈接方式
以太網卡+initiator軟件方式
硬件TOE網卡+initiator軟件方式
iSCSI HBA卡連接方式

######ISCSI系統工作原理
基本實現過程:
 iSCSI協議定義了在TCP/IP網絡發送、接收 block(數據塊)級的存儲數據的規則和方法:
 發送端將SCSI命令和數據封裝到TCP/IP包中再通過網絡轉發,接收端收到 TCP/IP包之後,將其還原爲SCSI命令和數據並執行,完成之後將返回的SCSI命令和數據再封裝到TCP/IP包中再傳送回發送端。
 整個過程在用戶看來: 使用遠端的存儲設備就象訪問本地的 SCSI設備一樣簡單。


######target安裝
下載iscsitarget-1.4.20.2.tar.gz包源碼安裝
[root@fone-server-2 tmp]# tar -zxvf iscsitarget-1.4.20.2.tar.gz
[root@fone-server-2 tmp]# cd iscsitarget-1.4.20.2
[root@fone-server-2 iscsitarget-1.4.20.2]# make

make後出錯
cc: /lib/modules/2.6.32-279.el6.x86_64/build/include/linux/version.h:沒有那個文件或目錄
cc: 沒有輸入文件
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -le: unary operator expected
/bin/sh: line 0: [: -lt: unary operator expected
make -C usr
make[1]: Entering directory `/tmp/iscsitarget-1.4.20.2/usr'
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o ietd.o ietd.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o iscsid.o iscsid.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o conn.o conn.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o session.o session.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o target.o target.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o message.o message.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o ctldev.o ctldev.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o log.o log.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o chap.o chap.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o event.o event.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o param.o param.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o plain.o plain.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o isns.o isns.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o md5.o md5.c
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o sha1.o sha1.c
cc ietd.o iscsid.o conn.o session.o target.o message.o ctldev.o log.o chap.o event.o param.o plain.o isns.o md5.o sha1.o -o ietd 
cc -O2 -fno-inline -Wall -Wstrict-prototypes -g -I../include -D_GNU_SOURCE    -c -o ietadm.o ietadm.c
cc ietadm.o param.o -o ietadm
make[1]: Leaving directory `/tmp/iscsitarget-1.4.20.2/usr'
make -C /lib/modules/2.6.32-279.el6.x86_64/build SUBDIRS=/tmp/iscsitarget-1.4.20.2/kernel modules
make: *** /lib/modules/2.6.32-279.el6.x86_64/build: 沒有那個文件或目錄。 停止。
make: *** [kernel] 錯誤 2

解決辦法:
安裝如下包
yum -y install likernel-headers kernel* make gcc gcc-c++ flex patch
如果還不行的話reboot一下 注:安裝kernel須重新啓動
(編譯這塊搞了半天,其實上邊的安裝包我也裝了就差一個重啓,不重啓添加的kernel相關的沒生效)
######target配置
[root@fone-server-2 iet]# pwd
/etc/iet
[root@fone-server-2 iet]# vim ietd.conf 
修改兩行配置
35 Target iqn.2013-12.com.fone:sdb
52 Lun 0 Path=/dev/sdb,Type=fileio,ScsiId=xyz,ScsiSN=xyz

如果是再共享一個磁盤需要將上邊的兩行都複製然後修改(要成對的)

######iscsi客戶端安裝(linux平臺)
yum -y install iscsi-initiator*
安裝完成後會生成/etc/iscsi/目錄
[root@fone-server-3 ~]# cd /etc/iscsi/
有兩個配置文件可以進行一定的設置
[root@fone-server-3 iscsi]# ls
initiatorname.iscsi  iscsid.conf

啓動iscsi服務
默認centos6.2iscsi服務啓動了
iscsi target發現:
[root@fone-server-3 iscsi]# iscsiadm -m discovery -t sendtargets -p 192.168.1.248 (這個ip是存儲段的地址)
192.168.1.248:3260,1 iqn.2013-12.com.fone:sdb

Discovery   (/var/lib/iscsi/send_targets):在/var/lib/iscsi/send_targets目錄下,生成一個target服務器信息文件,文件名爲“target服務的IP,端口號”(例如“192.168.1.248,3260”)。此文件用來記錄target服務器信息。
Node  (/var/lib/iscsi/nodes):在/var/lib/iscsi/nodes目錄下,生成一個或多個以target存儲服務器上的Target名命名的文件夾,每文件夾下有一個用來記錄target服務器上特定Target信息的文件。

通過iscsiadm指令與iscsi Target建立關聯
iscsiadm -m node -T iqn.2013-12.com.fone:sdb -p 192.168.1.248 -l
這裏的“-T”後面跟target名稱,“ip-address”是target主機的IP地址,-p指定ip地址 ,“port”是target主機的端口號,默認是3260

卸載
iscsiadm -m node -T iqn.2013-12.com.fone:sdb -p 192.168.1.248 -u

如果服務端新增加了一個共享磁盤,在客戶端刷新信息
iscsiadm -m session -R

######iscsi在安全方面的設定

再在服務端共享一塊磁盤
編輯配置文件
vim ietd.conf
接着前面的修改添加如下內容
Target iqn.2013-12.com.fone:sda
Lun 0 Path=/dev/sda,Type=fileio,ScsiId=xyz,ScsiSN=xyz

保存退出後重啓服務
[root@fone-server-2 iet]# /etc/init.d/iscsi-target restart
Stopping iSCSI Target:                                     [確定]
Starting iSCSI Target:                                     [確定]

在客戶端查看
[root@fone-server-3 /]# iscsiadm -m discovery -t sendtargets -p 192.168.1.248
192.168.1.248:3260,1 iqn.2013-12.com.fone:sda
192.168.1.248:3260,1 iqn.2013-12.com.fone:sdb

這樣會有個問題,每當共享一塊磁盤所有客戶端都可以看到共享,這樣就產生了混亂,不易於管理控制。

爲了防止這種情況一共有兩種方法:
###initiator主機以ip認證的方式獲取iscsi target資源
修改[root@fone-server-2 iet]# vim initiators.allow 
#ALL ALL   (將此行註釋,添加如下兩行)
iqn.2013-12.com.fone:sdb 192.168.4.249
iqn.2013-12.com.fone:sda 192.168.4.232
設置sdb只共享給249,sda只共享給232
修改完成後要重啓target
(如果一塊磁盤需要給多個機器共享那麼直接在後邊加ip,要用逗號分隔)
[root@fone-server-2 iet]# /etc/init.d/iscsi-target restart
Stopping iSCSI Target:                                     [確定]
Starting iSCSI Target:                                     [確定]

現在驗證配置是否好用
[root@fone-server-3 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.1.248
192.168.1.248:3260,1 iqn.2013-12.com.fone:sdb

[root@hadoop-slave232 ~]#  iscsiadm -m discovery -t sendtargets -p 192.168.1.248
192.168.1.248:3260,1 iqn.2013-12.com.fone:sda
232這個機器是我安裝了initiator的一個機器

可見現在跟我們在服務端修改的限制一樣,每個系統只能發現指定的共享磁盤

###密碼認證獲取iSCSI Target資源

target段設置
修改 vim initiators.allow
ALL ALL
#iqn.2013-12.com.fone:sdb 192.168.1.249
#iqn.2013-12.com.fone:sda 192.168.1.232
還原成沒有做ip認證的樣子

接着修改/etc/iet/ietd.conf文件,修改後的內容如下:
IncomingUser  discovery.auth  discoverysecret
第一個“IncomingUser”是個全局參數,用來指定Discovery查詢認證所使用的賬號和密碼,必須與initiator主機中設定的用戶名密碼一致。

如下格式:
共享給linux
Target iqn.2013-12.com.fone:sdb
IncomingUser  login.linux.auth linuxsecret
Lun 0 Path=/dev/sdb,Type=fileio,ScsiId=xyz,ScsiSN=xyz

如果是共享給windows如下
Target iqn.2013-12.com.fone:sdc
IncomingUser  login.linux.auth windowssecret
Lun 0 Path=/dev/sdc,Type=fileio,ScsiId=xyz,ScsiSN=xyz

Initiator主機以密碼認證獲取iSCSI Target資源
修改/etc/iscsi/iscsid.conf文件,添加如下選項: 
#以下三個是針對login的
node.session.auth.authmethod = CHAP  #表示在login時啓用CHAP驗證。
node.session.auth.username = login.linux.auth   #驗證用戶名稱,可以是任意字符,但必須與target端IncomingUse配置的名字一致。
node.session.auth.password = linuxsecret   #驗證密碼,必須與target端對應的IncomingUse選項設置的密碼一致。 

#以下三個是針對discovery的 
discovery.sendtargets.auth.authmethod = CHAP    #表示discovery時啓用CHAP驗證。
discovery.sendtargets.auth.username = discovery.auth  #驗證用戶名稱,可以是任意字符,但必須與target端IncomingUse配置的名稱一致。
discovery.sendtargets.auth.password = discoverysecret   #驗證密碼,必須與target端對應的IncomingUse選項設置的密碼一致。

修改完成後要重啓initiator

此時可以重新發現測試!

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章