Hibernação usando systemctl
e fazendo com que funcione em casos difíceis
Para mim, pm-hibernate
sempre falha. Depois de alguns ajustes, consegui hibernar usando a interface do systemd (sistema init em 16.04 e acima). Eu também consegui fazê-lo funcionar em 17.04 com um arquivo de troca. Este estudo de caso pode ser útil para outras pessoas com problemas.
Primeiro tente:
sudo systemctl hibernate
Se isso falhar, comece a solução de problemas: no estado de hibernação (HTD ou ACPI S4), o estado da máquina é gravado no disco, de modo que não é necessária energia para preservá-lo. O estado é gravado em uma partição de troca ou em um arquivo de troca. Nota: se estiver usando o BTRFS, NÃO tente usar um arquivo de troca, pois isso pode causar corrupção no sistema de arquivos
Sua partição swap ou arquivo de troca pode precisar ter o mesmo tamanho que a RAM para permitir a hibernação, mas há uma boa chance de que você possa hibernar se ela tiver pelo menos 2/5 do tamanho da RAM, de acordo com < a href="https://wiki.archlinux.org/index.php/Power_management/Suspend_and_hibernate#About_swap_partition.2Ffile_size"> a página wiki do Arch , portanto, tente outras etapas antes de aumentar tamanho de swap.
Se o seu problema é que você obtém uma inicialização limpa em vez do currículo esperado, no mínimo você provavelmente precisará definir um parâmetro de inicialização para localizar a imagem do disco
Encontre sua partição de swap:
grep swap /etc/fstab
para mim isso retorna (saída parcial)
# swap was on /dev/mmcblk0p3 during installation
em que /dev/mmcblk0p3
é a partição a ser especificada
Adicione um parâmetro de inicialização:
sudoedit /etc/default/grub
Para a linha que inicia GRUB_CMDLINE_LINUX_DEFAULT
add resume=/dev/YourSwapPartition
para a seção entre aspas (substitua pela partição que você identificou anteriormente). Usando meu exemplo:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=/dev/mmcblk0p3"
Sempre que você alterar este arquivo, você deve executar sudo update-grub
ou as alterações não terão efeito.
Agora você precisa reiniciar. Então você pode tentar hibernar, emitindo o comando:
sudo systemctl hibernate
Para continuar, pressione o botão liga / desliga e o sistema inicializará.
Se você ainda tiver problemas, inicie a depuração.
Eu incluo meu caso abaixo como exemplo, mas informações detalhadas sobre a depuração dos estados S podem ser encontradas neste blog e também este .
Defina mais alguns parâmetros de inicialização para capturar mais informações. Remova quiet
e splash
e adicione initcall_debug
e no_console_suspend
, o que fará com que as chamadas do sistema init sejam impressas no console para que você possa ver o que está errado. Eu configurei isso:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
O que me ajudou a ver o que estava errado no reinício da hibernação.
No meu caso, depois de continuar, perdi o WiFi, e o kernel claramente estava chateado, pois a maioria dos comandos (por exemplo, lendo qualquer coisa de /sys
, recarregando módulos ou qualquer comando systemctl
) não funcionaria - o processo pareceria iniciar e apenas pendurar (tudo isso seria retornado ao normal após a reinicialização, é claro). Assistindo o sistema muito lentamente desligar e ler todas as mensagens de depuração, notei que havia muitos problemas com "brcm", então eu imaginei que o meu módulo de driver sem fio da Broadcom era o culpado. Com certeza ajustei meu procedimento de hibernação para descarregar o módulo primeiro:
sudo modprobe -r brcmfmac
sudo systemctl hibernate
no currículo eu reinseri o módulo
sudo modprobe brcmfmac
E tudo funcionou perfeitamente. Eu também tenho que colocar na lista negra o módulo btsdio
que parece ser incompatível com brcmfmac
Atualização: hibernação usando um arquivo de troca em 17.04.
Mais uma vez com a ajuda da página wiki do Arch e alguns ajustes adicionais, consegui fazer a hibernação funcionar no dia 17.04 com um arquivo de troca. Isso exigiu um parâmetro de inicialização adicional, resume_offset=n
, em que n é o primeiro número em physical_offset
na saída de sudo filefrag -v /swapfile
:
$ sudo filefrag -v /swapfile
Filesystem type is: ef53
File size of /swapfile is 1425873920 (348114 blocks of 4096 bytes)
ext: logical_offset: physical_offset: length: expected: flags:
0: 0.. 32767: 34816.. 67583: 32768:
1: 32768.. 63487: 67584.. 98303: 30720:
....
Portanto, o parâmetro de inicialização adicional no meu caso é resume_offset=34816
. Você ainda precisa definir um parâmetro de inicialização para que a partição seja retomada. Esta será a partição raiz (ou qualquer partição em que seu arquivo de swap esteja localizado) Meus parâmetros são agora:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
Onde /dev/mmcblk1p2
é minha partição raiz (é mais provável que você seja algo como /dev/sda2
).
Durante a continuação, vi o carregamento da imagem com sucesso, mas no meu caso (apenas um exemplo - YMMVAPD), mais alguns drivers ( i2c_designware
) geraram alguns erros e obtive um congelamento completo do sistema no currículo. A hibernação funciona se eu descarregar esses módulos além de brcmfmac
, mas o sistema rapidamente se torna inutilizável sem esses módulos. Por isso, fiz uma espécie de script para descarregar os módulos com bugs e reinseri-los imediatamente no currículo:
# remove buggy modules
modprobe -r brcmfmac i2c_designware_platform i2c_designware_core &&
# hibernate
echo disk > /sys/power/state
# reinsert
modprobe i2c_designware_core i2c_designware_platform brcmfmac
Quando quero hibernar, corro sudo bash script
. Isso funciona muito bem.
TL; DR
Use systemd, defina um parâmetro de inicialização para retomar a troca, identifique drivers com problemas e descarregue-os antes de iniciar a hibernação. Se o sistema não puder funcionar por muito tempo sem esses módulos ou você precisar descarregar vários, pode ser mais fácil usar um script simples para iniciar a hibernação.