script for the PV metadatasize fix
authorGreg Price <price@mit.edu>
Tue, 10 Mar 2009 06:27:59 +0000 (02:27 -0400)
committerGreg Price <price@mit.edu>
Tue, 10 Mar 2009 06:27:59 +0000 (02:27 -0400)
svn path=/trunk/scripts/pv-fixup/; revision=2239

pv-fixup [new file with mode: 0644]

diff --git a/pv-fixup b/pv-fixup
new file mode 100644 (file)
index 0000000..206523f
--- /dev/null
+++ b/pv-fixup
@@ -0,0 +1,92 @@
+#!/bin/sh
+exit 1  #Not actually a script.
+
+VG=xenvg
+DISK=/dev/sdb
+HALFSIZETiB=2.04
+TMPDM=tmpfoo
+TMPDEV=/dev/mapper/$TMPDM
+TMPDM2=tmpbar
+TMPDEV2=/dev/mapper/$TMPDM2
+METADATASIZE=3.5m
+
+#  - pvresize the old PV to half the space
+pvresize --setphysicalvolumesize=${HALFSIZETiB}t $DISK
+
+#  - dmsetup create a device in the latter half
+dmstart=$(python -c "print int(($HALFSIZETiB + 0.01) * 1024 * 1024 * 1024 * 2)")
+dmlen=$(python -c "print int(($HALFSIZETiB - 0.02) * 1024 * 1024 * 1024 * 2)")
+#foreach host:
+dmsetup create $TMPDM --table "0 $dmlen linear $DISK $dmstart"
+#done
+
+#  - pvcreate a temporary PV on the new device
+pvcreate $TMPDEV
+
+#  - vgextend with the temporary PV
+vgextend $VG $TMPDEV
+
+#  - pvmove all the LVs to the temporary PV
+#    (something like
+#      for lv in $(LVs for running VMs on this host); do
+#        #some lvchange -a commands
+#        pvmove -n $lv <oldpv> <newpv>
+#        #possibly more lvchange -a to restore old state
+#      done)
+
+movelv () {
+  echo pvmoving $1...
+  lvchange -an $1
+  pvmove -i 10 -n $1 $2
+}
+
+#touch /etc/invirt/nocreate
+#FOREACH host:
+#machines=$(invirt-listvms | perl -lne 'print if s/^([^ ]*):.*/$1/')
+#lvs=$(echo $machines | perl -lpe "s|^|$VG/d_|; s|$|_hda|")
+for lv in $(lvs -o lv_name --noheadings $VG); do
+  movelv $VG/$lv $DISK
+done
+#done
+
+# hopefully empty:
+lvs $VG -o lv_name,devices | grep $DISK
+# if not, do some more movelv
+
+# This is possible if some LVs were used on more than one host during
+# migration.
+
+
+#  - pvremove the old PV
+vgreduce $VG $DISK
+pvremove $DISK
+
+#  - pvcreate a new PV in the old space,
+#     with --setphysicalvolumesize <half size>
+#     and with --metadatasize <huge>    (the point of this exercise)
+shortsize=$(python -c "print $HALFSIZETiB - 0.01")t
+dmsetup create $TMPDM2 --table "0 $((2 * 1024 * 4)) linear $DISK 0"
+pvcreate $TMPDEV2 --setphysicalvolumesize $shortsize --metadatasize $METADATASIZE
+dmsetup remove $TMPDM2
+pvscan
+vgextend $VG $DISK
+
+#  - pvmove all the LVs back
+
+#FOREACH host:
+for lv in $(lvs -o lv_name --noheadings $VG); do
+  movelv $VG/$lv $TMPDEV
+done
+#done
+
+# hopefully empty:
+lvs $VG -o lv_name,devices | grep $TMPDEV
+# if not, do some more movelv
+
+#  - pvremove the temporary PV
+vgreduce $VG $TMPDEV
+pvremove $TMPDEV
+dmsetup remove $TMPDM
+
+#  - pvresize the new PV to use the whole space
+pvresize $DISK