[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