iscsi_persistent_v3.patch
| src/datastore_mad/remotes/iscsi/cp | ||
|---|---|---|
| 74 | 74 |
IQN="$BASE_IQN:$DST_HOST.$VG_NAME.$LV_NAME" |
| 75 | 75 |
DEV="/dev/$VG_NAME/$LV_NAME" |
| 76 | 76 | |
| 77 |
let TID=ID+BASE_TID |
|
| 77 |
NEWTARGET_CMD=$(cat <<EOF |
|
| 78 |
set -e |
|
| 79 |
$SUDO $LVCREATE -L${SIZE}M ${VG_NAME} -n ${LV_NAME}
|
|
| 80 |
TID=\`$SUDO $TGTADM --lld iscsi --op show --mode target | grep "Target" | tail -n 1 | awk '{split(\$2,tmp,":"); print tmp[1]+1;}'\`
|
|
| 81 |
if [ -z \$TID ]; then TID=1; fi |
|
| 82 |
$SUDO $(tgtadm_target_new \$TID "$IQN") |
|
| 83 |
EOF |
|
| 84 |
) |
|
| 85 |
ssh_exec_and_log "$DST_HOST" "$NEWTARGET_CMD" \ |
|
| 86 |
"Error creating iscsi target $DST_HOST:$DEV" |
|
| 87 |
unset NEWTARGET_CMD |
|
| 88 | ||
| 89 |
TID=`$SSH $DST_HOST $SUDO $(tgtadm_get_tid_for_iqn $IQN)` |
|
| 78 | 90 | |
| 79 | 91 |
REGISTER_CMD=$(cat <<EOF |
| 80 | 92 |
set -e |
| 81 |
$SUDO $LVCREATE -L${SIZE}M ${VG_NAME} -n ${LV_NAME}
|
|
| 82 |
$SUDO $(tgtadm_target_new "$TID" "$IQN") |
|
| 83 | 93 |
$SUDO $(tgtadm_target_bind_all "$TID") |
| 84 | 94 |
$SUDO $(tgtadm_logicalunit_new "$TID" "$DEV") |
| 95 |
$SUDO $(tgt-admin_dump_config /etc/tgt/targets.conf) |
|
| 85 | 96 |
EOF |
| 86 | 97 |
) |
| 87 | 98 | |
| src/datastore_mad/remotes/iscsi/iscsi.conf | ||
|---|---|---|
| 18 | 18 |
HOST=localhost |
| 19 | 19 | |
| 20 | 20 |
# Default IQN path |
| 21 |
BASE_IQN=iqn.2012-02.org.opennebula
|
|
| 21 |
BASE_IQN=iqn.2012-04.org.opennebula
|
|
| 22 | 22 | |
| 23 | 23 |
# Default volume group |
| 24 | 24 |
VG_NAME=vg-one |
| 25 | 25 | |
| 26 |
# Starting TID for iSCSI targets |
|
| 27 |
BASE_TID=1 |
|
| 28 | ||
| 29 | 26 |
# Lists of hosts (separated by spaces) for which no iscsiadm login or logout |
| 30 | 27 |
# is performed. |
| 31 | 28 |
NO_ISCSI="$HOSTNAME" |
| src/datastore_mad/remotes/iscsi/mkfs | ||
|---|---|---|
| 75 | 75 |
IQN="$BASE_IQN:$DST_HOST.$VG_NAME.$LV_NAME" |
| 76 | 76 |
DEV="/dev/$VG_NAME/$LV_NAME" |
| 77 | 77 | |
| 78 |
let TID=ID+BASE_TID |
|
| 78 |
# ------------ Image to save_as disk, no need to create a FS ------------ |
|
| 79 | 79 | |
| 80 |
REGISTER_CMD=$(cat <<EOF |
|
| 80 |
if [ "$FSTYPE" = "save_as" ]; then |
|
| 81 |
NEWTARGET_CMD=$(cat <<EOF |
|
| 81 | 82 |
set -e |
| 82 | 83 |
$SUDO $LVCREATE -L${SIZE}M ${VG_NAME} -n ${LV_NAME}
|
| 83 |
$SUDO $(tgtadm_target_new "$TID" "$IQN") |
|
| 84 |
TID=\`$SUDO $TGTADM --lld iscsi --op show --mode target | grep "Target" | tail -n 1 | awk '{split(\$2,tmp,":"); print tmp[1]+1;}'\`
|
|
| 85 |
if [ -z \$TID ]; then TID=1; fi |
|
| 86 |
$SUDO $(tgtadm_target_new \$TID "$IQN") |
|
| 87 |
EOF |
|
| 88 |
) |
|
| 89 |
ssh_exec_and_log "$DST_HOST" "$NEWTARGET_CMD" \ |
|
| 90 |
"Error creating iscsi target $DST_HOST:$DEV" |
|
| 91 | ||
| 92 |
TID=`$SSH $DST_HOST $SUDO $(tgtadm_get_tid_for_iqn $IQN)` |
|
| 93 | ||
| 94 |
REGISTER_CMD=$(cat <<EOF |
|
| 95 |
set -e |
|
| 84 | 96 |
$SUDO $(tgtadm_target_bind_all "$TID") |
| 85 | 97 |
$SUDO $(tgtadm_logicalunit_new "$TID" "$DEV") |
| 86 |
$SUDO $(mkfs_command "$DEV" "$FSTYPE")
|
|
| 98 |
$SUDO $(tgt-admin_dump_config /etc/tgt/targets.conf)
|
|
| 87 | 99 |
EOF |
| 88 | 100 |
) |
| 101 |
ssh_exec_and_log "$DST_HOST" "$REGISTER_CMD" \ |
|
| 102 |
"Error setting up iscsi target $DST_HOST:$DEV" |
|
| 89 | 103 | |
| 90 |
# ------------ Image to save_as disk, no need to create a FS ------------ |
|
| 91 | ||
| 92 |
if [ "$FSTYPE" = "save_as" ]; then |
|
| 93 |
echo "$DST $SIZE" |
|
| 104 |
echo "$IQN $SIZE" |
|
| 94 | 105 |
exit 0 |
| 95 | 106 |
fi |
| 96 | 107 | |
| 97 | 108 |
# ------------ Create the image to the repository ------------ |
| 98 | 109 | |
| 110 |
NEWTARGET_CMD=$(cat <<EOF |
|
| 111 |
set -e |
|
| 112 |
$SUDO $LVCREATE -L${SIZE}M ${VG_NAME} -n ${LV_NAME}
|
|
| 113 |
TID=\`$SUDO $TGTADM --lld iscsi --op show --mode target | grep "Target" | tail -n 1 | awk '{split(\$2,tmp,":"); print tmp[1]+1;}'\`
|
|
| 114 |
if [ -z \$TID ]; then TID=1; fi |
|
| 115 |
$SUDO $(tgtadm_target_new \$TID "$IQN") |
|
| 116 |
EOF |
|
| 117 |
) |
|
| 118 |
ssh_exec_and_log "$DST_HOST" "$NEWTARGET_CMD" \ |
|
| 119 |
"Error creating iscsi target $DST_HOST:$DEV" |
|
| 120 | ||
| 121 |
TID=`$SSH $DST_HOST $SUDO $(tgtadm_get_tid_for_iqn $IQN)` |
|
| 122 | ||
| 123 |
REGISTER_CMD=$(cat <<EOF |
|
| 124 |
set -e |
|
| 125 |
$SUDO $(tgtadm_target_bind_all "$TID") |
|
| 126 |
$SUDO $(tgtadm_logicalunit_new "$TID" "$DEV") |
|
| 127 |
$SUDO $(tgt-admin_dump_config /etc/tgt/targets.conf) |
|
| 128 |
$SUDO $(mkfs_command "$DEV" "$FSTYPE") |
|
| 129 |
EOF |
|
| 130 |
) |
|
| 131 | ||
| 99 | 132 |
ssh_exec_and_log "$DST_HOST" "$REGISTER_CMD" \ |
| 100 | 133 |
"Error registering $DST_HOST:$DEV" |
| 101 | 134 | |
| src/datastore_mad/remotes/iscsi/rm | ||
|---|---|---|
| 58 | 58 |
VG_NAME=`echo $TARGET|$AWK -F. '{print $(NF-1)}'`
|
| 59 | 59 |
DEV="/dev/$VG_NAME/$LV_NAME" |
| 60 | 60 | |
| 61 |
let TID=ID+BASE_TID |
|
| 61 |
TID=`$SSH $DST_HOST $SUDO $(tgtadm_get_tid_for_iqn $SRC)` |
|
| 62 | 62 | |
| 63 | 63 |
RM_COMMAND=$(cat <<EOF |
| 64 | 64 |
$SUDO $(tgtadm_target_delete "$TID") |
| 65 |
$SUDO $(tgt-admin_dump_config "/etc/tgt/targets.conf") |
|
| 65 | 66 |
$SUDO $LVREMOVE -f $VG_NAME/$LV_NAME |
| 66 | 67 |
EOF |
| 67 | 68 |
) |
| src/mad/sh/scripts_common.sh | ||
|---|---|---|
| 40 | 40 |
SUDO=sudo |
| 41 | 41 |
TAR=tar |
| 42 | 42 |
TGTADM=tgtadm |
| 43 |
TGTADMIN=tgt-admin |
|
| 43 | 44 |
VMKFSTOOLS=/usr/sbin/vmkfstools |
| 44 | 45 |
WGET=wget |
| 45 | 46 | |
| ... | ... | |
| 294 | 295 |
echo "$TGTADM --lld iscsi --op delete --mode target --tid $ID" |
| 295 | 296 |
} |
| 296 | 297 | |
| 298 |
function tgtadm_get_tid_for_iqn {
|
|
| 299 |
IQN="$1" |
|
| 300 |
echo "$TGTADM --lld iscsi --op show --mode target | grep \"$IQN\" | awk '{split(\$2,tmp,\":\"); print(tmp[1]);}'"
|
|
| 301 |
} |
|
| 302 | ||
| 303 |
function tgt-admin_dump_config {
|
|
| 304 |
FILE_PATH="$1" |
|
| 305 |
echo "$TGTADMIN --dump > $FILE_PATH" |
|
| 306 |
} |
|
| 307 | ||
| 297 | 308 |
### |
| 298 | 309 | |
| 299 | 310 |
function iscsiadm_discovery {
|
| src/tm_mad/iscsi/clone | ||
|---|---|---|
| 31 | 31 |
TMCOMMON=$ONE_LOCATION/var/remotes/tm/tm_common.sh |
| 32 | 32 |
fi |
| 33 | 33 | |
| 34 |
DRIVER_PATH=$(dirname $0) |
|
| 35 | ||
| 34 | 36 |
. $TMCOMMON |
| 37 |
IQN=$SRC |
|
| 38 |
TARGET=`arg_path $SRC` |
|
| 39 |
DST_PATH=`arg_path $DST` |
|
| 40 |
DST_HOST=`arg_host $DST` |
|
| 41 |
DST_DIR=`dirname $DST_PATH` |
|
| 42 |
VM_ID=`echo $DST_DIR | awk '{split($0,a,"/"); print a[length(a)];}'`
|
|
| 43 |
NEW_IQN=$IQN-$VM_ID |
|
| 44 | ||
| 45 |
BASE_IQN=`echo $IQN|$CUT -d: -f1` |
|
| 46 |
TARGET=`echo $IQN|$CUT -d: -f2` |
|
| 47 |
LV_NAME=`echo $TARGET|$AWK -F. '{print $(NF)}'`
|
|
| 48 |
TARGET_LV_NAME=`echo $LV_NAME-$VM_ID` |
|
| 49 |
VG_NAME=`echo $TARGET|$AWK -F. '{print $(NF-1)}'`
|
|
| 50 |
TARGET_DEV="/dev/$VG_NAME/$LV_NAME" |
|
| 51 |
TARGET_HOST=${TARGET%.$VG_NAME.$LV_NAME}
|
|
| 52 | ||
| 53 |
SIZE=`$SSH $TARGET_HOST $SUDO lvdisplay $TARGET_DEV | awk '/Current LE/ {print $3}'`
|
|
| 54 | ||
| 55 |
log "Create LV" |
|
| 56 |
$SSH $TARGET_HOST $SUDO $LVCREATE -l${SIZE} ${VG_NAME} -n ${TARGET_LV_NAME}
|
|
| 57 | ||
| 58 |
log "Cloning /dev/${VG_NAME}/${LV_NAME} to /dev/${VG_NAME}/${TARGET_LV_NAME}"
|
|
| 59 |
$SSH $TARGET_HOST $SUDO $DD if=/dev/${VG_NAME}/${LV_NAME} of=/dev/${VG_NAME}/${TARGET_LV_NAME} bs=64k
|
|
| 60 | ||
| 61 |
log "Creating new iSCSI Target IQN: $NEW_IQN" |
|
| 62 |
NEWTARGET_CMD=$(cat <<EOF |
|
| 63 |
TID=\`$SUDO $TGTADM --lld iscsi --op show --mode target | grep "Target" | tail -n 1 | awk '{split(\$2,tmp,":"); print tmp[1]+1;}'\`
|
|
| 64 |
if [ -z \$TID ]; then TID=1; fi |
|
| 65 |
$SUDO $(tgtadm_target_new \$TID "$NEW_IQN") |
|
| 66 |
EOF |
|
| 67 |
) |
|
| 68 | ||
| 69 |
ssh_exec_and_log "$TARGET_HOST" "$NEWTARGET_CMD" \ |
|
| 70 |
"Error creating new target $TARGET_HOST:$DEV" |
|
| 71 |
unset NEWTARGET_CMD |
|
| 72 | ||
| 73 |
TID=`$SSH $TARGET_HOST $SUDO $(tgtadm_get_tid_for_iqn $NEW_IQN)` |
|
| 74 |
TARGETSETUP_CMD=$(cat <<EOF |
|
| 75 |
$SUDO $(tgtadm_target_bind_all "$TID") |
|
| 76 |
$SUDO $(tgtadm_logicalunit_new "$TID" "/dev/$VG_NAME/$TARGET_LV_NAME") |
|
| 77 |
$SUDO $(tgt-admin_dump_config /etc/tgt/targets.conf) |
|
| 78 |
EOF |
|
| 79 |
) |
|
| 80 | ||
| 81 |
ssh_exec_and_log "$TARGET_HOST" "$TARGETSETUP_CMD" \ |
|
| 82 |
"Error setting up target $TARGET_HOST:$DEV" |
|
| 83 |
unset TARGETSETUP_CMD |
|
| 84 | ||
| 85 |
DISCOVER_CMD=$(cat <<EOF |
|
| 86 |
set -e |
|
| 87 |
mkdir -p $DST_DIR |
|
| 88 |
$SUDO $(iscsiadm_discovery "$TARGET_HOST") |
|
| 89 |
$SUDO $(iscsiadm_login "$NEW_IQN" "$TARGET_HOST") |
|
| 90 |
sleep 2 |
|
| 91 |
DISK_BY_PATH=\$(ls /dev/disk/by-path/*$NEW_IQN-lun-1) |
|
| 92 |
ln -s "\$DISK_BY_PATH" "$DST_PATH" |
|
| 93 |
EOF |
|
| 94 |
) |
|
| 35 | 95 | |
| 36 |
log_error "CLONE not supported for TM_ISCSI. Use persistent images" |
|
| 96 |
ssh_exec_and_log "$DST_HOST" "$DISCOVER_CMD" \ |
|
| 97 |
"Error registering $DST_HOST:$DEV" |
|
| 37 | 98 | |
| 38 |
exit 1 |
|
| 99 |
exit 0 |
|
| src/tm_mad/iscsi/delete | ||
|---|---|---|
| 35 | 35 |
# remote_system_ds directory for the VM (remotely) |
| 36 | 36 |
#------------------------------------------------------------------------------- |
| 37 | 37 |
DST_PATH=`arg_path $DST` |
| 38 |
DST_DIR=`dirname $DST_PATH` |
|
| 38 | 39 |
DST_HOST=`arg_host $DST` |
| 39 | 40 | |
| 40 | 41 |
if [ `is_disk $DST_PATH` -eq 1 ]; then |
| 41 | 42 |
# Disk |
| 43 |
IQN=`$SSH $DST_HOST readlink $DST_PATH |grep -o 'iqn.*$'` |
|
| 44 |
IQN=${IQN%-lun-1}
|
|
| 45 |
TARGET=`echo $IQN|$CUT -d: -f2` |
|
| 46 |
LEN=`echo $IQN | awk '{split($0,a,".") split(a[length(a)],b,"-"); print length(b);}'`
|
|
| 47 |
VM_ID=`echo $DST_DIR | awk '{split($0,a,"/"); print a[length(a)];}'`
|
|
| 42 | 48 |
LOGOUT_CMD=$(cat <<EOF |
| 43 | 49 |
set -e |
| 44 | 50 |
IQN=\$(readlink $DST_PATH |grep -o 'iqn.*$') |
| ... | ... | |
| 46 | 52 |
$SUDO $(iscsiadm_logout "\$IQN") |
| 47 | 53 |
EOF |
| 48 | 54 |
) |
| 49 |
ssh_exec_and_log "$DST_HOST" "$LOGOUT_CMD" \ |
|
| 50 |
"Error logging out $IQN" |
|
| 55 |
if [ $LEN -eq 4 ]; then #Non persistent |
|
| 56 |
log "Removing non persistent disk from iSCSI DS" |
|
| 57 |
BASE_IQN=`echo $IQN|$CUT -d: -f1` |
|
| 58 |
LV_NAME=`echo $TARGET|$AWK -F. '{print $(NF)}'`
|
|
| 59 |
TARGET_LV_NAME=`echo $LV_NAME-$VM_ID` |
|
| 60 |
VG_NAME=`echo $TARGET|$AWK -F. '{print $(NF-1)}'`
|
|
| 61 |
TARGET_DEV="/dev/$VG_NAME/$LV_NAME" |
|
| 62 |
TARGET_HOST=${TARGET%.$VG_NAME.$LV_NAME}
|
|
| 63 |
TID=`$SSH $TARGET_HOST $SUDO tgtadm --lld iscsi --op show --mode target | grep $IQN | awk '{split($2,a,":"); print a[1];}'`
|
|
| 64 |
ssh_exec_and_log "$DST_HOST" "$LOGOUT_CMD" \ |
|
| 65 |
"Error logging out $IQN" |
|
| 66 |
ssh_exec_and_log "$TARGET_HOST" "$SUDO $TGTADM --lld iscsi --op delete --mode target --tid $TID" \ |
|
| 67 |
"Error while deleting iSCSI target $TID" |
|
| 68 |
ssh_exec_and_log "$TARGET_HOST" "$SUDO $TGTADMIN --dump > /etc/tgt/targets.conf" \ |
|
| 69 |
"Failed to refresh the config file" |
|
| 70 |
ssh_exec_and_log "$TARGET_HOST" "$SUDO $LVREMOVE -f $VG_NAME/$LV_NAME" \ |
|
| 71 |
"Error while removing LV $VG_NAME/$LV_NAME" |
|
| 72 |
else #Persistent |
|
| 73 |
log "Logging out from iSCSI target" |
|
| 74 |
ssh_exec_and_log "$DST_HOST" "$LOGOUT_CMD" \ |
|
| 75 |
"Error logging out $IQN" |
|
| 76 |
fi |
|
| 51 | 77 |
else |
| 52 | 78 |
# Directory |
| 53 | 79 |
log "Deleting $DST_PATH" |
| src/tm_mad/iscsi/ln | ||
|---|---|---|
| 55 | 55 |
mkdir -p $DST_DIR |
| 56 | 56 |
$SUDO $(iscsiadm_discovery "$TARGET_HOST") |
| 57 | 57 |
$SUDO $(iscsiadm_login "$IQN" "$TARGET_HOST") |
| 58 |
sleep 1
|
|
| 58 |
sleep 2
|
|
| 59 | 59 |
DISK_BY_PATH=\$(ls /dev/disk/by-path/*$IQN-lun-1) |
| 60 | 60 |
ln -s "\$DISK_BY_PATH" "$DST_PATH" |
| 61 | 61 |
EOF |
| src/tm_mad/iscsi/mvds | ||
|---|---|---|
| 34 | 34 |
. $TMCOMMON |
| 35 | 35 | |
| 36 | 36 |
SRC_HOST=`arg_host $SRC` |
| 37 |
IQN=$DST |
|
| 37 |
SRC_PATH=`arg_path $SRC` |
|
| 38 |
IQN=`$SSH $SRC_HOST readlink $SRC_PATH |grep -o 'iqn.*$'` |
|
| 39 |
IQN=${IQN%-lun-1}
|
|
| 40 |
TARGET_IQN=`echo $2` |
|
| 41 |
TARGET=`echo $IQN|$CUT -d: -f2` |
|
| 42 |
TARGET_TARGET=`echo $TARGET_IQN|$CUT -d: -f2` |
|
| 38 | 43 | |
| 39 |
log "Logging out $IQN" |
|
| 44 |
LEN=`echo $IQN | awk '{split($0,a,".") split(a[length(a)],b,"-"); print length(b);}'`
|
|
| 45 |
VM_ID=`echo $DST_DIR | awk '{split($0,a,"/"); print a[length(a)];}'`
|
|
| 46 | ||
| 47 |
BASE_IQN=`echo $IQN|$CUT -d: -f1` |
|
| 48 |
LV_NAME=`echo $TARGET|$AWK -F. '{print $(NF)}'`
|
|
| 49 |
VG_NAME=`echo $TARGET|$AWK -F. '{print $(NF-1)}'`
|
|
| 50 |
TARGET_LV_NAME=`echo $TARGET_TARGET|$AWK -F. '{print $(NF)}'`
|
|
| 51 |
TARGET_VG_NAME=`echo $TARGET_TARGET|$AWK -F. '{print $(NF-1)}'`
|
|
| 52 |
TARGET_HOST=${TARGET%.$VG_NAME.$LV_NAME}
|
|
| 53 | ||
| 54 |
if [ $LEN -eq 3 ]; then |
|
| 40 | 55 | |
| 56 |
log "Logging out $IQN" |
|
| 41 | 57 |
LOGOUT_CMD=$(cat <<EOF |
| 42 | 58 |
set -e |
| 43 | 59 |
$SUDO $(iscsiadm_logout "$IQN") |
| ... | ... | |
| 48 | 64 |
"Error logging out $IQN" |
| 49 | 65 | |
| 50 | 66 |
exit 0 |
| 67 |
else |
|
| 68 |
log "Logging out $IQN" |
|
| 69 |
LOGOUT_CMD=$(cat <<EOF |
|
| 70 |
set -e |
|
| 71 |
$SUDO $(iscsiadm_logout "$IQN") |
|
| 72 |
EOF |
|
| 73 |
) |
|
| 74 |
ssh_exec_and_log "$SRC_HOST" "$LOGOUT_CMD" \ |
|
| 75 |
"Error logging out $IQN" |
|
| 76 |
TID=`$SSH $TARGET_HOST $SUDO tgtadm --lld iscsi --op show --mode target | grep $IQN | awk '{split($2,a,":"); print a[1];}'`
|
|
| 77 |
ssh_exec_and_log "$TARGET_HOST" "$SUDO $TGTADM --lld iscsi --op delete --mode target --tid $TID" \ |
|
| 78 |
"Error while deleting iSCSI target $TID" |
|
| 79 |
ssh_exec_and_log "$TARGET_HOST" "$SUDO $TGTADMIN --dump > /etc/tgt/targets.conf" \ |
|
| 80 |
"Error while saving the config file" |
|
| 81 |
ssh_exec_and_log "$TARGET_HOST" "$SUDO $DD if=/dev/$VG_NAME/$LV_NAME of=/dev/$TARGET_VG_NAME/$TARGET_LV_NAME bs=64k" \ |
|
| 82 |
"Error while copying disk images from /dev/$VG_NAME/$LV_NAME to /dev/$TARGET_VG_NAME/$TARGET_LV_NAME" |
|
| 83 |
ssh_exec_and_log "$TARGET_HOST" "$SUDO $LVREMOVE -f $VG_NAME/$LV_NAME" \ |
|
| 84 |
"Error while removing LV /dev/$VG_NAME/$LV_NAME" |
|
| 85 |
exit 0 |
|
| 86 |
fi |
|