[pve-devel] [PATCH container 1/6] add reboot helpers to be used by containers
Stefan Reiter
s.reiter at proxmox.com
Wed Nov 13 10:11:11 CET 2019
On 11/12/19 5:26 PM, Oguz Bektas wrote:
> code for create_reboot_request and clear_reboot_request is from qemu, the only
> difference is that we use /run/lxc/$vmid.reboot path instead of
> /run/qemu-server.
>
> there _is_ actually reboot triggers for lxc which are used by the
> prestart hook and similar, however i think it's better if we can
> differentiate between reboot requests from inside the container and from
> API. (inadvertently this also allows to reboot container from inside without
> applying pending changes)
>
> since we don't have to clean up like in qemu, we can simply run vm_stop
> and vm_start for a reboot operation.
>
That being so, why do we need a restart trigger file at all? You create
it in vm_reboot and then delete it in vm_start or the error path... But
it existing or not doesn't change behaviour of any of these?
> Signed-off-by: Oguz Bektas <o.bektas at proxmox.com>
> ---
> src/PVE/LXC.pm | 41 +++++++++++++++++++++++++++++++++++++++++
> 1 file changed, 41 insertions(+)
>
> diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm
> index cdf6d64..c77ee01 100644
> --- a/src/PVE/LXC.pm
> +++ b/src/PVE/LXC.pm
> @@ -2013,6 +2013,47 @@ sub vm_stop {
> die "container did not stop\n";
> }
>
> +sub create_reboot_request {
> + my ($vmid) = @_;
> + open(my $fh, '>', "/run/lxc/$vmid.reboot")
> + or die "failed to create reboot trigger file: $!\n";
> + close($fh);
> +}
> +
> +sub clear_reboot_request {
> + my ($vmid) = @_;
> + my $path = "/run/lxc/$vmid.reboot";
> + my $res = 0;
> +
> + if (-e $path) {
> + $res = unlink($path);
> + die "could not remove reboot request for $vmid: $!\n" if !$res;
> + }
> +
> + return $res;
> +}
> +
> +sub vm_reboot {
> + my ($vmid, $timeout, $skiplock) = @_;
> +
> + PVE::LXC::Config->lock_config($vmid, sub {
> + eval {
> + return if !check_running($vmid);
> +
> + create_reboot_request($vmid);
> + vm_stop($vmid, 0, $timeout, 1); # kill if timeout exceeds
> +
> + my $conf = PVE::LXC::Config->load_config($vmid);
> + vm_start($vmid, $conf);
> + };
> + if (my $err = $@) {
> + # avoid that the next normal shutdown will be confused for a reboot
> + clear_reboot_request($vmid);
> + die $err;
> + }
> + });
> +}
> +
> sub run_unshared {
> my ($code) = @_;
>
>
More information about the pve-devel
mailing list