如何转储完整的系统内存?

如何转储完整的系统内存?

启动 VirtualBox 后,计算机变得缓慢,然后由于 OOM 完全挂起。通常,OOM 应该开始终止进程​​以释放一些空间,但这并没有发生(这是我第二次遇到这种情况)。

我在文本编辑器中有一些未保存的重要工作,所以我希望在使用SysRq+杀死当前控制台中的所有进程后,能在系统 RAM 中找到它K。该机器是一台具有 8 GiB RAM 的笔记本电脑,运行 Linux x86_64 3.7.5,并以 SSD 作为目标磁盘。

我的第一次尝试是dd if=/dev/mem of=memory,但在读取 1MiB 数据后失败了。接下来,我尝试了dd if=/dev/fmem of=memory bs=1M,但在读取 3010461696 字节(正好 2871 MiB)后停止。查看后/proc/mtrr(如下所示),我决定尝试添加skip=4096.这最终减慢了速度,读取速度仅为 3 MiB/秒,因此我中断了它(生成了 5.8 GiB 的文件)。 (文件的最后 100 MiB 至少包含FFs)

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

我找不到在文本编辑器中打开了几个小时的数据,所以我相信我在转储时跳过了一些内存。那么,考虑到我的目标(从用户空间程序恢复数据),将系统内存转储到文件的最有效方法是什么?进行此类转储时必须考虑哪些要点?

答案1

检查这个项目:福里亚纳

Foriana 是(FOrensic Ram 图像分析仪)

输入:(物理)RAM 的转储 输出:各种信息

1.0 版可以列出 i386/x86_64/arm linux/bsd 内核内存转储中的进程和模块,并提供从转储中读取线性内存的选项。

有一个内核模块fmem:

Fmem 是内核驱动程序,它创建 /dev/fmem 设备。 /dev/fmem 的行为方式与 /dev/mem 相同(直接访问物理内存),但没有 /dev/mem 的限制。可以通过 /dev/fmem 转储整个物理内存。

我用过,编译很简单。

答案2

您可能想要使用ddrescue或类似的程序,可以跳过无法访问的数据。dd conv=noerror可能也会有帮助。还要检查这个关于超级用户的问题

但更重要的是,如果您陷入 OOM 情况,那么缓慢很可能是由于内核从请求应用程序以外的其他任何地方交换页面而引起的。因此,如果您想要数据,请检查交换而不是/dev/mem- 它很可能会在那里。类似地,如果 OOM 杀手没有启动并且您手动终止进程,一旦您的编辑器首先被终止,内存匮乏的进程可能仍然会碰巧有一些时间来获取这些页面。

正如 Gilles 在评论中提到的,数据很容易处于某种特殊的结构中,因此即使您设法重建被杀死进程的地址空间映射,您也无法轻松找到它们有足够的运气才能找到所有需要的页面仍然完好无损。

相关内容