1

Я нахожусь в ситуации, аналогичной той, что описана в режиме гибернации без включенной подкачки : я бы хотел, чтобы мой подкачка отключалась каждый раз, кроме спящего режима.

Таким образом, моя идея состояла в том, чтобы создать системные модули, которые будут выполняться непосредственно до и после 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 ГБ памяти или оно отказывается удовлетворить запрос на выделение?

0