E fechando o ano de 2012, um último artigo sobre hibernação no Ubuntu 12.10, que é pra lembrar de entrar 2013 bem descansado :-)
Escrevo um artigo sobre a utilização do laptop sem ficar desligando, a guerra dos 100 dias, e seus benefícios e então me deparo justamente com um upgrade de sistema que não funciona com a hibernação. E em menos de 6 meses.
Tudo começou quando decidi passar o laptop de 32 bits para 64 (processador Intel Core i3). Minha limitação para não realizar tal tarefa antes era o sistema de SSL VPN, da Juniper, usado pela empresa para conectar remotamente. O sistema de VPN inicia um applet java que instala e roda uma biblioteca de 32 bits.
Já fazia algum tempo, eu vinha testando rodar isso em um modo "híbrido", com a funcionalidade de multi-arch ou com chroot de um ambiente de 32 bits. Como tudo estava funcionando nos testes, resolvi mudar o sistema aproveitando as férias de fim de ano.
Eu estava com Ubuntu 12.04 para i386, LTS, e resolvi instalar o 12.10 para amd64. Eu poderia ter escolhido um upgrade do sistema, que aparentemente funcionaria, mas resolvi fazer uma instalação nova, o que acabou me gerando a perda de dados do /home, mas essa é outra história.
Ao finalizar a instalação do 12.10 (e recuperar minha partição perdida - mas não completamente, duh!), eu me deparei com um kernel mais novo: 3.5.0-21-lowlatency. Anteriormente eu estava rodando o 3.2.7-pf (post factum). Não consegui fazer funcionar a hibernação de jeito nenhum. Nem com pm-suspend, nem com pm-hibernate, nem com o novo método, o pm-suspend-hybrid. Em todos os casos o sistema travava logo no início da hibernação e me deixava com uma tela preta, sistema operacional travado, mas máquina ligada. Somente um procedimento de "dedo-off" conseguia desligar o laptop. E sem nenhum log de problema por parte do ACPI.
Tentei recompilar o kernel, instalar outra versão, a versão sem lowlatency, enfim de tudo. Mas sem resultados.
Por um acaso, notei um erro no sistema pelo "dmesg". No começo achei que era problema da minha memória RAM.
[ 5.974345] BUG: unable to handle kernel paging request at 0000000000ff1000
[ 5.974351] IP: [] memcpy+0xd/0x110
[ 5.974359] PGD 1b0dbc067 PUD 1b0db9067 PMD 0
[ 5.974363] Oops: 0000 [#1] SMP
[ 5.974366] CPU 2
[ 5.974367] Modules linked in: snd_page_alloc drm_kms_helper serio_raw drm
coretemp cfg80211 kvm_intel i2c_algo_bit kvm videobuf2_vmalloc videobuf2_memops
mxm_wmi wmi sony_laptop(+) intel_ips microcode mac_hid video mei lpc_ich btusb
bluetooth xfs firewire_ohci firewire_core crc_itu_t sdhci_pci sdhci atl1c
[ 5.974385]
[ 5.974387] Pid: 637, comm: modprobe Not tainted 3.5.0-17-generic #28-Ubuntu
Sony Corporation VPCS110GB/VAIO
[ 5.974390] RIP: 0010:[] [] memcpy+0xd/0x110
[ 5.974394] RSP: 0018:ffff8801b0d31c40 EFLAGS: 00010246
[ 5.974395] RAX: ffff8801b0d31c90 RBX: ffff8801ae9545c0 RCX: 0000000000000001
[ 5.974397] RDX: 0000000000000000 RSI: 0000000000ff1000 RDI: ffff8801b0d31c90
[ 5.974398] RBP: ffff8801b0d31c58 R08: ffff8801b2218200 R09: 000000018040003e
[ 5.974399] R10: 0000000000000000 R11: ffffffff813ad3e5 R12: ffff8801b0d31c90
[ 5.974401] R13: ffff8801b0d31caf R14: ffff8801b22f4800 R15: 0000000000000135
[ 5.974403] FS: 00007fb7feb92700(0000) GS:ffff8801bbc80000(0000) knlGS:0000000000000000
[ 5.974404] CS: 0010 DS: 0000 ES: 0000 CR0: 000000008005003b
[ 5.974405] CR2: 0000000000ff1000 CR3: 00000001b271d000 CR4: 00000000000007e0
[ 5.974407] DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
[ 5.974408] DR3: 0000000000000000 DR6: 00000000ffff0ff0 DR7: 0000000000000400
[ 5.974410] Process modprobe (pid: 637, threadinfo ffff8801b0d30000, task ffff8801b0d8c500)
[ 5.974411] Stack:
[ 5.974413] ffffffffa01a8893 0000000000000009 0000000000000035 ffff8801b0d31ce8
[ 5.974416] ffffffffa01a9b69 ffff8801b16986a0 ffff8801b0067800 ffff8801b0d31c80
[ 5.974419] ffffffff00000000 0000000000000009 0000000000000000 0000000000000000
[ 5.974422] Call Trace:
[ 5.974430] [] ? sony_nc_buffer_call.constprop.12+0x43/0xa0 [sony_laptop]
[ 5.974435] [] sony_nc_function_setup+0x2f9/0xab0 [sony_laptop]
[ 5.974440] [] sony_nc_add+0x1f8/0x660 [sony_laptop]
[ 5.974446] [] ? sysfs_do_create_link+0xeb/0x200
[ 5.974451] [] acpi_device_probe+0x50/0x11d
[ 5.974457] [] driver_probe_device+0x7e/0x220
[ 5.974460] [] __driver_attach+0xab/0xb0
[ 5.974462] [] ? driver_probe_device+0x220/0x220
[ 5.974465] [] bus_for_each_dev+0x55/0x90
[ 5.974468] [] ? 0xffffffffa01b4fff
[ 5.974470] [] driver_attach+0x1e/0x20
[ 5.974473] [] bus_add_driver+0x198/0x270
[ 5.974475] [] ? 0xffffffffa01b4fff
[ 5.974478] [] driver_register+0x77/0x150
[ 5.974483] [] ? dmi_matches+0x53/0xc0
[ 5.974485] [] ? 0xffffffffa01b4fff
[ 5.974488] [] acpi_bus_register_driver+0x3e/0x47
[ 5.974492] [] sony_laptop_init+0x57/0x1000 [sony_laptop]
[ 5.974498] [] do_one_initcall+0x12a/0x180
[ 5.974502] [] sys_init_module+0xc2/0x230
[ 5.974508] [] system_call_fastpath+0x16/0x1b
[ 5.974509] Code: 2b 43 50 88 43 4e 48 83 c4 08 5b 5d c3 90 e8 eb fb ff ff
eb e6 90 90 90 90 90 90 90 90 90 48 89 f8 48 89 d1 48 c1 e9 03 83 e2 07
48 a5 89 d1 f3 a4 c3 20 4c 8b 06 4c 8b 4e 08 4c 8b 56 10 4c
[ 5.974539] RIP [] memcpy+0xd/0x110
[ 5.974542] RSP
[ 5.974543] CR2: 0000000000ff1000
[ 5.974545] ---[ end trace 67f7b54c3f5c5271 ]---
Como a danada da falha mostrava um erro com "memcpy+0xd/0x110", eu imaginei que era falha de cópia de dados pra alguma endereço da memória RAM, ou seja, o pente de memória que comprei no #DX estava com problemas, o que denota a máxima de que, na dúvida, culpe o fornecedor Chinês mais próximo de você.
Passei os restantes dos dias buscando por mais reclamações sobre problemas de hibernação no Ubuntu 12.10 ou algo parecido, e... nada. Comecei a desconfiar mesmo dos produtos chineses, a ponto de passar 2 dias rodando memtest pra verificar o estado da RAM, procedimento aliás que só causa expectativa seguida de frustração, e não tira o produto Chinês da mira de vilão da história.
Hoje, por um acaso muito grande, eu resolvi buscar pelo erro do bug, mas na verdade para buscar alguma ferramenta para bloquear o segmento de memória danificado. Então busquei pela linha:
BUG: unable to handle kernel paging request at
E encontrei umas referências sobre problemas em... Sony Vaio! Justamente a marca do meu laptop. Coincidência?
Então resolvi buscar diretamente o endereço de memória do meu problema:
BUG: unable to handle kernel paging request at 0000000000ff1000
E não é que peguei um problema reportado e bem descrito no Launchpad, o sistema de reporte de bugs do Ubuntu? Eu nunca tinha encontrado referências a esse bug porque a descrição fala de problema de Sony Vaio (outro duh!).
[SONY VAIO VPCS12L9E] Suspend doesn't work after dist-upgrade to Quantal 12.10
Felizmente a pessoa que abriu o bug report fez uma bela descrição do problema e também de uma solução. Apenas apliquei os seguintes passos para ter meu sistema funcionando corretamente:
sudo add-apt-repository ppa:shiba89/vaio-kernel sudo apt-get update sudo apt-get install linux-headers-generic sony-laptop-dkms
Com isso, no boot seguinte tive a comprovação de que meu laptop voltou à hibernar feito um bebê. E com isso fecho 2012 sem pendências, ao menos pessoais, para 2013.
E que venha 2013! Se sobrevivemos ao fim do mundo segundo os Maias, não é um problema de kernel que vai nos segurar!