|
|
a35d7f |
WHATS_NEW | 4 +
|
|
|
a35d7f |
configure | 6 +-
|
|
|
a35d7f |
configure.ac | 8 +-
|
|
|
a35d7f |
include/configure.h.in | 2 +-
|
|
|
a35d7f |
man/Makefile.in | 2 +-
|
|
|
a35d7f |
man/lvm_import_vdo.8_main | 92 ++++++++++++
|
|
|
a35d7f |
man/vdoimport.8_main | 92 ------------
|
|
|
a35d7f |
scripts/Makefile.in | 2 +-
|
|
|
a35d7f |
scripts/lvm_import_vdo.sh | 376 ++++++++++++++++++++++++++++++++++++++++++++++
|
|
|
a35d7f |
scripts/vdoimport.sh | 376 ----------------------------------------------
|
|
|
a35d7f |
test/Makefile.in | 2 +-
|
|
|
a35d7f |
test/shell/vdo-convert.sh | 12 +-
|
|
|
a35d7f |
12 files changed, 489 insertions(+), 485 deletions(-)
|
|
|
a35d7f |
create mode 100644 man/lvm_import_vdo.8_main
|
|
|
a35d7f |
delete mode 100644 man/vdoimport.8_main
|
|
|
a35d7f |
create mode 100755 scripts/lvm_import_vdo.sh
|
|
|
a35d7f |
delete mode 100755 scripts/vdoimport.sh
|
|
|
a35d7f |
|
|
|
a35d7f |
diff --git a/WHATS_NEW b/WHATS_NEW
|
|
|
a35d7f |
index 5556789..3637e31 100644
|
|
|
a35d7f |
--- a/WHATS_NEW
|
|
|
a35d7f |
+++ b/WHATS_NEW
|
|
|
a35d7f |
@@ -1,3 +1,7 @@
|
|
|
a35d7f |
+Version 2.03.14 -
|
|
|
a35d7f |
+==================================
|
|
|
a35d7f |
+ Rename vdoimport to lvm_import_vdo.
|
|
|
a35d7f |
+
|
|
|
a35d7f |
Version 2.03.13 -
|
|
|
a35d7f |
===============================
|
|
|
a35d7f |
Support --poolmetadataspare with vgsplit and vgmerge.
|
|
|
a35d7f |
diff --git a/configure b/configure
|
|
|
a35d7f |
index 661702d..897a810 100755
|
|
|
a35d7f |
--- a/configure
|
|
|
a35d7f |
+++ b/configure
|
|
|
a35d7f |
@@ -12379,8 +12379,8 @@ $as_echo "$FSADM" >&6; }
|
|
|
a35d7f |
|
|
|
a35d7f |
|
|
|
a35d7f |
################################################################################
|
|
|
a35d7f |
-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install vdoimport" >&5
|
|
|
a35d7f |
-$as_echo_n "checking whether to install vdoimport... " >&6; }
|
|
|
a35d7f |
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to install lvm_import_vdo" >&5
|
|
|
a35d7f |
+$as_echo_n "checking whether to install lvm_import_vdo... " >&6; }
|
|
|
a35d7f |
# Check whether --enable-vdoimport was given.
|
|
|
a35d7f |
if test "${enable_vdoimport+set}" = set; then :
|
|
|
a35d7f |
enableval=$enable_vdoimport; VDOIMPORT=$enableval
|
|
|
a35d7f |
@@ -13875,7 +13875,7 @@ cat >>confdefs.h <<_ACEOF
|
|
|
a35d7f |
_ACEOF
|
|
|
a35d7f |
|
|
|
a35d7f |
|
|
|
a35d7f |
-VDOIMPORT_PATH="$SBINDIR/vdoimport"
|
|
|
a35d7f |
+VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo"
|
|
|
a35d7f |
|
|
|
a35d7f |
cat >>confdefs.h <<_ACEOF
|
|
|
a35d7f |
#define VDOIMPORT_PATH "$VDOIMPORT_PATH"
|
|
|
a35d7f |
diff --git a/configure.ac b/configure.ac
|
|
|
a35d7f |
index 5a8b486..f769a63 100644
|
|
|
a35d7f |
--- a/configure.ac
|
|
|
a35d7f |
+++ b/configure.ac
|
|
|
a35d7f |
@@ -1295,8 +1295,8 @@ AC_MSG_RESULT($FSADM)
|
|
|
a35d7f |
|
|
|
a35d7f |
|
|
|
a35d7f |
################################################################################
|
|
|
a35d7f |
-dnl -- Enable vdoimport
|
|
|
a35d7f |
-AC_MSG_CHECKING(whether to install vdoimport)
|
|
|
a35d7f |
+dnl -- Enable lvm_import_vdo
|
|
|
a35d7f |
+AC_MSG_CHECKING(whether to install lvm_import_vdo)
|
|
|
a35d7f |
AC_ARG_ENABLE(vdoimport, AC_HELP_STRING([--disable-vdoimport], [disable vdoimport]),
|
|
|
a35d7f |
VDOIMPORT=$enableval)
|
|
|
a35d7f |
AC_MSG_RESULT($VDOIMPORT)
|
|
|
a35d7f |
@@ -1656,8 +1656,8 @@ USRSBINDIR="$(eval echo $(eval echo $usrsbindir))"
|
|
|
a35d7f |
FSADM_PATH="$SBINDIR/fsadm"
|
|
|
a35d7f |
AC_DEFINE_UNQUOTED(FSADM_PATH, ["$FSADM_PATH"], [Path to fsadm binary.])
|
|
|
a35d7f |
|
|
|
a35d7f |
-VDOIMPORT_PATH="$SBINDIR/vdoimport"
|
|
|
a35d7f |
-AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to vdoimport binary.])
|
|
|
a35d7f |
+VDOIMPORT_PATH="$SBINDIR/lvm_import_vdo"
|
|
|
a35d7f |
+AC_DEFINE_UNQUOTED(VDOIMPORT_PATH, ["$VDOIMPORT_PATH"], [Path to lvm_import_vdo binary.])
|
|
|
a35d7f |
|
|
|
a35d7f |
################################################################################
|
|
|
a35d7f |
dnl -- dmeventd pidfile and executable path
|
|
|
a35d7f |
diff --git a/include/configure.h.in b/include/configure.h.in
|
|
|
a35d7f |
index 6df8d89..028ae48 100644
|
|
|
a35d7f |
--- a/include/configure.h.in
|
|
|
a35d7f |
+++ b/include/configure.h.in
|
|
|
a35d7f |
@@ -684,7 +684,7 @@
|
|
|
a35d7f |
/* Enable a valgrind aware build of pool */
|
|
|
a35d7f |
#undef VALGRIND_POOL
|
|
|
a35d7f |
|
|
|
a35d7f |
-/* Path to vdoimport binary. */
|
|
|
a35d7f |
+/* Path to lvm_import_vdo binary. */
|
|
|
a35d7f |
#undef VDOIMPORT_PATH
|
|
|
a35d7f |
|
|
|
a35d7f |
/* The path to 'vdoformat', if available. */
|
|
|
a35d7f |
diff --git a/man/Makefile.in b/man/Makefile.in
|
|
|
a35d7f |
index d60a92c..45ebf54 100644
|
|
|
a35d7f |
--- a/man/Makefile.in
|
|
|
a35d7f |
+++ b/man/Makefile.in
|
|
|
a35d7f |
@@ -23,7 +23,7 @@ else
|
|
|
a35d7f |
endif
|
|
|
a35d7f |
|
|
|
a35d7f |
FSADMMAN = fsadm.8
|
|
|
a35d7f |
-VDOIMPORTMAN = vdoimport.8
|
|
|
a35d7f |
+VDOIMPORTMAN = lvm_import_vdo.8
|
|
|
a35d7f |
BLKDEACTIVATEMAN = blkdeactivate.8
|
|
|
a35d7f |
DMEVENTDMAN = dmeventd.8
|
|
|
a35d7f |
DMFILEMAPDMAN = dmfilemapd.8
|
|
|
a35d7f |
diff --git a/man/lvm_import_vdo.8_main b/man/lvm_import_vdo.8_main
|
|
|
a35d7f |
new file mode 100644
|
|
|
a35d7f |
index 0000000..ee817a0
|
|
|
a35d7f |
--- /dev/null
|
|
|
a35d7f |
+++ b/man/lvm_import_vdo.8_main
|
|
|
a35d7f |
@@ -0,0 +1,92 @@
|
|
|
a35d7f |
+.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.SH "NAME"
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+lvm_import_vdo \(em utility to import VDO volumes into a new volume group.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.SH SYNOPSIS
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.PD 0
|
|
|
a35d7f |
+.ad l
|
|
|
a35d7f |
+.TP 10
|
|
|
a35d7f |
+.B lvm_import_vdo
|
|
|
a35d7f |
+.RI [ options ]
|
|
|
a35d7f |
+.IR device
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.PD
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.SH DESCRIPTION
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+lvm_import_vdo utility imports VDO volumes created and managed by
|
|
|
a35d7f |
+.BR vdo (8)
|
|
|
a35d7f |
+manager into
|
|
|
a35d7f |
+.BR lvm2 (8)
|
|
|
a35d7f |
+managed VDO LV. This is realized by moving VDO superblock by 2MiB
|
|
|
a35d7f |
+and creating lvm2 metadata at the front of this device. The operation is not reversible,
|
|
|
a35d7f |
+thus after conversion to lvm2 the access to VDO data is only possible with
|
|
|
a35d7f |
+.BR lvm2 (8)
|
|
|
a35d7f |
+commands,
|
|
|
a35d7f |
+.BR vdo (8)
|
|
|
a35d7f |
+manager no longer control such volume.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.SH OPTIONS
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.TP
|
|
|
a35d7f |
+.BR -f | --force
|
|
|
a35d7f |
+Bypass some sanity checks.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.TP
|
|
|
a35d7f |
+.BR -h | --help
|
|
|
a35d7f |
+Display the help text.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.TP
|
|
|
a35d7f |
+.BR -n | --name
|
|
|
a35d7f |
+Specifies the name of converted VDO LV. When the name is not specified,
|
|
|
a35d7f |
+some automatic name is selected. In case the converted VDO volume is
|
|
|
a35d7f |
+already using LV a backend device, the name of this LV is used for VDO LV.
|
|
|
a35d7f |
+In this case also the of volume group must stay same.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.TP
|
|
|
a35d7f |
+.BR -v | --verbose
|
|
|
a35d7f |
+Be more verbose.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.TP
|
|
|
a35d7f |
+.BR -y | --yes
|
|
|
a35d7f |
+Answer "yes" at any prompts.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.TP
|
|
|
a35d7f |
+.BR --dry-run
|
|
|
a35d7f |
+Print commands without running them.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.SH DIAGNOSTICS
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+On successful completion, the status code is 0.
|
|
|
a35d7f |
+A status code of 1 is used for failure.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.SH EXAMPLES
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1.
|
|
|
a35d7f |
+.P
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+.B lvm_import_vdo --name VG1/LV1 /dev/mapper/vdo-volume
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.SH ENVIRONMENT VARIABLES
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.TP
|
|
|
a35d7f |
+.B TMPDIR
|
|
|
a35d7f |
+The temporary directory name for mount points. Defaults to "\fI/tmp\fP".
|
|
|
a35d7f |
+.TP
|
|
|
a35d7f |
+.B DM_DEV_DIR
|
|
|
a35d7f |
+The device directory name.
|
|
|
a35d7f |
+Defaults to "\fI/dev\fP" and must be an absolute path.
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.SH SEE ALSO
|
|
|
a35d7f |
+.
|
|
|
a35d7f |
+.nh
|
|
|
a35d7f |
+.ad l
|
|
|
a35d7f |
+.BR lvm (8),
|
|
|
a35d7f |
+.BR lvm.conf (5),
|
|
|
a35d7f |
+.P
|
|
|
a35d7f |
+.BR vdo (8),
|
|
|
a35d7f |
+.BR vdo2lvm (8),
|
|
|
a35d7f |
diff --git a/man/vdoimport.8_main b/man/vdoimport.8_main
|
|
|
a35d7f |
deleted file mode 100644
|
|
|
a35d7f |
index 1f32909..0000000
|
|
|
a35d7f |
--- a/man/vdoimport.8_main
|
|
|
a35d7f |
+++ /dev/null
|
|
|
a35d7f |
@@ -1,92 +0,0 @@
|
|
|
a35d7f |
-.TH "FSADM" "8" "LVM TOOLS #VERSION#" "Red Hat, Inc" "\""
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.SH "NAME"
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-vdoimport \(em utility to import VDO volumes into a new volume group.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.SH SYNOPSIS
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.PD 0
|
|
|
a35d7f |
-.ad l
|
|
|
a35d7f |
-.TP 10
|
|
|
a35d7f |
-.B vdoimport
|
|
|
a35d7f |
-.RI [ options ]
|
|
|
a35d7f |
-.IR device
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.PD
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.SH DESCRIPTION
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-vdoimport utility imports VDO volumes created and managed by
|
|
|
a35d7f |
-.BR vdo (8)
|
|
|
a35d7f |
-manager into
|
|
|
a35d7f |
-.BR lvm2 (8)
|
|
|
a35d7f |
-managed VDO LV. This is realized by moving VDO superblock by 2MiB
|
|
|
a35d7f |
-and creating lvm2 metadata at the front of this device. The operation is not reversible,
|
|
|
a35d7f |
-thus after conversion to lvm2 the access to VDO data is only possible with
|
|
|
a35d7f |
-.BR lvm2 (8)
|
|
|
a35d7f |
-commands,
|
|
|
a35d7f |
-.BR vdo (8)
|
|
|
a35d7f |
-manager no longer control such volume.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.SH OPTIONS
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.TP
|
|
|
a35d7f |
-.BR -f | --force
|
|
|
a35d7f |
-Bypass some sanity checks.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.TP
|
|
|
a35d7f |
-.BR -h | --help
|
|
|
a35d7f |
-Display the help text.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.TP
|
|
|
a35d7f |
-.BR -n | --name
|
|
|
a35d7f |
-Specifies the name of converted VDO LV. When the name is not specified,
|
|
|
a35d7f |
-some automatic name is selected. In case the converted VDO volume is
|
|
|
a35d7f |
-already using LV a backend device, the name of this LV is used for VDO LV.
|
|
|
a35d7f |
-In this case also the of volume group must stay same.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.TP
|
|
|
a35d7f |
-.BR -v | --verbose
|
|
|
a35d7f |
-Be more verbose.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.TP
|
|
|
a35d7f |
-.BR -y | --yes
|
|
|
a35d7f |
-Answer "yes" at any prompts.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.TP
|
|
|
a35d7f |
-.BR --dry-run
|
|
|
a35d7f |
-Print commands without running them.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.SH DIAGNOSTICS
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-On successful completion, the status code is 0.
|
|
|
a35d7f |
-A status code of 1 is used for failure.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.SH EXAMPLES
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-Convert VDO volume created by vdo manager into logical volume LV1 with within volume group VG1.
|
|
|
a35d7f |
-.P
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-.B vdoimport --name VG1/LV1 /dev/mapper/vdo-volume
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.SH ENVIRONMENT VARIABLES
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.TP
|
|
|
a35d7f |
-.B TMPDIR
|
|
|
a35d7f |
-The temporary directory name for mount points. Defaults to "\fI/tmp\fP".
|
|
|
a35d7f |
-.TP
|
|
|
a35d7f |
-.B DM_DEV_DIR
|
|
|
a35d7f |
-The device directory name.
|
|
|
a35d7f |
-Defaults to "\fI/dev\fP" and must be an absolute path.
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.SH SEE ALSO
|
|
|
a35d7f |
-.
|
|
|
a35d7f |
-.nh
|
|
|
a35d7f |
-.ad l
|
|
|
a35d7f |
-.BR lvm (8),
|
|
|
a35d7f |
-.BR lvm.conf (5),
|
|
|
a35d7f |
-.P
|
|
|
a35d7f |
-.BR vdo (8),
|
|
|
a35d7f |
-.BR vdo2lvm (8),
|
|
|
a35d7f |
diff --git a/scripts/Makefile.in b/scripts/Makefile.in
|
|
|
a35d7f |
index 1fe88ca..f16c37d 100644
|
|
|
a35d7f |
--- a/scripts/Makefile.in
|
|
|
a35d7f |
+++ b/scripts/Makefile.in
|
|
|
a35d7f |
@@ -32,7 +32,7 @@ ifeq ("@FSADM@", "yes")
|
|
|
a35d7f |
endif
|
|
|
a35d7f |
|
|
|
a35d7f |
ifeq ("@VDOIMPORT@", "yes")
|
|
|
a35d7f |
- LVM_SCRIPTS += vdoimport.sh
|
|
|
a35d7f |
+ LVM_SCRIPTS += lvm_import_vdo.sh
|
|
|
a35d7f |
endif
|
|
|
a35d7f |
|
|
|
a35d7f |
ifeq ("@BLKDEACTIVATE@", "yes")
|
|
|
a35d7f |
diff --git a/scripts/lvm_import_vdo.sh b/scripts/lvm_import_vdo.sh
|
|
|
a35d7f |
new file mode 100755
|
|
|
a35d7f |
index 0000000..35140a0
|
|
|
a35d7f |
--- /dev/null
|
|
|
a35d7f |
+++ b/scripts/lvm_import_vdo.sh
|
|
|
a35d7f |
@@ -0,0 +1,376 @@
|
|
|
a35d7f |
+#!/bin/bash
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+# Copyright (C) 2021 Red Hat, Inc. All rights reserved.
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+# This file is part of LVM2.
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+# This copyrighted material is made available to anyone wishing to use,
|
|
|
a35d7f |
+# modify, copy, or redistribute it subject to the terms and conditions
|
|
|
a35d7f |
+# of the GNU General Public License v.2.
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+# You should have received a copy of the GNU General Public License
|
|
|
a35d7f |
+# along with this program; if not, write to the Free Software Foundation,
|
|
|
a35d7f |
+# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+# Author: Zdenek Kabelac <zkabelac at redhat.com>
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+# Script for converting VDO volumes to lvm2 VDO LVs
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+# Needed utilities:
|
|
|
a35d7f |
+# lvm, dmsetup,
|
|
|
a35d7f |
+# vdo, vdo2lvm,
|
|
|
a35d7f |
+# grep, awk, sed, blockdev, readlink, mkdir
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+# Conversion is using 'vdo convert' support from VDO manager to move
|
|
|
a35d7f |
+# existing VDO header by 2M which makes space to place in PV header
|
|
|
a35d7f |
+# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG.
|
|
|
a35d7f |
+#
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+set -euE -o pipefail
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+TOOL=lvm_import_vdo
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+_SAVEPATH=$PATH
|
|
|
a35d7f |
+PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+# user may override lvm location by setting LVM_BINARY
|
|
|
a35d7f |
+LVM=${LVM_BINARY:-lvm}
|
|
|
a35d7f |
+VDO=${VDO_BINARY:-vdo}
|
|
|
a35d7f |
+VDOCONF=${VDOCONF:-}
|
|
|
a35d7f |
+BLOCKDEV="blockdev"
|
|
|
a35d7f |
+READLINK="readlink"
|
|
|
a35d7f |
+READLINK_E="-e"
|
|
|
a35d7f |
+MKDIR="mkdir"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$"
|
|
|
a35d7f |
+DM_DEV_DIR="${DM_DEV_DIR:-/dev}"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+DRY=0
|
|
|
a35d7f |
+VERB=""
|
|
|
a35d7f |
+FORCE=""
|
|
|
a35d7f |
+YES=""
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+# default name for converted VG and its VDO LV
|
|
|
a35d7f |
+NAME="vdovg/vdolvol"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+# help message
|
|
|
a35d7f |
+tool_usage() {
|
|
|
a35d7f |
+ echo "${TOOL}: Utility to convert VDO volume to VDO LV."
|
|
|
a35d7f |
+ echo
|
|
|
a35d7f |
+ echo " ${TOOL} [options] <vdo_device_path>"
|
|
|
a35d7f |
+ echo
|
|
|
a35d7f |
+ echo " Options:"
|
|
|
a35d7f |
+ echo " -f | --force Bypass sanity checks"
|
|
|
a35d7f |
+ echo " -h | --help Show this help message"
|
|
|
a35d7f |
+ echo " -n | --name Specifies VG/LV name for converted VDO volume"
|
|
|
a35d7f |
+ echo " -v | --verbose Be verbose"
|
|
|
a35d7f |
+ echo " -y | --yes Answer \"yes\" at any prompts"
|
|
|
a35d7f |
+ echo " --dry-run Print commands without running them"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ exit
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+verbose() {
|
|
|
a35d7f |
+ test -z "$VERB" || echo "$TOOL:" "$@"
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+# Support multi-line error messages
|
|
|
a35d7f |
+error() {
|
|
|
a35d7f |
+ for i in "$@" ; do
|
|
|
a35d7f |
+ echo "$TOOL: $i" >&2
|
|
|
a35d7f |
+ done
|
|
|
a35d7f |
+ cleanup 1
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+dry() {
|
|
|
a35d7f |
+ if [ "$DRY" -ne 0 ]; then
|
|
|
a35d7f |
+ verbose "Dry execution" "$@"
|
|
|
a35d7f |
+ return 0
|
|
|
a35d7f |
+ fi
|
|
|
a35d7f |
+ verbose "Executing" "$@"
|
|
|
a35d7f |
+ "$@"
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+cleanup() {
|
|
|
a35d7f |
+ trap '' 2
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ rm -rf "$TEMPDIR"
|
|
|
a35d7f |
+ # error exit status for break
|
|
|
a35d7f |
+ exit "${1:-1}"
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+get_enabled_value_() {
|
|
|
a35d7f |
+ case "$1" in
|
|
|
a35d7f |
+ enabled) echo "1" ;;
|
|
|
a35d7f |
+ *) echo "0" ;;
|
|
|
a35d7f |
+ esac
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+get_kb_size_with_unit_() {
|
|
|
a35d7f |
+ case "$1" in
|
|
|
a35d7f |
+ *[kK]) echo $(( ${1%[kK]} )) ;;
|
|
|
a35d7f |
+ *[mM]) echo $(( ${1%[mM]} * 1024 )) ;;
|
|
|
a35d7f |
+ *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;;
|
|
|
a35d7f |
+ *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;;
|
|
|
a35d7f |
+ *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;;
|
|
|
a35d7f |
+ esac
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+get_mb_size_with_unit_() {
|
|
|
a35d7f |
+ case "$1" in
|
|
|
a35d7f |
+ *[mM]) echo $(( ${1%[mM]} )) ;;
|
|
|
a35d7f |
+ *[gG]) echo $(( ${1%[gG]} * 1024 )) ;;
|
|
|
a35d7f |
+ *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;;
|
|
|
a35d7f |
+ *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;;
|
|
|
a35d7f |
+ esac
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+# Figure out largest possible extent size usable for VG
|
|
|
a35d7f |
+# $1 physical size
|
|
|
a35d7f |
+# $2 logical size
|
|
|
a35d7f |
+get_largest_extent_size_() {
|
|
|
a35d7f |
+ local max=4
|
|
|
a35d7f |
+ local i
|
|
|
a35d7f |
+ local d
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do
|
|
|
a35d7f |
+ d=$(( $1 / i ))
|
|
|
a35d7f |
+ test $(( d * i )) -eq "$1" || break
|
|
|
a35d7f |
+ d=$(( $2 / i ))
|
|
|
a35d7f |
+ test $(( d * i )) -eq "$2" || break
|
|
|
a35d7f |
+ max=$i
|
|
|
a35d7f |
+ done
|
|
|
a35d7f |
+ echo "$max"
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+# detect LV on the given device
|
|
|
a35d7f |
+# dereference device name if it is symbolic link
|
|
|
a35d7f |
+detect_lv_() {
|
|
|
a35d7f |
+ local DEVICE=$1
|
|
|
a35d7f |
+ local MAJOR
|
|
|
a35d7f |
+ local MINOR
|
|
|
a35d7f |
+ local SYSVOLUME
|
|
|
a35d7f |
+ local MAJORMINOR
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ DEVICE=${1/#"${DM_DEV_DIR}/"/}
|
|
|
a35d7f |
+ DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE")
|
|
|
a35d7f |
+ test -n "$DEVICE" || error "Cannot get readlink \"$1\"."
|
|
|
a35d7f |
+ RDEVICE=$DEVICE
|
|
|
a35d7f |
+ case "$RDEVICE" in
|
|
|
a35d7f |
+ # hardcoded /dev since udev does not create these entries elsewhere
|
|
|
a35d7f |
+ /dev/dm-[0-9]*)
|
|
|
a35d7f |
+ read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME"
|
|
|
a35d7f |
+ read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"."
|
|
|
a35d7f |
+ MAJOR=${MAJORMINOR%%:*}
|
|
|
a35d7f |
+ MINOR=${MAJORMINOR##*:}
|
|
|
a35d7f |
+ ;;
|
|
|
a35d7f |
+ *)
|
|
|
a35d7f |
+ STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE")
|
|
|
a35d7f |
+ test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"."
|
|
|
a35d7f |
+ eval "$STAT"
|
|
|
a35d7f |
+ ;;
|
|
|
a35d7f |
+ esac
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')"
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+# parse yaml config files into 'prefix_yaml_part_names=("value")' strings
|
|
|
a35d7f |
+parse_yaml_() {
|
|
|
a35d7f |
+ local yaml_file=$1
|
|
|
a35d7f |
+ local prefix=$2
|
|
|
a35d7f |
+ local s
|
|
|
a35d7f |
+ local w
|
|
|
a35d7f |
+ local fs
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ s='[[:space:]]*'
|
|
|
a35d7f |
+ w='[a-zA-Z0-9_.-]*'
|
|
|
a35d7f |
+ fs="$(echo @|tr @ '\034')"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ (
|
|
|
a35d7f |
+ sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \
|
|
|
a35d7f |
+ -e 's/\$/\\\$/g' \
|
|
|
a35d7f |
+ -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \
|
|
|
a35d7f |
+ -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
|
|
|
a35d7f |
+ -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" |
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ awk -F"$fs" '{
|
|
|
a35d7f |
+ indent = length($1)/2;
|
|
|
a35d7f |
+ if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";}
|
|
|
a35d7f |
+ vname[indent] = $2;
|
|
|
a35d7f |
+ for (i in vname) {if (i > indent) {delete vname[i]}}
|
|
|
a35d7f |
+ if (length($3) > 0) {
|
|
|
a35d7f |
+ vn=""; for (i=0; i
|
|
|
a35d7f |
+ printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1], $3);
|
|
|
a35d7f |
+ }
|
|
|
a35d7f |
+ }' |
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ sed -e 's/_=/+=/g' |
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ awk 'BEGIN {
|
|
|
a35d7f |
+ FS="=";
|
|
|
a35d7f |
+ OFS="="
|
|
|
a35d7f |
+ }
|
|
|
a35d7f |
+ /(-|\.).*=/ {
|
|
|
a35d7f |
+ gsub("-|\\.", "_", $1)
|
|
|
a35d7f |
+ }
|
|
|
a35d7f |
+ { print }'
|
|
|
a35d7f |
+ ) < "$yaml_file"
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+# convert existing VDO volume into lvm2 volume
|
|
|
a35d7f |
+convert2lvm_() {
|
|
|
a35d7f |
+ local DEVICE=$1
|
|
|
a35d7f |
+ local VGNAME=${NAME%/*}
|
|
|
a35d7f |
+ local LVNAME=${NAME#*/}
|
|
|
a35d7f |
+ local VDONAME
|
|
|
a35d7f |
+ local TRVDONAME
|
|
|
a35d7f |
+ local EXTENTSZ
|
|
|
a35d7f |
+ local IS_LV=1
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ DM_UUID=""
|
|
|
a35d7f |
+ detect_lv_ "$DEVICE"
|
|
|
a35d7f |
+ case "$DM_UUID" in
|
|
|
a35d7f |
+ LVM-*) eval "$(dmsetup splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")"
|
|
|
a35d7f |
+ if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ] ; then
|
|
|
a35d7f |
+ VGNAME=$DM_VG_NAME
|
|
|
a35d7f |
+ elif test "$VGNAME" != "$DM_VG_NAME" ; then
|
|
|
a35d7f |
+ error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for device \"$DEVICE\"."
|
|
|
a35d7f |
+ fi
|
|
|
a35d7f |
+ ;;
|
|
|
a35d7f |
+ *) IS_LV=0
|
|
|
a35d7f |
+ # Check $VGNANE does not already exists
|
|
|
a35d7f |
+ "$LVM" vgs "$VGNAME" && error "Cannot use already existing volume group name \"$VGNAME\"."
|
|
|
a35d7f |
+ ;;
|
|
|
a35d7f |
+ esac
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ verbose "Checked whether device $1 is already LV ($IS_LV)."
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ "$MKDIR" -p -m 0000 "$TEMPDIR" || error "Failed to create $TEMPDIR."
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ verbose "Getting YAML VDO configuration."
|
|
|
a35d7f |
+ "$VDO" printConfigFile $VDOCONF >"$TEMPDIR/vdoconf.yml"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml")
|
|
|
a35d7f |
+ TRVDONAME=$(echo "$VDONAME" | tr '-' '_')
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ # When VDO volume is 'active', check it's not mounted/being used
|
|
|
a35d7f |
+ eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)"
|
|
|
a35d7f |
+ test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ #parse_yaml_ "$TEMPDIR/vdoconf.yml" _
|
|
|
a35d7f |
+ eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize")
|
|
|
a35d7f |
+ vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize")
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB."
|
|
|
a35d7f |
+ verbose "With logical volume of size $vdo_logicalSize KiB."
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ PARAMS=$(cat <
|
|
|
a35d7f |
+allocation {
|
|
|
a35d7f |
+ vdo_use_compression = $(get_enabled_value_ "$vdo_compression")
|
|
|
a35d7f |
+ vdo_use_deduplication = $(get_enabled_value_ "$vdo_deduplication")
|
|
|
a35d7f |
+ vdo_use_metadata_hints=1
|
|
|
a35d7f |
+ vdo_minimum_io_size = $vdo_logicalBlockSize
|
|
|
a35d7f |
+ vdo_block_map_cache_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize")
|
|
|
a35d7f |
+ vdo_block_map_period = $vdo_blockMapPeriod
|
|
|
a35d7f |
+ vdo_check_point_frequency = $vdo_indexCfreq
|
|
|
a35d7f |
+ vdo_use_sparse_index = $(get_enabled_value_ "$vdo_indexSparse")
|
|
|
a35d7f |
+ vdo_index_memory_size_mb = $(awk "BEGIN {print $vdo_indexMemory * 1024}")
|
|
|
a35d7f |
+ vdo_slab_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize")
|
|
|
a35d7f |
+ vdo_ack_threads = $vdo_ackThreads
|
|
|
a35d7f |
+ vdo_bio_threads = $vdo_bioThreads
|
|
|
a35d7f |
+ vdo_bio_rotation = $vdo_bioRotationInterval
|
|
|
a35d7f |
+ vdo_cpu_threads = $vdo_cpuThreads
|
|
|
a35d7f |
+ vdo_hash_zone_threads = $vdo_hashZoneThreads
|
|
|
a35d7f |
+ vdo_logical_threads = $vdo_logicalThreads
|
|
|
a35d7f |
+ vdo_physical_threads = $vdo_physicalThreads
|
|
|
a35d7f |
+ vdo_write_policy = $vdo_writePolicy
|
|
|
a35d7f |
+ vdo_max_discard = $(( $(get_kb_size_with_unit_ "$vdo_maxDiscardSize") * 1024 ))
|
|
|
a35d7f |
+ vdo_pool_header_size = 0
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+EOF
|
|
|
a35d7f |
+)
|
|
|
a35d7f |
+ verbose "VDO conversion paramaters: $PARAMS"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ verbose "Stopping VDO volume."
|
|
|
a35d7f |
+ dry "$VDO" stop $VDOCONF --name "$VDONAME"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ if [ "$IS_LV" = "0" ]; then
|
|
|
a35d7f |
+ verbose "Moving VDO header by 2MiB."
|
|
|
a35d7f |
+ dry "$VDO" convert $VDOCONF --force --name "$VDONAME"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ dry "$LVM" pvcreate $YES --dataalignment 2M "$DEVICE" || {
|
|
|
a35d7f |
+ error "Creation of PV on \"$DEVICE\" failed, while VDO header has been already moved!"
|
|
|
a35d7f |
+ }
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ # Obtain free space in this new PV
|
|
|
a35d7f |
+ # after 'vdo convert/vdo2lvm' call there is +2M free space at the front of the device
|
|
|
a35d7f |
+ case "$DRY" in
|
|
|
a35d7f |
+ 0) pvfree=$("$LVM" pvs -o devsize --units b --nosuffix --noheadings "$DEVICE") ;;
|
|
|
a35d7f |
+ *) pvfree=$("$BLOCKDEV" --getsize64 "$DEVICE") ;;
|
|
|
a35d7f |
+ esac
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ pvfree=$(( pvfree / 1024 - 2048 )) # to KiB
|
|
|
a35d7f |
+ else
|
|
|
a35d7f |
+ pvfree=$("$LVM" lvs -o size --units b --nosuffix --noheadings "$VGNAME/$LVNAME")
|
|
|
a35d7f |
+ pvfree=$(( pvfree / 1024 )) # to KiB
|
|
|
a35d7f |
+ fi
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ # select largest possible extent size that can exactly express both sizes
|
|
|
a35d7f |
+ EXTENTSZ=$(get_largest_extent_size_ "$pvfree" "$vdo_logicalSize")
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ if [ "$IS_LV" = "0" ]; then
|
|
|
a35d7f |
+ verbose "Creating VG \"${NAME%/*}\" with extent size $EXTENTSZ KiB."
|
|
|
a35d7f |
+ dry "$LVM" vgcreate $YES $VERB -s "${EXTENTSZ}k" "$VGNAME" "$DEVICE" || {
|
|
|
a35d7f |
+ error "Creation of VG \"$VGNAME\" failed, while VDO header has been already moved!"
|
|
|
a35d7f |
+ }
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ verbose "Creating VDO pool data LV from all extents in volume group $VGNAME."
|
|
|
a35d7f |
+ dry "$LVM" lvcreate -Zn -Wn $YES $VERB -l100%VG -n "${LVNAME}_vpool" "$VGNAME"
|
|
|
a35d7f |
+ else
|
|
|
a35d7f |
+ # validate existing VG extent_size can express virtual VDO size
|
|
|
a35d7f |
+ vg_extent_size=$("$LVM" vgs -o vg_extent_size --units b --nosuffix --noheadings "$VGNAME" || true)
|
|
|
a35d7f |
+ vg_extent_size=$(( vg_extent_size / 1024 ))
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ test "$vg_extent_size" -le "$EXTENTSZ" || {
|
|
|
a35d7f |
+ error "Please vgchange extent_size to at most $EXTENTSZ KiB or extend and align virtual size on $vg_extent_size KiB."
|
|
|
a35d7f |
+ }
|
|
|
a35d7f |
+ verbose "Renaming existing LV to be used as _vdata volume for VDO pool LV."
|
|
|
a35d7f |
+ dry "$LVM" lvrename $YES $VERB "$VGNAME/$LVNAME" "$VGNAME/${LVNAME}_vpool" || {
|
|
|
a35d7f |
+ error "Rename of LV \"$VGNAME/$LVNAME\" failed, while VDO header has been already moved!"
|
|
|
a35d7f |
+ }
|
|
|
a35d7f |
+ fi
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ verbose "Converting to VDO pool."
|
|
|
a35d7f |
+ dry "$LVM" lvconvert $YES $VERB $FORCE --config "$PARAMS" -Zn -V "${vdo_logicalSize}k" -n "$LVNAME" --type vdo-pool "$VGNAME/${LVNAME}_vpool"
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+ rm -fr "$TEMPDIR"
|
|
|
a35d7f |
+}
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+#############################
|
|
|
a35d7f |
+# start point of this script
|
|
|
a35d7f |
+# - parsing parameters
|
|
|
a35d7f |
+#############################
|
|
|
a35d7f |
+trap "cleanup 2" 2
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+test "$#" -eq 0 && tool_usage
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+while [ "$#" -ne 0 ]
|
|
|
a35d7f |
+do
|
|
|
a35d7f |
+ case "$1" in
|
|
|
a35d7f |
+ "") ;;
|
|
|
a35d7f |
+ "-f"|"--force" ) FORCE="-f" ;;
|
|
|
a35d7f |
+ "-h"|"--help" ) tool_usage ;;
|
|
|
a35d7f |
+ "-n"|"--name" ) shift; NAME=$1 ;;
|
|
|
a35d7f |
+ "-v"|"--verbose") VERB="-v" ;;
|
|
|
a35d7f |
+ "-y"|"--yes" ) YES="-y" ;;
|
|
|
a35d7f |
+ "--dry-run" ) DRY="1" ;;
|
|
|
a35d7f |
+ "-*") error "Wrong argument \"$1\". (see: $TOOL --help)" ;;
|
|
|
a35d7f |
+ *) DEVICENAME=$1 ;; # device name does not start with '-'
|
|
|
a35d7f |
+ esac
|
|
|
a35d7f |
+ shift
|
|
|
a35d7f |
+done
|
|
|
a35d7f |
+
|
|
|
a35d7f |
+# do conversion
|
|
|
a35d7f |
+convert2lvm_ "$DEVICENAME"
|
|
|
a35d7f |
diff --git a/scripts/vdoimport.sh b/scripts/vdoimport.sh
|
|
|
a35d7f |
deleted file mode 100755
|
|
|
a35d7f |
index ef96591..0000000
|
|
|
a35d7f |
--- a/scripts/vdoimport.sh
|
|
|
a35d7f |
+++ /dev/null
|
|
|
a35d7f |
@@ -1,376 +0,0 @@
|
|
|
a35d7f |
-#!/bin/bash
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-# Copyright (C) 2021 Red Hat, Inc. All rights reserved.
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-# This file is part of LVM2.
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-# This copyrighted material is made available to anyone wishing to use,
|
|
|
a35d7f |
-# modify, copy, or redistribute it subject to the terms and conditions
|
|
|
a35d7f |
-# of the GNU General Public License v.2.
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-# You should have received a copy of the GNU General Public License
|
|
|
a35d7f |
-# along with this program; if not, write to the Free Software Foundation,
|
|
|
a35d7f |
-# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-# Author: Zdenek Kabelac <zkabelac at redhat.com>
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-# Script for converting VDO volumes to lvm2 VDO LVs
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-# Needed utilities:
|
|
|
a35d7f |
-# lvm, dmsetup,
|
|
|
a35d7f |
-# vdo, vdo2lvm,
|
|
|
a35d7f |
-# grep, awk, sed, blockdev, readlink, mkdir
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-# Conversion is using 'vdo convert' support from VDO manager to move
|
|
|
a35d7f |
-# existing VDO header by 2M which makes space to place in PV header
|
|
|
a35d7f |
-# and VG metadata area, and then create VDOPOOL LV and VDO LV in such VG.
|
|
|
a35d7f |
-#
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-set -euE -o pipefail
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-TOOL=vdoimport
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-_SAVEPATH=$PATH
|
|
|
a35d7f |
-PATH="/sbin:/usr/sbin:/bin:/usr/sbin:$PATH"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-# user may override lvm location by setting LVM_BINARY
|
|
|
a35d7f |
-LVM=${LVM_BINARY:-lvm}
|
|
|
a35d7f |
-VDO=${VDO_BINARY:-vdo}
|
|
|
a35d7f |
-VDOCONF=${VDOCONF:-}
|
|
|
a35d7f |
-BLOCKDEV="blockdev"
|
|
|
a35d7f |
-READLINK="readlink"
|
|
|
a35d7f |
-READLINK_E="-e"
|
|
|
a35d7f |
-MKDIR="mkdir"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-TEMPDIR="${TMPDIR:-/tmp}/${TOOL}_${RANDOM}$$"
|
|
|
a35d7f |
-DM_DEV_DIR="${DM_DEV_DIR:-/dev}"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-DRY=0
|
|
|
a35d7f |
-VERB=""
|
|
|
a35d7f |
-FORCE=""
|
|
|
a35d7f |
-YES=""
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-# default name for converted VG and its VDO LV
|
|
|
a35d7f |
-NAME="vdovg/vdolvol"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-# help message
|
|
|
a35d7f |
-tool_usage() {
|
|
|
a35d7f |
- echo "${TOOL}: Utility to convert VDO volume to VDO LV."
|
|
|
a35d7f |
- echo
|
|
|
a35d7f |
- echo " ${TOOL} [options] <vdo_device_path>"
|
|
|
a35d7f |
- echo
|
|
|
a35d7f |
- echo " Options:"
|
|
|
a35d7f |
- echo " -f | --force Bypass sanity checks"
|
|
|
a35d7f |
- echo " -h | --help Show this help message"
|
|
|
a35d7f |
- echo " -n | --name Specifies VG/LV name for converted VDO volume"
|
|
|
a35d7f |
- echo " -v | --verbose Be verbose"
|
|
|
a35d7f |
- echo " -y | --yes Answer \"yes\" at any prompts"
|
|
|
a35d7f |
- echo " --dry-run Print commands without running them"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- exit
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-verbose() {
|
|
|
a35d7f |
- test -z "$VERB" || echo "$TOOL:" "$@"
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-# Support multi-line error messages
|
|
|
a35d7f |
-error() {
|
|
|
a35d7f |
- for i in "$@" ; do
|
|
|
a35d7f |
- echo "$TOOL: $i" >&2
|
|
|
a35d7f |
- done
|
|
|
a35d7f |
- cleanup 1
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-dry() {
|
|
|
a35d7f |
- if [ "$DRY" -ne 0 ]; then
|
|
|
a35d7f |
- verbose "Dry execution" "$@"
|
|
|
a35d7f |
- return 0
|
|
|
a35d7f |
- fi
|
|
|
a35d7f |
- verbose "Executing" "$@"
|
|
|
a35d7f |
- "$@"
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-cleanup() {
|
|
|
a35d7f |
- trap '' 2
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- rm -rf "$TEMPDIR"
|
|
|
a35d7f |
- # error exit status for break
|
|
|
a35d7f |
- exit "${1:-1}"
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-get_enabled_value_() {
|
|
|
a35d7f |
- case "$1" in
|
|
|
a35d7f |
- enabled) echo "1" ;;
|
|
|
a35d7f |
- *) echo "0" ;;
|
|
|
a35d7f |
- esac
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-get_kb_size_with_unit_() {
|
|
|
a35d7f |
- case "$1" in
|
|
|
a35d7f |
- *[kK]) echo $(( ${1%[kK]} )) ;;
|
|
|
a35d7f |
- *[mM]) echo $(( ${1%[mM]} * 1024 )) ;;
|
|
|
a35d7f |
- *[gG]) echo $(( ${1%[gG]} * 1024 * 1024 )) ;;
|
|
|
a35d7f |
- *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 * 1024 )) ;;
|
|
|
a35d7f |
- *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 * 1024 )) ;;
|
|
|
a35d7f |
- esac
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-get_mb_size_with_unit_() {
|
|
|
a35d7f |
- case "$1" in
|
|
|
a35d7f |
- *[mM]) echo $(( ${1%[mM]} )) ;;
|
|
|
a35d7f |
- *[gG]) echo $(( ${1%[gG]} * 1024 )) ;;
|
|
|
a35d7f |
- *[tT]) echo $(( ${1%[tT]} * 1024 * 1024 )) ;;
|
|
|
a35d7f |
- *[pP]) echo $(( ${1%[pP]} * 1024 * 1024 * 1024 )) ;;
|
|
|
a35d7f |
- esac
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-# Figure out largest possible extent size usable for VG
|
|
|
a35d7f |
-# $1 physical size
|
|
|
a35d7f |
-# $2 logical size
|
|
|
a35d7f |
-get_largest_extent_size_() {
|
|
|
a35d7f |
- local max=4
|
|
|
a35d7f |
- local i
|
|
|
a35d7f |
- local d
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- for i in 8 16 32 64 128 256 512 1024 2048 4096 ; do
|
|
|
a35d7f |
- d=$(( $1 / i ))
|
|
|
a35d7f |
- test $(( d * i )) -eq "$1" || break
|
|
|
a35d7f |
- d=$(( $2 / i ))
|
|
|
a35d7f |
- test $(( d * i )) -eq "$2" || break
|
|
|
a35d7f |
- max=$i
|
|
|
a35d7f |
- done
|
|
|
a35d7f |
- echo "$max"
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-# detect LV on the given device
|
|
|
a35d7f |
-# dereference device name if it is symbolic link
|
|
|
a35d7f |
-detect_lv_() {
|
|
|
a35d7f |
- local DEVICE=$1
|
|
|
a35d7f |
- local MAJOR
|
|
|
a35d7f |
- local MINOR
|
|
|
a35d7f |
- local SYSVOLUME
|
|
|
a35d7f |
- local MAJORMINOR
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- DEVICE=${1/#"${DM_DEV_DIR}/"/}
|
|
|
a35d7f |
- DEVICE=$("$READLINK" $READLINK_E "$DM_DEV_DIR/$DEVICE")
|
|
|
a35d7f |
- test -n "$DEVICE" || error "Cannot get readlink \"$1\"."
|
|
|
a35d7f |
- RDEVICE=$DEVICE
|
|
|
a35d7f |
- case "$RDEVICE" in
|
|
|
a35d7f |
- # hardcoded /dev since udev does not create these entries elsewhere
|
|
|
a35d7f |
- /dev/dm-[0-9]*)
|
|
|
a35d7f |
- read -r <"/sys/block/${RDEVICE#/dev/}/dm/name" SYSVOLUME 2>&1 && DEVICE="$DM_DEV_DIR/mapper/$SYSVOLUME"
|
|
|
a35d7f |
- read -r <"/sys/block/${RDEVICE#/dev/}/dev" MAJORMINOR 2>&1 || error "Cannot get major:minor for \"$DEVICE\"."
|
|
|
a35d7f |
- MAJOR=${MAJORMINOR%%:*}
|
|
|
a35d7f |
- MINOR=${MAJORMINOR##*:}
|
|
|
a35d7f |
- ;;
|
|
|
a35d7f |
- *)
|
|
|
a35d7f |
- STAT=$(stat --format "MAJOR=\$((0x%t)) MINOR=\$((0x%T))" "$RDEVICE")
|
|
|
a35d7f |
- test -n "$STAT" || error "Cannot get major:minor for \"$DEVICE\"."
|
|
|
a35d7f |
- eval "$STAT"
|
|
|
a35d7f |
- ;;
|
|
|
a35d7f |
- esac
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- eval "$(dmsetup info -c -j "$MAJOR" -m "$MINOR" -o uuid,name --noheadings --nameprefixes --separator ' ')"
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-# parse yaml config files into 'prefix_yaml_part_names=("value")' strings
|
|
|
a35d7f |
-parse_yaml_() {
|
|
|
a35d7f |
- local yaml_file=$1
|
|
|
a35d7f |
- local prefix=$2
|
|
|
a35d7f |
- local s
|
|
|
a35d7f |
- local w
|
|
|
a35d7f |
- local fs
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- s='[[:space:]]*'
|
|
|
a35d7f |
- w='[a-zA-Z0-9_.-]*'
|
|
|
a35d7f |
- fs="$(echo @|tr @ '\034')"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- (
|
|
|
a35d7f |
- sed -ne '/^--/s|--||g; s|\"|\\\"|g; s/[[:space:]]*$//g;' \
|
|
|
a35d7f |
- -e 's/\$/\\\$/g' \
|
|
|
a35d7f |
- -e "/#.*[\"\']/!s| #.*||g; /^#/s|#.*||g;" \
|
|
|
a35d7f |
- -e "s|^\($s\)\($w\)$s:$s\"\(.*\)\"$s\$|\1$fs\2$fs\3|p" \
|
|
|
a35d7f |
- -e "s|^\($s\)\($w\)${s}[:-]$s\(.*\)$s\$|\1$fs\2$fs\3|p" |
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- awk -F"$fs" '{
|
|
|
a35d7f |
- indent = length($1)/2;
|
|
|
a35d7f |
- if (length($2) == 0) { conj[indent]="+";} else {conj[indent]="";}
|
|
|
a35d7f |
- vname[indent] = $2;
|
|
|
a35d7f |
- for (i in vname) {if (i > indent) {delete vname[i]}}
|
|
|
a35d7f |
- if (length($3) > 0) {
|
|
|
a35d7f |
- vn=""; for (i=0; i
|
|
|
a35d7f |
- printf("%s%s%s%s=(\"%s\")\n", "'"$prefix"'",vn, $2, conj[indent-1], $3);
|
|
|
a35d7f |
- }
|
|
|
a35d7f |
- }' |
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- sed -e 's/_=/+=/g' |
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- awk 'BEGIN {
|
|
|
a35d7f |
- FS="=";
|
|
|
a35d7f |
- OFS="="
|
|
|
a35d7f |
- }
|
|
|
a35d7f |
- /(-|\.).*=/ {
|
|
|
a35d7f |
- gsub("-|\\.", "_", $1)
|
|
|
a35d7f |
- }
|
|
|
a35d7f |
- { print }'
|
|
|
a35d7f |
- ) < "$yaml_file"
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-# convert existing VDO volume into lvm2 volume
|
|
|
a35d7f |
-convert2lvm_() {
|
|
|
a35d7f |
- local DEVICE=$1
|
|
|
a35d7f |
- local VGNAME=${NAME%/*}
|
|
|
a35d7f |
- local LVNAME=${NAME#*/}
|
|
|
a35d7f |
- local VDONAME
|
|
|
a35d7f |
- local TRVDONAME
|
|
|
a35d7f |
- local EXTENTSZ
|
|
|
a35d7f |
- local IS_LV=1
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- DM_UUID=""
|
|
|
a35d7f |
- detect_lv_ "$DEVICE"
|
|
|
a35d7f |
- case "$DM_UUID" in
|
|
|
a35d7f |
- LVM-*) eval "$(dmsetup splitname --nameprefixes --noheadings --separator ' ' "$DM_NAME")"
|
|
|
a35d7f |
- if [ -z "$VGNAME" ] || [ "$VGNAME" = "$LVNAME" ] ; then
|
|
|
a35d7f |
- VGNAME=$DM_VG_NAME
|
|
|
a35d7f |
- elif test "$VGNAME" != "$DM_VG_NAME" ; then
|
|
|
a35d7f |
- error "Volume group name \"$VGNAME\" does not match name \"$DM_VG_NAME\" for device \"$DEVICE\"."
|
|
|
a35d7f |
- fi
|
|
|
a35d7f |
- ;;
|
|
|
a35d7f |
- *) IS_LV=0
|
|
|
a35d7f |
- # Check $VGNANE does not already exists
|
|
|
a35d7f |
- "$LVM" vgs "$VGNAME" && error "Cannot use already existing volume group name \"$VGNAME\"."
|
|
|
a35d7f |
- ;;
|
|
|
a35d7f |
- esac
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- verbose "Checked whether device $1 is already LV ($IS_LV)."
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- "$MKDIR" -p -m 0000 "$TEMPDIR" || error "Failed to create $TEMPDIR."
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- verbose "Getting YAML VDO configuration."
|
|
|
a35d7f |
- "$VDO" printConfigFile $VDOCONF >"$TEMPDIR/vdoconf.yml"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- VDONAME=$(awk -v DNAME="$DEVICE" '/.*VDOService$/ {VNAME=substr($1, 0, length($1) - 1)} /[[:space:]]*device:/ { if ($2 ~ DNAME) {print VNAME}}' "$TEMPDIR/vdoconf.yml")
|
|
|
a35d7f |
- TRVDONAME=$(echo "$VDONAME" | tr '-' '_')
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- # When VDO volume is 'active', check it's not mounted/being used
|
|
|
a35d7f |
- eval "$(dmsetup info -c -o open "$VDONAME" --noheadings --nameprefixes || true)"
|
|
|
a35d7f |
- test "${DM_OPEN:-0}" -eq 0 || error "Cannot converted VDO volume \"$VDONAME\" which is in use!"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- #parse_yaml_ "$TEMPDIR/vdoconf.yml" _
|
|
|
a35d7f |
- eval "$(parse_yaml_ "$TEMPDIR/vdoconf.yml" _ | grep "$TRVDONAME" | sed -e "s/_config_vdos_$TRVDONAME/vdo/g")"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- vdo_logicalSize=$(get_kb_size_with_unit_ "$vdo_logicalSize")
|
|
|
a35d7f |
- vdo_physicalSize=$(get_kb_size_with_unit_ "$vdo_physicalSize")
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- verbose "Going to convert physical sized VDO device $vdo_physicalSize KiB."
|
|
|
a35d7f |
- verbose "With logical volume of size $vdo_logicalSize KiB."
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- PARAMS=$(cat <
|
|
|
a35d7f |
-allocation {
|
|
|
a35d7f |
- vdo_use_compression = $(get_enabled_value_ "$vdo_compression")
|
|
|
a35d7f |
- vdo_use_deduplication = $(get_enabled_value_ "$vdo_deduplication")
|
|
|
a35d7f |
- vdo_use_metadata_hints=1
|
|
|
a35d7f |
- vdo_minimum_io_size = $vdo_logicalBlockSize
|
|
|
a35d7f |
- vdo_block_map_cache_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize")
|
|
|
a35d7f |
- vdo_block_map_period = $vdo_blockMapPeriod
|
|
|
a35d7f |
- vdo_check_point_frequency = $vdo_indexCfreq
|
|
|
a35d7f |
- vdo_use_sparse_index = $(get_enabled_value_ "$vdo_indexSparse")
|
|
|
a35d7f |
- vdo_index_memory_size_mb = $(awk "BEGIN {print $vdo_indexMemory * 1024}")
|
|
|
a35d7f |
- vdo_slab_size_mb = $(get_mb_size_with_unit_ "$vdo_blockMapCacheSize")
|
|
|
a35d7f |
- vdo_ack_threads = $vdo_ackThreads
|
|
|
a35d7f |
- vdo_bio_threads = $vdo_bioThreads
|
|
|
a35d7f |
- vdo_bio_rotation = $vdo_bioRotationInterval
|
|
|
a35d7f |
- vdo_cpu_threads = $vdo_cpuThreads
|
|
|
a35d7f |
- vdo_hash_zone_threads = $vdo_hashZoneThreads
|
|
|
a35d7f |
- vdo_logical_threads = $vdo_logicalThreads
|
|
|
a35d7f |
- vdo_physical_threads = $vdo_physicalThreads
|
|
|
a35d7f |
- vdo_write_policy = $vdo_writePolicy
|
|
|
a35d7f |
- vdo_max_discard = $(( $(get_kb_size_with_unit_ "$vdo_maxDiscardSize") * 1024 ))
|
|
|
a35d7f |
- vdo_pool_header_size = 0
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-EOF
|
|
|
a35d7f |
-)
|
|
|
a35d7f |
- verbose "VDO conversion paramaters: $PARAMS"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- verbose "Stopping VDO volume."
|
|
|
a35d7f |
- dry "$VDO" stop $VDOCONF --name "$VDONAME"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- if [ "$IS_LV" = "0" ]; then
|
|
|
a35d7f |
- verbose "Moving VDO header by 2MiB."
|
|
|
a35d7f |
- dry "$VDO" convert $VDOCONF --force --name "$VDONAME"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- dry "$LVM" pvcreate $YES --dataalignment 2M "$DEVICE" || {
|
|
|
a35d7f |
- error "Creation of PV on \"$DEVICE\" failed, while VDO header has been already moved!"
|
|
|
a35d7f |
- }
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- # Obtain free space in this new PV
|
|
|
a35d7f |
- # after 'vdo convert/vdo2lvm' call there is +2M free space at the front of the device
|
|
|
a35d7f |
- case "$DRY" in
|
|
|
a35d7f |
- 0) pvfree=$("$LVM" pvs -o devsize --units b --nosuffix --noheadings "$DEVICE") ;;
|
|
|
a35d7f |
- *) pvfree=$("$BLOCKDEV" --getsize64 "$DEVICE") ;;
|
|
|
a35d7f |
- esac
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- pvfree=$(( pvfree / 1024 - 2048 )) # to KiB
|
|
|
a35d7f |
- else
|
|
|
a35d7f |
- pvfree=$("$LVM" lvs -o size --units b --nosuffix --noheadings "$VGNAME/$LVNAME")
|
|
|
a35d7f |
- pvfree=$(( pvfree / 1024 )) # to KiB
|
|
|
a35d7f |
- fi
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- # select largest possible extent size that can exactly express both sizes
|
|
|
a35d7f |
- EXTENTSZ=$(get_largest_extent_size_ "$pvfree" "$vdo_logicalSize")
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- if [ "$IS_LV" = "0" ]; then
|
|
|
a35d7f |
- verbose "Creating VG \"${NAME%/*}\" with extent size $EXTENTSZ KiB."
|
|
|
a35d7f |
- dry "$LVM" vgcreate $YES $VERB -s "${EXTENTSZ}k" "$VGNAME" "$DEVICE" || {
|
|
|
a35d7f |
- error "Creation of VG \"$VGNAME\" failed, while VDO header has been already moved!"
|
|
|
a35d7f |
- }
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- verbose "Creating VDO pool data LV from all extents in volume group $VGNAME."
|
|
|
a35d7f |
- dry "$LVM" lvcreate -Zn -Wn $YES $VERB -l100%VG -n "${LVNAME}_vpool" "$VGNAME"
|
|
|
a35d7f |
- else
|
|
|
a35d7f |
- # validate existing VG extent_size can express virtual VDO size
|
|
|
a35d7f |
- vg_extent_size=$("$LVM" vgs -o vg_extent_size --units b --nosuffix --noheadings "$VGNAME" || true)
|
|
|
a35d7f |
- vg_extent_size=$(( vg_extent_size / 1024 ))
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- test "$vg_extent_size" -le "$EXTENTSZ" || {
|
|
|
a35d7f |
- error "Please vgchange extent_size to at most $EXTENTSZ KiB or extend and align virtual size on $vg_extent_size KiB."
|
|
|
a35d7f |
- }
|
|
|
a35d7f |
- verbose "Renaming existing LV to be used as _vdata volume for VDO pool LV."
|
|
|
a35d7f |
- dry "$LVM" lvrename $YES $VERB "$VGNAME/$LVNAME" "$VGNAME/${LVNAME}_vpool" || {
|
|
|
a35d7f |
- error "Rename of LV \"$VGNAME/$LVNAME\" failed, while VDO header has been already moved!"
|
|
|
a35d7f |
- }
|
|
|
a35d7f |
- fi
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- verbose "Converting to VDO pool."
|
|
|
a35d7f |
- dry "$LVM" lvconvert $YES $VERB $FORCE --config "$PARAMS" -Zn -V "${vdo_logicalSize}k" -n "$LVNAME" --type vdo-pool "$VGNAME/${LVNAME}_vpool"
|
|
|
a35d7f |
-
|
|
|
a35d7f |
- rm -fr "$TEMPDIR"
|
|
|
a35d7f |
-}
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-#############################
|
|
|
a35d7f |
-# start point of this script
|
|
|
a35d7f |
-# - parsing parameters
|
|
|
a35d7f |
-#############################
|
|
|
a35d7f |
-trap "cleanup 2" 2
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-test "$#" -eq 0 && tool_usage
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-while [ "$#" -ne 0 ]
|
|
|
a35d7f |
-do
|
|
|
a35d7f |
- case "$1" in
|
|
|
a35d7f |
- "") ;;
|
|
|
a35d7f |
- "-f"|"--force" ) FORCE="-f" ;;
|
|
|
a35d7f |
- "-h"|"--help" ) tool_usage ;;
|
|
|
a35d7f |
- "-n"|"--name" ) shift; NAME=$1 ;;
|
|
|
a35d7f |
- "-v"|"--verbose") VERB="-v" ;;
|
|
|
a35d7f |
- "-y"|"--yes" ) YES="-y" ;;
|
|
|
a35d7f |
- "--dry-run" ) DRY="1" ;;
|
|
|
a35d7f |
- "-*") error "Wrong argument \"$1\". (see: $TOOL --help)" ;;
|
|
|
a35d7f |
- *) DEVICENAME=$1 ;; # device name does not start with '-'
|
|
|
a35d7f |
- esac
|
|
|
a35d7f |
- shift
|
|
|
a35d7f |
-done
|
|
|
a35d7f |
-
|
|
|
a35d7f |
-# do conversion
|
|
|
a35d7f |
-convert2lvm_ "$DEVICENAME"
|
|
|
a35d7f |
diff --git a/test/Makefile.in b/test/Makefile.in
|
|
|
a35d7f |
index 6be03aa..0f2cc25 100644
|
|
|
a35d7f |
--- a/test/Makefile.in
|
|
|
a35d7f |
+++ b/test/Makefile.in
|
|
|
a35d7f |
@@ -353,7 +353,7 @@ LIB = $(addprefix lib/, $(LIB_SECURETEST) $(LIB_DMSECURETEST) $(LIB_SHARED) $(LI
|
|
|
a35d7f |
$(Q) $(LN_S) -f $(abs_top_srcdir)/conf/lvmdbusd.profile lib/
|
|
|
a35d7f |
$(Q) $(LN_S) -f $(abs_top_srcdir)/conf/thin-performance.profile lib/
|
|
|
a35d7f |
$(Q) $(LN_S) -f $(abs_top_srcdir)/scripts/fsadm.sh lib/fsadm
|
|
|
a35d7f |
- $(Q) $(LN_S) -f $(abs_top_srcdir)/scripts/vdoimport.sh lib/vdoimport
|
|
|
a35d7f |
+ $(Q) $(LN_S) -f $(abs_top_srcdir)/scripts/lvm_import_vdo.sh lib/lvm_import_vdo
|
|
|
a35d7f |
@test "$(srcdir)" = . || \
|
|
|
a35d7f |
for i in $(LIB_LVMLOCKD_CONF) $(LIB_MKE2FS_CONF); do \
|
|
|
a35d7f |
test -n "$(Q)" || echo "$(LN_S) -f $(abs_top_srcdir)/test/lib/$$i lib/"; \
|
|
|
a35d7f |
diff --git a/test/shell/vdo-convert.sh b/test/shell/vdo-convert.sh
|
|
|
a35d7f |
index 538147b..2d16c97 100644
|
|
|
a35d7f |
--- a/test/shell/vdo-convert.sh
|
|
|
a35d7f |
+++ b/test/shell/vdo-convert.sh
|
|
|
a35d7f |
@@ -54,12 +54,12 @@ vdo create $VDOCONF --name "$VDONAME" --device="$DM_DEV_DIR/$vg/$lv1" --vdoLogic
|
|
|
a35d7f |
mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME"
|
|
|
a35d7f |
|
|
|
a35d7f |
# Different VG name fails
|
|
|
a35d7f |
-not vdoimport -y -v --name $vg1/$lv1 "$DM_DEV_DIR/$vg/$lv1"
|
|
|
a35d7f |
+not lvm_import_vdo -y -v --name $vg1/$lv1 "$DM_DEV_DIR/$vg/$lv1"
|
|
|
a35d7f |
|
|
|
a35d7f |
# Try just dry run and observe logging
|
|
|
a35d7f |
-vdoimport --dry-run -y -v --name $lv1 "$DM_DEV_DIR/$vg/$lv1"
|
|
|
a35d7f |
+lvm_import_vdo --dry-run -y -v --name $lv1 "$DM_DEV_DIR/$vg/$lv1"
|
|
|
a35d7f |
|
|
|
a35d7f |
-vdoimport -y --name $lv1 "$DM_DEV_DIR/$vg/$lv1"
|
|
|
a35d7f |
+lvm_import_vdo -y --name $lv1 "$DM_DEV_DIR/$vg/$lv1"
|
|
|
a35d7f |
|
|
|
a35d7f |
# ATM needed - since we do not call 'vdo convert' in this case
|
|
|
a35d7f |
vdo remove $VDOCONF --force --name "$VDONAME" || true
|
|
|
a35d7f |
@@ -79,13 +79,13 @@ vdo create $VDOCONF --name "$VDONAME" --device="$dev1" --vdoLogicalSize=31G
|
|
|
a35d7f |
mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME"
|
|
|
a35d7f |
|
|
|
a35d7f |
# Fail with an already existing volume group $vg2
|
|
|
a35d7f |
-not vdoimport --dry-run -y -v --name $vg2/$lv1 "$dev1" |& tee err
|
|
|
a35d7f |
+not lvm_import_vdo --dry-run -y -v --name $vg2/$lv1 "$dev1" |& tee err
|
|
|
a35d7f |
grep "already existing volume group" err
|
|
|
a35d7f |
|
|
|
a35d7f |
# User can also convert already stopped VDO volume
|
|
|
a35d7f |
vdo stop $VDOCONF --name "$VDONAME"
|
|
|
a35d7f |
|
|
|
a35d7f |
-vdoimport -y -v --name $vg/$lv1 "$dev1"
|
|
|
a35d7f |
+lvm_import_vdo -y -v --name $vg/$lv1 "$dev1"
|
|
|
a35d7f |
|
|
|
a35d7f |
fsck -n "$DM_DEV_DIR/$vg/$lv1"
|
|
|
a35d7f |
|
|
|
a35d7f |
@@ -102,7 +102,7 @@ vdo create $VDOCONF --name "$VDONAME" --device="$dev1" --vdoLogicalSize=23G
|
|
|
a35d7f |
|
|
|
a35d7f |
mkfs -E nodiscard "$DM_DEV_DIR/mapper/$VDONAME"
|
|
|
a35d7f |
|
|
|
a35d7f |
-vdoimport -y -v --name $vg1/$lv2 "$dev1"
|
|
|
a35d7f |
+lvm_import_vdo -y -v --name $vg1/$lv2 "$dev1"
|
|
|
a35d7f |
|
|
|
a35d7f |
fsck -n "$DM_DEV_DIR/$vg1/$lv2"
|
|
|
a35d7f |
|