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


9

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

テキストエディターで未保存の重要な作業があったため、SysRq+ を使用して現在のコンソールのすべてのプロセスを強制終了した後、システムRAMでそれを見つけたいと思っていましたK。問題のマシンは、ターゲットディスクとしてSSDを備えたLinux x86_64 3.7.5を実行する8 GiB RAMを搭載したラップトップです。

私の最初の試みはでしたが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

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


/ proc / kmemも試しましたか?あなたがそれをコピーしている間に変化するので、それはあまり価値がありません。
ott-- 2013

@ ott-- CONFIG_DEVKMEMは無効になっており、ソースコードを見ると無制限のアクセスが許可されているようですが、これが最善の方法であるとはまだ確信していません(IO memアクセス?)
Lekensteyn

2
多分あなたはエディタの記憶を手に入れましたが、あなたはそれを認識しませんでした。メモリダンプからデータ構造を再構築するのは難しい場合があります。最初に行う必要があるのは、カーネルデータ構造からメモリマッピングを再構築することです(おそらくそのための法医学ツールが存在します)。関心のあるプロセスの仮想メモリを取得します(これは、物理メモリ内の多くのばらばらの4kBページに広がっています)。次に、テキストは1つの連続したblobにはなく、UCS4または他の表現を使用し、行または他のブロックを別々のチャンクに格納できます。
Gilles 'SO-悪をやめる'

1
@Gilles +1、プロセスが強制終了されると、カーネルがタスク記述子を解放することを期待します->そのアドレス空間マッピングのすべてを忘れます。データ表現に関しては、それは簡単にツリーにすることができます(JVMによって十分な運が割り当てられます:))。
peterph 2013

ギガバイトのデータを調べて、そこにない可能性のある数kbのテキストを探しますか?針、干し草の山を満たします。あなたがこれに費やした時間には、テキストを再入力しただけかもしれません。そもそもそれだけだった場合は、テキストエディターが定期的にバックアップを保存するように構成されていることを確認してください。
psusi 2013

回答:


4

このプロジェクトをチェックしてください: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を介して物理メモリ全体をダンプすることが可能です。

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


質問者は試しました/dev/fmem
東武

3

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

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

コメントにジルで述べたように、あなたがその簡単にあなたが殺したプロセスのアドレス空間のマッピングを再構築するために管理していても、それらを見つけることができなくなりますので、データを簡単に、いくつかの特殊な構造にすることができかつ必要なすべてを見つけるために十分な運を持っていますページはまだそのままです。


1
私は前にSUの答えを見たことがあります。それが私がfmemを見つけた方法です。ddrescue256ページ(1 MiB)はハードコードされた制限であるため、私には役に立ちません。私はOOM状態になることを期待していましたが、OOMキラーは作動しませんでした(pastebin.com/DvYTCcRK)。1週間前、私は同じ問題を抱えていました(まだLinux 3.7.5、私は再起動せず、ramに一時停止しただけです)。SSDを使用しているため、スワップファイル/パーティションはありません。(swappiness = 60(デフォルト))。
Lekensteyn 2013
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.