Lek*_*eyn 9 memory data-recovery ram
启动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 包含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
Run Code Online (Sandbox Code Playgroud)
我在文本编辑器中找不到我打开了几个小时的数据,所以我相信我在做转储时跳过了一些内存。那么,鉴于我的目标(从用户空间程序恢复数据),将系统内存转储到文件的最有效方法是什么?在进行此类转储时必须考虑哪些要点?
您可能想要使用ddrescue
或类似的程序,可以跳过无法访问的数据。dd conv=noerror
可能也会有帮助。还要检查超级用户的这个问题。
但更重要的是,如果您陷入 OOM 情况,那么缓慢很可能是由于内核从请求应用程序以外的其他任何地方交换页面而引起的。因此,如果您想要数据,请检查交换而不是/dev/mem
- 它很可能会在那里。类似地,如果 OOM 杀手没有启动并且您手动终止进程,一旦您的编辑器首先被终止,内存匮乏的进程可能仍然会碰巧有一些时间来获取这些页面。
正如 Gilles 在评论中提到的,数据很容易处于某种特殊的结构中,因此即使您设法重建被杀死进程的地址空间映射并且有足够的运气找到所有需要的数据,您也无法轻松找到它们页面仍然完好无损。