Toc
  1. 背景故事
  2. 環境
  3. 操作
    1. ZFS 端
    2. PVE 端
  4. 後話
Toc
0 results found
Vongola
如何設定 Proxmox VE 在 CentOS 8 上的 ZFS over iSCSI

OS: 這標題有夠難下的…

最近在公司測試 Proxmox VE,打算區分測試區及正式區,想說旁邊有一台已經建好 ZFS 的機器,就直接拿來當叢集的儲存區,沒想到被 Proxmox VE 官方的文件 給雷到,弄了兩天才弄好,因此決定好好寫下來,免得之後又遇到相同問題。

背景故事

依照PVE 的操作介面可以看到 ZFS over iSCSI 有四個Provider,分別為:

  • Comstar
  • istgt
  • IET
  • LIO

其中,根據官方文件的範例來看,Comstar 是給 Solaris 系列的系統用的;istgt 是給 BSD 系列的系統用的;IET 則是給 Linux 系列的系統用的,至於 LIO … 官方文件根本沒提到。
由於 CentOS 8 屬於 Linux 系列的作業系統,所以理所當然地採用 IET … 才怪!Google 了一下午,大多數 CentOS 的教學都是採用一個叫 scsi-target-util 的工具,詳細可以參考鳥哥的文件,不過我試了一個下午就是各種錯誤,無論我怎麼改參數、PVE怎麼改設定都沒辦法正常的在上面建立虛擬磁碟。直到最後,我直接去翻了 PVE 的腳本,檔案位置在 /usr/share/perl5/PVE/Storage/LunCmd/LIO.pm(同目錄下還有幾個provider的腳本,像是Comstar.pmIet.pmIstgt.pm),LIO.pm的前幾行就透露出了一切:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 大註解全部吃掉了 口卡~
package PVE::Storage::LunCmd::LIO;

use strict;
use warnings;
use PVE::Tools qw(run_command);
use JSON;

sub get_base;

# targetcli constants
# config file location differs from distro to distro
my @CONFIG_FILES = (
'/etc/rtslib-fb-target/saveconfig.json', # Debian 9.x et al
'/etc/target/saveconfig.json' , # ArchLinux, CentOS
);

從這個腳本看來 LIO 就是給 Linux 系列作業系統用的 Provider 之一,而且看來 CentOS 也是可以採用 LIO 的,因此就安裝對應工具,設定完成就好了。
好奇其他腳本的可到PVE的官方git repository看,後面就直接進操作環境及步驟。

環境

兩台主機:

  • Proxmox VE 6.2 (PVE)
  • CentOS 8 (ZFS)

操作

ZFS 端

  1. 你會需要先安裝一個程式 targetcli
1
yum install targetcli
  1. 利用 targetctl 來設定 iSCSI。
1
targetcli

開啟之後便開始建立iSCSI。

1
2
3
4
5
6
7
8
9
10
11
12
13
# 新增 Device
cd /backstores/block/
create name= dev=/dev///
# 建立 IQN
cd /iscsi
create
# 設定tgp
cd ///luns
create /backstores/block/
cd ..
set attribute authentication=0 demo_mode_write_protect=0 generate_node_acls=1 cache_dynamic_acls=1
# 儲存
saveconfig

請特別注意,在建立IQN時會顯示你的IQN和TGP編號,這兩個要記錄下來,後面PVE設定上會需要,同時建議設定ACL及防火牆,避免未授權存取。
詳細設定過程的話,請參考這篇文章,寫得非常完整。

  1. 檢查你的config。
1
cat /etc/target/saveconfig.conf

那輸出應該會長得像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
{
"fabric_modules": [],
"storage_objects": [
{
"alua_tpgs": [
{
"alua_access_state": 0,
"alua_access_status": 0,
"alua_access_type": 3,
"alua_support_active_nonoptimized": 1,
"alua_support_active_optimized": 1,
"alua_support_offline": 1,
"alua_support_standby": 1,
"alua_support_transitioning": 1,
"alua_support_unavailable": 1,
"alua_write_metadata": 0,
"implicit_trans_secs": 0,
"name": "default_tg_pt_gp",
"nonop_delay_msecs": 100,
"preferred": 0,
"tg_pt_gp_id": 0,
"trans_delay_msecs": 0
}
],
"attributes": {
"block_size": 512,
"emulate_3pc": 1,
"emulate_caw": 1,
"emulate_dpo": 1,
"emulate_fua_read": 1,
"emulate_fua_write": 1,
"emulate_model_alias": 1,
"emulate_pr": 1,
"emulate_rest_reord": 0,
"emulate_tas": 1,
"emulate_tpu": 0,
"emulate_tpws": 0,
"emulate_ua_intlck_ctrl": 0,
"emulate_write_cache": 0,
"enforce_pr_isids": 1,
"force_pr_aptpl": 0,
"is_nonrot": 1,
"max_unmap_block_desc_count": 1,
"max_unmap_lba_count": 262144,
"max_write_same_len": 65535,
"optimal_sectors": 32768,
"pi_prot_format": 0,
"pi_prot_type": 0,
"pi_prot_verify": 0,
"queue_depth": 128,
"unmap_granularity": 16,
"unmap_granularity_alignment": 0,
"unmap_zeroes_data": 0
},
"dev": "/dev/zvol/data/iscsi",
"name": "g01",
"plugin": "block",
"readonly": false,
"write_back": false,
"wwn": "71363029-bdd8-4493-9d41-5dbfe0d9e58e"
}
],
"targets": [
{
"fabric": "iscsi",
"tpgs": [
{
"attributes": {
"authentication": 0,
"cache_dynamic_acls": 1,
"default_cmdsn_depth": 64,
"default_erl": 0,
"demo_mode_discovery": 1,
"demo_mode_write_protect": 0,
"fabric_prot_type": 0,
"generate_node_acls": 1,
"login_keys_workaround": 1,
"login_timeout": 15,
"netif_timeout": 2,
"prod_mode_write_protect": 0,
"t10_pi": 0,
"tpg_enabled_sendtargets": 1
},
"enable": true,
"luns": [
{
"alias": "38c6ca2bc1",
"alua_tg_pt_gp_name": "default_tg_pt_gp",
"index": 0,
"storage_object": "/backstores/block/g01"
}
],
"node_acls": [],
"parameters": {
"AuthMethod": "CHAP,None",
"DataDigest": "CRC32C,None",
"DataPDUInOrder": "Yes",
"DataSequenceInOrder": "Yes",
"DefaultTime2Retain": "20",
"DefaultTime2Wait": "2",
"ErrorRecoveryLevel": "0",
"FirstBurstLength": "65536",
"HeaderDigest": "CRC32C,None",
"IFMarkInt": "Reject",
"IFMarker": "No",
"ImmediateData": "Yes",
"InitialR2T": "Yes",
"MaxBurstLength": "262144",
"MaxConnections": "1",
"MaxOutstandingR2T": "1",
"MaxRecvDataSegmentLength": "8192",
"MaxXmitDataSegmentLength": "262144",
"OFMarkInt": "Reject",
"OFMarker": "No",
"TargetAlias": "LIO Target"
},
"portals": [
{
"ip_address": "",
"iser": false,
"offload": false,
"port": 3260
}
],
"tag": 1
}
],
"wwn": ""
}
]
}
  1. 確定沒問題之後可以開起來連線測試:
1
systemctl start target
  1. 如果測試沒問題就讓他開機自動啟動:
1
systemctl enable target

PVE 端

依照剛剛的設定去PVE的Dashboard設定。
(Datacenter > Storage > Add > ZFS Over iSCSI)

其設定對應如下:

  • ID: 你PVE中辨識用的名稱
  • Portal: 目的機器的 IP
  • Pool: ZFS Pool 名稱
  • Block Size: ZFS的 Block Size
  • Target: 前面建立 IQN 時系統產生的 IQN編號
  • iSCSI Provider: LIO
  • Target portal group: 剛剛定義的tgp編號,格式一定是 tgpX,這個在前面建立IQN時會顯示,不確定的話可以從設定檔中確認(設定檔中tgp的"tag": 1,那這裡就是填tgp1)。

最後設定完成之後應該會長得像這樣:

後話

研究過程中一度以為可以改用istgt這個provider解決一切(因為很多教學都教用scsi-target-util,這玩意兒的daemon就叫做tgtd),不過實際去翻了腳本才知道,因為每個provider都會去檢查特定的設定黨是否存在,所以這裡用istgt一樣會遇到找不到設定檔。
真心希望PVE官方趕快更新文件,不然踩雷會踩到起笑,而且網路上針對CentOS (ZFS) + PVE 的解法不多,再加上到底要用哪個provider也是眾說紛紜,感覺沒有一個答案。

是說這個玩意兒搞了我兩天,該去買杯奶茶壓壓驚了…

作者:Vongola
聲明:本文首發於Vongola的部落格,並採用 CC-BY-SA 授權條款授權轉載或分享行為。

留言板