/etc/xen/scripts/block-iscsi is in xen-utils-common 4.6.0-1ubuntu4.
This file is owned by root:root, with mode 0o755.
The actual contents of the file can be viewed below.
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 | #!/bin/bash -e
#
# Open-iSCSI Xen block device hotplug script
#
# Author Roger Pau Monné <roger.pau@citrix.com>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published
# by the Free Software Foundation; version 2.1 only. with the special
# exception on linking described in file LICENSE.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Lesser General Public License for more details.
#
# Usage:
#
# Target should be specified using the following syntax:
#
# script=block-iscsi,vdev=xvda,target=iqn=<iqn>,portal=<portal IP>
#
# Portal address must be in IP format.
#
dir=$(dirname "$0")
. "$dir/block-common.sh"
remove_label()
{
echo $1 | sed "s/^\("$2"\)//"
}
check_tools()
{
if ! command -v iscsiadm > /dev/null 2>&1; then
fatal "Unable to find iscsiadm tool"
fi
if [ "$multipath" = "y" ] && ! command -v multipath > /dev/null 2>&1; then
fatal "Unable to find multipath"
fi
}
# Sets the following global variables based on the params field passed in as
# a parameter: iqn, portal, auth_method, user, multipath, password
parse_target()
{
# set multipath default value
multipath="n"
for param in $(echo "$1" | tr "," "\n")
do
case $param in
iqn=*)
iqn=$(remove_label $param "iqn=")
;;
portal=*)
portal=$(remove_label $param "portal=")
;;
multipath=*)
multipath=$(remove_label $param "multipath=")
;;
esac
done
if [ -z "$iqn" ] || [ -z "$portal" ]; then
fatal "iqn= and portal= are required parameters"
fi
if [ "$multipath" != "y" ] && [ "$multipath" != "n" ]; then
fatal "multipath valid values are y and n, $multipath not a valid value"
fi
}
# Sets $dev to point to the device associated with the value in iqn
find_device()
{
count=0
while [ ! -e /dev/disk/by-path/*"$iqn"-lun-0 ]; do
sleep 0.1
count=`expr $count + 1`
if [ count = 100 ]; then
# 10s timeout while waiting for iSCSI disk to settle
fatal "timeout waiting for iSCSI disk to settle"
fi
done
sddev=$(readlink -f /dev/disk/by-path/*"$iqn"-lun-0 || true)
if [ ! -b "$sddev" ]; then
fatal "Unable to find attached device path"
fi
if [ "$multipath" = "y" ]; then
mdev=$(multipath -ll "$sddev" | head -1 | awk '{ print $1}')
if [ ! -b /dev/mapper/"$mdev" ]; then
fatal "Unable to find attached device multipath"
fi
dev="/dev/mapper/$mdev"
else
dev="$sddev"
fi
}
# Attaches the target $iqn in $portal and sets $dev to point to the
# multipath device
attach()
{
do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --login > /dev/null
find_device
}
# Discovers targets in $portal and checks that $iqn is one of those targets
# Also sets the auth parameters to attach the device
prepare()
{
# Check if target is already opened
iscsiadm -m session 2>&1 | grep -q "$iqn" && fatal "Device already opened"
# Discover portal targets
iscsiadm -m discovery -t st -p $portal 2>&1 | grep -q "$iqn" || \
fatal "No matching target iqn found"
}
# Attaches the device and writes xenstore backend entries to connect
# the device
add()
{
attach
write_dev $dev
}
# Disconnects the device
remove()
{
find_device
do_or_die iscsiadm -m node --targetname "$iqn" -p "$portal" --logout > /dev/null
}
command=$1
target=$(xenstore-read $XENBUS_PATH/params || true)
if [ -z "$target" ]; then
fatal "No information about the target"
fi
parse_target "$target"
check_tools || exit 1
case $command in
add)
prepare
add
;;
remove)
remove
;;
*)
exit 1
;;
esac
|