Eu publiquei esse tutorial originalmente no Fórum do Kurumin, do Guia do Hardware. Mas acho que pode ajudar mais gente. Assim, trouxe uma versão ligeiramente adaptada para cá.

Eu estava incomodado com a ausência de um recurso no meu notebook, que roda o Kurumin. Resolvi os problemas que tive originalmente com o gerenciamento de energia e periféricos, com o ACPI, mas fiquei pensando em como fazer funcionar o recurso de suspender/hibernar.

Então consegui. Funcionou para o Kurumin, mas usuários de outras distros que ainda não trazem a dupla kpowersave e powersave pré configuradas também poderão se beneficiar do passo a passo.

Antes de tudo, um alerta: se for tentar o que descrevo aqui, é por sua conta e risco. Estou tratando de descrever minha experiência pessoal com o assunto, que envolveu inclusive recuperar o sistema de arquivos e outras ações de manutenção, porque fiz na base da tentativa. Assim, se queimar seu notebook, PC, explodir sua casa, ou brigar com a(o) namorada(o)/esposa(o) por passar a noite recuperando o micro, a responsabilidade é toda sua.

Primeiro, conceituando: suspender e hibernar são “estados de energia” do conjunto processador/memória. Eles permitem um ?quase desligar” do PC ou notebook, para depois retornar exatamente à tela em que se estava trabalhando, muito mais rapidamente que um boot.

Não vou entrar em detalhes técnicos, porque não é a intenção desse texto. Mas pode-se dizer que “suspender” é equivalente a desligar tudo no computador, exceto a memória RAM, de forma que ela possa armazenar, enquanto durar a bateria (com um consumo muito reduzido de energia), as informações necessárias para retomar o trabalho do exato ponto em que o sistema parou. É também chamado, no Linux, de Suspender para a RAM.

Já o recurso de Hibernar, ou Suspender para o Disco, é mais radical. Trata-se de um desligamento completo do computador, no estado em que se encontra, mas usando o espaço em disco para armazenar um “snapshot” desse estado para que, ao voltar, o sistema pule a etapa de boot e simplesmente restaure a “fotografia” da tela, dos programas em execução, hardware etc, do mesmo jeito que estavam.

Em alguns micros há ainda o stand-by, um estado de energia anterior ao ?Suspender para a RAM?, onde o micro continua ligado, mas a energia para monitor, disco e processador é cortada, o que na prática causa um efeito similar a suspender. Tempos atrás (2001), o GDH publicou um artigo bastante completo (e basicamente ainda atual) sobre isso.

Bom, no Kurumin, se o ACPI está habilitado, as opções suspender (e stand-by, que na maioria das vezes é parecido) e hibernar até ficam disponíveis no aplicativo padrão, o Klaptop. Mas seu uso produz resultados bisonhos; provavelmente, diferentes em cada equipamento. No meu notebook, produziam um piscar de telas no modo suspender ou stand-by, e um boot com dados corrompidos na hibernação.

Lendo os fóruns de outras duas distribuições, Ubuntu e OpenSUSE, descobri que ambas têm suas soluções para isso. A primeira depende de alguma intervenção do usuário para o funcionamento correto; mas na segunda, até mesmo no LiveDVD, o suspender/hibernar já funciona.

Quem consegue isso é um pequeno conjunto de programas. Pelos testes que fiz, embora sejam instruções e programas diferentes, nenhum deles conseguiu, sozinho, a façanha de fazer funcionar o suspender/hibernar. O segredo foi juntar tudo 🙂

Por juntar tudo entenda-se complementar a instalação do Suspend2, que é um patch do kernel e trabalha em conjunto com o “hibernate”, e o uswsusp (com o qual vêm os binários s2ram e s2disk, cujas finalidades acho que ficam bem claras nos próprios nomes).

O Suspend2 depende de uma peculiaridade da imagem “initrd” de inicialização (um script compactado que algumas distros — incluindo o Kurumin — usam durante o boot) para funcionar. Mas não foi surpresa (foi mesmo tentativa e reza braba 🙂 descobrir que não só o kernel do Kurumin já vem com o patch do Suspend2 (como todo kernel baseado no vanilla), como a initrd também atende ao pré requisito, que é não montar o sistema de arquivos antes de checar se há uma imagem de hibernação gravada no disco, normalmente colocada na partição swap. E isso é ótimo, porque até hoje ainda não aprendi (=?não perdi o medo de?) recompilar um kernel 🙂

A partir daí, foi relativamente simples:

#apt-get install hibernate
#apt-get install uswsusp

Eventualmente, se o apt-get sugerir, instale também os pacotes initramfs-tools e vbetools. Eles podem ser necessários.

Com isso já deve ser possível efetuar um teste. No terminal, como root, execute:

# s2ram

O sistema deve encontrar o executável sem problemas. Caso receba a mensagem de arquivo não encontrado, tente com ?/usr/sbin/s2ram?. Tanto um quanto outro sem nenhum parâmetro. Se o ACPI estiver funcionando corretamente, o script identificará os parâmetros corretos para suspender o computador para a RAM. Os discos rígidos se desligam, o monitor, tudo, exceto a memória RAM. E ao toque de qualquer tecla ? e não apenas as teclas de ?despertar? dos teclados que as possuem ? o sistema vai retornar exatamente de onde parou.

O s2ram só funciona com ?máquinas conhecidas?. Internamente ele tem uma lista de fabricantes cuja ACPI é compatível com o Suspender para a RAM. Mas se ao tentar executar o comando ele reclamar de seu equipamento, há parâmetros adicionais que podem ajudar na solução do problema. O ?s2ram -f?, por exemplo, ajuda a forçar a suspensão. Mais sobre estes parâmetros pode ser encontrado neste link.

O s2disk também já está instalado, mas requer mais duas etapas. Primeiro, é preciso inserir uma instrução na linha de parâmetros para o kernel no lilo/grub. Depois de root=/dev/hdaX (sim, ?X? é o numero que aparece no seu computador aí…), acrescente:

resume2=swap:/dev/hdaY

(sem aspas e onde hdaY deve ser substituído por SUA partição swap).

Se estiver usando o lilo, não esqueça de dar o comando # lilo[enter] depois de editar o lilo.conf

OBS: a documentação original do uswsusp, e do grub (ou do lilo), dizem que o parâmetro a ser colocado no boot é ?resume=/dev/hdaY?. Mas como eu disse, aparentemente, somente juntando tudo a coisa poderá funcionar. Se para você a primeira forma não der resultado, tente dessa forma. Além do swap, há outras formas de suspender para o disco, como a criação de um arquivo específico ou usando uma outra partição. São mais trabalhosas e produzem o mesmo efeito, então, não falarei sobre elas.

É conveniente dar boot (completo) agora. Se tentar suspender para o disco antes disso, vai apenas conseguir corromper seu ?filesystem?, e ficar sem boot. Feito isso, é hora de experimentar o s2disk (ou ?/usr/sbin/s2ram?), como root… ESPERE: faça backup de tudo antes desse teste. E tenha à mão um liveCD do Kurumin ou de qualquer outra distribuição Linux para fazer um fsck.ext3 ou um reiserfsck caso seu boot pare de funcionar por corrompimento do sistema de arquivos.

Se correr tudo bem, o sistema vai desligar. Não se assuste se alguns módulos forem desligados. O bluetooth, por exemplo: alguns ?modules? e drivers são incompatíveis com os modos de suspensão, por isso são desligados pelo ?hibernate?. Ao reiniciar pelo botão ?power?, ele não dará um boot convencional: vai voltar à mesma tela em que estava, incluindo tudo que estava aberto (programas, arquivos, textos, planilhas), e em bem menos tempo que um boot convencional o faria.

Se até aí tudo correu tudo bem, pode ficar melhor. As mesmas distribuições que me serviram de modelo, também integraram o Suspender/Hibernar ao KDE. Mas não foi pelo Klaptop. Ele não se integra bem ao s2ram ou o s2disk. Então, acabei substituindo-o por outro aplicativo que se propõe a fazer o mesmo, mas cujo desenvolvimento anda bem mais ativo que o do Klaptop: o Kpowersave.

O único problema é que, para usar o Kpowersave, será preciso usar o daemon ?powersave?. Ele é concorrente do ?powernow? no monitoramento e controle de freqüência da CPU (quando o processador permitir velocidades diferentes, como é o caso da maioria dos atuais Semprons, Athlons, Pentiuns e Celerons ?escaláveis?.

Assim, se quiser acesso integrado ao suspender/hibernar no modo gráfico, esqueça o powernow e o Klaptop, e faça:

# apt-get install kpowersave

Com isso o apt faz as substituições para ter o aplicativo e o daemon instalados, rodando perfeitamente. Apenas uma alteração é necessária, para pemitir que o usuário kurumin (ou outro que você use no lugar dele) também tenha acesso às configurações de desempenho, suspender e hibernar:

Entre em:

Menu KDE -> Sistema -> Gnome System Tolls -> Gerenciar Usuários e Grupos

Na aba ?Grupos?, localize o grupo ?powerdev?. Clique em propriedades e acrescente nele o seu usuário.

Com mudança, não notei nenhuma diferença no gerenciamento de freqüências ou na temperatura (que sobe quanto maior é o uso) do processador, indicando que o ?powersave? faz o serviço tão bem quanto o ?powernow?. Há até uma discussão na comunidade de desenvolvedores mostrando que a tendência do Kpowersave é passar a sugerir mas não depender do powersave. Quem sabe, numa próxima versão, possamos escolher entre powernow e powersave…

E por falar em versões, uma última sugestão, para quem quiser arriscar, é usar o Kpowersave 0.7.2.X, que está no repositório unstable do Debian no momento em que escrevo. Ele traz mais opções de personalização de comportamentos, como suspender por teclas específicas, ao fechar a tela do notebook etc. Foi a única coisa que consertou o funcionamento do botão ?power? do meu note, que tinha parado de desligar corretamente (por shutdown) o sistema. (O problema é que a instalação a partir do unstable pode requerer outras bibliotecas, o que pode ser prejudicial a uma instalação do Kurumin, por exemplo). Mas aqui, está funcionando normalmente.

Referências:
S2disk no OpenSUSE
S2ram no OpenSUSE
Suspend
Mihai Bazon Blog
http://blog.paulbetts.org/index.php/2007/02/11/fixing-software-suspend-hibernate-with-uswsusp-in-ubuntu-feisty-and-edgy