--- trunk/vz-clone.pl 2009/02/27 20:49:06 66 +++ trunk/vz-clone.pl 2009/03/09 19:09:22 74 @@ -1,12 +1,12 @@ #!/usr/bin/perl -w use strict; -use Shell qw/rsync vzlist lvcreate mount umount lvremove which lvdisplay mke2fs vzctl/; +use Shell qw/rsync lvcreate mount umount lvremove which lvdisplay mke2fs/; -my $vz = '/vz'; -my $conf = '/etc/vz/conf'; +use lib 'lib'; +use VZ; -my $snap_size = '1G'; +my $snap_size = '10G'; my ( $action, $VEID ) = @ARGV; @@ -14,7 +14,7 @@ my $valid_actions = 'create|mount|umount|destroy'; -die "Usage: $0 ($valid_actions) VEID\n\n",vzlist unless $VEID && $action && $action =~ m/($valid_actions)/; +die "Usage: $0 ($valid_actions) VEID\n\n",`vzlist` unless $VEID && $action && $action =~ m{($valid_actions)}; my $CVEID = "10$VEID"; @@ -52,10 +52,11 @@ umount( $clone ) if $clone; if ( $action eq 'destroy' && -e $snap ) { lvremove( '-f', $snap ); - exit; } - exit if $action eq 'umount'; + vzctl('destroy', $VEID) if $action eq 'destroy'; + + exit if $action =~ m{(umount|destroy)}; } @@ -67,15 +68,15 @@ my $vz_lv; -open(my $m, '<', '/etc/fstab') || die "can't open /etc/fstab: $!"; +open(my $m, '-|', "df $vz_root") || die "can't open df $vz_root: $!"; while(<$m>) { - next if m/^#/; + next if ! m{^/}; my @v = split(/\s+/,$_); - if ( $v[1] =~ m/\Q$vz\E/ ) { - $vz_lv = $v[0]; - warn "found LV $vz_lv for $vz\n"; - last; - } + $vz_lv = $v[0]; + $vz_lv =~ s{^/dev/mapper/([^\-]+)-(.+)$}{/dev/$1/$2}; + # rewrite /dev/mapper/vg-lv to /dev/vg/lv + warn "found LV $vz_lv for $vz_root\n"; + last; } sub fs_quota { @@ -131,8 +132,8 @@ do_mount( "$vz_lv_path/$snap", "/tmp/$snap" ); - mount_bind( "/tmp/$snap/private/$VEID", "$vz/private/$CVEID" ); - mount_bind( "/tmp/$snap/root/$VEID", "$vz/root/$CVEID" ); + mount_bind( "/tmp/$snap/private/$VEID", "$vz_root/private/$CVEID" ); + mount_bind( "/tmp/$snap/root/$VEID", "$vz_root/root/$CVEID" ); } else { @@ -151,16 +152,16 @@ test_mkdir( "/tmp/$clone/private" ); test_mkdir( "/tmp/$clone/root" ); - copy_files( "$vz/private/$VEID", "/tmp/$clone/private" ); + copy_files( "$vz_root/private/$VEID", "/tmp/$clone/private" ); - mount_bind( "/tmp/$clone/private", "$vz/private/$CVEID" ); - mount_bind( "/tmp/$clone/root", "$vz/root/$CVEID" ); + mount_bind( "/tmp/$clone/private", "$vz_root/private/$CVEID" ); + mount_bind( "/tmp/$clone/root", "$vz_root/root/$CVEID" ); } } else { - copy_files( "$vz/private/$VEID", "$vz/private/$CVEID" ); + copy_files( "$vz_root/private/$VEID", "$vz_root/private/$CVEID" ); } exit if $action eq 'mount'; @@ -187,8 +188,8 @@ return $note . qq{HOSTNAME="$hostname"}; } -open(my $o, '<', "$conf/$VEID.conf") || die "can't open $conf/$VEID.conf: $!"; -open(my $n, '>', "$conf/$CVEID.conf") || die "can't open $conf/$CVEID.conf: $!"; +open(my $o, '<', "$vz_conf/$VEID.conf") || die "can't open $vz_conf/$VEID.conf: $!"; +open(my $n, '>', "$vz_conf/$CVEID.conf") || die "can't open $vz_conf/$CVEID.conf: $!"; while(<$o>) { s{^HOSTNAME=(.*)$}{fix_hostname($1)}ie; s{^IP_ADDRESS=(.*)$}{fix_ip($1)}ie; @@ -198,5 +199,7 @@ print $n qq{DISK_QUOTA="no"\n} if $use_snapshot; # don't wait for quota rebuild on startup -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" +my $iptables="iptables -t nat -A POSTROUTING -s $ve_clone_ip -o eth0 -j MASQUERADE"; +system( $iptables ); +print "\nConfig file: $vz_conf/$CVEID.conf\nAdded NAT for new VE with: $iptables\nStart clone of $VEID with: vzctl start $CVEID\n"