Guia Completo: Configurar Hibernação no Ubuntu 24.04 com Swap File
Versão: Ubuntu 24.04 LTS (Noble Numbat)
Kernel: 6.17+
Swap: Arquivoswap.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.imgde 36GB) - Swap ativo (
swapon --showmostra 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
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
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}'
Exemplo:
14241792⚠️ Importante: Se o
filefragretornar algo como14241792.., 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
Localize a linha:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
Adicione no final (mantenha o que já existe):
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash resume=UUID=58bf371d-01d1-4316-98c3-ef845c1825f2 resume_offset=14241792"
⚠️ Não apague o
quiet splashou outros parâmetros existentes!
Salve (Ctrl+O, Enter, Ctrl+X) e atualize:
sudo update-grub
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.
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
Regenere o initramfs:
sudo update-initramfs -u -k all
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
✅ Verifique e remova scripts desnecessários
# Listar scripts no initramfs
ls -la /etc/initramfs-tools/scripts/init-premount/
Se encontrar um arquivo como resume_swapfile, remova:
sudo rm /etc/initramfs-tools/scripts/init-premount/resume_swapfile
sudo update-initramfs -u -k all
Regra de ouro: O kernel lê
resumeeresume_offsetdo 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
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
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;
}
});
Salve (Ctrl+O, Enter, Ctrl+X).
Reiniciar o systemd-logind
sudo systemctl restart systemd-logind
⚠️ Isso pode deslogar sua sessão gráfica. Salve tudo antes.
Passo 5: Reboot e teste
sudo reboot
Após reiniciar, verifique:
5.1 Verificar parâmetros do kernel
cat /proc/cmdline | grep resume
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
Esperado:
s "yes"Se retornar
s "no", vá para a seção Debug.
5.3 Testar o hibernate
sudo systemctl hibernate
O sistema deve:
- Salvar o estado da RAM no swap.img
- Desligar completamente
- 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
Esperado:
-
/proc/cmdlinemostraresume=UUID=... resume_offset=... -
/sys/power/resumemostra259:5(ou similar, major:minor do device) -
/sys/power/resume_offsetmostra seu offset -
/sys/power/statemostrafreeze mem disk
Check 2: Verificar swap
swapon --show
free -h
Esperado: Swap ativo e tamanho >= RAM.
Check 3: Verificar Secure Boot
mokutil --sb-state
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
Se retornar Not authorized:
- O arquivo
.pklaestá sendo usado (formato antigo) - Ou a regra
.rulesestá no lugar errado - Ou o
systemd-logindnão foi reiniciado
Solução:
- Remova qualquer
.pkla:
sudo rm -f /etc/polkit-1/localauthority/50-local.d/*.pkla
- Crie o
.rules(Passo 4) - Reinicie o
systemd-logind(Passo 4)
Check 5: Verificar logs do systemd-logind
journalctl -u systemd-logind -n 50
Procure por mensagens de erro relacionadas a hibernate.
Check 6: Verificar se o initramfs tem warning
sudo update-initramfs -u -k all
Se aparecer:
W: initramfs-tools configuration sets RESUME=UUID=...
W: but no matching swap device is available.
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
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
🎯 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
- Arch Wiki - Hibernation
- Ubuntu Wiki - Hibernate
- Polkit Documentation
- Kernel Documentation - Power Management
📝 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 argumente scriptresume_swapfile
Autor: Hallan + Kimi (sessão de debug colaborativa)
Licença: MIT - Use e modifique à vontade!
Top comments (0)