chroot and make machine bootable
[vmdk-backup] / vmdk-backup.pl
index 0205997..a44c253 100755 (executable)
@@ -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";
@@ -116,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";
@@ -140,7 +144,36 @@ foreach my $mount ( @mounts ) {
 
 chdir '/';
 
-warn "FIXME create swap\n";
+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 "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";
+<STDIN>;
 
 
 warn "cleanup...\n";
@@ -151,9 +184,10 @@ sh "lvremove -f $_" foreach @lv_remove;
 
 sh "vgchange --available n $vg_backup";
 
-sh "kpartx -dv /dev/nbd0";
+sh "vgexport $vg_backup";
 
 warn "finished in ", time() - $start_t, " seconds\n";
 
 sh "qemu-nbd --disconnect /dev/nbd0";
 
+sh "rmmod nbd";