Containers: Fix reboot and poweroff
Previously "machinectl reboot/poweroff" brutally killed the container, as did "systemctl stop/restart". And reboot didn't actually work. Now everything is fine.
This commit is contained in:
parent
b10a3e9145
commit
32b977d4a7
@ -168,6 +168,9 @@ in
|
|||||||
|
|
||||||
preStart =
|
preStart =
|
||||||
''
|
''
|
||||||
|
# Clean up existing machined registration.
|
||||||
|
machinectl terminate "$INSTANCE" 2> /dev/null || true
|
||||||
|
|
||||||
mkdir -p -m 0755 $root/var/lib
|
mkdir -p -m 0755 $root/var/lib
|
||||||
|
|
||||||
# Create a named pipe to get a signal when the container
|
# Create a named pipe to get a signal when the container
|
||||||
@ -205,6 +208,7 @@ in
|
|||||||
fi
|
fi
|
||||||
''}
|
''}
|
||||||
|
|
||||||
|
EXIT_ON_REBOOT=1 \
|
||||||
exec ${config.systemd.package}/bin/systemd-nspawn \
|
exec ${config.systemd.package}/bin/systemd-nspawn \
|
||||||
--keep-unit \
|
--keep-unit \
|
||||||
-M "$INSTANCE" -D "$root" $extraFlags \
|
-M "$INSTANCE" -D "$root" $extraFlags \
|
||||||
@ -242,23 +246,38 @@ in
|
|||||||
|
|
||||||
preStop =
|
preStop =
|
||||||
''
|
''
|
||||||
machinectl poweroff "$INSTANCE"
|
machinectl poweroff "$INSTANCE" || true
|
||||||
'';
|
'';
|
||||||
|
|
||||||
restartIfChanged = false;
|
restartIfChanged = false;
|
||||||
#reloadIfChanged = true; # FIXME
|
#reloadIfChanged = true; # FIXME
|
||||||
|
|
||||||
serviceConfig.ExecReload = pkgs.writeScript "reload-container"
|
serviceConfig = {
|
||||||
''
|
ExecReload = pkgs.writeScript "reload-container"
|
||||||
#! ${pkgs.stdenv.shell} -e
|
''
|
||||||
SYSTEM_PATH=/nix/var/nix/profiles/system
|
#! ${pkgs.stdenv.shell} -e
|
||||||
echo $SYSTEM_PATH/bin/switch-to-configuration test | \
|
SYSTEM_PATH=/nix/var/nix/profiles/system
|
||||||
${pkgs.socat}/bin/socat unix:$root/var/lib/run-command.socket -
|
echo $SYSTEM_PATH/bin/switch-to-configuration test | \
|
||||||
'';
|
${pkgs.socat}/bin/socat unix:$root/var/lib/run-command.socket -
|
||||||
|
'';
|
||||||
|
|
||||||
serviceConfig.SyslogIdentifier = "container %i";
|
SyslogIdentifier = "container %i";
|
||||||
|
|
||||||
serviceConfig.EnvironmentFile = "-/etc/containers/%i.conf";
|
EnvironmentFile = "-/etc/containers/%i.conf";
|
||||||
|
|
||||||
|
# Note that on reboot, systemd-nspawn returns 10, so this
|
||||||
|
# unit will be restarted. On poweroff, it returns 0, so the
|
||||||
|
# unit won't be restarted.
|
||||||
|
Restart = "on-failure";
|
||||||
|
|
||||||
|
# Hack: we don't want to kill systemd-nspawn, since we call
|
||||||
|
# "machinectl poweroff" in preStop to shut down the
|
||||||
|
# container cleanly. But systemd requires sending a signal
|
||||||
|
# (at least if we want remaining processes to be killed
|
||||||
|
# after the timeout). So send an ignored signal.
|
||||||
|
KillMode = "mixed";
|
||||||
|
KillSignal = "WINCH";
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
# Generate a configuration file in /etc/containers for each
|
# Generate a configuration file in /etc/containers for each
|
||||||
|
Loading…
Reference in New Issue
Block a user