Contents

Linux - 提供 iSCSI 儲存

對於儲存空間不足除了本體主機加裝硬碟之外,也可以透過像是網路芳鄰(CIFS)或是網路磁碟機(NFS)將檔案或資料儲存到其他設備上,不過有些軟體會要求需要一整顆硬碟才能使用,此時就需要 iSCSI 的幫助了。

練習環境
可以使用 HowHow 的創建 Lab 練習環境,來實作分享 iSCSI Target 操作,使用方式請參閱 HowHow 網站 - Linux 練習 Lab 第二版

1. iSCSI 簡述

iSCSI 是一種基於 TCP/IP 協議上並藉由網路發送 SCSI 指令,可以藉由網路方式將一整顆硬碟分享給 Client 端並作為儲存區域網路(SAN),對於客戶端來說看到的就一整顆完整的硬碟,而非是一般 NAS或是 CIFS 上分享的檔案目錄,在生產環境中 LAN 區域網路中使用 iSCSI 為避免網路頻寬上瓶頸,最好具備 10G 乙太網路,才能發揮最好的性能。


2. iSCSI 常用術語

  1. Initiator :
  • 一個 iSCSI 的 Client 端,並須授予其唯一名稱 (IQN)才能訪問其 iSCSI Target。
  1. Target :
  • iSCSI Server 上的儲存資源,也是需授予危機名稱,每一個目標可以提供一個或多個設備或是邏輯單元,大多是都是一個目標對應一個設備。
  1. IQN (iSCSI Qualified Name) :
  • 唯一的全球範圍名稱,用於識別 Initiator 與 Target,其格式如下:
1
iqn.YYYY-MM.com.reversed.domain:name_string
NOTE

reversed.domain 為反向網域名稱。 EX. www.example.com -> com.example.www

name_string ,用於識別管理的目標,通常以主機名稱當作設定值

  1. Portal :
  • Initiator 需要存取的目標 IP 位置及 Port 通訊埠號。
  1. LUN (Logical Unit Number) :
  • LUN 表示目標所提空的區塊設備,每一個目標可以提供一個至多個 LUN。
  1. ACL (Access Control List) :
  • 現在哪些 Initiator 可以存取 Server 存取權限。
  1. TPG (Target Portal Group) :
  • TPG 為 Target 完整配置,包含 Portal、LUN及ACL等。

3. 提供 iSCSI Target 步驟

3.1. 安裝套件

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
[root@servera ~]# yum install targetcli -y | grep Installed -B 5
Transaction Summary
================================================================================
Install  7 Packages

Total download size: 1.3 M
Installed size: 4.7 M
--
  Verifying        : python3-pyparsing-2.1.10-7.el8.noarch                  4/7
  Verifying        : python3-rtslib-2.1.75-4.el8.noarch                     5/7
  Verifying        : python3-urwid-1.3.1-4.el8.x86_64                       6/7
  Verifying        : target-restore-2.1.75-4.el8.noarch                     7/7
...output omitted...

3.2. 開放防火牆規則

1
2
3
4
[root@servera ~]# firewall-cmd --permanent  --add-service=iscsi-target
success
[root@servera ~]# firewall-cmd --reload
success

3.3. 檢視所有的儲存設備

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[root@servera ~]# lsblk
NAME           MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
vda            252:0    0   10G  0 disk
├─vda1         252:1    0  100M  0 part /boot/efi
├─vda2         252:2    0 1000M  0 part /boot
├─vda3         252:3    0  8.9G  0 part
│ └─rocky-root 253:0    0  8.9G  0 lvm  /
└─vda4         252:4    0    1M  0 part
vdb            252:16   0   50G  0 disk
vdc            252:32   0   50G  0 disk
vdd            252:48   0   50G  0 disk

3.4. 設定 iSCSI Target

藉由互動模式的 targetcli 操作

1
2
3
4
5
使用 ServerA 為 Target 範例:
    1. IQN : iqn.2023-02.com.example:servera
    2. 監聽的網路介面為 : 192.168.0.10
    3. 使用虛擬硬碟 : /dev/vdb 為其 Block 並命名 mybk
    4. ACL 限制 : iqn.2023-02.com.example:serverb 
  1. 查看所有的內容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
[root@servera ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.53
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> 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]
儲存設備

在 backstore 物件中可以選擇下列得儲存設備:

  1. block : 一整顆硬碟、硬碟分區或是 LVM。
  2. fileio : 以本地文件系統中的檔案當作硬碟 Image。
  3. pscsi : 連接到真實物理的 SCSI 設備。
  4. ramdisk : 使用記憶體分享,一但 Target 重啟後,將會喪失其數據。
  1. 使用 /dev/vdb 一整顆虛擬硬碟分享
1
2
/> /backstores/block create mybk /dev/vdb
Created block storage object mybk using /dev/vdb.
  1. 創建 Target IQN
1
2
3
4
5
/> /iscsi create iqn.2023-02.com.example:servera
Created target iqn.2023-02.com.example:servera.
Created TPG 1.
Global pref auto_add_default_portal=true
Created default portal listening on all IPs (0.0.0.0), port 3260.
  1. 查閱所創建的內容
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
/> ls
o- / ............................................................................................ [...]
  o- backstores ................................................................................. [...]
  | o- block ..................................................................... [Storage Objects: 1]
  | | o- mybk ............................................. [/dev/vdb (50.0GiB) write-thru deactivated]
  | |   o- alua ...................................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp .......................................... [ALUA state: Active/optimized]
  | o- fileio .................................................................... [Storage Objects: 0]
  | o- pscsi ..................................................................... [Storage Objects: 0]
  | o- ramdisk ................................................................... [Storage Objects: 0]
  o- iscsi ............................................................................... [Targets: 1]
  | o- iqn.2023-02.com.example:servera ...................................................... [TPGs: 1]
  |   o- tpg1 .................................................................. [no-gen-acls, no-auth]
  |     o- acls ............................................................................. [ACLs: 0]
  |     o- luns ............................................................................. [LUNs: 0]
  |     o- portals ....................................................................... [Portals: 1]
  |       o- 0.0.0.0:3260 ........................................................................ [OK]
  o- loopback ............................................................................ [Targets: 0]
  1. 刪除任何網路介面存取即設定限定介面
1
2
3
4
5
/> /iscsi/iqn.2023-02.com.example:servera/tpg1/portals/ delete 0.0.0.0 3260
Deleted network portal 0.0.0.0:3260
/> /iscsi/iqn.2023-02.com.example:servera/tpg1/portals create 192.168.0.10 3260
Using default IP port 3260
Created network portal 192.168.0.10:3260.
  1. 設定 Target 掛載的 LUN
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/> /iscsi/iqn.2023-02.com.example:servera/tpg1/luns create /backstores/block/mybk
Created LUN 0.
Created LUN 0->0 mapping in node ACL iqn.2023-02.com.example:serverb
/> ls
o- / ............................................................................................ [...]
  o- backstores ................................................................................. [...]
  | o- block ..................................................................... [Storage Objects: 1]
  | | o- mybk ............................................... [/dev/vdb (50.0GiB) write-thru activated]
  | |   o- alua ...................................................................... [ALUA Groups: 1]
  | |     o- default_tg_pt_gp .......................................... [ALUA state: Active/optimized]
  | o- fileio .................................................................... [Storage Objects: 0]
  | o- pscsi ..................................................................... [Storage Objects: 0]
  | o- ramdisk ................................................................... [Storage Objects: 0]
  o- iscsi ............................................................................... [Targets: 1]
  | o- iqn.2023-02.com.example:servera ...................................................... [TPGs: 1]
  |   o- tpg1 .................................................................. [no-gen-acls, no-auth]
  |     o- acls ............................................................................. [ACLs: 0]
  |     |   o- mapped_lun0 ..................................................... [lun0 block/mybk (rw)]
  |     o- luns ............................................................................. [LUNs: 1]
  |     | o- lun0 .......................................... [block/mybk (/dev/vdb) (default_tg_pt_gp)]
  |     o- portals ....................................................................... [Portals: 1]
  |       o- 192.168.0.10:3260 ................................................................... [OK]
  o- loopback ............................................................................ [Targets: 0]
  1. 設定 ACL 存取後離開
1
2
3
4
5
/> /iscsi/iqn.2023-02.com.example:servera/tpg1/acls create iqn.2023-02.com.example:serverb
Created Node ACL for iqn.2023-02.com.example:serverb
/> exit
Global pref auto_save_on_exit=true
Configuration saved to /etc/target/saveconfig.json
自動保存
在互動模式下只要離開後會自動保存於 /etc/target/saveconfig.json 檔案內。

3.5. 啟動 iSCSI Target

設定開機後即現在立即啟動其服務。

1
2
[root@servera ~]# systemctl enable target --now
Created symlink /etc/systemd/system/multi-user.target.wants/target.service → /usr/lib/systemd/system/target.service.

4. 設定網路介面

囿於 Target 分享於 192.168.0.10 ,可以使用 eth3 網路介面卡設定 IP,其步驟如下 :

關於如何使用 nmcli 操作方式可以參閱 HowHow 的網路管理工具 - NetworkManager 文章

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@servera ~]# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    altname enp1s0
    inet 172.25.250.11/24 brd 172.25.250.255 scope global dynamic noprefixroute eth0
       valid_lft 484sec preferred_lft 484sec
[root@servera ~]# nmcli con add con-name eth3 ipv4.method manual ipv4.addresses 192.168.0.10/24 autoconnect yes ifname eth3 type ethernet
Connection 'eth3' (0e521351-81f3-481a-8b6e-84a177ea456f) successfully added.
[root@servera ~]# nmcli con up eth3
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/63)
[root@servera ~]# ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    altname enp1s0
    inet 172.25.250.11/24 brd 172.25.250.255 scope global dynamic noprefixroute eth0
       valid_lft 410sec preferred_lft 410sec
5: eth3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    altname enp13s0
    inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth3
       valid_lft forever preferred_lft forever

5. 小結

提供 iSCSI Target 藉由 targetcli 可以非常方便就完成其設定,除了互動模式外,也可以直接補齊晚整指令藉由 Shell 自動化完成,例如 : targetcli /backstores/block create mybk /dev/vdb 方式,將所有步驟寫入腳本中。



如果你還沒有註冊 Like Coin,你可以在文章最下方看到 Like 的按鈕,點下去後即可申請帳號,透過申請帳號後可以幫我的文章按下 Like,而 Like 最多可以點五次,而你不用付出任何一塊錢,就能給我寫這篇文章的最大的回饋!