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? ?