|
|
| Line 205: |
Line 205: |
| }; | | }; |
| </syntaxhighlight> | | </syntaxhighlight> |
|
| |
| = Delay UPS Shutdown =
| |
|
| |
| As part of the system shutdown process, there needs to be an action to
| |
| send a message to the UPS to tell it that some time later, it too will
| |
| shut down. Note that the UPS does not shutdown at the same time as the
| |
| system it protects. The UPS shutdown is delayed. By default the delay
| |
| is 20 seconds. The absence of AC power to the protected system for a
| |
| sufficient time has the effect of resetting the BIOS options, and in
| |
| particular the option Restore power on AC return. This BIOS option
| |
| will be needed to restart the box.
| |
|
| |
| During the system shutdown, systemd service unit runs the command
| |
| <code>upsdrvctl shutdown</code>. This tells the UPS that it is to shut down
| |
| offdelay seconds later. The system powers down before offdelay seconds
| |
| have passed. Wall power returns before the UPS shuts down. Less than
| |
| offdelay seconds have now passed. The UPS continues it's shutdown
| |
| process.
| |
|
| |
| After offdelay seconds the UPS shuts down, disconnecting it's
| |
| outlets. The beeping stops. With some UPS units, there is an audible
| |
| clunk. An interval of ondelay minus offdelay seconds later: After ondelay
| |
| seconds the UPS turns itself on, and repowers it's outlets. The system
| |
| BIOS option Restore Power on AC return has hopefully been selected and
| |
| the system powers up.
| |
|
| |
| There is a danger that the system will take longer
| |
| than the default 20 seconds to shut down. If that were to happen, the UPS shutdown
| |
| would provoke a brutal system crash. We have adjusted offdelay above, to solve this issue.
| |
|
| |
|
| |
| <syntaxhighlight lang="nix">
| |
| # copied from ConfigExamples 3.0 book, Appendix B.2.
| |
| systemd.services.nut-delayed-ups-shutdown = {
| |
| enable = true;
| |
| environment = config.systemd.services.upsmon.environment;
| |
| description = "Initiate delayed UPS shutdown";
| |
| before = [ "umount.target" ];
| |
| wantedBy = [ "final.target" ];
| |
| serviceConfig = {
| |
| Type = "oneshot";
| |
| # need to use '-u root', or else permission denied
| |
| ExecStart = ''${pkgs.nut}/bin/upsdrvctl -u root shutdown'';
| |
| # must not use slice: if used, upsdrvctl will not run as a late
| |
| # shutdown service
| |
| # Slice = "";
| |
| };
| |
| unitConfig = {
| |
| ConditionPathExists = config.power.ups.upsmon.settings.POWERDOWNFLAG;
| |
| DefaultDependencies = "no";
| |
| };
| |
| };
| |
| </syntaxhighlight>
| |
|
| |
|
| |
| [[Category:Hardware]] | | [[Category:Hardware]] |