swapon & hibernar na tecla liga / desliga

1

Eu tenho um laptop & Eu corro o Arch Linux. Meu laptop tem um disco rígido giratório em vez de um SSD, então eu odeio swap. No entanto, eu preciso de um para hibernar e quero que meu laptop hiberne toda vez que a tecla liga / desliga é pressionada ou a bateria fica fraca. Minha ideia agora é ter swapon antes do início de systemd-hibernate.service . (Claro, seria bom também swapoff logo após o despertar.)

Para o propósito, eu fiz uma dev-sda7.swap unit. Sua operação é direta:

[Unit]

Description=Hibernate swapon
DefaultDependencies=false
TimeoutStopSec=infinity

[Swap]
What=/dev/sda7

Eu esperava vinculá-lo a sleep.target , hibernate.target ou systemd-hibernate.service para iniciá-lo um pouco antes da hibernação e parei logo depois. No entanto, as coisas não funcionaram tão bem. Por enquanto, tenho dev-sda7.swap stop se adicionar PartOf=sleep.target & Eu tenho que começar antes de systemd-hibernate.service se eu adicionar WantedBy=systemd-hibernate.service & %código%. Isso soa como sucesso, mas não é.

Before=systemd-hibernate.service especifica logind.conf e, pelo que entendi, invoca HandlePowerKey=hibernate . (Talvez seja mais complicado, não sei). systemctl hibernate no entanto não emitirá systemctl hibernate a menos que uma verificação de swap integrada seja passada, o que não acontecerá até que start systemd-hibernate.service seja emitido. Espero que você possa ver a complicação aqui.

Gostaria de usar a lógica de start systemd-hibernate.service para iniciar minha troca. Então eu entendo que eu tenho que de alguma forma remover a verificação de swap de systemd . Caso contrário, talvez exista uma maneira de executar um script antes dessa verificação - um script que seria logind .

Um swapon dedicado especifica um comando arbitrário para ser executado quando a energia é baixa, o que pode ser /etc/udev/rules.d/99-lowbat.rules . Gostaria de saber se existe uma regra do udev que executa um comando quando a tecla liga / desliga é pressionada. Eu posso então fazer sem logind completamente.

O que você pode me aconselhar?

Tivemos uma conversa de longa duração no fórum do Arch Linux que ajudou a estabelecer as evidências, mas não ofereceu nenhuma solução.

    
por Ignat Insarov 12.05.2017 / 19:26

1 resposta

2

A verificação de troca do systemctl pode ser desativada configurando SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1 para o serviço systemd-logind . Isso pode ser feito da seguinte forma:

# systemctl edit systemd-logind.service

[Service]
Environment=SYSTEMD_BYPASS_HIBERNATION_MEMORY_CHECK=1

Agora, para realmente trocar / trocar quando necessário, você pode adicionar este serviço:

# vim /etc/systemd/system/swap-to-hibernate.service

[Unit]
Description=Swapon/off when hibernating or resuming
DefaultDependencies=no
Before=systemd-hibernate.service systemd-hybrid-sleep.service
StopWhenUnneeded=yes
RefuseManualStart=yes
RefuseManualStop=yes

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/swapon /dev/sda7    # <--- can be file, too
ExecStop=/usr/bin/swapoff /dev/sda7   

[Install]
RequiredBy=systemd-hibernate.service systemd-hybrid-sleep.service

Depois, basta ativá-lo via # systemctl enable swap-to-hibernate.service . Você pode ter que reinicializar para que o logind env tenha efeito (talvez # systemctl daemon-reexec && systemctl reload systemd-logind seja suficiente, não tenho certeza).

Para mais informações, consulte solicitação de pull e este readme .

    
por 15.07.2018 / 15:18