pv-fixup, lvmanip: last tweaks
authorGreg Price <price@mit.edu>
Sat, 2 May 2009 22:53:34 +0000 (18:53 -0400)
committerGreg Price <price@mit.edu>
Sat, 2 May 2009 22:53:34 +0000 (18:53 -0400)
This is from the very beginning of April, at the close of the LVM saga.
Somehow I never pushed.

svn path=/trunk/scripts/pv-fixup/; revision=2321

lvmanip
pv-fixup

diff --git a/lvmanip b/lvmanip
index 4df4d80..2b9febb 100644 (file)
--- a/lvmanip
+++ b/lvmanip
@@ -1,7 +1,7 @@
 #!/bin/bash
 exit 1
 
-DISK=/dev/mapper/36090a028407d6e2b2589a45cdb971489
+SOURCE=/dev/mapper/36090a028407d6e2b2589a45cdb971489
 
 # The name of the LVM archive to get data from
 ARCHIVE=/etc/lvm/archive/xenvg_01514.vg
@@ -13,6 +13,17 @@ lvmextractint () {
   perl -lne 'print $1 if (/'"$1"' = ([0-9]+)/)'
 }
 
+# Extract the first block of an lv to a file named part-$lv
+getfirstblock () {
+  lvname="$1"
+  offset=$(grep -A16 $'\t'$lvname $ARCHIVE  | grep pv0 | cut -f 2 -d ,);
+  if [ -z "$offset" ]; then echo "WARNING: LV not found";
+  else
+    echo "Extracting $lvname from offset $offset"
+    dd if=$SOURCE of=part-$lvname bs=1M skip=$(( $offset * 8192 + 384 )) bs=512 count=1;
+  fi
+}
+
 lvinfo () {
   perl -ne 'print if ( /^(\s*)'"$1"' \{/ ... /^$1\}/ )' $ARCHIVE
 }
@@ -69,7 +80,7 @@ ddlv () {
     echo "# WARNING: LV $lvname not found";
   else
     echo "# Extracting $lvname from offset $offset PEs with length $length PEs"
-    echo dd if=$DISK of=/dev/xenvg/$lvname \
+    echo dd if=$SOURCE of=/dev/xenvg/$lvname \
       skip=$(( $offset * 64 + 3 )) bs=64K count=$(( $length * 64 ))
   fi
 }
@@ -89,7 +100,7 @@ ddlv2 () {
     echo "# WARNING: LV $lvname not found";
   else
     echo "# Extracting $lvname segment 2 from offset $offset PEs with length $length PEs"
-    echo dd if=$DISK of=/dev/xenvg/$lvname bs=64K \
+    echo dd if=$SOURCE of=/dev/xenvg/$lvname bs=64K \
       skip=$(($offset*64 + 3)) count=$(($length*64)) seek=$(($seek*64))
   fi
 }
index d5c0830..5db38a9 100644 (file)
--- a/pv-fixup
+++ b/pv-fixup
@@ -35,11 +35,6 @@ yamlkeys () {
     for m in sorted(mm.iterkeys()): print m'
 }
 
-lvsleft () {
-  lvs -o name,devices xenvg \
-    | perl -lane "print \$F[0] if (\$F[1] =~ m|$DISK|)"
-}
-
 vmstolvs () {
   perl -pe 's/^/d_/;s/$/_hda/'
 }
@@ -51,6 +46,11 @@ totalsize () {
    | perl -lne '$total += $_; END { print $total; }'
 }
 
+lvsleft () {
+  lvs -o name,devices $VG \
+    | perl -lane "print \$F[0] if (\$F[1] =~ m|$DISK|)"
+}
+
 movelv () {
   echo pvmoving $VG/$1...
   pvmove -i 10 -n $VG/$1 $2
@@ -107,12 +107,55 @@ LVM_SYSTEM_DIR=lvm vgextend $VG $DISK
 
 #  - pvmove all the LVs back
 
+# Doing this part with CLVM again.
+
+lvsleft () {
+  lvs -o name,devices $VG \
+    | perl -lane "print \$F[0] if (\$F[1] =~ m|$TMPDEV|)"
+}
+
+movelv () {
+  echo pvmoving $VG/$1...
+  lvchange -an $VG/$1
+  pvmove -i 10 -n $VG/$1 $2
+  lvchange -ay $VG/$1
+}
+
+movestuff () {
+  date
+  while read lv; do
+    echo MOVING: $lv >>/var/log/lvm2.log
+    movelv $lv $TMPDEV
+    date
+  done
+}
+
+moveall () {
+  date
+  for lv in $(lvsleft); do
+    echo MOVING: $lv >>/var/log/lvm2.log
+    movelv $lv $TMPDEV
+    date
+  done
+}
+
 #FOREACH host:
-for lv in $(lvs -o lv_name --noheadings $VG); do
-  movelv $VG/$lv $TMPDEV
-done
+#set logging in /etc/lvm/lvm.conf
+while sleep 1; do
+  echo MARK: $(date) >>/var/log/lvm2.log
+done &
+lvsleft | grep -xf <(invirt-listvms | yamlkeys | vmstolvs) \
+ | movestuff >>/root/lvm/movelv.log 2>&1
+moveall >>/root/lvm/movelv.log 2>&1
+while true; do
+  kinit -k -45
+  sh -x status.sh 2>&1 | zwrite -c xvm-auto -i pvmove -O auto
+  sleep 1800
+done &
 #done
 
+#suffix=.return-1; mv /var/log/lvm2.log lvm/lvm2.$suffix.log; mv lvm/movelv{,.$suffix}.log
+
 # hopefully empty:
 lvs $VG -o lv_name,devices | grep $TMPDEV
 # if not, do some more movelv
@@ -120,7 +163,9 @@ lvs $VG -o lv_name,devices | grep $TMPDEV
 #  - pvremove the temporary PV
 vgreduce $VG $TMPDEV
 pvremove $TMPDEV
+#FOREACH host:
 dmsetup remove $TMPDM
+#done
 
 #  - pvresize the new PV to use the whole space
 pvresize $DISK