Linux下搭建iSCSI共享存儲的方法 Linux-IO Target 方式CentOS7-1810下實現


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系統中可以使用iscsi-initiator-utils軟件包來模擬實現;

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(Linux-IO)項目被選擇來代替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 格式方便閱讀,並且是一種更友好的名 稱分配方式。


二、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設備的特性:

支持ACL(訪問控制列表)
支持兩種挑戰握手協議CHAP(ChallengeHandshake Authentication Protocol)的認證方式
支持多通道(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

、Linux-IO簡介
Linux-IO Target在Linux內核中(linux 2.6.38后),用軟件實現各種SCSI Target,其支持的SAN技術中所有流行的存儲協議包括Fibre Channel(Qlogic,linux3.5)、FCoE(linux3.0)、iSCSI(linux 3.1)、iSER (Mellanox InfiniBand,linux3.10), SRP (Mellanox InfiniBand,linux3.3), USB等,同時還能為本機生成模擬的SCSI設備,以及為虛擬機提供基於virtio的SCSI設備。Linux-IO Target使用戶能夠使用相對廉價的Linux系統實現SCSI、SAN的各種功能,而不用購買昂貴的專業設備。

1. 架構

 

 


上圖顯示了Linux-IO Target的各個組件。LIO模擬了通用的SCSI設備,並且實現了SPC-3和4。接着,通過各種各樣的backstore對象,來導入真正的后端存儲,最后連接上各種前端Fabric模塊,來導出模擬的SCSI設備。無論是Fibre Channel、FCoE、iSCSI還是vhost(即virtio),都只是一種Fabric技術,我們可以將其理解成傳輸協議,而在這些傳輸協議中傳輸的SCSI命令則總是由核心的SCSI設備處理的。要支持新的Fabric技術,並不需要修改核心的SCSI設備和后端存儲模塊,只需要按照該Fabric技術的規范實現對SCSI命令的傳輸就可以了。iSCSI技術就是把SCSI命令放在TCP/IP中傳輸,vhost技術就是把SCSI命令放在virtio隊列中傳輸。

Generic Target Engine:實現了SAM中規定的一個SCSI target的功能,主要是SCSI協議的解析。它通過Fabric模塊和initiator通信,通過backstore和具體的存儲設備通信。Fabric modules:實現了LIO的前端,即SCSI協議傳輸層的模塊。可以通過Fabric Hardware Abstraction Layer(F-HAL)來為LIO增加新的fabric模塊。

Backstores:實現了LIO的后端,即訪問磁盤數據的方式。可以通過Storage Hardware Abstraction Layer(S-HAL)在LIO中增加新的存儲硬件的支持。通常使用BLOCKIO和FILEIO。

2. 使用方法

Linux-IO Target則在內核態實現了對Target的模擬,配置管理則采用了更為“現代化”的基於sysfs的方式,提供了友好的用戶態管理工具。從內核的2.6.38版起,Linux內核都包含Linux-IO Target的相關模塊。在用戶態,各大發行版都打包了targetcli和rtslib,其中targetcli程序用於配置、管理,rtslib則提供Python編程接口。

以iSCSI為例,Linux-IO Target的配置結構如圖1所示。處於最后端的是各種各樣的Linux的存儲設備。Linux-IO Target支持的后端存儲設備包括Ramdisk、通用塊設備和文件,也可以直接映射本地SCSI設備。Linux-IO Target通過創建backstore存儲對象來導入這些存儲設備。它可以使用各種SAN傳輸技術來導出這些存儲對象。首先,基於某種SAN技術(例如iSCSI)創建一個Target。接着,在Target里創建一個TPG(Target Portal Group)。每個Target下可以創建多個TPG,每個TPG包含了一組入口(Portal)。然后在TPG里創建LUN,並將特定的存儲對象與特定的LUN關聯起來。最后在TPG里創建一個或者多個入口,對iSCSI來說,每個Portal就是一個IP地址和端口的組合。為了更精確的控制對LUN的訪問,還可以在TPG之下創建各種ACL規則。


targetcli
targetcli是Linux-IO Target的用戶態的管理配置工具。用戶可以使用yum或apt-get直接從各大發行版的官方倉庫安裝,對於較老的linux版本需要自己編譯源碼安裝。targetcli提供一個類似shell的界面,各種Target、TPG、LUN、backstore對象則被組織成目錄樹的形式,用戶可以用ls、cd命令來瀏覽目錄樹,用create、delete命令來創建和刪除各種對象。瀏覽配置,就是瀏覽目錄樹,創建刪除各種對象,就是在目錄樹的各級節點中創建新的節點。同時targetcli還提供了常見的shell命令輔助編輯功能,例如TAB智能補全、上下鍵切換命令歷史、Ctrl + R搜索命令歷史。凡是有不熟悉的命令,都可以用help命令查詢使用說明。其實,對於我們來說,配置LIO主要就是使用targetcli

rtslib
rtslib是一個Python程序庫,讓用戶可以以編程的方式配置Linux-IO Target的各項功能。rtslib中的對象也被組織成樹狀結構,並且與我們在targetcli中熟悉的各種對象也很相似。熟悉了targetcli的操作之后,用rtslib編程就變得十分容易

七、安裝配置工具targetcli

--------------------------------------------------
[root@CentOS7 ~]# yum -y install targetcli        #安裝軟件

[root@CentOS7 ~]# systemctl enable target.service    #設置服務程序target開機啟動,默認不啟動,很重要
[root@CentOS7 ~]# systemctl start target.service         #啟動服務程序target,很重要

--------------------------------------------------
安裝完targetcli將會生成/etc/target/saveconfig.json用於保存配置,在安裝完程序后必須執行systemctl enable target.service設置服務程序target開機啟動,同時啟動這個服務。否則配置完的數據不能保存到/etc/target/saveconfig.json文件中,重啟系統后進入targetcli命令后將不能看到上次創建的target配置


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

九、使用targetcli創建后端存儲對象
targetcli命令有兩種模式,一種是交互式模式,一種是命令行模式。輸入targetcli 回車就進入交互式模式,進入交互式模式可以使用ls,pwd,cd等命令
--------------------------------------------------
1. targetcli初始提示
[root@CentOS7 ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb49
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/>                 #在這里按2次TAB鍵可以查看所有可用的命令,在每個目錄下都可以通過這種方式查看可用的命令
* / @last backstores/ iscsi/ loopback/ vhost/ bookmarks
cd clearconfig exit get help ls pwd refresh
restoreconfig saveconfig sessions set status version
/>

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

2. 在交互模式下列出初始目錄樹,輸入ls命令,targetcli便將當前的目錄樹輸出
--------------------------------------------------
/> ls
o- / ................................................... [...]
  o- backstores ........................................ [...]
  | o- block ............................ [Storage Objects: 0]
  | o- fileio ............................. [Storage Objects: 0]
  | o- pscsi ............................. [Storage Objects: 0]
  | o- ramdisk .......................... [Storage Objects: 0]
  o- iscsi ................................................ [Targets: 0]
  o- loopback ........................................ [Targets: 0]
  o- vhost .............................................. [Targets: 0]
/>
--------------------------------------------------

命令行實現:
--------------------------------------------------
[root@CentOS7 ~]# targetcli ls
o- / ................................................... [...]
  o- backstores ........................................ [...]        #用戶配置后端存儲目錄,下面有4個子目錄分別創建不同類型的存儲資源
  | o- block ............................ [Storage Objects: 0]     #配置塊設備目錄,可以是磁盤驅動器,分區,邏輯卷,多路徑設備,只要塊設備都可以
  | o- fileio ............................. [Storage Objects: 0]     #配置文件(鏡像img)目錄,根據一個事先准備的文件,提供存儲功能
  | o- pscsi ............................. [Storage Objects: 0]     #配置物理scsi設備目錄,不推薦使用
  | o- ramdisk .......................... [Storage Objects: 0]   #配置內存存儲目錄,利用內存當做存儲。
  o- iscsi .............................................. [Targets: 0]      #配置iSCSI目標
  o- loopback ...................................... [Targets: 0]
  o- vhost ............................................ [Targets: 0]
[root@CentOS7 ~]#
--------------------------------------------------

2、創建物理磁盤結構作為target后端的物理存儲(事先已經准備好了一個5G的磁盤做備用)
--------------------------------------------------
[root@CentOS7 ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb49
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> cd backstores/block                 #進入block子目錄來通過塊設備創建target后端存儲資源
/backstores/block> create lun1 /dev/sdb        #通過create命令創建名字為lun1的存儲資源
Created block storage object lun1 using /dev/sdb.

/backstores/block> ls               #查看創建的存儲資源
o- block ............................................................... [Storage Objects: 1]
  o- lun1 ...................... [/dev/sdc (5.0GiB) write-thru deactivated]      #新創建的
    o- alua ........................................................ [ALUA Groups: 1]
      o- default_tg_pt_gp ..... [ALUA state: Active/optimized]
/backstores/block>
--------------------------------------------------

命令行的實現:
[root@CentOS7 ~]# targetcli /backstores/block create name=lun1 dev=/dev/sdb


3、創建文件和內存作為target后端的物理存儲
--------------------------------------------------
/backstores> cd fileio/                    #進入fileio子目錄來通過文件創建target后端存儲資源
/backstores/fileio> create lun1 /tmp/lun1.img     #/tmp/lun1.img文件的大小是你想用資源的大小,可以通過dd命令創建空文件
Created fileio lun1 with size 1073741824 #這個文件的大小是1G

/backstores/fileio> cd ../ramdisk           #進入ramdisk子目錄來通過內存創建target后端存儲資源
/backstores/ramdisk> create rd0 10MB    #使用10MB的內存空間創建名稱為rd0的存儲資源
Created ramdisk rd0 with size 10MB.
/backstores/ramdisk>
--------------------------------------------------

命令行的實現:
[root@CentOS7 ~]# targetcli /backstores/fileio create name=lun1 file_or_dev=/tmp/lun1.img
[root@CentOS7 ~]# targetcli /backstores/ramdisk create name=rd0 size=10MB


4、查看創建的存儲資源
--------------------------------------------------
/backstores> ls
o- backstores ................................................................................ [...]
  o- block ....................................................... [Storage Objects: 1]
  |    o- lun1 ................. [/dev/sdc (5.0GiB) write-thru deactivated]              #基於塊的
  |    o- alua .................................................... [ALUA Groups: 1]
  |          o- default_tg_pt_gp ... [ALUA state: Active/optimized]
  o- fileio ................................................. [Storage Objects: 1  ]                #基於文件的
  |    o- lun1... . [/tmp/lun1.img (0 bytes) write-back deactivated]
  |    o- alua .................................................... [ALUA Groups: 1]
  |               o- default_tg_pt_gp ..... [ALUA state: Active/optimized]
o- pscsi ................................................................ [Storage Objects: 0]
o- ramdisk ........................................................... [Storage Objects: 1]        #基於內存的
  o- rd0 ..................................................... [(10.0MiB) deactivated]
       o- alua .......................................................... [ALUA Groups: 1]
    o- default_tg_pt_gp ........... [ALUA state: Active/optimized]
--------------------------------------------------


5、刪除剛才創建的存儲資源以block/為例子,其他目錄的一樣
--------------------------------------------------
/backstores> cd block/        #進入創建的子目錄刪除
/backstores/block> delete        #輸入刪除命令delete按兩下TAB鍵,查看操作提示
lun1 name=             #delete命令后可以接的參數
/backstores/block> delete lun1    #delete命令后輸入資源名直接回車刪除
Deleted storage object lun1.
/backstores/block> ls
o- block ................................ [Storage Objects: 0]    #成功刪除
/backstores/block>
--------------------------------------------------

命令行的實現:
[root@CentOS7 ~]# targetcli /backstores/block delete name=lun1

可以創建fileio和ramdisk類型的backstore對象,還可以創建block和pscsi對象。block對象可以用來導入一般的塊設備,比如/dev/hdaX、/dev/sdX、/dev/vgX/lvX等。pscsi對象可以用來導入系統里已有的SCSI設備(即lsscsi列出的設備),所有SAN的前端收到的SCSI命令都會透傳到pscsi導入的設備。需要注意,Linux-IO Target所模擬的SCSI設備實現了SPC-2、SCP-3和SPC-4規范,也就是說Persistent Reservations (PRs)、Asymmetric Logical Unit Assignment (ALUA)和vStorage APIs for Array Integration (VAAI)等高端SCSI特性都有實現。但是主機上的現有SCSI設備則未必實現了SPC-4,因此在需要高端SCSI特性的場合,最好通過block對象來導入/dev/sdX這樣的設備,而不是通過pscsi。

十、 使用targetcli創建iSCSI目標

1、創建iSCSI目標
--------------------------------------------------
/iscsi> create          #create命令后面如果不加任何參數會自動創建一個target同時iqn號也是隨機的
Created target iqn.2003-01.org.linux-iscsi.debian.x8664:sn.aea77a8eef23.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

/iscsi> delete iqn.2003-01.org.linux-iscsi.debian.x8664:sn.aea77a8eef23      #刪除這個隨機的iqn
Deleted Target iqn.2003-01.org.linux-iscsi.debian.x8664:sn.aea77a8eef23.

/iscsi> create iqn.2019-10.cc.pipci.iscsi:debian.tgt1              #創建一個方便記憶的iqn,但是要保證唯一性
Created target iqn.2019-10.cc.pipci.iscsi:debian.tgt1.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.

/iscsi> ls
o- iscsi ............................................................... [Targets: 1]
    o- iqn.2019-10.cc.pipci.iscsi:debian.tgt1 ........ [TPGs: 1]   #創建的target,以iqn名字的目錄形式存在
  o- tpg1 .................................... [no-gen-acls, no-auth]   #同時創建子目錄TPG
         o- acls ............................................................ [ACLs: 0]   #ACL(訪問控制列表)控制子目錄
  o- luns .......................................................... [LUNs: 0]    #用於關聯存儲資源子目錄
  o- portals ................................................... [Portals: 1]   #監聽的端口資源
       o- 0.0.0.0:3260 ................................................ [OK]
/iscsi>
--------------------------------------------------

命令行實現:
[root@CentOS7 ~]# targetcli /iscsi create iqn.2019-10.cc.pipci.iscsi:debian.tgt1   #創建
[root@CentOS7 ~]# targetcli /iscsi delete iqn.2019-10.cc.pipci.iscsi:debian.tgt1   #刪除
--------------------------------------------------

2、關聯后端存儲資源
--------------------------------------------------
/iscsi> cd iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/luns     #進入到關聯子目錄
/iscsi/iqn.20...gt1/tpg1/luns> create /backstores/block/lun1      #通過命令create命令關聯/backstores/block/lun1是上面創建的存儲資源,要注意路徑
Created LUN 0.                         #默認創建lUN0
/iscsi/iqn.20...gt1/tpg1/luns> ls                      #查看關聯的存儲資源
o- luns ..................................................................... [LUNs: 1]
     o- lun0 ..........[block/lun1 (/dev/sdc) (default_tg_pt_gp)]        #已經關聯的存儲資源

/iscsi/iqn.20...gt1/tpg1/luns> delete 0                 #解除關聯,在delete后面直接輸入LUN號就可以
Deleted LUN 0.
/iscsi/iqn.20...gt1/tpg1/luns>
--------------------------------------------------

命令實現:
關聯
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/luns create /backstores/block/lun1
解除關聯
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/luns delete 0

3、配置ACL(訪問控制列表)
ACL的作用是允許那些initiator可以訪問target,target使用initiator的iqn來標識initiator。在ACL配置目錄執行 set attribute generate_node_acls=0使用自定義的acl實現訪問控制,則需要設置訪問權限控制列表acl(默認就是這種),acl參數目錄用於存放能夠訪問target端共享存儲資源的initiator的iqn。在客戶端訪問時,只要iscsi客戶端的iqn名稱與服務端設置的訪問控制列表中的iqn名稱一致即可訪問。如果不想使用ACL可以在ACL配置目錄執行 set attribute generate_node_acls=1使用自動生成acl節點,這樣不添加initiator的iqn也允許initiator訪問。

--------------------------------------------------
/iscsi/iqn.20...ian.tgt1/tpg1> cd acls                     #進入ACL配置目錄
/iscsi/iqn.20...gt1/tpg1/acls> create iqn.2019-10.cc.pipci.iscsi:clinet.sn8888    #添加允許訪問的iqn號
Created Node ACL for iqn.2019-10.cc.pipci.iscsi:clinet.sn8888
Created mapped LUN 0.
/iscsi/iqn.20...gt1/tpg1/acls> ls                  #查看
o- acls ........................................................................... [ACLs: 1]
    o- iqn.2019-10.cc.pipci.iscsi:clinet.sn8888 [Mapped LUNs: 1]    #允許訪問的iqn
  o- mapped_lun0 ............................. [lun0 block/lun1 (rw)]

/iscsi/iqn.20...gt1/tpg1/acls> delete iqn.2019-10.cc.pipci.iscsi:clinet.sn8888   #刪除iqn
Deleted Node ACL iqn.2019-10.cc.pipci.iscsi:clinet.sn8888.
--------------------------------------------------

配置自動生成acl節點

--------------------------------------------------
/iscsi> ls
o- iscsi .............................................................. [Targets: 1]
    o- iqn.2019-10.cc.pipci.iscsi:debian.tgt1 ........ [TPGs: 1]
  o- tpg1 .................................... [no-gen-acls, no-auth]   #no-gen-acls表示自定義的acl實現訪問控制,默認值
       o- acls ....................................................... [ACLs: 0]
       o- luns .......................................................[LUNs: 1]
       | o- lun0 ....[block/lun1 (/dev/sdc) (default_tg_pt_gp)]
      o- portals ...................................................... [Portals: 1]
    o- 0.0.0.0:3260 .................................................... [OK]
/iscsi>
/iscsi> cd iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/              #必須進入TPG目錄下才可以更改
/iscsi/iqn.20...ian.tgt1/tpg1> set attribute generate_node_acls=1    #配置成自動生成acl節點
Parameter generate_node_acls is now '1'.
/iscsi/iqn.20...ian.tgt1/tpg1> ls
o- tpg1 ......................................... [gen-acls, no-auth]    #修改成功
o- acls .......................................... [ACLs: 0]
o- luns .......................................... [LUNs: 1]
| o- lun0 ........[block/lun1 (/dev/sdc) (default_tg_pt_gp)]
o- portals .................................... [Portals: 1]
o- 0.0.0.0:3260 ..................................... [OK]
/iscsi/iqn.20...ian.tgt1/tpg1>
--------------------------------------------------
一旦配置成自動生成acl節點,當initiator認證成功后,再配置成自定義的acl實現訪問控制是無效的 只有重啟系統后恢復正常,我感覺這個是因為有認證記憶的功能

命令實現:
添加iqn:
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/acls create iqn.2019-10.cc.pipci.iscsi:clinet.sn8888
刪除iqn
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/acls delete iqn.2019-10.cc.pipci.iscsi:clinet.sn8888
配置自動生成acl節點
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set attribute generate_node_acls=1

4、設置target端的監聽IP地址和端口號,以發現target
有的服務器可能有多塊網卡,那么到底是那塊網卡或IP地址對外提供共享資源哪,我們可以手動在portals參數目錄里設置監聽的IP地址和端口,默認是監聽所有地址的。

先刪除默認的0.0.0.0這樣不太安全
--------------------------------------------------
/iscsi/iqn.20...ian.tgt1/tpg1> ls
o- tpg1 .................................. [gen-acls, no-auth]
  o- acls .......................................... [ACLs: 0]
  o- luns .......................................... [LUNs: 1]
  | o- lun0 ........[block/lun1 (/dev/sdc) (default_tg_pt_gp)]
  o- portals .................................... [Portals: 1]
    o- 0.0.0.0:3260 ..................................... [OK]        #默認監聽0.0.0.0也就是所有的IP地址,端口3260

/iscsi/iqn.20...ian.tgt1/tpg1> cd portals/          #進入portals目錄配置
/iscsi/iqn.20.../tpg1/portals> delete 0.0.0.0 3260       #先刪除 0.0.0.0地址,地址后面必須有端口號
Deleted network portal 0.0.0.0:3260
/iscsi/iqn.20.../tpg1/portals>
--------------------------------------------------

創建默認監聽的端口
--------------------------------------------------
/iscsi/iqn.20.../tpg1/portals> create 192.168.1.16
Using default IP port 3260              # 如果上面的IP地址后面不加端口號會加上默認的3260,如果加端口在IP地址后面空格端口號就可以
Created network portal 192.168.1.16:3260.
/iscsi/iqn.20.../tpg1/portals> ls
o- portals ...................................... [Portals: 1]
o- 192.168.1.16:3260 .................................. [OK]    # 更改成功
/iscsi/iqn.20.../tpg1/portals>
--------------------------------------------------

命令實現:
刪除監聽的IP
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/portals delete 0.0.0.0 3260
添加監聽的IP和端口號,不加端口號使用默認的3260
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/portals create 192.168.1.16 3260


十一、配置服務端 targetcli CHAP(質詢握手身份驗證協議) 認證
認證分為全局配置和局部配置
在 /iscsi 下為全局配置。
在 iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/ 下為單個Target的配置,配置只對單個IQN生效為局部配置

全局配置下只能設置發現認證,局部配置只能設置登錄認證,其中每種認證又分為單向認證和雙向認證

發現認證和登錄認證的意思就和名字一樣

單向認證是指initiator端在發現target端的時候,要提供正確的認證才能發現在target端的iSCSI服務

雙向認證是指在單向認證的基礎上,target端需要正確設置initiator端設置的認證才能被initiator端發現

無論那種認證都是在target端配置的


十二、全局配置下的發現認證

1、單向認證(target服務器認證initiator)

查看默認配置
--------------------------------------------------
/> cd iscsi/                     #進入到iscsi/目錄進行全局配置
/iscsi> get discovery_auth         #查看發現認證狀態
DISCOVERY_AUTH CONFIG GROUP
===========================
enable=False          #沒有開啟
-----------
The enable discovery_auth parameter.

mutual_password=          #雙向認真的密碼
----------------
The mutual_password discovery_auth parameter.

mutual_userid=         #雙向認真的用戶名
--------------
The mutual_userid discovery_auth parameter.

password=            #單向認真的密碼
---------------
The password discovery_auth parameter.

userid=           #單向認真的用戶名
------------
The userid discovery_auth parameter.

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

命令實現:
[root@CentOS7 ~]# targetcli /iscsi/ get discovery_auth    #查看發現認證狀態


配置用戶名密碼
--------------------------------------------------
/iscsi> set discovery_auth enable=1      #數字1表示開啟0表示關閉
Parameter enable is now 'True'.
/iscsi> set discovery_auth userid=laopi    #添加用戶laopi
Parameter userid is now 'laopi'.
/iscsi> set discovery_auth password=pi1234   #設置認證密碼pi1234
Parameter password is now 'pi1234'.
/iscsi> get discovery_auth enable userid password
enable=True
userid=laopi
password=pi1234
/iscsi>
--------------------------------------------------

命令實現:
[root@CentOS7 ~]# targetcli /iscsi/ set discovery_auth enable=1          #數字1表示開啟0表示關閉
[root@CentOS7 ~]# targetcli /iscsi/ set discovery_auth userid=laopi          #添加用戶laopi
[root@CentOS7 ~]# targetcli /iscsi/ set discovery_auth password=pi1234      #設置認證密碼pi1234

這時我們需要設置initiator端的配置文件/etc/iscsi/iscsid.conf,才能運行發現
--------------------------------------------------
# *************
# CHAP Settings
# *************
.............

discovery.sendtargets.auth.authmethod = CHAP #開啟CHAP

# To set a discovery session CHAP username and password for the initiator
# authentication by the target(s), uncomment the following lines:
discovery.sendtargets.auth.username = laopi #添加用戶名
discovery.sendtargets.auth.password = pi1234 #添加密碼

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

2、設置雙向認證(必須建立在單向認證的基礎上,因為在initiator登錄的時候要先進行單項認證)

配置mutual用戶名密碼
--------------------------------------------------  
/iscsi> set discovery_auth mutual_userid=laopimal      #添加mutual用戶名
Parameter mutual_userid is now 'laopimal'.
/iscsi> set discovery_auth mutual_password=pi123456    #設置mutual用戶名密碼
Parameter mutual_password is now 'pi123456'.

/iscsi> get discovery_auth                 #查看發現認證狀態
DISCOVERY_AUTH CONFIG GROUP
===========================
enable=True
-----------
The enable discovery_auth parameter.

mutual_password=pi123456
------------------------
The mutual_password discovery_auth parameter.

mutual_userid=laopimal               #添加成功
----------------------
The mutual_userid discovery_auth parameter.

password=pi1234
---------------
The password discovery_auth parameter.

userid=laopi                     #雙向認證單項認證用戶必須已經存在
------------
The userid discovery_auth parameter.
--------------------------------------------------

命令實現:
[root@CentOS7 ~]# targetcli /iscsi/ set discovery_auth mutual_userid=laopimal     #添加mutual用戶名
[root@CentOS7 ~]# targetcli /iscsi/ set discovery_auth mutual_password=pi123456     #設置mutual用戶名密碼
[root@CentOS7 ~]# targetcli /iscsi/ get discovery_auth #查看發現認證狀態

這時我們需要設置initiator端的配置文件/etc/iscsi/iscsid.conf,才能運行發現
--------------------------------------------------
# *************
# CHAP Settings
# *************
.............

discovery.sendtargets.auth.authmethod = CHAP        #開啟CHAP


discovery.sendtargets.auth.username = laopi       #添加用戶名
discovery.sendtargets.auth.password = pi1234     #添加密碼

discovery.sendtargets.auth.username_in = laopimal   #添加mutual用戶名
discovery.sendtargets.auth.password_in = pi123456   #添加mutual用戶名密碼
--------------------------------------------------



十三、局部配置下的登錄認證,這個我一直沒實驗成功,可能是沒找到合適方法,待以后在深入研究吧
--------------------------------------------------
1、單向認證(target服務器認證initiator)

/iscsi> cd iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1/        #局部認證要在target對應的iqn下配置
/iscsi/iqn.20...ian.tgt1/tpg1>set attribute authentication=1   #開啟賬號密碼驗證訪問控制,開啟后無論initiator端是否成功設置都不能登錄,默認是關閉,請不要開啟,通過attribute authentication=0 關閉

/iscsi/iqn.20...ian.tgt1/tpg1> set auth userid=laopi          #添加用戶laopi
Parameter userid is now 'laopi'.
/iscsi/iqn.20...ian.tgt1/tpg1> set auth password=pi1234          #設置認證密碼pi1234
Parameter password is now 'pi1234'.
/iscsi/iqn.20...ian.tgt1/tpg1> get auth              #查看登錄證狀態
AUTH CONFIG GROUP
=================
mutual_password=
----------------
The mutual_password auth parameter.

mutual_userid=
--------------
The mutual_userid auth parameter.

password=pi1234
---------------
The password auth parameter.

userid=laopi
------------
The userid auth parameter.
--------------------------------------------------

命令實現:
添加用戶laopi
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set auth userid=laopi
設置認證密碼pi1234
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set auth password=pi1234
查看登錄認證狀態
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 get auth

這時我們需要設置initiator端的配置文件/etc/iscsi/iscsid.conf,才能登錄發現
--------------------------------------------------
# *************
# CHAP Settings
# *************
.............

node.session.auth.authmethod = CHAP          #開啟CHAP

node.session.auth.username = laopi        #添加用戶名
node.session.auth.password = pi1234      #添加用戶名密碼
--------------------------------------------------


2、設置雙向認證(必須建立在單向認證的基礎上,因為在initiator登錄的時候要先進行單項認證)

配置mutual用戶名密碼
--------------------------------------------------
/iscsi/iqn.20...ian.tgt1/tpg1> set auth mutual_userid=laopimal      #添加mutual用戶名
Parameter mutual_userid is now 'laopimal'.
/iscsi/iqn.20...ian.tgt1/tpg1> set auth mutual_password=pi123456     #設置mutual用戶名密碼
Parameter mutual_password is now 'pi123456'.
/iscsi/iqn.20...ian.tgt1/tpg1> get auth
AUTH CONFIG GROUP
=================
mutual_password=pi123456
------------------------
The mutual_password auth parameter.

mutual_userid=laopimal
----------------------
The mutual_userid auth parameter.

password=pi1234
-----------------
The password auth parameter.

userid=laopi              #雙向認證單項認證用戶必須已經存在
--------------
The userid auth parameter.
--------------------------------------------------

命令實現:
添加用戶laopimal
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set auth mutual_userid=laopimal
設置認證密碼pi123456
[root@CentOS7 ~]# targetcli /iscsi/iqn.2019-10.cc.pipci.iscsi:debian.tgt1/tpg1 set auth mutual_password=pi123456

這時我們需要設置initiator端的配置文件/etc/iscsi/iscsid.conf,在能運行發現
--------------------------------------------------
# *************
# CHAP Settings
# *************
.............

node.session.auth.authmethod = CHAP      #開啟CHAP

node.session.auth.username = laopi            #添加用戶名
node.session.auth.password = pi1234         #添加用戶名密碼

node.session.auth.username_in = laopimal    #添加mutual用戶名
node.session.auth.password_in = pi123456    #添加mutual用戶密碼

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


十四、保持配置,重啟生效
在交互模式下默認創建完配置exit退出時會主動將配置保存到配置文件/etc/rtslib-fb-target/saveconfig.json中,重啟后生效
--------------------------------------------------
/> ls
o-     / ................................................................................ [...]
  o- backstores ............................................................ [...]
  | o- block ........................................ [Storage Objects: 1]
  | | o- lun1 ....... [/dev/sdb (5.0GiB) write-thru activated]
  | o- fileio ......................................... [Storage Objects: 0]
  | o- pscsi ......................................... [Storage Objects: 0]
  | o- ramdisk ................................... [Storage Objects: 0]
  o- iscsi ......................................................... [Targets: 1]
  |    o- iqn.2019-10.cc.pipci.iscsi:debian.tgt1 ...... [TPGs: 1]
  |    o- tpg1 ................................ [no-gen-acls, no-auth]
  |      o- acls ................................................. [ACLs: 0]
  |      o- luns ............................................... [LUNs: 1]
  |     | o- lun0 ....................... [block/lun1 (/dev/sdb)]
  |      o- portals ........................................ [Portals: 1]
  |        o- 0.0.0.0:3260 ................................... [OK]
  o- loopback .................................................... [Targets: 0]
  o- vhost ........................................................... [Targets: 0]
/> exit
Global pref auto_save_on_exit=true                 #提示全局配置下是推出自動保持配置。
Last 10 configs saved in /etc/rtslib-fb-target/backup.
Configuration saved to /etc/rtslib-fb-target/saveconfig.json   #提示已經保持配置
[root@CentOS7 ~]#
--------------------------------------------------
上面的操作如果不是exit退出,而是Ctrl+C組合鍵提出,這樣不會保持到配置文件中

交互模式下手動保持配置和清楚配置
--------------------------------------------------
/> saveconfig                           #在交互模式的根目錄下通過這個命令直接回車保持配置到默認配置文件
Last 10 configs saved in /etc/rtslib-fb-target/backup.
Configuration saved to /etc/rtslib-fb-target/saveconfig.json

/> saveconfig savefile=/tmp/lio.conf                #我們也可以指定保存到其他文件,用於備份,這個文件不需要提前創建
Configuration saved to /tmp/lio.conf
/>
/> clearconfig confirm=true                           #當我們想清楚所以配置可以通過這個命令完成
All configuration cleared
/>

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

命令實現:
[root@CentOS7 ~]# targetcli saveconfig                #保存到默認文件
[root@CentOS7 ~]# targetcli saveconfig savefile=/tmp/lio.conf    #保存到制定文件
[root@CentOS7 ~]# targetcli clearconfig confirm=true        #這個不會清除配置文件中的配置,如果想清楚配置文件中的配置需要執行完這個操作才保存一次

 

十五、initiator客戶端配置

這里就不介紹了前面的Linux下搭建iSCSI共享存儲的方法 TGT 方式 CentOS6.9系統下里面有詳細的使用方法

 

 

參考資料:

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

https://wiki.debian.org/SAN/iSCSI/LIO

http://manpages.ubuntu.com/manpages/xenial/man8/targetcli.8.html

http://linux-iscsi.org/wiki/Targetcli

 https://www.holoem.com/?p=784

http://www.mamicode.com/info-detail-2496160.html 

https://blog.csdn.net/weixin_42179528/article/details/90311361

https://blog.51cto.com/zhuxu91313/2154819

http://www.udpwork.com/item/13114.html

http://scst.sourceforge.net/comparison.html

https://blog.csdn.net/u014106644/article/details/84565912

https://www.ibm.com/developerworks/community/blogs/5144904d-5d75-45ed-9d2b-cf1754ee936a/entry/linux_io_target%25e4%25bb%258b%25e7%25bb%258d_%25e4%25b8%2580?lang=en 

 https://blog.csdn.net/zxlld/article/details/51829046


免責聲明!

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



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