--- trunk/vz-clone.pl 2007/10/04 23:23:20 26 +++ trunk/vz-clone.pl 2007/10/04 23:42:24 27 @@ -10,19 +10,32 @@ my ( $action, $VEID ) = @ARGV; +my $use_snapshot = 0; + my $valid_actions = 'create|umount|destroy'; die "Usage: $0 ($valid_actions) VEID\n\n",vzlist unless $VEID && $action && $action =~ m/($valid_actions)/; -if ( $action eq 'destroy' ) { +my $CVEID = "10$VEID"; + +sub vzctl_stop { + my $veid = shift; my $vzlist = vzlist(); - if ( $vzlist =~ m/$VEID/ ) { - print "stop $VEID\n"; - vzctl('stop', $VEID); + if ( $vzlist =~ m/$veid/ ) { + print "stop $veid\n"; + vzctl('stop', $veid); } } -if ( $action =~ m/(umount|destroy)/ ) { + +if ( $action eq 'create' ) { + vzctl_stop( $CVEID ); +} elsif ( $action eq 'destroy' ) { + vzctl_stop( $VEID ); +} + + +if ( 1 || $action =~ m/(umount|destroy)/ ) { my $clone; open(my $m, '-|', 'mount') || die "can't open mount: $!"; while(<$m>) { @@ -39,8 +52,6 @@ #die "unknown action: $action" unless $action eq 'create'; exit unless $action eq 'create'; -my $CVEID = "10$VEID"; - my $orig_conf = "/etc/vz/conf/$VEID.conf"; die "$VEID config $orig_conf doesn't exist\n" unless -e $orig_conf; @@ -105,10 +116,14 @@ mount( '--bind', $from, $to ); } - print "Creating $snap_size snapshot $snap from $vz_lv\n"; - lvcreate( '--size', $snap_size, '--snapshot', '--name', $snap, $vz_lv ); + if ( $use_snapshot ) { + + print "Creating $snap_size snapshot $snap from $vz_lv\n"; + lvcreate( '--size', $snap_size, '--snapshot', '--name', $snap, $vz_lv ); - do_mount( "$vz_lv_path/$snap", "/tmp/$snap" ); + do_mount( "$vz_lv_path/$snap", "/tmp/$snap" ); + + } my $clone_size = fs_quota( $VEID ) . 'k'; my $vg_name = $1 if ( $vz_lv_path =~ m!/([^/]+)/*$! ); @@ -129,14 +144,21 @@ mount_bind( "/tmp/$clone/private", "$vz/private/$CVEID" ); mount_bind( "/tmp/$clone/root", "$vz/root/$CVEID" ); - copy_files( "/tmp/$snap/private/$VEID", "$vz/private/$CVEID" ); + if ( $use_snapshot ) { + + copy_files( "/tmp/$snap/private/$VEID", "$vz/private/$CVEID" ); - print "Cleanup\n"; + print "Cleanup\n"; - #umount( "$vz_lv_path/$clone" ); - umount( "$vz_lv_path/$snap" ); + #umount( "$vz_lv_path/$clone" ); + umount( "$vz_lv_path/$snap" ); - lvremove( '-f', "$vz_lv_path/$snap" ); + lvremove( '-f', "$vz_lv_path/$snap" ); + + } else { + copy_files( "$vz/private/$VEID", "$vz/private/$CVEID" ); + + } } else {