對於儲存空間不足除了本體主機加裝硬碟之外,也可以透過像是網路芳鄰(CIFS)或是網路磁碟機(NFS)將檔案或資料儲存到其他設備上,不過有些軟體會要求需要一整顆硬碟才能使用,此時就需要 iSCSI 的幫助了。
1. iSCSI 簡述
iSCSI 是一種基於 TCP/IP 協議上並藉由網路發送 SCSI 指令,可以藉由網路方式將一整顆硬碟分享給 Client 端並作為儲存區域網路(SAN),對於客戶端來說看到的就一整顆完整的硬碟,而非是一般 NAS或是 CIFS 上分享的檔案目錄,在生產環境中 LAN 區域網路中使用 iSCSI 為避免網路頻寬上瓶頸,最好具備 10G 乙太網路,才能發揮最好的性能。
2. iSCSI 常用術語
- Initiator :
- 一個 iSCSI 的 Client 端,並須授予其唯一名稱 (IQN)才能訪問其 iSCSI Target。
- Target :
- iSCSI Server 上的儲存資源,也是需授予危機名稱,每一個目標可以提供一個或多個設備或是邏輯單元,大多是都是一個目標對應一個設備。
- 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 ,用於識別管理的目標,通常以主機名稱當作設定值
- Portal :
- Initiator 需要存取的目標 IP 位置及 Port 通訊埠號。
- LUN (Logical Unit Number) :
- LUN 表示目標所提空的區塊設備,每一個目標可以提供一個至多個 LUN。
- ACL (Access Control List) :
- 現在哪些 Initiator 可以存取 Server 存取權限。
- 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
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 物件中可以選擇下列得儲存設備:
- block : 一整顆硬碟、硬碟分區或是 LVM。
- fileio : 以本地文件系統中的檔案當作硬碟 Image。
- pscsi : 連接到真實物理的 SCSI 設備。
- ramdisk : 使用記憶體分享,一但 Target 重啟後,將會喪失其數據。
- 使用 /dev/vdb 一整顆虛擬硬碟分享
1
2
|
/> /backstores/block create mybk /dev/vdb
Created block storage object mybk using /dev/vdb.
|
- 創建 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
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
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.
|
- 設定 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]
|
- 設定 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
方式,將所有步驟寫入腳本中。