Execute a unidade systemd antes de hibernar

1

Estou em uma situação semelhante à descrita em Hibernação sem troca ativada : Gostaria que minha troca fosse desativada toda vez, exceto para hibernação.

Assim, a ideia que tive foi criar unidades systemd para serem executadas logo antes e depois de hibernate.target . O que eu tenho agora para 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

e para 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

Assim, se minha troca estiver desabilitada, executar systemctl start hibernate.target tem o comportamento esperado: meu computador hiberna e logo após a hibernação, a troca é desativada novamente conforme o esperado.

No entanto, a execução de systemctl hibernate ou o envio de um sinal de hibernação falha: acontece que swapon.service não é executado antes do início da hibernação, e recebo uma mensagem de erro:

Failed to hibernate system via logind: Sleep verb not supported

O que é interessante é que, se eu ativar o swap manualmente antes de lançar systemctl hibernate , os sucessos de hibernação e swapoff.unit serão executados no currículo: posso inferir que hibernation.target foi executado.

Alguém pode me ajudar a entender como forçar o swapon.service a ser executado antes que qualquer operação de hibernação comece? Observe que tentei adicionar hibernate.target sleep.target à linha After= de swapon.service , sem efeito.

Obrigado antecipadamente. :)

EDIT : de acordo com man 8 systemd-hibernate.service , todos os arquivos localizados em /lib/systemd/system-sleep são executados com parâmetros específicos antes e depois da hibernação, suspensão e hibernação-suspensão. Assim, tentei colocar este script:

#!/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

Mas systemctl hibernate ainda resulta em um erro Sleep verb not supported …: |

EDIT 2 : Eu estava me perguntando se definir o swappiness como 0 e ativar o swap seria suficiente para fazer o que eu quero. Se eu definir o swappiness como 0, então eu posso hibernar, mas isso garante que a swap nunca será usada, mesmo que um programa tente alocar mais memória do que minha quantidade de RAM livre?

Ie: com swappiness 0, se 15 GB de 16 forem alocados e um programa solicitar 2 GB, o kernel alocará 2 GB ao programa e trocará 1 GB de memória, ou se recusará a satisfazer a solicitação de alocação? ?

    
por Valentin Melot 22.04.2018 / 22:36

0 respostas