while(<$pv>) {
chomp;
s/ *//g;
- if ( s{$sda}{mapper/nbd0p} ) {
+ if ( s{$sda}{nbd0p} ) {
push @pvs, $_;
} else {
warn "SKIP pv $_\n";
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";
}
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 ) {
sh "qemu-nbd --verbose --connect /dev/nbd0 $vmdk";
- warn "finished in ", time() - $start_t, " seconds\n";
exit 0;
}
sh "sfdisk -d /dev/$sda | sfdisk --force /dev/nbd0";
-sh "kpartx -av /dev/nbd0";
-
sh "pvcreate $_" foreach @pvs;
sh "vgcreate $vg_backup @pvs";
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";
}
}
+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 "cleanup...\n";
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";