VirtualBoxを起動すると、コンピュータが遅くなり、OOMのために完全に停止します。通常、OOMはスペースを解放するためにプロセスの終了を開始する必要がありますが、これは起こりません(この現象は今回が2番目です)。
SysRqテキストエディタに保存されていない重要なタスクがあるため、+を使用して現在のコンソールのすべてのプロセスを終了した後、システムRAMでそのタスクを見つけようとしますK。マシンは、SSDをターゲットディスクとして使用してLinux x86_64 3.7.5を実行する8GiB RAMを搭載したノートブックです。
最初の試みはありましたが、dd if=/dev/mem of=memory
1MiBのデータを読み取った後に失敗しました。次に試したことはdd if=/dev/fmem of=memory bs=1M
ただし、3010461696バイト(正確に2871MiB)を読み取った後に停止します。/proc/mtrr
下記の内容を見てからskip=4096
。 (ファイルの最後の100MiBには最小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
何時間もテキストエディタで開いていたデータが見つからなかったため、ダンプしたときにいくつかのメモリをスキップしたようです。それでは、私の目標(ユーザー空間プログラムからのデータ復旧)を考えると、システムメモリをファイルにダンプする最も効率的な方法は何ですか?そのようなダンプをするときに考慮すべきことは何ですか?
答え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がコメントで述べたように、データは特別な構造にある可能性があるため、終了したプロセスのアドレス空間マッピングを再構成しても簡単には見つかりません。そして必要なすべてのページがまだ破損していない状態で見つけるのに十分な運があります。