Я нахожусь в ситуации, аналогичной той, что описана в режиме гибернации без включенной подкачки : я бы хотел, чтобы мой подкачка отключалась каждый раз, кроме спящего режима.
Таким образом, моя идея состояла в том, чтобы создать системные модули, которые будут выполняться непосредственно до и после 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.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
не выполняется до запуска hibernation, и я получаю сообщение об ошибке:
Failed to hibernate system via logind: Sleep verb not supported
Что интересно, если я вручную включу своп перед запуском systemctl hibernate
, то при возобновлении работы hibernation и 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, то я могу перейти в спящий режим, но гарантирует ли это, что подкачка никогда не будет использоваться, даже если программа пытается выделить больше памяти, чем мое количество свободной оперативной памяти?
То есть: при перестановке 0, если 15 из 16 ГБ выделены и программа запрашивает 2 ГБ, выделяет ли ядро 2 ГБ для программы и не меняет ли 1 ГБ памяти или оно отказывается удовлетворить запрос на выделение?