X-Git-Url: http://git.rot13.org/?p=vmdk-backup;a=blobdiff_plain;f=vmdk-backup.pl;h=a44c2535142ded7df6a092112668dd3a277aa5ff;hp=36a4157a4248c6795cde31a00818805d0618d3c2;hb=edabe6a87ef2c63348a169160ff896531445be8a;hpb=223be2b8c6a199a1db646aaaadb0d1cf8a808f25 diff --git a/vmdk-backup.pl b/vmdk-backup.pl index 36a4157..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 ) { @@ -97,7 +98,6 @@ if ( $nbd_pid = fork ) { sh "qemu-nbd --verbose --connect /dev/nbd0 $vmdk"; - warn "finished in ", time() - $start_t, " seconds\n"; exit 0; } @@ -105,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"; @@ -117,14 +115,19 @@ mkdir $tmp unless -d $tmp; my @umount; +sub dev_to_backup { + my $dev = shift; + $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; +} + foreach my $mount ( @mounts ) { my ( $dev, $path, $fs ) = @$mount; if ( exists $blks->{$dev} ) { warn "working on $dev $path $fs\n"; - my $dev_backup = $dev; - $dev_backup =~ s{/dev/$sda}{/dev/mapper/nbd0p} || - $dev_backup =~ s{/dev/mapper/.+-([^-]+)}{/dev/mapper/$vg_backup-$1} || - die "can't map $dev to new backup device!"; + my $dev_backup = dev_to_backup($dev); my $label = $blks->{$dev}->{LABEL}; $label = $label ? "-L $label" : ''; sh "mkfs.$fs $label $dev_backup"; @@ -139,8 +142,38 @@ foreach my $mount ( @mounts ) { } } +chdir '/'; + +if ( my $swap = (grep { $blks->{$_}->{TYPE} eq 'swap' } keys %$blks)[0] ) { + my $dev = dev_to_backup($swap); + my $label = $blks->{$swap}->{LABEL}; + $label = $label ? "-L $label" : ''; + warn "create swap on $dev\n"; + sh "mkswap $label $dev"; +} + -warn "FIXME create swap\n"; +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"; @@ -149,9 +182,12 @@ sh "umount $_" foreach @umount; sh "lvremove -f $_" foreach @lv_remove; -sh "kpartx -dv /dev/nbd0"; - sh "vgchange --available n $vg_backup"; +sh "vgexport $vg_backup"; + +warn "finished in ", time() - $start_t, " seconds\n"; + sh "qemu-nbd --disconnect /dev/nbd0"; +sh "rmmod nbd";