Hibernação usando systemctl
e fazendo funcionar em casos difíceis
Para mim, pm-hibernate
sempre falha. Após alguns ajustes, consegui hibernar usando a interface do systemd (sistema init no 16.04 e acima). Também consegui fazê-lo funcionar no 17.04 com um arquivo de troca. Este estudo de caso pode ser útil para outras pessoas com problemas.
Primeira tentativa:
sudo systemctl hibernate
Se isso falhar, inicie a solução de problemas: no estado de hibernação (HTD ou ACPI S4), o estado da máquina é gravado no disco para que não seja necessária energia para preservá-lo. O estado é gravado em uma partição de troca ou em um arquivo de troca. Nota: se usar BTRFS, NÃO tente usar um arquivo de permuta, pois isso pode causar corrupção no sistema de arquivos
Sua partição de swap ou arquivo de troca pode precisar do mesmo tamanho da RAM para permitir a hibernação, mas há uma boa chance de você poder hibernar se tiver pelo menos 2/5 do tamanho da RAM, de acordo com a página wiki do Arch , tente outras etapas antes de aumentar o tamanho da troca.
Se o seu problema é obter uma inicialização limpa em vez do resumo esperado, no mínimo você provavelmente precisará definir um parâmetro de inicialização para encontrar a imagem do disco
Encontre sua partição swap:
grep swap /etc/fstab
para mim isso retorna (saída parcial)
# swap was on /dev/mmcblk0p3 during installation
onde /dev/mmcblk0p3
é a partição para especificar
Adicione um parâmetro de inicialização:
sudoedit /etc/default/grub
Para a linha inicial, GRUB_CMDLINE_LINUX_DEFAULT
adicione resume=/dev/YourSwapPartition
à 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.
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 neste .
Defina mais alguns parâmetros de inicialização para capturar mais informações. Remova quiet
e splash
adicione initcall_debug
e o no_console_suspend
que fará com que as chamadas do sistema init sejam impressas no console para que você possa ver o que está errado. Eu defini isso:
GRUB_CMDLINE_LINUX_DEFAULT="resume=/dev/mmcblk0p3 no_console_suspend initcall_debug"
O que me ajudou a ver o que estava errado no resumo da hibernação.
No meu caso, após retomar, perdi o WiFi, e o kernel estava claramente chateado, pois a maioria dos comandos (por exemplo, ler qualquer coisa /sys
, recarregar módulos ou qualquer systemctl
comando) não funcionaria - o processo parecia iniciar e travar (tudo isso seria voltou ao normal após a reinicialização, é claro). Observando o sistema muito lentamente sendo desligado e lendo todas as mensagens de depuração, notei que havia muitos problemas com "brcm", então achei que meu módulo de driver sem fio 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 reinsiro o módulo
sudo modprobe brcmfmac
E tudo funcionou perfeitamente. Eu também tenho que colocar na lista negra o btsdio
módulo que parece ser incompatível combrcmfmac
Atualização: Hibernação usando um arquivo de swap no 17.04.
Mais uma vez, com a ajuda da página wiki do Arch e alguns ajustes adicionais, consegui que a hibernação funcionasse no 17.04 com um arquivo de troca. Isso exigiu um parâmetro de inicialização adicional, em resume_offset=n
que n é o primeiro número 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 a partição retomar. Essa será a partição raiz (ou qualquer partição em que seu arquivo de troca esteja localizado). Meus parâmetros agora são:
GRUB_CMDLINE_LINUX_DEFAULT="no_console_suspend initcall_debug resume=/dev/mmcblk1p2 resume_offset=34816"
Onde /dev/mmcblk1p2
está minha partição raiz (é mais provável que a sua seja algo parecido /dev/sda2
).
Durante o currículo, vi a imagem sendo carregada com êxito, mas no meu caso (apenas um exemplo - YMMVAPD), mais alguns drivers ( i2c_designware
) geraram alguns erros e eu tive 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, criei um tipo de script para descarregar os módulos com erros e imediatamente reinseri-los 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 da troca, identifique os drivers com erros e descarregue-os antes de iniciar a hibernação. Se o sistema não 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.