File: basic-scsi-device

package info (click to toggle)
sg3-utils 1.48-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,212 kB
  • sloc: ansic: 123,509; cpp: 14,381; sh: 7,956; makefile: 702
file content (123 lines) | stat: -rw-r--r-- 3,681 bytes parent folder | download | duplicates (2)
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
#!/bin/bash

set -eo pipefail

die()
{
  echo "$@" >&2
  exit 1
}

cwd=$(pwd)
backing_filename="backingfile"
target_name="iqn.2024-10.com.test.storage:target01"
localhost="127.0.0.1"
portal="${localhost}:3260"
initiator_name="iqn.2024-10.com.test.storage:initiator01"

# Install necessary iSCSI modules which are in -extra in Ubuntu
if dpkg-vendor --derives-from Ubuntu; then
    apt-get install -y "linux-modules-extra-$(uname -r)" \
        || die "Could not install iSCSI linux modules"
fi

# Load iSCSI/TCP data-path module
modprobe iscsi_tcp \
    || die "Failed modprobe of iscsi_tcp kernel module"
lsmod | grep scsi


# create backing file
targetcli backstores/fileio create name="${backing_filename}" size=1M file_or_dev="${cwd}/${backing_filename}" \
    || die "Failed to create backing file"
# create Target Portal Group (TPG)
targetcli iscsi/ create "${target_name}" \
    || die "Failed to create target"

# cleanup any existing portal
targetcli iscsi/${target_name}/tpg1/portals delete ip_address=0.0.0.0 ip_port=3260 \
    || echo "-"
# create new portal
targetcli iscsi/${target_name}/tpg1/portals create \
    || die "Failed to create portal"

# set backing file to target
targetcli "iscsi/${target_name}/tpg1/luns" create "/backstores/fileio/${backing_filename}" \
    || die "Failed to set backing file"

# set acls
targetcli iscsi/${target_name}/tpg1/ set attribute generate_node_acls=1 \
    || die "Failed to set acls node generation"
targetcli iscsi/${target_name}/tpg1/acls create "${initiator_name}" \
    || die "Failed to set acls"
echo "InitiatorName=${initiator_name}" > "/etc/iscsi/initiatorname.iscsi"

targetcli "ls"

systemctl restart iscsid \
    || die "Failed to restart iscsid"
systemctl restart open-iscsi \
    || die "Failed to restart open-iscsi"

# scan for targets (locally)
iscsiadm --mode discovery --type sendtargets --portal "${localhost}" \
    || die "Failed to scan for local targets"

# login and establish disk node (/dev/sdX)
iscsiadm --mode node --targetname "${target_name}" --portal "${portal}" --login \
    || die "Failed to login in and establish disk node"
udevadm settle --timeout 60 \
    || die "Failed during udevadm settle"

# Determine the disk device name
disk=$(lsscsi -g | grep ${backing_filename} | head -n1 | awk '{ print $6 }')

echo
echo "Status after initial setup"
sginfo "${disk}" | grep "^Product:" \
    || die "Failed to query for product name from sginfo"

ls -l "${disk}" \
    || die "Failed to find ${disk}"

echo
echo "Check SCSI Logical Unit Number (LUN) report"
sg_luns "${disk}" | grep "Lun list length = " \
    || die "Failed to get lun for ${disk}"

echo
echo "Lookup op codes, checking for op code 88 'Read'"
sg_opcodes "${disk}" | grep "^ 88" | grep "Read" \
    || die "Failed check of opcodes on ${disk}"

echo
echo "Reset the disk"
sg_reset "${disk}" \
    || die "Failed to reset disk"

echo
echo "Scan the disk to check that it is active"
sg_scan -av "${disk}" \
    || die "Failed to scan disk for activity"

echo
echo "Check the SCSI VERIFY command is handled and succeeds"
sg_verify "${disk}" \
    || die "Failed to check verify command"

echo
echo "Read the mode pages with the SCSI MODE SENSE command"
sg_modes "${disk}" \
    || die "Failed to read mode pages"

echo
echo "Check data write behavior"
sg_dd bs=512 if=/dev/random of="${disk}" count=1000 2>/dev/null \
    || "Failed writing to ${disk}"

echo
echo "Check data read behavior"
sg_dd bs=512 if=/etc/lsb-release of="${disk}" 2>/dev/null \
    || "Failed writing lsb-release info to ${disk}"
sg_dd count=1 if="${disk}" of=/dev/stdout 2>/dev/null | grep '^DISTRIB_ID' 2>/dev/null \
    || "Failed reading from ${disk}"