我的情况与未启用交换的休眠:我希望我的交换每次都被禁用,除了休眠状态。
因此,我的想法是创建在之前和之后执行的 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.target
到After=
行中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 内存,还是拒绝满足分配请求?