forked from hreinecke/tcm-scripts
-
Notifications
You must be signed in to change notification settings - Fork 0
/
setup_loopback.sh
157 lines (136 loc) · 3.73 KB
/
setup_loopback.sh
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#!/bin/bash
##check if the user has root access
if [ "$EUID" -ne 0 ]
then echo "Please run as root"
exit
fi
gen_sas_address() {
prefix="naa.6001405"
uuid=$(uuidgen | sed 's/-//g' | tail --bytes 10)
echo "${prefix}${uuid}"
}
test_and_set_value() {
attr=$1
new_val=$2
[ -f ${attr} ] || return 0
read orig_val < ${attr}
if [ -z "$orig_val" ] || [ ${orig_val} -ne ${new_val} ] ; then
echo ${new_val} > ${attr}
if [ $? -ne 0 ] ; then
echo "Failed to set ${attr}"
exit 1
fi
fi
}
imgdir=/dev/shm
img=disk1.img
size=4096
bs=fileio_0
disk=disk1
hba=${bs}/${disk}
loop=/sys/kernel/config/target/loopback
core=/sys/kernel/config/target/core
prim_tpg="default_tg_pt_gp"
sec_tpg="secondary_tg_pt_gp"
#
# configure fileio
#
if [ ! -f ${imgdir}/${img} ] ; then
[ -d ${imgdir} ] || mkdir ${imgdir}
dd if=/dev/zero of=${imgdir}/${img} bs=1M count=${size} conv=sparse
fi
if [ ! -d /sys/kernel/config ] ; then
modprobe target_core_mod
modprobe tcm_loop
fi
if [ ! -d ${core}/${hba} ] ; then
[ -d ${core}/${hba} ] || mkdir -p ${core}/${hba}
echo "Create ${hba} image ${img}"
imgsize=$(( $size * 1024 * 1024 ))
echo "fd_dev_name=${imgdir}/${img},fd_dev_size=${imgsize}" > ${core}/${hba}/control
uuidgen > ${core}/${hba}/wwn/vpd_unit_serial
echo 1 > ${core}/${hba}/enable
fi
#
# configure ALUA
#
if [ ! -d ${core}/${hba}/alua/${prim_tpg} ] ; then
echo "Target not configured"
exit 1
fi
# test_and_set_value ${core}/${hba}/enable 1
test_and_set_value ${core}/${hba}/alua/${prim_tpg}/tg_pt_gp_id 0
test_and_set_value ${core}/${hba}/alua/${prim_tpg}/alua_access_state 0
echo 1 > ${core}/${hba}/alua/${prim_tpg}/alua_access_type
echo 0 > ${core}/${hba}/alua/${prim_tpg}/alua_support_offline
echo 0 > ${core}/${hba}/alua/${prim_tpg}/alua_support_unavailable
test_and_set_value ${core}/${hba}/alua/${prim_tpg}/implicit_trans_secs 30
if [ ! -d ${core}/${hba}/alua/${sec_tpg} ] ; then
mkdir ${core}/${hba}/alua/${sec_tpg}
if [ $? -ne 0 ] ; then
echo "Failed to create ${core}/${hba}/alua/${sec_tpg}"
exit 1;
fi
fi
test_and_set_value ${core}/${hba}/alua/${sec_tpg}/tg_pt_gp_id 1
test_and_set_value ${core}/${hba}/alua/${sec_tpg}/alua_access_state 1
echo 1 > ${core}/${hba}/alua/${sec_tpg}/alua_access_type
echo 0 > ${core}/${hba}/alua/${sec_tpg}/alua_support_offline
echo 0 > ${core}/${hba}/alua/${sec_tpg}/alua_support_unavailable
test_and_set_value ${core}/${hba}/alua/${sec_tpg}/implicit_trans_secs 30
#
# configure loopback
#
[ -d ${loop} ] || mkdir ${loop}
num_naa=0
for t in ${loop}/naa.* ; do
[ -d ${t} ] || continue
target_address=${t##*/}
port=$t
break;
done
if [ -z "$target_address" ] ; then
target_address=$(gen_sas_address)
port=${loop}/${target_address}
if [ ! -d ${port} ] ; then
echo "Create $port"
mkdir ${port} || exit 1
fi
fi
num_tpgt=0
for t in ${port}/tpgt_* ; do
[ -d ${t} ] || continue
(( num_tpgt++ ))
done
while [ ${num_tpgt} -lt 2 ] ; do
t=${port}/tpgt_${num_tpgt}
if [ ! -d ${t} ] ; then
echo "Create $t"
mkdir ${t} || exit 1
fi
read nexus < ${t}/nexus 2>/dev/null
if [ -z "$nexus" ] ; then
initiator_address=$(gen_sas_address)
echo "Create nexus $initiator_address"
echo "${initiator_address}" > ${t}/nexus
if [ $? -ne 0 ] ; then
echo "Failed to create nexus"
exit 1
fi
fi
# echo offline > $t/transport_status
l=${t}/lun/lun_0
if [ ! -d ${l} ] ; then
echo "Create ${l}"
mkdir ${l} || exit 1
fi
if [ ! -L ${l}/virtual_scsi_port ] ; then
echo "Link LUN 0"
ln -s ${core}/${hba} ${l}/virtual_scsi_port || exit 1
fi
if [ $num_tpgt = "1" ] ; then
echo secondary_tg_pt_gp > ${t}/lun/lun_0/alua_tg_pt_gp
fi
# echo online > $t/transport_status
(( num_tpgt++ ))
done