Linux下搭建iSCSI共享存儲的方法 TGT 方式 Debian9.5系統下


iSCSI(internet SCSI)技術由IBM公司研究開發,是一個供硬件設備使用的、可以在IP協議的上層運行的SCSI指令集,這種指令集合可以實現在IP網絡上運行SCSI協議,使其能夠在諸如高速千兆以太網上進行路由選擇。iSCSI技術是一種新儲存技術,該技術是將現有SCSI接口與以太網絡(Ethernet)技術結合,使服務器可與使用IP網絡的儲存裝置互相交換資料。

iSCSI分為服務端和客戶端,服務端需要安裝scsi target用來共享存儲設備,客戶端需要安裝iscsi initiator用來連接target端,將target端共享的設備掛載到initiator本地,可以對其進行分區,格式化等操作,訪問過程如下圖:

 

一、iSCSI實現數據的訪問需要的條件:

1、iSCSI客戶端具有的特性:
iSCSI initiator是發起I/O操作的啟動者;需要通過發現過程請求遠端快設備;可以與target進行持久連接;在Linux系統中可以使用open-iscsi軟件包來模擬實現;

2、iSCSI服務器端具有的特性:
iSCSI target是I/O操作的執行者;需要導出一個或多個塊設備供啟動者(initiator)使用;在Linux系統中可以使用兩種target工具,分別為tgt,和targetcli,這里先介紹TGT的方法,TGT是Fujita Tomonori於2006年底將SCSI Target Framework (STGT/TGT) 引入Linux內核。它在內核中有一個庫,可協助內核控制目標驅動程序,TGT是用戶態實現的iscsi target,所有目標處理都在用戶空間進行。在2010年底,LIO項目被選擇來代替TGT作為內核態實現的iscsi target。當選擇LIO替換TGT時,它的實現已經進行了調整,以允許TGT用戶空態模塊繼續運行,因此TGT社區支持在內核中包含LIO。在Linux內核 2.6.38 之前都是TGT。

3、iSCSI 命名規則
iSCSI 使用全球唯一的名稱標識 iSCSI 設備(目標或啟動器)。此名稱類似於與光纖通道設備相關聯的全球名稱 (WWN),可作為一種通用的設備識別方式使用。
iSCSI 名稱有兩種不同格式。第一種是通過iSCSI限定名以 iqn.開頭通常稱為“IQN 名稱”。第二種是通過企業唯一標識符,以eui.開頭也稱為“EUI 名稱”,此方法不常用。
有關 iSCSI 命名要求和字符串配置文件的更多詳細信息,請參見 IETF 網站上的 RFC 3721 和 RFC 3722。

iSCSI 限定名
iSCSI 限定名采用 iqn.yyyy-mm.naming-authority:unique name 的形式,其中:
yyyy-mm :
表示“年份-月份“,是公司成立的年份和月份,這里的公司一般為安裝軟件的這個公司,當然了可以隨意選個時間

naming-authority :
通常是公司的 Internet 域名的逆轉格式。例如,pipci 公司的 iSCSI 限定名形式可能是 iqn.2018-01.cc.pipci.iscsi。此名稱表示 pipci.cc域名於 2018 年 1 月注冊,iscsi 是pipci.cc的子域,子域名可有可無。

unique name:
是希望使用的任何名稱,如主機的名稱或sn號。必須確保在冒號后面分配的任何名稱都是唯一的,例如:

iqn.2018-01.cc.pipci.iscsi:host1
iqn.2018-01.cc.pipci.iscsi:name1
iqn.2018-01.cc.pipci.iscsi:sn1999

企業唯一標識符
企業唯一標識符采用 eui.<16 hex digits> 的形式。
例如,eui.0123456789ABCDEF。
16 位十六進制數字是 IEEE EUI(擴展唯一標識符)格式的 64 位數的文本表示形式。前 24 位是 IEEE 向特定公 司注冊的公司 ID。后 40 位由持有該公司 ID 的實體分配,並且必須是唯一的。 在許多情況下,人們都會選擇 IQN 格式,而不是 EUI 格式,因為 IQN 格式方便閱讀,並且是一種更友好的名 稱分配方式。


4、Logical Unit Number
每個在同一個target上的backing-store 稱為邏輯單元號(LUN),LUN ID由iSCSI目標設備(Target)分配。iSCSI 啟動端(Initiator)設備當前支持在每個目標設備(Target)中導出最多256個LUN,即最大支持16個target。

對於LUN的理解,比較通俗就是整個磁盤,磁盤分區、LVM卷組、RAID等等。在iSCSI通信中,都有一個發起I/O請求的啟動端(Initiator)和響應請求並執行實際I/O操作的目標設備(Target),我們能夠提供 BlockLevel I/O 給 Initiator 主機,其目的不外乎是“將硬盤的排線網路化”、“把Target 主機的共享磁盤幻化成Initiator 主機的磁盤”以達成更大空間、更高 I/O 速度及具有冗余與高延展度的應用。

Target 即儲存設備(Storage Device),也就是存放數據的硬盤(以硬盤陣列居多),在使用iSCSI時,會在 iSCSI 儲存設備上去建立 LUN來提供給具備 iSCSI Initiator 功能的主機來存取數據的。可以把Target主機看作是服務端,把Initiator主機看作是客戶端。LUN 好比是個“邏輯單位磁碟”,為追求效率、冗余與延展性,這個 LUN 通常會是由數個實體磁碟( RAID 或 LVM 技術的技術實現)所組成。

 

二、iSCSI initiator發現iSCSI target的過程:

ISCSI initiator按照配置文件/etc/iscsi/iscsid.conf中配置的相應項目利用iSCSI的發現機制在網絡中收索目標設備target
ISCSI target將返回有效的iqn名稱給iSCSI initiator
ISCSI target按照配置的驗證方式接受initiator的登錄並返回目標設備target標識
ISCSI initiator發生查詢請求給target請求查詢target的相關信息
target響應initiator的查詢請求,並將設備的有關信息返回給initiator
initiator創建可以的目標設備target列表

 

三、iSCSI設備的特性:

支持報頭和數據摘要
支持兩種挑戰握手協議CHAP(ChallengeHandshake Authentication Protocol)的認證方式
目標端支持R2T(ReadytoTransfer)流控制
從RHEL4U2開始支持多通道(multipath)
支持sendtargets發現機制
支持動態目標端發現
具備異步事件通知入口
支持即時數據更新
支持動態設備重配
支持自動掛接iSCSI技術
支持IPV6技術

四、iSCSI設備名稱
iSCSI設備在iSCSI啟動端(Initiator)導入的時候,其內核將按當前的設備情況給iSCSI設備分配一個本地SCSI設備名(例如/dev/sda或/dev/sdb等),如果導入的iSCSI設備已被分區,在導入iSCSI設備建立本地SCSI設備的同時也會建立相應的分區設備名(例如/dev/sda1、/dev/sda5等等),但要注意的是此SCSI設備名並不是每次導入是都是固定的,比如你的主機之前沒有/dev/sda設備,你導入了iSCSI設備,其被內核命名為/dev/sda;之后你將其取消了導入,並重新掛接了一個熱插拔設備(如U盤或移動硬盤),這個熱插拔設備占據的/dev/sda設備;你又從新導入了iSCSI設備,此時其被內核分配的設備名就成了/dev/sdb。

五、為什么要搭建iSCSI共享存儲,因為窮!!!,如果有錢最好的方法是買一台真正的存儲,因為沒錢還要做很多需要共享存儲才能測試的功能,比如 Oracle RAC ,虛擬化的HA等都需要一台共享存儲,下面將介紹通過Linux 軟件來實現iscsi目標器,從而自己搭建一台iscsi存儲,組建iscsi

 

六、安裝iscsi目標器tgt,Debian9.5下實現

--------------------------------------------------
root@debian:~# apt install tgt
--------------------------------------------------

七、設置tgt服務開機啟動同時啟動tgt
--------------------------------------------------
root@debian:~# systemctl  enable  tgt.service         #設置開機啟動
root@debian:~# systemctl  start   tgt.service       #啟動tgt
--------------------------------------------------

八、關閉防火牆或開啟TCP 3260 端口,tgt通過TCP的3260端口來進行數據的傳輸


九、創建tgt共享資源
共享資源可以是分區(不需要格式化),整塊硬盤或通過dd命令創建一個文件,以上的創建方法這里就不介紹了

十、創建目標器(target),我們需要通過命令tgtadm來創建目標器,同時把共享資源添加到目標器中,這樣客戶端的啟動器才可以訪問目標器上的存儲資源,服務器端管理配置工具tgtadm的使用

tgtadm是一個高度模式化的命令,他們的模式很相近。有三個模式:target、logicalunit、account。指定模式時使用--mode選項。再使用--op來指定對應模式下的選項。另外,使用-lld指定driver,有兩種driver:iscsi和iser,基本都會使用iscsi。

1、模式target下的語法格式:

tgtadm  --lld  <driver>  --mode  target  --op {new|delete|show|update|bind|unbind} [option]

其中driver一般為iscsi, –op后面的參數表示要進行的操作如下

new:            表示增加一個target,語法格式為:–tid < id > –targetname < name >
delete:    表示刪除一個target,語法格式為:delete –tid < id >
show:      表示顯示所有的target,后面可以接某個target的id,只顯示某個target的信息。語法格式為:show [–tid < id >]
update:  用來修改某個特定的target的參數的,語法格式為:update –tid < id > –name < param > value < value >
bind:       用來將某個特定的initiator和target綁定在一起,表示只接受特定的initiator的請求,語法格式為:
bind –tid < id > –initiator-address < address >
unbind:  表示解綁的意思,語法格式為:unbind –tid < id > –initiator-address < address >

2、模式logicalunit下的語法格式:

tgtadm --lld < driver > --mode logicalunit --op {new|delete} [option]

其中driver一般為iscsi –op后面的參數表示要進行的操作

new:     表示新建一個lun,語法格式為:
new  –tid  < id >  –lun  < lun >  –backing-store < device-path > –bstype < type > –bsoflags
delete:      表示刪除一個LUN,語法格式為:delete –tid < id > –lun < lun >

3、模式account下的語法格式:

tgtadm --lld < driver > --mode account --op {new|delete|bind|unbind} [option]


其中driver一般為iscsi –op后面的參數表示要進行的操作

new:          表示新建一個賬號和密碼,語法格式為:new –user < name > –password < pass >
delete:      刪除某個已有的賬號,語法格式為:delete –user < name >
bind:      表示在某個特定的target上添加賬號,語法格式為:bind –tid < id > –user < name > [–outgoing]
如果使用了–outgoing選項,將被添加作為出去的賬號來使用
unbind:      表示在某個特定的target上刪除某個賬號,語法格式為:account –op unbind –tid < id > –user < name >

 

4、在tgtadm命令中,某些長選項可以使用短選項來代理,如:

 

十一、通過命令創建舉例:
1、創建一個target
需要說明的是,下面的實驗全是使用命令行工具tgtadm來實現的。但是修改配置文件然后使用tgt-admin也是一樣可以的,且target數量多的時候,更建議使用配置為文件加載的方式。最重要的一點是,使用命令行方式創建的target及lun等是臨時生效的,在target服務重啟后就失效了,再手動建立它們是一件相當麻煩的事情。

如下,分別使用了長格式選項和短格式選項分別創建和顯示target。注意:創建target時,tid不能是0,因為0是被系統保留的。
-----------------------------------------------------------------
root@debian:~# tgtadm   --lld  iscsi   --mode    target   --op   new   --tid  1  --targetname   iqn.pipci.cc.iscsi:debian.tgt1
root@debian:~# tgtadm  -L  iscsi  -m  target  -o  show
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
Account information:
ACL information:
root@debian:~#
-----------------------------------------------------------------
以上是第一個target的信息。從信息中可以看到:
創建完第一個target后自動就創建了一個LUN為0的logicalunit(以后簡稱lun),這是固定給每個target都使用的LUN。
此lun的類型是controller。
"backing store type"為null,即此lun沒有向下擴展邏輯設備,因為它是lun控制器。也就是說這個LUN是保留作為lun控制器用的。
"I_T nexus information"記錄的是initiator與此target的聯結關系,nexus的意思就是聯結、關聯,在后文介紹initiator的時候會展示此處信息。

2、現在向此target添加一個lun,使用的是新插入的磁盤/dev/sdb1。當然,使用整個磁盤或通過dd命令創建的文件來做實驗也可以。

-----------------------------------------------------------------
root@debian:~# tgtadm  -L  iscsi  -m  logicalunit  -o  new  -t  1  -l  1  -b  /dev/sdb1
root@debian:~# tgtadm  -L  iscsi  -m  target  -o  show
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk          #設備類型
SCSI ID: IET 00010001       #設備ID
SCSI SN: beaf11
Size: 2147 MB, Block size: 512   #這個lun的容量
Online: Yes             #狀態為在線
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr        #設備可讀寫
Backing store path: /dev/sdb1   #這個lun使用的是那個設備
Backing store flags:
Account information:
ACL information:
root@debian:~#
-----------------------------------------------------------------
從LUN 1信息中可以看出,lun type已經是disk而非controller,且顯示了此lun的容量大小是42950M。另外還顯示了使用的邏輯設備是/dev/sdb1,且是可讀可寫的(rdwr)。但到目前為止,該target都沒有定義共享給誰,這從target信息的最后兩行Account/ACL information中可以看出。

3、現在將此target綁定一個共享IP,即說明此IP可以連接該target。這是iSCSI的一種認證方式:IP認證,192.168.1.0/24表示一個網段,192.168.1.100表示一個具體的IP,千萬不要在具體的IP后面加/24,感覺是表示24位的掩碼,其實不用,加上以后initiator會連接失敗。除此之外,還有基於account的CHAP認證,詳細內容見后文。IP認證的作用是允許Initiator發現該target,並允許做進一步的基account的CHAP認證
-----------------------------------------------------------------
root@debian:~# tgtadm  -L  iscsi  -m  target  -o  bind  -t  1  -I  192.168.1.0/24
root@debian:~# tgtadm  -L  iscsi  -m  target  -o  show
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 2147 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb1
Backing store flags:
Account information:
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------
可以看到ACL information: 這里多了我們剛才添加的網絡信息,我們這里添加的是一個網段,也可以添加某個固定的IP地址,共享出去的是target級別而不是lun級別的,所以一旦允許訪問這個target,也就允許訪問target下的所有LUN了,所以要讓多個LUN有不同的主機訪問就要創建多個target,通過上面的操作我們就可以通過initiator進行訪問了

十二、通過target配置文件配置,重啟后依然生效

target端使用tgtadm命令配置的結果都是工作在內核中的,重啟tgt服務或重啟系統時,內存中的內容都會丟失。所以要永久讓配置生效需要寫入到配置文件中去。target的配置文件默認是/etc/tgt/targets.conf,但是可以在/etc/tgt/conf.d/目錄下建立多個以".conf"為后綴的配置文件,然后啟用主配置文件中的include指令即可。

1、說道配置文件就不到不說tgt-admin命令

tgt-admin是讀取配置文件的選項然后調用tgtadm來執行的工具。它的選項很多可以簡化tgtadm命令的書寫,畢竟tgtadm的選項太長太多余了,除此之外也有一些其他的作用用於更細致的配(tgtadm配置的太粗糙了)。用法如下:

tgt的配置文件為/etc/tgt/targets.conf,該配置文件的格式很容易讀懂,能實現的target和lun的配置方式多種多樣。下面就使用tgt-admin為當前的target生成對應的配置文件來稍作分析。首先列出當前target的信息。
-----------------------------------------------------------------
root@debian:~# tgt-admin  -s
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 2147 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb1
Backing store flags:
LUN: 2
Type: disk
SCSI ID: IET 00010002
SCSI SN: beaf12
Size: 5369 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdc        #直接將整個硬盤添加到lun
Backing store flags:
Account information:
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

使用--dump選項輸出為配置文件的格式
-----------------------------------------------------------------
root@debian:~# tgt-admin  --dump
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
backing-store /dev/sdb1
backing-store /dev/sdc         #列出多個LUN,
initiator-address 192.168.1.0/24
</target>

root@debian:~#
-----------------------------------------------------------------
由此可以看出,默認使用的driver是iscsi,名稱為iqn.pipci.cc.iscsi:debian.tgt1的target有一個backing-store,即邏輯設備/dev/sdb1。但是要注意,這樣導出的配置文件指定的LUN號碼可能會在tgt-admin讀取並執行的時候更換位置,但這並不會有任何影響。

將通過命令生產的配置信息導入到配置文件/etc/tgt/conf.d/tgt1.conf
-----------------------------------------------------------------
root@debian:~# tgt-admin  --dump  >  /etc/tgt/conf.d/tgt1.conf      #tgt1.conf是自定義的/etc/tgt/conf.d/目錄默認沒有這個文件
root@debian:~# cat /etc/tgt/conf.d/tgt1.conf
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>      #target的開始
backing-store /dev/sdb1
backing-store /dev/sdc
initiator-address 192.168.1.0/24
</target>                  #target的結束,有多個target就會有多個這樣的結構

root@debian:~#
-----------------------------------------------------------------
另外需要說明的是在tgt的配置文件/etc/tgt/targets.conf中有一行:

include /etc/tgt/conf.d/*.conf

只有存在這個選項,以后才可以導出配置文件到/etc/tgt/conf.d/目錄下並以.conf作為后綴的文件中,重啟tgtd服務即可重新加載,而不需要在手動加載了。不過有個問題,使用dump出來的配置文件會有default-driver指令行,而這一行不能在沒一個配置文件中都存在,他只能出現一次,否則將會報錯,所以需要只在地一個配置文件中的default-driver指令存在,其他配置文件中的都要注釋掉。其實我們只要把所有的target放在一個文件中就可以了,沒必要弄多個配置文件

現在將已有的target全部刪除,再去查看信息就已經沒有了
-----------------------------------------------------------------
root@debian:~# tgt-admin  --delete   ALL
root@debian:~# tgt-admin  -s
-----------------------------------------------------------------

重啟tgt服務然后查看信息,發現已經有了target
-----------------------------------------------------------------
root@debian:~# systemctl restart tgt.service    #重啟tgt服務
root@debian:~# tgt-admin  -s
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 2147 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb1
Backing store flags:
LUN: 2
Type: disk
SCSI ID: IET 00010002
SCSI SN: beaf12
Size: 5369 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdc
Backing store flags:
Account information:
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

自定義lun的號,backing-store的順序決定了lun號碼的順序,上面的配置中/dev/sdb1會是Lun1,/dev/sdc會是lun2。若想要為每個邏輯設備指定想要指定的lun號碼,需要將每個backing-store封裝在target中並獨立指定lun號碼。把/etc/tgt/conf.d/tgt1.conf配置文件改成下面的內容
-----------------------------------------------------------------
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
<backing-store /dev/sdb1>
lun 10
</backing-store>
<backing-store /dev/sdc>
lun 11
</backing-store>
initiator-address 192.168.1.0/24
</target>
-----------------------------------------------------------------
root@debian:~# systemctl restart tgt.service      #重起服務
root@debian:~# tgt-admin -s
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 10           #已經改成自定意的了
Type: disk
SCSI ID: IET 0001000a
SCSI SN: beaf110
Size: 2147 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdb1
Backing store flags:
LUN: 11
Type: disk
SCSI ID: IET 0001000b
SCSI SN: beaf111
Size: 5369 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
SWP: No
Thin-provisioning: No
Backing store type: rdwr
Backing store path: /dev/sdc
Backing store flags:
Account information:
ACL information:
192.168.1.0/24
root@debian:~#

十三、Debian9.5配置iSCSI Initiator
在Linux 2.6內核中提供了iscsi驅動,iSCSI 驅動(driver)使主機擁有了通過IP網絡訪問存儲的能力,但還需要一個具體的客戶端工具(Linux用戶空間組件)初始化iSCSI驅動,即open-iscsi。

open-iscsi initiator說明
open-iscsi包括兩個守護進程iscsid和iscsi,其中iscsid是主進程,iscsi進程則主要負責根據配置在系統啟動時進行發起端(Initiator)到服務端(target)的登錄,建立發起端與服務端的會話,使主機在啟動后即可使用通過iSCSI提供服務的存儲設備。

iscsid進程實現iSCSI協議的控制路徑以及相關管理功能。例如守護進程(指iscsid)可配置為在系統啟動時基於持久化的iSCSI數據庫內容,自動重新開始發現(discovery)目標設備。

open-iSCSI是通過以下iSCSI數據庫文件來實現永久配置的:

Discovery (/etc/iscsi/send_targets)
在 /etc/iscsi/send_targets 目錄下包含iSCSI portals的配置信息,每個portal對應一個目錄,目錄名為“iSCSI portal IP,端口號”(例如192.168.1.78,3260),在執行完發現命令后就會生成對應的目錄,目錄里面有對應的數據庫文件。

Node (/etc/iscsi/nodes)
在 /etc/iscsi/nodes 目錄下,生成一個或多個以iSCSI存儲服務器上的Target名命名的文件夾如iqn.pipci.cc.iscsi:debian.tgt1,在該文件夾下有一個文件名為“iSCSI portal IP,編號” (例如192.168.1.78,3260,1)的配置參數文件default,這個目錄也是在執行完發現后生成的,該文件中是initiator登錄target時要使用的參數,這些參數的設置是從/etc/iscsi/iscsi.conf中的參數設置繼承而來的,可以通過iscsiadm對某一個參數文件進行更改(需要先注銷到target的登錄)。

iSCSI node是一個在網絡上可用的SCSI設備標識符,在open-iscsi中利用術語node表示目標(target)上的門戶(portal)。一個target可以有多個portal,portal 由IP地址和端口構成。

1、安裝initiator程序open-iscsi
-----------------------------------------------------------------
root@debian:~# apt install  open-iscsi
-----------------------------------------------------------------
安裝完成后,比較重要的配置文件有兩個: /etc/iscsi/iscsid.conf 所有剛發起的iSCSI session默認都將使用這個文件中的參數設定 以及 /etc/iscsi/initiatorname.iscsi 軟件iSCSI initiator的intiator名稱配置文件,后面會介紹

2、設置iscsi服務開機啟動同時啟動iscsi
-----------------------------------------------------------------
root@debian:~# systemctl  enable  iscsi.service
root@debian:~# systemctl  enable  iscsid.service
root@debian:~# systemctl  start  iscsi.service
root@debian:~# systemctl  start  iscsid.service
-----------------------------------------------------------------

十四、 iscsi-iname命令
和target一樣,initiator也需要一個獨特的名稱來標識自己讓target識別。initiator在連接target的時候,會讀取/etc/iscsi/initiatorname.iscsi中的iqn作為自己的iname。

1、初始狀態的iname如下:
-----------------------------------------------------------------
root@debian:~# cat  /etc/iscsi/initiatorname.iscsi

InitiatorName=iqn.1993-08.org.debian:01:26cbb0737764
root@debian:~#
-----------------------------------------------------------------

2、通過命令iscsi-iname命令生成隨機的iqn號
-----------------------------------------------------------------
root@debian:~# iscsi-iname
iqn.2005-03.org.open-iscsi:12264f3310e0
root@debian:~# iscsi-iname
iqn.2005-03.org.open-iscsi:b0f184f7946b
root@debian:~# iscsi-iname
iqn.2005-03.org.open-iscsi:84cc29c37b5d
-----------------------------------------------------------------
通過上面的執行可以看出來沒次運行這個命令都會生成一個不一樣的iqn號,但是iqn的前綴iqn.2005-03.org.open-iscsi:都是一樣的只是后面的隨機數不一樣
我們可以通過“-p”選項來指定前綴,如下所示:
-----------------------------------------------------------------
root@debian:~# iscsi-iname  -p  iqn.2019-10.cc.pipci.iscsi
iqn.2019-10.cc.pipci.iscsi:193a96d04d8
root@debian:~# iscsi-iname -p iqn.2019-10.cc.pipci.iscsi
iqn.2019-10.cc.pipci.iscsi:ac34b648a96           #只是后面的隨機數變化了
root@debian:~#
-----------------------------------------------------------------

3、通過修改/etc/iscsi/initiatorname.iscsi的內容來實現默認的iqn,通過上面的命令生成的iqn重啟iscsi服務后還會讀取默認的,所以我們直接通過修改這個配置文件來得到一個容易記憶的iqn修改內容如下:
-----------------------------------------------------------------
InitiatorName=iqn.2019-10.cc.pipci.iscsi:sn8888    #后面的隨機數推薦用主機的sn好后4位或6位,這樣比較好管理

修改完重啟服務
-----------------------------------------------------------------
root@debian:~# systemctl  restart  iscsi.service
-----------------------------------------------------------------

十五、iscsiadm命令
iscsiadm是用來管理(更新、刪除、插入、查詢)iSCSI配置數據庫文件的命令行工具,用戶能夠用它對iSCSI nodes、sessions、connections和discovery records進行一系列的操作。iscsiadm也是一個模式化的命令,使用-m指定mode。mode有:discovery、node、session、iface。一般就用前兩個mode。

discovery:  發現某服務器是否有target輸出,以及輸出了哪些target。發現target后會生成target數據庫discoverydb。
node:          管理跟某target的關聯關系。在discovery發現了target后,是否要跟target建立關系,是否要刪除已有的關系或者解除已有的關系等。刪除關聯關系不僅會解除關聯,還會刪除發現target后生成的discoverydb。
session:  會話管理。
iface:       接口管理。

在客戶端使用Target提供的存儲空間前,必須在服務器上通過Initiator軟件執行以下步驟:發現目標設備 --> 關聯(登錄)目標設備 --> 與目標設備建立會話,下面分別說明通過各個命令進行說明。

1、發現target(discovery)

即使用discovery模式。

iscsiadm -m discovery [ -d debug_level ] [ -t type -p ip:port -I ifaceN [ -p ip:port ]

-d:  輸出調試信息,級別從0-8。出現錯誤的時候用來判斷錯誤來源是很有用處的,可以使用級別2。
-I:  指定發現target時通信接口。
-t  type:          有三種type(sendtargets,SLP,iSNS),一般只會用到sendtargets,可以簡寫為st。
-p  IP:PORT:  指定要發現target的IP和端口,不指定端口時使用默認的3260。

2、現在可以進行discovery來發現target
-----------------------------------------------------------------
root@debian:~# iscsiadm  -m  discovery  -t  st  -p  192.168.1.78:3260
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1
root@debian:~#
-----------------------------------------------------------------
在完成目標發現后,即可以登錄到相應的節點,使用目標設備提供的存儲空間

3、關聯和解除關聯target(node)

關聯target的作用是initiator和target建立session,建立session后,initiator上就可以查看、訪問、操作target上的scsi設備。同時target提供的存儲設備也掛載到主機中,在/dev目錄下生成一個新的設備文件類似於sdb、sdc等。使用iscsiadm -m session 來查看連接會話信息。
有兩種關聯方法,一是關聯所有,一是指定單個target進行關聯。關聯也可以叫做登錄,解關聯也可以叫做取消登錄


iscsiadm -m node [-d debug_level] [-L all,manual,automatic] [-U all,manual,automatic]
iscsiadm -m node [-d debug_level] [[-T targetname -p ip:port -I ifaceN] [-l | -u ]] [-o operation]

-d:    指定debug級別,有0-8個級別。
-L和-U:  分別是登錄和登出target,可以指定ALL表示所有發現的target,或者manual指定。
-l和-u:    分別是登錄和登出某一個target。
-T:    用於-l或-u時指定要登錄和登出的targetname。
-o:    對discoverydb做某些操作,可用的操作有new/delete/update/show,一般只會用到delete和show。
-p:    指定要發現target的IP和端口,不指定端口時使用默認的3260
-R:    掃描所有關聯的target

例如,使用單個的關聯方式關聯target。其中在第一步中發現的target都會保存在本地的數據庫中,可以通過命令iscsiadm -m node查看。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m node
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1
root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
Login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] successful.
root@debian:~#

-----------------------------------------------------------------

關聯發現的所有目標器
iscsiadm -m node -L all


4、查看登錄的session,可以通過選項-P 0-3 來打印更詳細的信息
-----------------------------------------------------------------
root@debian:~# iscsiadm -m session
tcp: [1] 192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1 (non-flash)
root@debian:~# iscsiadm -m session -P 2 #打印更詳細的信息
Target: iqn.pipci.cc.iscsi:debian.tgt1 (non-flash)
Current Portal: 192.168.1.78:3260,1
Persistent Portal: 192.168.1.78:3260,1
**********
Interface:
**********
Iface Name: default
Iface Transport: tcp
Iface Initiatorname: iqn.2019-10.cc.pipci.iscsi:sn8888
Iface IPaddress: 192.168.1.16
Iface HWaddress: <empty>
Iface Netdev: <empty>
SID: 1
iSCSI Connection State: LOGGED IN
iSCSI Session State: LOGGED_IN
Internal iscsid Session State: NO CHANGE
*********
Timeouts:
*********
Recovery Timeout: 120
Target Reset Timeout: 30
LUN Reset Timeout: 30
Abort Timeout: 15
*****
CHAP:
*****
username: <empty>
password: ********
username_in: <empty>
password_in: ********
************************
Negotiated iSCSI params:
************************
HeaderDigest: None
DataDigest: None
MaxRecvDataSegmentLength: 262144
MaxXmitDataSegmentLength: 8192
FirstBurstLength: 65536
MaxBurstLength: 262144
ImmediateData: Yes
InitialR2T: Yes
MaxOutstandingR2T: 1

root@debian:~#
-----------------------------------------------------------------

5、此時先看下target端的target信息
-----------------------------------------------------------------
root@debian:~# tgt-admin  -s  |  more
Target 1: iqn.pipci.cc.iscsi:debian.tgt1
System information:
Driver: iscsi
State: ready
I_T nexus information:
I_T nexus: 1
Initiator: iqn.2019-10.cc.pipci.iscsi:sn8888
Connection: 0
IP Address: 192.168.1.16
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 10

--More--
-----------------------------------------------------------------
其中I_T nexus表示initiator到target的關聯信息,nexus的值是該initiator關聯到target的次數。多個initiator會顯示多個I_T nexus信息。這里可以看到只有一個I_T nexus,說明只有一個initiator進行了關聯,這里可以看到initiator的iqn號和ip地址。

6、掃描所有關聯的target/session
一旦登錄成功,所有分配給當前主機的LUN都可以看到了,但有時,新分配的LUN,LUN的信息發生變化后,主要不能立即看到,這樣就需要rescan了 --rescan 。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m node -R
Rescanning session [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260]
root@debian:~#

root@debian:~# iscsiadm -m session -R
Rescanning session [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260]
root@debian:~
-----------------------------------------------------------------

7、解除關聯
解除單個關聯
-----------------------------------------------------------------
root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260  -u
Logging out of session [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260]
Logout of [sid: 1, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] successful.
root@debian:~#
-----------------------------------------------------------------

解除所有關聯
iscsiadm -m node -U all


8、連接死掉(斷網或者target端斷掉或目標器IP改變)時,可以刪除老節點,然后再重新發起discovery生成新節點,使用如下指令刪除
-----------------------------------------------------------------
root@debian:~# iscsiadm  -m  node  -T  iqn.pipci.cc.iscsi:debian.tgt1  -p  192.168.1.78:3260  -o  delete
-----------------------------------------------------------------

刪除所有node信息
iscsiadm -m node -o delete

通過上面的刪除操作其實就是清除了在discovery時存儲在/etc/iscsi/nodes中的信息,已經設置開機啟動的node因為沒有了數據庫信息也不會隨開機啟動了,但是在刪除前可能需要先解除管理


9、設置開機自動登錄
-----------------------------------------------------------------
root@debian:~# iscsiadm  -m node  -T  iqn.pipci.cc.iscsi:debian.tgt1  -p  192.168.1.78:3260  --op  update  -n  node.startup  -v  automatic
-----------------------------------------------------------------
對於還沒有關聯的節點,編輯配置文件/etc/iscsi/iscsid.conf,在其中增加一項node.startup = automatic ,將默認的node.startup = manual項注釋掉,這樣以后通過discovery新發現的節點的node.startup都會被設置為automatic,設置自動管理目標器以后,即使沒有通過命令設置開機啟動,每次啟動iscsi服務時都會自動關聯目標器

10、取消開機自動登錄
-----------------------------------------------------------------
root@debian:~# iscsiadm  -m  node  -T  iqn.pipci.cc.iscsi:debian.tgt1  -p  192.168.1.78:3260  --op  update  -n  node.startup  -v  manual
----------------------------------------------------------------- 

十六、/etc/iscsi/iscsid.conf 主要的配置文件,我們主要關系下面幾個部分

1、# Startup settings initator啟動設置

node.startup = automatic   是表示當iscsi initator啟動時就會自動登陸到發現過的target。

node.startup = manual        是表示當iscsi initator啟動時不會自動登陸到發現過的target。


2、# CHAP Settings   主要是一些安全設置。

3、# Timeouts 部分是我們重點關注的地方:

node.session.timeo.replacement_timeout
指網絡出現問題,多長時間通知上層:

node.session.timeo.replacement_timeout = 120
一般我們可以把這個時間改小,防止IO被hang太長時間,如:
node.session.timeo.replacement_timeout = 3


下面兩個時間是sessison登錄和登出Target的超時時間,也可以適當減少。
node.conn[0].timeo.login_timeout = 15
node.conn[0].timeo.logout_timeout = 15


node.conn[0].timeo.noop_out_interval 指發ping包的時間間隔,
node.conn[0].timeo.noop_out_timeout 為接收心跳包的超時時間

node.conn[0].timeo.noop_out_interval = 5
node.conn[0].timeo.noop_out_timeout = 5
這兩個時間根據需要減少,如:
node.conn[0].timeo.noop_out_interval = 1
node.conn[0].timeo.noop_out_timeout = 1


node.session.initial_login_retry_max 為登錄的重試次數:
node.session.initial_login_retry_max = 4
可以適當減少到 2:
node.session.initial_login_retry_max = 2

設置完成后啟動iscsi initiator服務

十七 account模式和CHAP認證

1 CHAP認證

基於IP的認證不夠安全,不過多數時候已經夠用了。但對於安全性要求高的環境來說,使用CHAP認證更好一些。

CHAP(Challenge-Handshake Authentication Protocol),稱為挑戰式握手認證協議,它是雙向認證,當然也支持單向認證。

對於iscsi而言,在CHAP認證的機制上有兩種方式:initiator authentication和target authentication。

initiator authentication認證
 
在initiator嘗試連接到一個target的時候,initator需要提供一個用戶名和密碼給target被target進行認證。也就是說initiator需要被target認證,它向target端提供的賬號和密碼是target端指定的。
 
這個賬號和密碼對於target來說是流入的賬號和密碼,用incoming表示。所以后面稱呼這個賬號和密碼為incoming賬號和incoming密碼。再次說明,incoming賬號是initiator端提供給target端,被target端認證的賬號。incoming賬號可以有多個。
 
target authentication認證
 
在initiator嘗試連接到一個target的時候,target有時也需要被initiator認證,以確保該target是合法而非偽裝的target,這就要求target提供一個用戶名和密碼給initiator被initiator進行認證。
 
target向initiator提供的賬號和密碼對於target而言是流出的,所以稱之為outgoing。所以outgoing使用的賬號和密碼在后文稱為outgoing賬號和outgoing密碼。而對於initiator而言是incoming的,所以在initiator配置文件中稱為in。也就是說outgoing賬號是target端提供給initiator端,被initiator認證的賬號,但盡管如此,這個賬號和密碼還是在target端創建和綁定的。target的outgoing賬號只能有一個。

綜上,不管是什么認證,賬號和密碼都是target端創建和綁定。

以上兩種認證方式是有層次順序的。一般來說,有認證需求的時候都是服務器驗證客戶端是否有權限,iscsi也一樣。

initiator authentication可以單獨存在,它可以在沒有target authentication的情況下應用,這時候的CHAP認證就是單向認證(target認證initiator的合法性)。

但target authentication只有在initiator authentication的基礎上才能進行。也就是說target認證和initiator認證必須同時存在才可以。即initiator和target需要相互認證實現雙向CHAP認證

2、tgtadm命令的account模式用法

以下是tgtadm --help關於account的結果,但是用法給的並不全面。

--lld  <driver>  --mode  account  --op  new  --user  <name>  --password  <pass>
--lld  <driver>  --mode  account  --op  delete  --user  <name>
--lld  <driver>  --mode  account  --op bind  --tid  <id>  --user  <name>  [--outgoing]
--lld  <driver>  --mode  account  --op unbind  --tid  <id>  --user  <name>

以下是個人發現的較為全面的用法,為了偷懶,所以使用短選項格式來表示。其中

# 新建一個用戶
-L <driver> -m account -o new --u <name> --p <pass>

# 刪除一個用戶
-L <driver> -m account -o delete --u <name>

# 查看用戶列表
-L <driver> -m account -o show

# 綁定用戶到target上,outgoing的意義在后文會說明
-L <driver> -m account -o bind -t <tid> -u <name> [--outgoing]

# 從target上解綁用戶
-L <driver> -m account -o unbind -t <tid> -u <name> [--outgoing]

十八、實現CHAP單向認證

1、首先確保target的ACL是允許initiator進行discovery的。
-----------------------------------------------------------------
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

2、在target端創建initiator authentication所需的賬號和密碼並綁定到target_ID上。這個賬號是用來對initiator進行單向認證的,所以對於target而言是incoming賬號。
-----------------------------------------------------------------
root@debian:~# tgtadm  -L  iscsi  -m  account  -o  new --user  laopi  --password  pi1234
root@debian:~# tgtadm -L iscsi -m account -o bind -t 1 --user laopi
root@debian:~#
-----------------------------------------------------------------

3、查看下綁定情況
-----------------------------------------------------------------
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:
laopi
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------
由於gtg的工作在用戶態,所以配置好后無需重啟服務,這些賬號相關的就可以生效。

4、在initiator端修改配置文件/etc/iscsi/iscsid.conf,設置以下幾項,這里故意沒啟用密碼認證部分,是為了看到認證失敗的結果。
-----------------------------------------------------------------
root@debian:~# vi /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = laopi
node.session.auth.password = pi12       #錯誤的密碼
-----------------------------------------------------------------

5、在initiator發現,然后關聯。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m discovery -t st -p 192.168.1.78:3260
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1

root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260].
iscsiadm: initiator reported error (24 - iSCSI login failed due to authorization failure) #提示由於授權失敗導致iSCSI登錄失敗
iscsiadm: Could not log into all portals
root@debian:~#
-----------------------------------------------------------------

6、因為認證所需的密碼沒設置,所以認證失敗了。設置為正確的賬號和密碼再進行發現、關聯認證。
-----------------------------------------------------------------
root@debian:~# vi /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = laopi
node.session.auth.password = pi1234      #正確的密碼

root@debian:~# iscsiadm -m discovery -t st -p 192.168.1.78:3260      #需要從新發現一次
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1

root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
Login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] successful.      #成功
root@debian:~#
-----------------------------------------------------------------

十九、 實現CHAP雙向認證

1、要雙向認證,那么target端需要創建一個outgoing賬號和密碼,並綁定到target上。注意下面的--outgoing選項,表示是從target流出的賬號,即表示該target要被initiator認證。target authentication只有在initiator authentication的基礎上才能進行。所以要先創建initiator認證
-----------------------------------------------------------------
root@debian:~# tgtadm -L iscsi -m account -o new --user laopi --password pi1234
root@debian:~# tgtadm -L iscsi -m account -o bind -t 1 --user laopi #創建initiator認證
root@debian:~# tgtadm -L iscsi -m account -o new --user laopiout --password pi123456 #兩個認證的密碼要不一樣否則登錄會有錯誤
root@debian:~# tgtadm -L iscsi -m account -o bind -t 1 --user laopiout --outgoing #創建target認證
root@debian:~#
-----------------------------------------------------------------

2、查看下target上的賬號信息。在信息中,outgoing的賬號后面使用括號對此進行了標識。
-----------------------------------------------------------------
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:
laopi
laopiout (outgoing)      #兩個認證都存在了
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

3、然后在initiator端配置CHAP雙向認證。同樣,此處先配置一個錯誤的情況以作比較。
-----------------------------------------------------------------
root@debian:~# vi /etc/iscsi/iscsid.conf
node.session.auth.authmethod = CHAP
node.session.auth.username = laopi             #單向的配置選項
node.session.auth.password = pi1234
node.session.auth.username_in = laopiout      #雙向的配置選項
node.session.auth.password_in = pi12
-----------------------------------------------------------------

4、重新進行發現和關聯。不過首先要解關聯已經關聯的target。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m node -U all        #解除已經關聯的

root@debian:~# iscsiadm -m discovery -t st -p 192.168.1.78:3260
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1

root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
iscsiadm: Could not login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260].
iscsiadm: initiator reported error (19 - encountered non-retryable iSCSI login failure)      #關聯失敗和上面報的錯誤不一樣
iscsiadm: Could not log into all portals
root@debian:~#
-----------------------------------------------------------------

5、配置為正確的密碼然后再進行發現、關聯。
-----------------------------------------------------------------
root@debian:~# iscsiadm -m discovery -t st -p 192.168.1.78:3260
192.168.1.78:3260,1 iqn.pipci.cc.iscsi:debian.tgt1
root@debian:~# iscsiadm -m node -T iqn.pipci.cc.iscsi:debian.tgt1 -p 192.168.1.78:3260 -l
Logging in to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] (multiple)
Login to [iface: default, target: iqn.pipci.cc.iscsi:debian.tgt1, portal: 192.168.1.78,3260] successful.      #登錄成功

root@debian:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 18G 0 part /
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 2G 0 part [SWAP]
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 2G 0 part
└─sdb2 8:18 0 1G 0 part
sdc 8:32 0 5G 0 disk        #可以正常的識別磁盤
sdd 8:48 0 2G 0 disk
sde 8:64 0 5G 0 disk
sr0 11:0 1 1024M 0 rom
-----------------------------------------------------------------

二十、tgtadm上解綁和刪除用戶

1、先查看下有目前有哪些用戶。
-----------------------------------------------------------------
root@debian:~# tgtadm -L iscsi -m account -o show
Account list:
laopiout
laopi
root@debian:~#
-----------------------------------------------------------------

2、再查看下哪些用戶是已經綁定到target上的
-----------------------------------------------------------------
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:
laopi
laopiout (outgoing)
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

3、對incoming賬號進行解綁
-----------------------------------------------------------------
root@debian:~#tgtadm -L iscsi -m account -o unbind -t 1 -u laopi
-----------------------------------------------------------------

4、對outgoing賬戶解綁
-----------------------------------------------------------------
root@debian:~# tgtadm -L iscsi -m account -o unbind -t 1 -u laopiout --outgoing
root@debian:~# tgt-admin -s | sed -n '/Account/,$p'
Account information:                  #綁定的帳號已經全部解除
ACL information:
192.168.1.0/24
root@debian:~#
-----------------------------------------------------------------

6、刪除賬戶
-----------------------------------------------------------------
root@debian:~# tgtadm -L iscsi -m account -o delete -u laopi
root@debian:~# tgtadm -L iscsi -m account -o delete -u laopiout
root@debian:~# tgtadm -L iscsi -m account -o show
root@debian:~#                      #全部刪除了
-----------------------------------------------------------------

二一、target將CHAP認證添加到配置文件,重啟后依然生效
通過命令生產的配置文件格式如下所示:
-----------------------------------------------------------------
root@debian:~# tgt-admin  --dump
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
backing-store /dev/sdb1
backing-store /dev/sdc
incominguser laopi PLEASE_CORRECT_THE_PASSWORD
outgoinguser laopiout PLEASE_CORRECT_THE_PASSWORD
initiator-address 192.168.1.0/24
</target>
-----------------------------------------------------------------
如果將上面的文件內容直接導入到配置文件/etc/tgt/conf.d/tgt1.conf(這個文件上面第十二節已經介紹)中,initiator端關聯會報認證失敗的錯誤,因為上面的密碼部分已經不是通過命令時創建的密碼,導入配置文件后需要改成如下的格式
-----------------------------------------------------------------
root@debian:~# tgt-admin --dump
default-driver iscsi

<target iqn.pipci.cc.iscsi:debian.tgt1>
backing-store /dev/sdb1
backing-store /dev/sdc
incominguser laopi pi1234           #incoming賬號的密碼必須直接體現出來
outgoinguser laopiout pi123456       #outgoing賬號的密碼必須直接體現出來
initiator-address 192.168.1.0/24
</target>
-----------------------------------------------------------------
通過上面的更改保持后,重啟tgt服務或系統都會生效,正常關聯,在通過tgt-admin --dump命令查看到的密碼還是沒改前的形式

二十二、格式化分區添加的設備

1、查看新添加的設備
-----------------------------------------------------------------
root@debian:~# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 18G 0 part /
├─sda2 8:2 0 1K 0 part
└─sda5 8:5 0 2G 0 part [SWAP]
sdb 8:16 0 5G 0 disk
├─sdb1 8:17 0 2G 0 part
└─sdb2 8:18 0 1G 0 part
sdc 8:32 0 5G 0 disk
sdd 8:48 0 2G 0 disk       #新添加的iscsi設備
sde 8:64 0 5G 0 disk       #新添加的iscsi設備
sr0 11:0 1 1024M 0 rom
-----------------------------------------------------------------
2、將新添加的設備分區格式化為ext4 並掛在到/mnt目錄
-----------------------------------------------------------------
root@debian:~# df -hT
文件系統 類型 容量 已用 可用 已用% 掛載點
udev devtmpfs 991M 0 991M 0% /dev
........
/dev/sde1 ext4 2.0G 6.0M 1.8G 1% /mnt     #成功掛載
root@debian:~#
-----------------------------------------------------------------

二十三、常遇到的問題

1、initiator開機一直處於等待狀態
該問題在前文描述過。

出現這個問題是因為initiator端設置了iscsi或iscsid開機自啟動,正好又無法和target聯系,如通信出現故障、target處於關機狀態、target中的tgtd服務未啟動、target上的target_id和target_name等配置改變了。

總而言之,開機自啟動的時候無法正常關聯target就會出現此問題。

解決辦法也是建議的辦法是把iscsi和iscsid的開機自啟動關閉掉,然后把啟動他們的命令放到啟動加載文件中。

如果已經遇到了無法正常開機的情況,那么可以多等待些時間,或者修改target端讓target端能夠和initiator匹配上。如target端本來是關機狀態,將其開機即可。

initiator連接target后關機開機的順序是:
關機:先關initiator在關target
開機:先開target在開initiator

2、iSCSI的數據不安全性(不同步性)

因為target共享的分區可以被多個initiator同時掛在,當多個主機同時使用邏輯存儲,數據會沖突並且不能及時同步而導致數據丟失。這是因為target沒有設備鎖機制,也就是當有一個
initiator正在寫入的時候不會鎖定這個分區不讓其他initiator也同時寫寫入,所以,iscsi一定要配合集群文件系統或者分布式文件系統來使用以防止上述問題。

3、重啟tgtd服務不加載配置文件的問題
如果在正常狀態下有initiator關聯了target設備,此時重啟tgtd服務很可能會導致配置文件中的配置不生效,這是為了保護initiator仍然可以隨時關聯target而不丟失數據和狀態設立的機制。但不得不說,這個特性真的很讓人煩惱,配置不生效,難道非得再使用tgtadm來重新生成到內核嗎?上述問題只有使用force-reload選項或重啟能解決
-----------------------------------------------------------------
root@debian:~# systemctl force-reload tgt.service
-----------------------------------------------------------------

 

 

https://wiki.archlinux.org/index.php/ISCSI_Target_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

 

https://wiki.archlinux.org/index.php/ISCSI_initiator_(%E7%AE%80%E4%BD%93%E4%B8%AD%E6%96%87)

 

https://segmentfault.com/a/1190000002717726

 

https://fedoraproject.org/wiki/Scsi-target-utils_Quickstart_Guide

 

https://www.cnblogs.com/sting2me/p/6937578.html

 

https://blog.csdn.net/qqqqqq999999/article/details/72547970

 

https://www.cnblogs.com/f-ck-need-u/p/9067906.html

 

https://blog.csdn.net/celeste7777/article/details/48783385

 

https://forum.huawei.com/enterprise/zh/thread-217813.html

 

http://stgt.sourceforge.net/manpages/tgtadm.8.html

 

https://www.cnblogs.com/wuchanming/p/4894373.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM