[pve-devel] [PATCH][pve-manager] Changes set_userpasswd method

Dietmar Maurer dietmar at proxmox.com
Fri Oct 25 17:25:13 CEST 2013


Sorry if this is a stupid question, but does 'vzctl mount' does not work with ploop?

> -----Original Message-----
> From: Игорь Шестаков [mailto:shine at selectel.ru]
> Sent: Freitag, 25. Oktober 2013 15:37
> To: Dietmar Maurer
> Cc: pve-devel
> Subject: Re: [pve-devel] [PATCH][pve-manager] Changes set_userpasswd
> method
> 
> Done
> 
> diff --git a/PVE/API2/OpenVZ.pm b/PVE/API2/OpenVZ.pm
> index 06fe60b..eeba1a2 100644
> --- a/PVE/API2/OpenVZ.pm
> +++ b/PVE/API2/OpenVZ.pm
> @@ -413,7 +413,7 @@ __PACKAGE__->register_method({
> 
>  		# hack: vzctl '--userpasswd' starts the CT, but we want
>  		# to avoid that for create
> -		PVE::OpenVZ::set_rootpasswd($private, $password)
> +		PVE::OpenVZ::set_rootpasswd($private, $password, $vmid)
>  		    if defined($password);
>  	    }
> 
> 
> 
> diff --git a/PVE/OpenVZ.pm b/PVE/OpenVZ.pm
> index a16d4fc..ea0717f 100644
> --- a/PVE/OpenVZ.pm
> +++ b/PVE/OpenVZ.pm
> @@ -1243,24 +1243,55 @@ sub replacepw {
>      }
>  }
> 
> +sub ploop_mount {
> +    my ($rootdisk, $vmid) = @_;
> +	my $fstype = "ext4";
> +	my $tmpdir = "/tmp/$vmid";
> +    if (-f $rootdisk) {
> +        #create tmp dir
> +        mkdir $tmpdir;
> +		#mount image to tmpdir
> +        my $cmd = ['/usr/sbin/ploop', 'mount', '-t', $fstype, '-m', $tmpdir,
> $rootdisk];
> +        eval { PVE::Tools::run_command($cmd); };
> +        my $err = $?;
> +        die "cannot mount $rootdisk" if ($err ne 0);
> +        return $tmpdir;
> +    }
> +}
> +
> +sub ploop_umount {
> +        my $ploopdisk = shift;
> +        my $cmd = ['/usr/sbin/ploop', 'umount', $ploopdisk];
> +        eval { PVE::Tools::run_command($cmd); };
> +        my $err = $?;
> +        die "cannot umount $ploopdisk" if ($err ne 0);
> +}
> +
>  sub set_rootpasswd {
> -    my ($privatedir, $opt_rootpasswd) = @_;
> +    my ($privatedir, $opt_rootpasswd, $vmid) = @_;
> +
> +    my $rootdisk = "$privatedir/root.hdd/root.hdd";
> +    my ($pwfile, $shadow, $tmpdir);
> 
> -    my $pwfile = "$privatedir/etc/passwd";
> +    $tmpdir = ploop_mount($rootdisk, $vmid) if (-f $rootdisk);
> +    $privatedir = $tmpdir if defined($tmpdir);
> +
> +    $pwfile = "$privatedir/etc/passwd";
> 
>      return if ! -f $pwfile;
> 
> -    my $shadow = "$privatedir/etc/shadow";
> +    $shadow = "$privatedir/etc/shadow";
> 
>      if ($opt_rootpasswd !~ m/^\$/) {
> -	my $time = substr (Digest::SHA::sha1_base64 (time), 0, 8);
> -	$opt_rootpasswd = crypt(encode("utf8", $opt_rootpasswd),
> "\$1\$$time\$");
> +                my $time = substr (Digest::SHA::sha1_base64 (time), 0, 8);
> +                $opt_rootpasswd = crypt(encode("utf8", $opt_rootpasswd),
> "\$1\$$time\$");
>      };
> 
>      if (-f $shadow) {
> -	replacepw ($shadow, $opt_rootpasswd);
> -	replacepw ($pwfile, 'x');
> +                replacepw ($shadow, $opt_rootpasswd);
> +                replacepw ($pwfile, 'x');
>      } else {
> -	replacepw ($pwfile, $opt_rootpasswd);
> +                replacepw ($pwfile, $opt_rootpasswd);
>      }
> -}
> +    ploop_umount($rootdisk) if (-f $rootdisk);
> +}
> \ No newline at end of file
> 
> 
> On Fri, Oct 25, 2013 at 11:44 AM, Dietmar Maurer <dietmar at proxmox.com>
> wrote:
> > Previous solution work only with simfs.
> > If we use ploop, we need to mount VM image and then change password.
> >
> > Why we can't solve this with simple, built-in solution?
> Because that made many troubles. Starting a container at create stage
> is really unexpected and not what we want to do (for example many prebuild
> appliances do special things a first boot).
> 
> But maybe you can find another solution, i.e. mount ploop first?
> 
> 
> 
> 
> --
> С уважением, Шестаков Игорь
> Сеть дата-центров "Селектел"


More information about the pve-devel mailing list