WHATS_NEW | 4 + configure | 6 +- configure.ac | 8 +- include/configure.h.in | 2 +- man/Makefile.in | 2 +- man/lvm_import_vdo.8_main | 92 ++++++++++++ man/vdoimport.8_main | 92 ------------ scripts/Makefile.in | 2 +- scripts/lvm_import_vdo.sh | 376 ++++++++++++++++++++++++++++++++++++++++++++++ scripts/vdoimport.sh | 376 ---------------------------------------------- test/Makefile.in | 2 +- test/shell/vdo-convert.sh | 12 +- 12 files changed, 489 insertions(+), 485 deletions(-) create mode 100644 man/lvm_import_vdo.8_main delete mode 100644 man/vdoimport.8_main create mode 100755 scripts/lvm_import_vdo.sh delete mode 100755 scripts/vdoimport.sh diff --git a/WHATS_NEW b/WHATS_NEW index 5556789..3637e31 100644 --- a/WHATS_NEW +++ b/WHATS_NEW @@ -1,3 +1,7 @@ +Version 2.03.14 - +================================== + Rename vdoimport to lvm_import_vdo. + Version 2.03.13 - =============================== Support --poolmetadataspare with vgsplit and vgmerge. diff --git a/configure b/configure index 661702d..897a810 100755 --- a/configure +++ b/configure @@ -12379,8 +12379,8 @@ $as_echo "$FSADM" >&6; } ################################################################################ -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install vdoimport" >&5 -$as_echo_n "checking whether to install vdoimport... " >&6; } +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install lvm_import_vdo" >&5 +$as_echo_n "checking whether to install lvm_import_vdo... " >&6; } # Check whether --enable-vdoimport was given. if test "${enable_vdoimport+set}" = set; then : enableval=$enable_vdoimport; VDOIMPORT=$enableval @@ -13875,7 +13875,7 @@ cat >>confdefs.h <<_ACEOF _ACEOF -VDOIMPORT_PATH="$SBINDIR/vdoimport" +VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo" cat >>confdefs.h <<_ACEOF #define VDOIMPORT_PATH "$VDOIMPORT_PATH" diff --git a/configure.ac b/configure.ac index 5a8b486..f769a63 100644 --- a/configure.ac +++ b/configure.ac @@ -1295,8 +1295,8 @@ AC_MSG_RESULT($FSADM) ################################################################################ -dnl -- Enable vdoimport -AC_MSG_CHECKING(whether to install vdoimport) +dnl -- Enable lvm_import_vdo +AC_MSG_CHECKING(whether to install lvm_import_vdo) AC_ARG_ENABLE(vdoimport, AC_HELP_STRING([--disable-vdoimport], [disable vdoimport]), VDOIMPORT=$enableval) AC_MSG_RESULT($VDOIMPORT) @@ -1656,8 +1656,8 @@ USRSBINDIR="$(eval echo $(eval echo $usrsbindir))" FSADM_PATH="$SBINDIR/fsadm" AC_DEFINE_UNQUOTED(FSADM_PATH, ["$FSADM_PATH"], [Path to fsadm binary.]) -VDOIMPORT_PATH="$SBINDIR/vdoimport" -AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to vdoimport binary.]) +VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo" +AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to lvm_import_vdo binary.]) ################################################################################ dnl -- dmeventd pidfile and executable path diff --git a/include/configure.h.in b/include/configure.h.in index 6df8d89..028ae48 100644 --- a/include/configure.h.in +++ b/include/configure.h.in @@ -684,7 +684,7 @@ /* Enable a valgrind aware build of pool */ #undef VALGRIND_POOL -/* Path to vdoimport binary. */ +/* Path to lvm_import_vdo binary. */ #undef VDOIMPORT_PATH /* The path to 'vdoformat', if available. */ diff --git a/man/Makefile.in b/man/Makefile.in index d60a92c..45ebf54 100644 --- a/man/Makefile.in +++ b/man/Makefile.in @@ -23,7 +23,7 @@ else endif FSADMMAN = fsadm.8 -VDOIMPORTMAN = vdoimport.8 +VDOIMPORTMAN = lvm_import_vdo.8 BLKDEACTIVATEMAN = blkdeactivate.8 DMEVENTDMAN = dmeventd.8 DMFILEMAPDMAN = dmfilemapd.8 diff --git a/man/lvm_import_vdo.8_main b/man/lvm_import_vdo.8_main new file mode 100644 index 0000000..ee817a0 --- /dev/null +++ b/man/lvm_import_vdo.8_main @@ -0,0 +1,92 @@ +.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" +. +.SH "NAME" +. +lvm_import_vdo \(em utility to import VDO volumes into a new volume group. +. +.SH SYNOPSIS +. +.PD 0 +.ad l +.TP 10 +.B lvm_import_vdo +.RI [ options ] +.IR device +. +.PD +. +.SH DESCRIPTION +. +lvm_import_vdo utility imports VDO volumes created and managed by +.BR vdo (8) +manager into +.BR lvm2 (8) +managed VDO LV. This is realized by moving VDO superblock by 2MiB +and creating lvm2 metadata at the front of this device. The operation is not reversible, +thus after conversion to lvm2 the access to VDO data is only possible with +.BR lvm2 (8) +commands, +.BR vdo (8) +manager no longer control such volume. +. +.SH OPTIONS +. +.TP +.BR -f | --force +Bypass some sanity checks. +. +.TP +.BR -h | --help +Display the help text. +. +.TP +.BR -n | --name +Specifies the name of converted VDO LV. When the name is not specified, +some automatic name is selected. In case the converted VDO volume is +already using LV a backend device, the name of this LV is used for VDO LV. +In this case also the of volume group must stay same. +. +.TP +.BR -v | --verbose +Be more verbose. +. +.TP +.BR -y | --yes +Answer "yes" at any prompts. +. +.TP +.BR --dry-run +Print commands without running them. +. +. +.SH DIAGNOSTICS +. +On successful completion, the status code is 0. +A status code of 1 is used for failure. +. +.SH EXAMPLES +. +Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1. +.P +# +.B lvm_import_vdo --name VG1/LV1 /dev/mapper/vdo-volume +. +.SH ENVIRONMENT VARIABLES +. +.TP +.B TMPDIR +The temporary directory name for mount points. Defaults to "\fI/tmp\fP". +.TP +.B DM_DEV_DIR +The device directory name. +Defaults to "\fI/dev\fP" and must be an absolute path. +. +.SH SEE ALSO +. +.nh +.ad l +.BR lvm (8), +.BR lvm.conf (5), +.P +.BR vdo (8), +.BR vdo2lvm (8), diff --git a/man/vdoimport.8_main b/man/vdoimport.8_main deleted file mode 100644 index 1f32909..0000000 --- a/man/vdoimport.8_main +++ /dev/null @@ -1,92 +0,0 @@ -.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\"" -. -.SH "NAME" -. -vdoimport \(em utility to import VDO volumes into a new volume group. -. -.SH SYNOPSIS -. -.PD 0 -.ad l -.TP 10 -.B vdoimport -.RI [ options ] -.IR device -. -.PD -. -.SH DESCRIPTION -. -vdoimport utility imports VDO volumes created and managed by -.BR vdo (8) -manager into -.BR lvm2 (8) -managed VDO LV. This is realized by moving VDO superblock by 2MiB -and creating lvm2 metadata at the front of this device. The operation is not reversible, -thus after conversion to lvm2 the access to VDO data is only possible with -.BR lvm2 (8) -commands, -.BR vdo (8) -manager no longer control such volume. -. -.SH OPTIONS -. -.TP -.BR -f | --force -Bypass some sanity checks. -. -.TP -.BR -h | --help -Display the help text. -. -.TP -.BR -n | --name -Specifies the name of converted VDO LV. When the name is not specified, -some automatic name is selected. In case the converted VDO volume is -already using LV a backend device, the name of this LV is used for VDO LV. -In this case also the of volume group must stay same. -. -.TP -.BR -v | --verbose -Be more verbose. -. -.TP -.BR -y | --yes -Answer "yes" at any prompts. -. -.TP -.BR --dry-run -Print commands without running them. -. -. -.SH DIAGNOSTICS -. -On successful completion, the status code is 0. -A status code of 1 is used for failure. -. -.SH EXAMPLES -. -Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1. -.P -# -.B vdoimport --name VG1/LV1 /dev/mapper/vdo-volume -. -.SH ENVIRONMENT VARIABLES -. -.TP -.B TMPDIR -The temporary directory name for mount points. Defaults to "\fI/tmp\fP". -.TP -.B DM_DEV_DIR -The device directory name. -Defaults to "\fI/dev\fP" and must be an absolute path. -. -.SH SEE ALSO -. -.nh -.ad l -.BR lvm (8), -.BR lvm.conf (5), -.P -.BR vdo (8), -.BR vdo2lvm (8), diff --git a/scripts/Makefile.in b/scripts/Makefile.in index 1fe88ca..f16c37d 100644 --- a/scripts/Makefile.in +++ b/scripts/Makefile.in @@ -32,7 +32,7 @@ ifeq ("@FSADM@", "yes") endif ifeq ("@VDOIMPORT@", "yes") - LVM_SCRIPTS += vdoimport.sh + LVM_SCRIPTS += lvm_import_vdo.sh endif ifeq ("@BLKDEACTIVATE@", "yes") diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh new file mode 100755 index 0000000..35140a0 --- /dev/null +++ b/scripts/lvm_import_vdo.sh @@ -0,0 +1,376 @@ +#!/bin/bash +# +# Copyright (C) 2021 Red Hat, Inc. All rights reserved. +# +# This file is part of LVM2. +# +# This copyrighted material is made available to anyone wishing to use, +# modify, copy, or redistribute it subject to the terms and conditions +# of the GNU General Public License v.2. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA +# +# Author: Zdenek Kabelac +# +# Script for converting VDO volumes to lvm2 VDO LVs +# +# Needed utilities: +# lvm, dmsetup, +# vdo, vdo2lvm, +# grep, awk, sed, blockdev, readlink, mkdir +# +# Conversion is using 'vdo convert' support from VDO manager to move +# existing VDO header by 2M which makes space to place in PV header +# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG. +# + +set -euE -o pipefail + +TOOL=lvm_import_vdo + +_SAVEPATH=$PATH +PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH" + +# user may override lvm location by setting LVM_BINARY +LVM=${LVM_BINARY:-lvm} +VDO=${VDO_BINARY:-vdo} +VDOCONF=${VDOCONF:-} +BLOCKDEV="blockdev" +READLINK="readlink" +READLINK_E="-e" +MKDIR="mkdir" + +TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$" +DM_DEV_DIR="${DM_DEV_DIR:-/dev}" + +DRY=0 +VERB="" +FORCE="" +YES="" + +# default name for converted VG and its VDO LV +NAME="vdovg/vdolvol" + +# help message +tool_usage() { + echo "${TOOL}: Utility to convert VDO volume to VDO LV." + echo + echo " ${TOOL} [options] " + echo + echo " Options:" + echo " -f | --force Bypass sanity checks" + echo " -h | --help Show this help message" + echo " -n | --name Specifies VG/LV name for converted VDO volume" + echo " -v | --verbose Be verbose" + echo " -y | --yes Answer \"yes\" at any prompts" + echo " --dry-run Print commands without running them" + + exit +} + +verbose() { + test -z "$VERB" || echo "$TOOL:" "$@" +} + +# Support multi-line error messages +error() { + for i in "$@" ; do + echo "$TOOL: $i" >&2 + done + cleanup 1 +} + +dry() { + if [ "$DRY" -ne 0 ]; then + verbose "Dry execution" "$@" + return 0 + fi + verbose "Executing" "$@" + "$@" +} + +cleanup() { + trap '' 2 + + rm -rf "$TEMPDIR" + # error exit status for break + exit "${1:-1}" +} + +get_enabled_value_() { + case "$1" in + enabled) echo "1" ;; + *) echo "0" ;; + esac +} + +get_kb_size_with_unit_() { + case "$1" in + *[kK]) echo $(( ${1%[kK]} )) ;; + *[mM]) echo $(( ${1%[mM]} * 1024 )) ;; + *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;; + *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;; + *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;; + esac +} + +get_mb_size_with_unit_() { + case "$1" in + *[mM]) echo $(( ${1%[mM]} )) ;; + *[gG]) echo $(( ${1%[gG]} * 1024 )) ;; + *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;; + *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;; + esac +} + +# Figure out largest possible extent size usable for VG +# $1 physical size +# $2 logical size +get_largest_extent_size_() { + local max=4 + local i + local d + + for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do + d=$(( $1 / i )) + test $(( d * i )) -eq "$1" || break + d=$(( $2 / i )) + test $(( d * i )) -eq "$2" || break + max=$i + done + echo "$max" +} + +# detect LV on the given device +# dereference device name if it is symbolic link +detect_lv_() { + local DEVICE=$1 + local MAJOR + local MINOR + local SYSVOLUME + local MAJORMINOR + + DEVICE=${1/#"${DM_DEV_DIR}/"/} + DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE") + test -n "$DEVICE" || error "Cannot get readlink \"$1\"." + RDEVICE=$DEVICE + case "$RDEVICE" in + # hardcoded /dev since udev does not create these entries elsewhere + /dev/dm-[0-9]*) + read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME" + read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"." + MAJOR=${MAJORMINOR%%:*} + MINOR=${MAJORMINOR##*:} + ;; + *) + STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE") + test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." + eval "$STAT" + ;; + esac + + eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" +} + +# parse yaml config files into 'prefix_yaml_part_names=("value")' strings +parse_yaml_() { + local yaml_file=$1 + local prefix=$2 + local s + local w + local fs + + s='[[:space:]]*' + w='[a-zA-Z0-9_.-]*' + fs="$(echo @|tr @ '\034')" + + ( + sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \ + -e 's/\$/\\\$/g' \ + -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \ + -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ + -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" | + + awk -F"$fs" '{ + indent = length($1)/2; + if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";} + vname[indent] = $2; + for (i in vname) {if (i > indent) {delete vname[i]}} + if (length($3) > 0) { + vn=""; for (i=0; i"$TEMPDIR/vdoconf.yml" + + VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") + TRVDONAME=$(echo "$VDONAME" | tr '-' '_') + + # When VDO volume is 'active', check it's not mounted/being used + eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)" + test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" + + #parse_yaml_ "$TEMPDIR/vdoconf.yml" _ + eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")" + + vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize") + vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize") + + verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB." + verbose "With logical volume of size $vdo_logicalSize KiB." + + PARAMS=$(cat < -# -# Script for converting VDO volumes to lvm2 VDO LVs -# -# Needed utilities: -# lvm, dmsetup, -# vdo, vdo2lvm, -# grep, awk, sed, blockdev, readlink, mkdir -# -# Conversion is using 'vdo convert' support from VDO manager to move -# existing VDO header by 2M which makes space to place in PV header -# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG. -# - -set -euE -o pipefail - -TOOL=vdoimport - -_SAVEPATH=$PATH -PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH" - -# user may override lvm location by setting LVM_BINARY -LVM=${LVM_BINARY:-lvm} -VDO=${VDO_BINARY:-vdo} -VDOCONF=${VDOCONF:-} -BLOCKDEV="blockdev" -READLINK="readlink" -READLINK_E="-e" -MKDIR="mkdir" - -TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$" -DM_DEV_DIR="${DM_DEV_DIR:-/dev}" - -DRY=0 -VERB="" -FORCE="" -YES="" - -# default name for converted VG and its VDO LV -NAME="vdovg/vdolvol" - -# help message -tool_usage() { - echo "${TOOL}: Utility to convert VDO volume to VDO LV." - echo - echo " ${TOOL} [options] " - echo - echo " Options:" - echo " -f | --force Bypass sanity checks" - echo " -h | --help Show this help message" - echo " -n | --name Specifies VG/LV name for converted VDO volume" - echo " -v | --verbose Be verbose" - echo " -y | --yes Answer \"yes\" at any prompts" - echo " --dry-run Print commands without running them" - - exit -} - -verbose() { - test -z "$VERB" || echo "$TOOL:" "$@" -} - -# Support multi-line error messages -error() { - for i in "$@" ; do - echo "$TOOL: $i" >&2 - done - cleanup 1 -} - -dry() { - if [ "$DRY" -ne 0 ]; then - verbose "Dry execution" "$@" - return 0 - fi - verbose "Executing" "$@" - "$@" -} - -cleanup() { - trap '' 2 - - rm -rf "$TEMPDIR" - # error exit status for break - exit "${1:-1}" -} - -get_enabled_value_() { - case "$1" in - enabled) echo "1" ;; - *) echo "0" ;; - esac -} - -get_kb_size_with_unit_() { - case "$1" in - *[kK]) echo $(( ${1%[kK]} )) ;; - *[mM]) echo $(( ${1%[mM]} * 1024 )) ;; - *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;; - *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;; - *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;; - esac -} - -get_mb_size_with_unit_() { - case "$1" in - *[mM]) echo $(( ${1%[mM]} )) ;; - *[gG]) echo $(( ${1%[gG]} * 1024 )) ;; - *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;; - *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;; - esac -} - -# Figure out largest possible extent size usable for VG -# $1 physical size -# $2 logical size -get_largest_extent_size_() { - local max=4 - local i - local d - - for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do - d=$(( $1 / i )) - test $(( d * i )) -eq "$1" || break - d=$(( $2 / i )) - test $(( d * i )) -eq "$2" || break - max=$i - done - echo "$max" -} - -# detect LV on the given device -# dereference device name if it is symbolic link -detect_lv_() { - local DEVICE=$1 - local MAJOR - local MINOR - local SYSVOLUME - local MAJORMINOR - - DEVICE=${1/#"${DM_DEV_DIR}/"/} - DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE") - test -n "$DEVICE" || error "Cannot get readlink \"$1\"." - RDEVICE=$DEVICE - case "$RDEVICE" in - # hardcoded /dev since udev does not create these entries elsewhere - /dev/dm-[0-9]*) - read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME" - read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"." - MAJOR=${MAJORMINOR%%:*} - MINOR=${MAJORMINOR##*:} - ;; - *) - STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE") - test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"." - eval "$STAT" - ;; - esac - - eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')" -} - -# parse yaml config files into 'prefix_yaml_part_names=("value")' strings -parse_yaml_() { - local yaml_file=$1 - local prefix=$2 - local s - local w - local fs - - s='[[:space:]]*' - w='[a-zA-Z0-9_.-]*' - fs="$(echo @|tr @ '\034')" - - ( - sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \ - -e 's/\$/\\\$/g' \ - -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \ - -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \ - -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" | - - awk -F"$fs" '{ - indent = length($1)/2; - if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";} - vname[indent] = $2; - for (i in vname) {if (i > indent) {delete vname[i]}} - if (length($3) > 0) { - vn=""; for (i=0; i"$TEMPDIR/vdoconf.yml" - - VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml") - TRVDONAME=$(echo "$VDONAME" | tr '-' '_') - - # When VDO volume is 'active', check it's not mounted/being used - eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)" - test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!" - - #parse_yaml_ "$TEMPDIR/vdoconf.yml" _ - eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")" - - vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize") - vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize") - - verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB." - verbose "With logical volume of size $vdo_logicalSize KiB." - - PARAMS=$(cat <