休眠前执行 systemd 单元

休眠前执行 systemd 单元

我的情况与未启用交换的休眠:我希望我的交换每次都被禁用,除了休眠状态。

因此,我的想法是创建在之前和之后执行的 systemd 单元hibernate.target。我现在为 swapon 准备的是:

#swapon.service
[Unit]
Description=Enable swap before hibernate
Before=systemd-hibernate.service

[Service]
User=root
Type=simple
ExecStart=/usr/bin/swapon -a 

[Install]
RequiredBy=hibernate.target

对于 swapoff :

#swapoff.service
[Unit]
Description=User resume actions [swapoff]
After=systemd-hibernate.service

[Service]
User=root
Type=simple
ExecStart=/usr/bin/swapoff -a

[Install]
WantedBy=hibernate.target

因此,如果我的交换被禁用,则运行systemctl start hibernate.target具有预期的行为:我的计算机休眠,并且在休眠之后,交换再次按预期被禁用。

尽管如此,运行systemctl hibernate或发送休眠信号还是失败:事实证明swapon.service在休眠开始之前没有执行,并且我收到一条错误消息:

Failed to hibernate system via logind: Sleep verb not supported

有趣的是,如果我在启动之前手动打开交换systemctl hibernate,那么休眠就会成功并swapoff.unit在恢复时运行:我可以推断hibernation.target已经执行了。

有人能帮助我理解如何swapon.service在任何休眠操作开始之前强制执行吗?请注意,我尝试添加hibernate.target sleep.targetAfter=行中swapon.service,但没有效果。

提前致谢。 :)


编辑:根据man 8 systemd-hibernate.service,位于 的所有文件在/lib/systemd/system-sleep休眠、挂起和混合睡眠之前和之后都会使用特定参数执行。因此,我尝试放置此脚本:

#!/bin/sh
#/lib/systemd/system-sleep/manage_swap

if [ $2 = "hibernate" ] || [ $2 = "hybrid-sleep" ]; then
    if [ $1 = "pre" ]; then
            swapon -a
    elif [ $1 = "post" ]; then
            swapoff -a
    else
            exit 1
    fi
elif [ $2 = "suspend" ]; then
    exit 0
else
    exit 1
fi
exit 0

systemctl hibernate仍然会导致Sleep verb not supported错误...:|


编辑2:我想知道将 swappiness 设置为 0 并启用 swap 是否足以实现我想要的功能。如果我将 swappiness 设置为 0,那么我可以休眠,但这是否确保 swap 将绝不可以使用,即使程序试图分配比我的可用 RAM 数量更多的内存?

即:在 swappiness 为 0 的情况下,如果分配了 16 GB 中的 15 GB 并且某个程序要求 2 GB,那么内核是否会为该程序分配 2 GB 并交换 1 GB 内存,还是拒绝满足分配请求?

相关内容