Hibernar e retomar a partir de um arquivo de troca

23

Eu configurei uma nova instalação do Ubuntu em um Notebook para usar um arquivo de troca, em vez de usar uma partição de troca.

Por padrão, não é possível fazer o Ubuntu hibernar usando um arquivo de troca, então tentei este tutorial , mas é específico para o grub1 , e o Ubuntu agora usa o grub2 .

Alguém sabe como fazer isto?

tfmoraes
fonte

Respostas:

21

Hibernar com arquivo de permuta usando uswusp

Embora seja possível hibernar para trocar arquivos, ele supostamente funciona com a hibernação do systemd definindo parâmetros do kernel. No entanto, como não consegui retomar, mudei para o uswsusp (suspensão do software userspace) . Aqui estão as etapas que eu usei no Ubuntu 17.04 / 17.10.

Crie o arquivo de permuta

Os comandos para criar um arquivo de troca 4GiB formatado, montado e adicionado a /etc/fstab:

sudo fallocate -l 4g /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab

Verificar partição de arquivo de permuta

sudo findmnt -no SOURCE,UUID -T /swapfile
> /dev/sda1 11cc33ee-1234-abcd-1234-ddeeff112233

Instalar a suspensão do software do espaço do usuário (uswsusp)

sudo apt install uswsusp

Configurar uswsusp

Para criar /etc/uswsusp.confe recriar initramfs:

sudo dpkg-reconfigure -pmedium uswsusp
  • Yespara ' Continuar sem um espaço de troca válido? ' (O assistente ainda não definiu o arquivo de troca.)
  • Selecione a partição em que o arquivo de troca reside, faça referência cruzada com detalhes findmntacima. ( Nota: não o próprio arquivo de troca )

Nota: Qualquer alteração feita manualmente /etc/uswsusp.confexigirá a recriação initramfsposterior com este comando:

sudo update-initramfs -u

Teste o hibernate do uswusp

sudo s2disk

Deve haver snapshotmensagens na tela em hibernação e retomada.

Use s2disk com hibernação systemd

Por padrão, o systemd usará seus próprios comandos de hibernação, portanto, substitua-os pelos comandos uswusp, substituindo o systemd-hibernate.service:

sudo systemctl edit systemd-hibernate.service

No editor de texto que é aberto, coloque o seguinte texto (o ExecStart em branco é necessário). Em seguida, salve e saia:

[Service]
ExecStart=
ExecStart=/usr/sbin/s2disk 
ExecStartPost=/bin/run-parts -a post /lib/systemd/system-sleep

Isso criará um /etc/systemd/system/systemd-hibernate.service.d/override.confarquivo com detalhes de substituição.

Teste o sistema hibernar:

systemctl hibernate 

Nota: Para verificar se o systemd override.conffoi criado, carregado e sem erros, execute:

systemctl status systemd-hibernate.service

Referências:

Cas
fonte
Essas instruções parecem funcionar, mas a hibernação do systemd não está funcionando para mim. Você já testou isso sozinho? Caso isso ExceStart=run-parts -a post /lib/systemd/system-sleepsejaExceStartPost=run-parts -a post /lib/systemd/system-sleep
Joaquín Aramendia
Foi testado e funcionando, mas talvez essa adição seja necessária. Eu atualizei minha resposta.
Cas
Isso não parece muito certo. A enableopção de systemctl links simbólicos de /etc/systemd/system/para /lib/systemd/system/. Você nunca deve ser copiando diretamente/etc/systemd/system/
Auspex
1
Não consegui fazer isso funcionar 😞. Instalei o swapfile, instalei e configurei o uswsusp, mas sudo s2diskapenas os logs Saving snapshot, que desligam a tela, travam por ~ 5 minutos e, em seguida, desligam o computador. No entanto, depois que eu o ligo, ele inicializa normalmente como se não houvesse hibernação.
M93a
1
Eu acho que essa linha sudo findmnt -no SOURCE,UUID -T /mnt/4GiB.swapdeve ser alterada parasudo findmnt -no SOURCE,UUID -T /swapfile
user1915011 10/10
12

Aqui está o que eu fiz para fazê-lo funcionar com o Ubuntu 18.04.

  • Faça com que você /swapfiletenha pelo menos o tamanho da sua RAM

    sudo swapoff /swapfile
    sudo dd if=/dev/zero of=/swapfile bs=$(cat /proc/meminfo | grep MemTotal | grep -oh '[0-9]*') count=1024 conv=notrun
    sudo mkswap /swapfile
    sudo swapon /swapfile
    
  • Observe o UUID da partição que contém o seu /swapfile:

    $ sudo findmnt -no SOURCE,UUID -T /swapfile
    /dev/nvme0n1p5 20562a02-cfa6-42e0-bb9f-5e936ea763d0
    
  • Reconfigure o pacote uswsusppara usar corretamente o arquivo de troca:

    sudo dpkg-reconfigure -pmedium uswsusp
    # Answer "Yes" to continue without swap space
    # Select "/dev/disk/by-uuid/20562a02-cfa6-42e0-bb9f-5e936ea763d0" replace the UUID with the result from the previous findmnt command
    # Encrypt: "No"
    
  • Edite o serviço de hibernação do SystemD usando sudo systemctl edit systemd-hibernate.servicee preencha-o com o seguinte conteúdo:

    [Service]
    ExecStart=
    ExecStartPre=-/bin/run-parts -v -a pre /lib/systemd/system-sleep
    ExecStart=/usr/sbin/s2disk
    ExecStartPost=-/bin/run-parts -v --reverse -a post /lib/systemd/system-sleep
    
  • Observe o deslocamento do currículo /swapfile:

    $ sudo swap-offset /swapfile
    resume offset = 34818
    
  • Configure o Grub para continuar a partir do arquivo de swap editando /etc/default/grube modificando a seguinte linha:

    GRUB_CMDLINE_LINUX_DEFAULT="resume=UUID=20562a02-cfa6-42e0-bb9f-5e936ea763d0 resume_offset=34818 quiet splash"
    
  • Atualizar o Grub:

    sudo update-grub
    
  • Crie o seguinte /etc/initramfs-tools/conf.d/resume:

    RESUME=UUID=20562a02-cfa6-42e0-bb9e-5e936ea763d0 resume_offset=34816
    # Resume from /swapfile
    
  • Atualize initramfs:

    sudo update-initramfs -u -k all
    

Agora você pode hibernar com sudo systemctl hibernate.

Pode-se também criar esses scripts:

    sudo tee /usr/local/bin/gotosleep <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo /usr/sbin/s2both
    EOF
    sudo chmod +x /usr/local/bin/gotosleep
    sudo tee /usr/local/bin/gotohibernation <<EOF
    dbus-send --type=method_call --dest=org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.Lock
    sleep 2
    sudo systemctl hibernate
    EOF
    sudo chmod +x /usr/local/bin/gotohibernation

Para que você possa dormir gotosleepou hibernar com ele gotohibernation.

Você deve ser capaz de executar sudo s2both, sudo s2rame sudo systemctl hibernatesem ter de introduzir a palavra-passe para os scripts anteriores ao trabalho.

Você pode fazer isso, por exemplo, criando um powerdevgrupo, adicione seu usuário atual e configure a seguinte configuração de sudoers (edite-o com sudo visudo -f /etc/sudoers.d/powerdev):

     %powerdev ALL=NOPASSWD: /usr/sbin/s2both, /usr/sbin/s2ram, /bin/systemctl hibernate

Documentação utilizada:

Anthony O.
fonte
Obrigado por isso! Eu tentei muitos métodos, mas apenas o seu funciona para mim no Ubuntu 18.04 :)
jirislav
Isso quase me faz sentir vontade de tentar a hibernação novamente - tive um problema com corrupção ocasional nos meus discos, o que aparentemente estava relacionado ao processo de hibernação. Você encontrou algo assim?
Charles Green
Obrigado, @ Anthony! Eu tentei muitas coisas para fazer o hibernar funcionar. A sua foi a solução final que fez. Parece -me muito estranho que isso não esteja configurado corretamente imediatamente. :(
Mike Williamson
Obrigado por este guia. Depois de seguir as etapas e tentar hibernar usando o $ sudo systemctl hibernate, meu laptop acorda alguns segundos depois de tentar hibernar. / var / log / syslog mostra muitos erros, mas estes parecem os mais relevantes: - Falha ao definir o modo de economia de energia para a saída eDP-1: Permissão negada ... - O objeto .Gjs_AppIndicatorIconActor__1 (0x561c60a4d150) já foi finalizado. Impossível definir qualquer propriedade para ele. ... - s2disk: não foi possível usar o dispositivo de retomada (tente swapon -a). Razão: Não existe esse dispositivo - systemd-hibernate.service: Processo principal encerrado, código = encerrado, ...
Jelani Nelson 11/07
1
Esta é a única solução que funcionou para mim. Conectado apenas para votar esta resposta. Obrigado.
dpetrini 20/08
8

Fiz uma rápida leitura do tutorial e, se entendi corretamente, você só precisa especificar as resumeopções para a linha de comando do Linux. Com o Grub2 é realmente simples, e suas alterações serão sempre preservadas. Você precisa editar o /etc/default/grubarquivo, especificamente esta linha:

GRUB_CMDLINE_LINUX="resume=... resume_offset=..."

Depois disso, execute sudo update-grubas alterações entrarem em vigor.

A alteração GRUB_CMDLINE_LINUXnão afetará outras instalações Linux que você possui (porque /etc/grub.d/30_os-probernão usa essa variável).

Sobre o problema que você está tendo: a partição do arquivo de troca é criptografada? Nesse caso, a hibernação não funcionará. Caso contrário, a saída de filefrag -v /swapfilepode ser útil.

Andrea Corbellini
fonte
Obrigado! Eu vou tentar. Mas acho que ele configura todas as entradas do linux no grub com esta linha.
Tfmoraes 13/10/10
Não se esqueça: depois de mudar, /etc/default/grubvocê precisa executar update-grub.
janc
@tfmoraes: por que você não deseja que isso seja adicionado a todas as entradas do Linux?
JanC 13/10/10
@ JanC: Porque eu posso ter outras distribuições Linux instaladas.
Tfmoraes 13/10/10
1
@ didi_X8 esse comentário foi escrito há 8 anos. É possível que as coisas tenham mudado desde então. Obrigado por compartilhar.
Andrea Corbellini