X-Git-Url: http://git.rot13.org/?p=vmdk-backup;a=blobdiff_plain;f=vmdk-backup.pl;h=a44c2535142ded7df6a092112668dd3a277aa5ff;hp=14b89943c9e8f3b221627d358c67300bc8d47d79;hb=edabe6a87ef2c63348a169160ff896531445be8a;hpb=40ae3372d5003dadc04671280756ca92b68977b3 diff --git a/vmdk-backup.pl b/vmdk-backup.pl index 14b8994..a44c253 100755 --- a/vmdk-backup.pl +++ b/vmdk-backup.pl @@ -42,7 +42,7 @@ open(my $pv, '-|', "pvs --noheadings --options pv_name --unbuffered"); while(<$pv>) { chomp; s/ *//g; - if ( s{$sda}{mapper/nbd0p} ) { + if ( s{$sda}{nbd0p} ) { push @pvs, $_; } else { warn "SKIP pv $_\n"; @@ -64,6 +64,7 @@ while(<$lvs>) { next; } push @lv_create, "lvcreate --name $name --size $size $vg_backup"; + next if $name =~ m/swap/; push @lv_create, "lvcreate --snapshot /dev/$vg/$name --name ${name}-snap --size 100M"; push @lv_remove, "/dev/$vg/$name-snap"; } @@ -89,7 +90,7 @@ warn "begin vmdk creation...\n"; my $size = `blockdev --getsize64 /dev/$sda`; sh "qemu-img create -f vmdk -o compat6 $vmdk $size"; -sh "modprobe nbd"; +sh "modprobe nbd max_part=8"; my $nbd_pid; if ( $nbd_pid = fork ) { @@ -104,8 +105,6 @@ sleep 1; sh "sfdisk -d /dev/$sda | sfdisk --force /dev/nbd0"; -sh "kpartx -av /dev/nbd0"; - sh "pvcreate $_" foreach @pvs; sh "vgcreate $vg_backup @pvs"; @@ -118,7 +117,7 @@ my @umount; sub dev_to_backup { my $dev = shift; - $dev =~ s{/dev/$sda}{/dev/mapper/nbd0p} || + $dev =~ s{/dev/$sda}{/dev/nbd0p} || $dev =~ s{/dev/mapper/.+-([^-]+)}{/dev/mapper/$vg_backup-$1} || die "can't map $dev to new backup device!"; return $dev; @@ -154,6 +153,29 @@ if ( my $swap = (grep { $blks->{$_}->{TYPE} eq 'swap' } keys %$blks)[0] ) { } +warn "mount bind chroot...\n"; + +foreach ( qw(dev proc sys) ) { + sh "mount --bind /$_ $tmp/$_"; + unshift @umount, "$tmp/$_"; +} + +warn "make backup bootable...\n"; + +open(my $sh, '>', "$tmp/tmp/backup-fixup.sh"); +print $sh qq{ +grub-install /dev/nbd0 +update-grub +}; +close($sh); +chmod 0755, "$tmp/tmp/backup-fixup.sh"; + +sh "chroot $tmp /tmp/backup-fixup.sh"; + +warn "wait for ENTER to continue...\n"; +; + + warn "cleanup...\n"; sh "umount $_" foreach @umount; @@ -164,9 +186,8 @@ sh "vgchange --available n $vg_backup"; sh "vgexport $vg_backup"; -sh "kpartx -dv /dev/nbd0"; - warn "finished in ", time() - $start_t, " seconds\n"; sh "qemu-nbd --disconnect /dev/nbd0"; +sh "rmmod nbd";