Como posso descarregar toda a memória do sistema?

9

Depois de iniciar o VirtualBox, o computador ficou lento e ficou completamente suspenso devido à OOM. Normalmente, a OOM deve começar a matar processos para liberar algum espaço, mas isso não aconteceu (essa foi a segunda vez que experimentei isso).

Eu tive alguns trabalhos importantes não salvos em um editor de texto, então eu esperava encontrá-lo de volta na RAM do sistema depois de matar todos os processos no console atual usando SysRq + K . A máquina em questão é um laptop com 8 GiB de RAM rodando o Linux x86_64 3.7.5 com um SSD como disco de destino.

Minha primeira tentativa foi dd if=/dev/mem of=memory , mas isso falhou depois de ler 1 MiB de dados. Em seguida, tentei dd if=/dev/fmem of=memory bs=1M , mas isso parou depois de ler 3010461696 bytes (exatamente 2871 MiB). Depois de olhar para /proc/mtrr (mostrado abaixo), decidi adicionar skip=4096 . Isso acabou diminuindo, lendo a uma velocidade de apenas 3 MiB / s, então eu o interrompi (produzindo um arquivo de 5.8 GiB). (pelo menos os últimos 100 MiB do arquivo contém FF s)

reg01: base=0x000000000 (    0MB), size= 2048MB, count=1: write-back
reg02: base=0x080000000 ( 2048MB), size= 1024MB, count=1: write-back
reg03: base=0x100000000 ( 4096MB), size= 4096MB, count=1: write-back
reg04: base=0x200000000 ( 8192MB), size= 1024MB, count=1: write-back
reg05: base=0x23c000000 ( 9152MB), size=   64MB, count=1: uncachable
reg06: base=0x0b4000000 ( 2880MB), size=   64MB, count=1: uncachable
reg07: base=0x0b8000000 ( 2944MB), size=  128MB, count=1: uncachable

Eu não consegui encontrar os dados que eu tinha aberto por algumas horas no editor de texto, então acredito ter pulado um pouco de memória enquanto fazia um dump. Então, dado o meu objetivo (recuperação de dados de programas userspace), qual é o método mais eficiente para despejar a memória do sistema em um arquivo? Quais são alguns pontos que devem ser considerados ao fazer esse despejo?

    
por Lekensteyn 24.02.2013 / 21:52

2 respostas

4

Verifique este projeto: foriana

Foriana is (FOrensic Ram Image ANAlyzer)

input: dump of (physical) RAM output: various information

Version 1.0 can list processes and modules from memory dump of i386/x86_64/arm linux/bsd kernels, and provide option for reading linear memory from dumps.

Existe um módulo do kernel fmem:

Fmem is kernel driver, that creates /dev/fmem device. /dev/fmem behave in same way that /dev/mem (direct access to physical memory), but does not have limits that /dev/mem have. It is possible to dump whole physical memory through /dev/fmem.

Eu tenho usado, compila bem fácil.

    
por 07.07.2013 / 06:00
3

Você pode querer usar ddrescue ou programa semelhante, que pode ignorar dados inacessíveis. dd conv=noerror pode ser útil também. Além disso, verifique essa pergunta no superusuário .

Mais importante ainda, se você se meteu em uma situação de OOM, a lentidão foi provavelmente causada pelo kernel trocando páginas de qualquer outra coisa que não o aplicativo requisitante. Portanto, se você quiser seus dados, verifique o swap em vez de /dev/mem - as chances são de que ele estará lá. Da mesma forma, se o assassino de OOM não entrar em ação e você matar os processos manualmente, uma vez, por exemplo, seu editor é morto primeiro, o processo de passar fome na memória ainda pode demorar algum tempo para pegar essas páginas.

Como mencionado por Gilles no comentário, os dados podem facilmente estar em alguma estrutura especial, então você não conseguirá encontrá-los facilmente mesmo se você conseguir reconstruir os mapeamentos de espaço de endereço do processo eliminado e ter sorte suficiente para encontrar todas as páginas necessárias ainda intactas.

    
por 24.02.2013 / 23:29