--- trunk/vz-clone.pl 2009/02/27 18:41:06 64 +++ trunk/vz-clone.pl 2009/03/03 20:58:48 69 @@ -6,11 +6,11 @@ my $vz = '/vz'; my $conf = '/etc/vz/conf'; -my $snap_size = '100M'; +my $snap_size = '10G'; my ( $action, $VEID ) = @ARGV; -my $use_snapshot = 0; +my $use_snapshot = 1; my $valid_actions = 'create|mount|umount|destroy'; @@ -34,20 +34,29 @@ } -if ( $action =~ m/(create|umount|destroy)/ ) { +if ( $action =~ m{(create|umount|destroy)} ) { my $clone; + my $snap; open(my $m, '-|', 'mount') || die "can't open mount: $!"; while(<$m>) { my @v = split(/\s+/,$_); - if ( $v[2] =~ m{/(private|root)/$CVEID$} && $v[5] =~ m/bind/ ) { + if ( $v[2] =~ m{/(private|root)/($VEID|$CVEID)$} && $v[5] =~ m{bind} ) { umount( $v[2] ); } elsif ( $v[2] =~ m{vz-clone-$CVEID$} ) { $clone = $v[2]; + } elsif ( $v[2] =~ m{-snap} ) { + $snap = $v[0]; + umount( $snap ); } } umount( $clone ) if $clone; + if ( $action eq 'destroy' && -e $snap ) { + lvremove( '-f', $snap ); + } + + vzctl('destroy', $VEID) if $action eq 'destroy'; - exit if $action eq 'umount'; + exit if $action =~ m{(umount|destroy)}; } @@ -123,41 +132,31 @@ do_mount( "$vz_lv_path/$snap", "/tmp/$snap" ); - } - - my $vg_name = $1 if ( $vz_lv_path =~ m{/([^/]+)/*$} ); + mount_bind( "/tmp/$snap/private/$VEID", "$vz/private/$CVEID" ); + mount_bind( "/tmp/$snap/root/$VEID", "$vz/root/$CVEID" ); - if ( lvdisplay( "$vz_lv_path/$clone" ) ) { - warn "using existing $vz_lv_path/$clone\n"; } else { - my $clone_size = fs_quota( $VEID ) . 'k'; - print "Creating LV $clone ($clone_size bytes) in VG $vg_name for $VEID clone filesystem\n"; - lvcreate( '--size', $clone_size, '--name', $clone, $vg_name ); - mke2fs( '-m', 0, '-j', "$vz_lv_path/$clone" ); - } - - do_mount( "$vz_lv_path/$clone", "/tmp/$clone" ); - - test_mkdir( "/tmp/$clone/private" ); - test_mkdir( "/tmp/$clone/root" ); - - mount_bind( "/tmp/$clone/private", "$vz/private/$CVEID" ); - mount_bind( "/tmp/$clone/root", "$vz/root/$CVEID" ); - if ( $use_snapshot ) { - - copy_files( "/tmp/$snap/private/$VEID", "/tmp/$clone/private" ); - - print "Cleanup\n"; + if ( lvdisplay( "$vz_lv_path/$clone" ) ) { + warn "using existing $vz_lv_path/$clone\n"; + } else { + my $vg_name = $1 if ( $vz_lv_path =~ m{/([^/]+)/*$} ); + my $clone_size = fs_quota( $VEID ) . 'k'; + print "Creating LV $clone ($clone_size bytes) in VG $vg_name for $VEID clone filesystem\n"; + lvcreate( '--size', $clone_size, '--name', $clone, $vg_name ); + mke2fs( '-m', 0, '-j', "$vz_lv_path/$clone" ); + } - #umount( "$vz_lv_path/$clone" ); - umount( "$vz_lv_path/$snap" ); + do_mount( "$vz_lv_path/$clone", "/tmp/$clone" ); - lvremove( '-f', "$vz_lv_path/$snap" ); + test_mkdir( "/tmp/$clone/private" ); + test_mkdir( "/tmp/$clone/root" ); - } else { copy_files( "$vz/private/$VEID", "/tmp/$clone/private" ); + mount_bind( "/tmp/$clone/private", "$vz/private/$CVEID" ); + mount_bind( "/tmp/$clone/root", "$vz/root/$CVEID" ); + } } else { @@ -198,4 +197,9 @@ print $n $_; } -print "\nPlease review config file: $conf/$CVEID.conf\nAdd NAT for new VE with: iptables -t nat -A POSTROUTING -s $ve_clone_ip -o eth0 -j MASQUERADE\nStart clone of $VEID with: vzctl start $CVEID\n" +print $n qq{DISK_QUOTA="no"\n} if $use_snapshot; # don't wait for quota rebuild on startup + +my $iptables="iptables -t nat -A POSTROUTING -s $ve_clone_ip -o eth0 -j MASQUERADE"; +system( $iptables ); +print "\nConfig file: $conf/$CVEID.conf\nAdded NAT for new VE with: $iptables\nStart clone of $VEID with: vzctl start $CVEID\n" +