DEV Community

Hállan Costa
Hállan Costa

Posted on

Guia Completo: Configurar Hibernação no Ubuntu 24.04 com Swap File

Guia Completo: Configurar Hibernação no Ubuntu 24.04 com Swap File

Versão: Ubuntu 24.04 LTS (Noble Numbat)

Kernel: 6.17+

Swap: Arquivo swap.img (não partição dedicada)

Atualizado: Julho 2026


⚠️ O que torna este guia diferente

O Ubuntu 24.04 mudou silenciosamente o sistema de permissões do polkit. A maioria dos tutoriais na internet usa o formato .pkla (antigo), que não funciona mais no Ubuntu 24.04. Este guia cobre:

  • Configuração com swap file (não partição)
  • O bug do initramfs com swap files
  • O novo formato de regras do polkit (JavaScript .rules)
  • Erro sh: write error: invalid argument — e como evitá-lo
  • Debug passo a passo quando algo dá errado

Pré-requisitos

  • Ubuntu 24.04 LTS instalado
  • Swap file já criado (ex: /swap.img de 36GB)
  • Swap ativo (swapon --show mostra o arquivo)
  • Swap >= RAM física (recomendado para hibernação segura)

Verificar pré-requisitos

# Distro
cat /etc/os-release | grep PRETTY_NAME

# Swap ativo
swapon --show

# RAM total
free -h
Enter fullscreen mode Exit fullscreen mode

Passo 1: Coletar informações do sistema

Você precisa de dois valores:

1.1 UUID da partição raiz (onde o swap.img está)

sudo findmnt -no UUID -T /swap.img
Enter fullscreen mode Exit fullscreen mode

Exemplo: 58bf371d-01d1-4316-98c3-ef845c1825f2

1.2 Offset físico do swap.img no disco

sudo filefrag -v /swap.img | awk 'NR==4{gsub(/\./,"");print $4}'
Enter fullscreen mode Exit fullscreen mode

Exemplo: 14241792

⚠️ Importante: Se o filefrag retornar algo como 14241792.., remova os dois pontos e use só o número.


Passo 2: Configurar o GRUB

No Ubuntu, os parâmetros do kernel para hibernação vão no GRUB.

sudo nano /etc/default/grub
Enter fullscreen mode Exit fullscreen mode

Localize a linha:

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
Enter fullscreen mode Exit fullscreen mode

Adicione no final (mantenha o que já existe):

GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=58bf371d-01d1-4316-98c3-ef845c1825f2 resume_offset=14241792"
Enter fullscreen mode Exit fullscreen mode

⚠️ Não apague o quiet splash ou outros parâmetros existentes!

Salve (Ctrl+O, Enter, Ctrl+X) e atualize:

sudo update-grub
Enter fullscreen mode Exit fullscreen mode

Passo 3: Configurar o initramfs (Atenção ao bug!)

❌ O que NÃO fazer (erro comum)

Não crie um arquivo /etc/initramfs-tools/conf.d/resume com resume_offset. Isso causa o warning:

W: initramfs-tools configuration sets RESUME=UUID=...
W: but no matching swap device is available.
Enter fullscreen mode Exit fullscreen mode

O initramfs procura uma partição de swap com aquele UUID, mas você tem um arquivo de swap. O warning é inofensivo, mas confuso.

✅ O que fazer

Simplesmente não crie o arquivo resume. Deixe o initramfs gerar sem ele — o kernel vai ler os parâmetros do GRUB diretamente.

Se você já criou o arquivo, remova:

sudo rm -f /etc/initramfs-tools/conf.d/resume
Enter fullscreen mode Exit fullscreen mode

Regenere o initramfs:

sudo update-initramfs -u -k all
Enter fullscreen mode Exit fullscreen mode

Saída esperada (sem warnings):

update-initramfs: Generating /boot/initrd.img-6.17.0-35-generic

⚠️ Passo 3.5: NÃO crie scripts de resume no initramfs!

🚨 O erro sh: write error: invalid argument

Alguns tutoriais antigos sugerem criar um script em /etc/initramfs-tools/scripts/init-premount/resume_swapfile para setar o resume e resume_offset manualmente durante o boot.

Isso é desnecessário e causa erro!

Quando o kernel já recebe resume e resume_offset via GRUB (Passo 2), ele configura automaticamente. Se um script tentar escrever de novo em /sys/power/resume ou /sys/power/resume_offset, o kernel retorna:

sh: write error: invalid argument
Enter fullscreen mode Exit fullscreen mode

✅ Verifique e remova scripts desnecessários

# Listar scripts no initramfs
ls -la /etc/initramfs-tools/scripts/init-premount/
Enter fullscreen mode Exit fullscreen mode

Se encontrar um arquivo como resume_swapfile, remova:

sudo rm /etc/initramfs-tools/scripts/init-premount/resume_swapfile
sudo update-initramfs -u -k all
Enter fullscreen mode Exit fullscreen mode

Regra de ouro: O kernel lê resume e resume_offset do GRUB automaticamente. Não crie scripts para isso.


Passo 4: Configurar o Polkit (O truque do Ubuntu 24.04!)

🚨 A pegadinha

O Ubuntu 24.04 usa polkit 122+, que migrou do formato .pkla (legacy) para regras JavaScript (.rules).

Tutoriais antigos usam:

/etc/polkit-1/localauthority/50-local.d/com.ubuntu.enable-hibernate.pkla
Enter fullscreen mode Exit fullscreen mode

Isso NÃO funciona mais no Ubuntu 24.04. O arquivo é simplesmente ignorado.

✅ Solução: Usar .rules (JavaScript)

sudo mkdir -p /etc/polkit-1/rules.d
sudo nano /etc/polkit-1/rules.d/85-enable-hibernate.rules
Enter fullscreen mode Exit fullscreen mode

Cole:

polkit.addRule(function(action, subject) {
    if (action.id == "org.freedesktop.login1.hibernate" ||
        action.id == "org.freedesktop.login1.hibernate-multiple-sessions" ||
        action.id == "org.freedesktop.login1.handle-hibernate-key") {
        return polkit.Result.YES;
    }
});
Enter fullscreen mode Exit fullscreen mode

Salve (Ctrl+O, Enter, Ctrl+X).

Reiniciar o systemd-logind

sudo systemctl restart systemd-logind
Enter fullscreen mode Exit fullscreen mode

⚠️ Isso pode deslogar sua sessão gráfica. Salve tudo antes.


Passo 5: Reboot e teste

sudo reboot
Enter fullscreen mode Exit fullscreen mode

Após reiniciar, verifique:

5.1 Verificar parâmetros do kernel

cat /proc/cmdline | grep resume
Enter fullscreen mode Exit fullscreen mode

Deve mostrar: resume=UUID=... resume_offset=...

5.2 Verificar se o hibernate está habilitado

busctl call org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager CanHibernate
Enter fullscreen mode Exit fullscreen mode

Esperado: s "yes"

Se retornar s "no", vá para a seção Debug.

5.3 Testar o hibernate

sudo systemctl hibernate
Enter fullscreen mode Exit fullscreen mode

O sistema deve:

  1. Salvar o estado da RAM no swap.img
  2. Desligar completamente
  3. Ao ligar, restaurar a sessão exatamente como estava

Não deve aparecer sh: write error: invalid argument.


🔧 Debug: Quando o CanHibernate retorna "no"

Se busctl call ... CanHibernate retornar s "no", execute este checklist:

Check 1: Verificar parâmetros do kernel

cat /proc/cmdline
cat /sys/power/resume
cat /sys/power/resume_offset
cat /sys/power/state
Enter fullscreen mode Exit fullscreen mode

Esperado:

  • /proc/cmdline mostra resume=UUID=... resume_offset=...
  • /sys/power/resume mostra 259:5 (ou similar, major:minor do device)
  • /sys/power/resume_offset mostra seu offset
  • /sys/power/state mostra freeze mem disk

Check 2: Verificar swap

swapon --show
free -h
Enter fullscreen mode Exit fullscreen mode

Esperado: Swap ativo e tamanho >= RAM.

Check 3: Verificar Secure Boot

mokutil --sb-state
Enter fullscreen mode Exit fullscreen mode

Se estiver enabled, o hibernate pode ser bloqueado. Desative no BIOS se necessário.

Check 4: Verificar autorização do polkit

pkcheck --action-id org.freedesktop.login1.hibernate --process $$ --allow-user-interaction 2>&1
Enter fullscreen mode Exit fullscreen mode

Se retornar Not authorized:

  • O arquivo .pkla está sendo usado (formato antigo)
  • Ou a regra .rules está no lugar errado
  • Ou o systemd-logind não foi reiniciado

Solução:

  1. Remova qualquer .pkla:
   sudo rm -f /etc/polkit-1/localauthority/50-local.d/*.pkla
Enter fullscreen mode Exit fullscreen mode
  1. Crie o .rules (Passo 4)
  2. Reinicie o systemd-logind (Passo 4)

Check 5: Verificar logs do systemd-logind

journalctl -u systemd-logind -n 50
Enter fullscreen mode Exit fullscreen mode

Procure por mensagens de erro relacionadas a hibernate.

Check 6: Verificar se o initramfs tem warning

sudo update-initramfs -u -k all
Enter fullscreen mode Exit fullscreen mode

Se aparecer:

W: initramfs-tools configuration sets RESUME=UUID=...
W: but no matching swap device is available.
Enter fullscreen mode Exit fullscreen mode

Solução: Remova /etc/initramfs-tools/conf.d/resume e regenere.

Check 7: Verificar scripts desnecessários no initramfs

ls -la /etc/initramfs-tools/scripts/init-premount/
lsinitramfs /boot/initrd.img-$(uname -r) | grep -i resume
Enter fullscreen mode Exit fullscreen mode

Se encontrar resume_swapfile ou similar, remova (veja Passo 3.5).


📋 Comandos rápidos (cheat sheet)

# Coletar info
sudo findmnt -no UUID -T /swap.img
sudo filefrag -v /swap.img | awk 'NR==4{gsub(/\./,"");print $4}'

# Configurar GRUB
sudo nano /etc/default/grub
sudo update-grub

# Limpar initramfs (se necessário)
sudo rm -f /etc/initramfs-tools/conf.d/resume
sudo rm -f /etc/initramfs-tools/scripts/init-premount/resume_swapfile
sudo update-initramfs -u -k all

# Configurar polkit (Ubuntu 24.04)
sudo mkdir -p /etc/polkit-1/rules.d
sudo nano /etc/polkit-1/rules.d/85-enable-hibernate.rules
sudo systemctl restart systemd-logind

# Testar
busctl call org.freedesktop.login1 /org/freedesktop/login1 org.freedesktop.login1.Manager CanHibernate
sudo systemctl hibernate

# Debug
cat /proc/cmdline
cat /sys/power/resume
cat /sys/power/resume_offset
pkcheck --action-id org.freedesktop.login1.hibernate --process $$ --allow-user-interaction 2>&1
journalctl -u systemd-logind -n 50
ls -la /etc/initramfs-tools/scripts/init-premount/
lsinitramfs /boot/initrd.img-$(uname -r) | grep -i resume
Enter fullscreen mode Exit fullscreen mode

🎯 Diferenças: Ubuntu vs Pop!_OS

Passo Ubuntu Pop!_OS
Bootloader GRUB systemd-boot
Kernel params Edita /etc/default/grub + update-grub kernelstub -a
Polkit (24.04+) .rules (JavaScript) .rules (JavaScript)
Initramfs update-initramfs kernelstub + update-initramfs

❓ FAQ

Preciso de swap maior que a RAM?

Recomendado: Sim, pelo menos igual à RAM. Se você tem 32GB RAM, use 32GB+ de swap. O kernel precisa de espaço para salvar toda a RAM + algum overhead.

Posso usar swapfile em BTRFS?

Sim, mas o offset é calculado de forma diferente. Use btrfs inspect-internal map-swapfile em vez de filefrag.

O hibernate funciona com criptografia LUKS?

Sim, mas o processo é diferente. O swap precisa estar dentro do container LUKS ou usar um swap criptografado separado. Não coberto neste guia.

O que acontece se o swap estiver cheio?

O hibernate falha e o sistema continua ligado. Por isso é recomendado ter swap >= RAM.

Posso hibernar sem sudo?

Com a regra do polkit configurada, usuários normais podem hibernar via interface gráfica (botão de hibernate no menu de energia).

Por que aparece sh: write error: invalid argument?

Isso acontece quando um script no initramfs (ex: resume_swapfile) tenta escrever em /sys/power/resume ou /sys/power/resume_offset, mas o kernel já configurou esses valores via parâmetros do GRUB. A solução é remover o script (veja Passo 3.5).


📚 Referências


📝 Changelog

  • 2026-07-06 - Versão inicial com foco no Ubuntu 24.04, polkit .rules e swap file
  • 2026-07-06 - Adicionado: Erro sh: write error: invalid argument e script resume_swapfile

Autor: Hallan + Kimi (sessão de debug colaborativa)

Licença: MIT - Use e modifique à vontade!

Top comments (0)