web-dev-qa-db-ja.com

システムメモリ全体をダンプするにはどうすればよいですか?

VirtualBoxを起動した後、OOMが原因でコンピューターが遅くなり、完全にハングしました。通常、OOMは領域を解放するためにプロセスの強制終了を開始する必要がありますが、これは発生しませんでした(これが2回目に発生しました)。

テキストエディターで保存されていない重要な作業があったため、現在のコンソールですべてのプロセスを強制終了した後、システムでそれを見つけたいと考えていましたRAM SysRqK。問題のマシンは、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

テキストエディタで数時間開いていたデータを見つけることができなかったため、ダンプの実行中に一部のメモリをスキップしたと思います。したがって、私の目標(ユーザー空間プログラムからのデータの回復)を考えると、システムメモリをファイルにダンプする最も効率的な方法は何ですか。このようなダンプを行う際に考慮しなければならない点は何ですか?

9
Lekensteyn

このプロジェクトをチェックしてください: foriana

Foriana is(FOrensic Ram Image ANAlyzer)

入力:(物理)のダンプRAM出力:さまざまな情報

バージョン1.0では、i386/x86_64/arm linux/bsdカーネルのメモリダンプからプロセスとモジュールを一覧表示し、ダンプから線形メモリを読み取るためのオプションを提供できます。

カーネルモジュールfmemがあります:

Fmemは、/ dev/fmemデバイスを作成するカーネルドライバーです。/dev/fmemは/ dev/mem(物理メモリへの直接アクセス)と同じように動作しますが、/ dev/memにある制限はありません。/dev/fmemを通じて物理メモリ全体をダンプすることが可能です。

私はそれを使用していますが、コンパイルはかなり簡単です。

4
stackterminator

アクセスできないデータをスキップできるddrescueまたは同様のプログラムを使用したい場合があります。 dd conv=noerrorも役に立ちます。 スーパーユーザーへの質問 も確認してください。

ただし、さらに重要なのは、OOMの状況に陥った場合、カーネルがページを要求しているアプリケーション以外のものからスワップアウトしていることが原因であると考えられます。したがって、データが必要な場合は、/dev/memの代わりにスワップを確認してください-スワップが存在する可能性があります。同様に、OOMキラーが起動せず、手動でプロセスを強制終了した場合、たとえばエディターが最初に強制終了され、メモリを大量に消費するプロセスが、これらのページを取得するためにまだ時間がかかる場合があります。

Gillesのコメントで述べたように、データは簡単に特別な構造になっている可能性があるため、強制終了されたプロセスのアドレススペースマッピングを再構築できたとしても、それらを簡単に見つけることはできません。 必要なページをすべてそのままにしておくのに十分な運があります。

3
peterph