2011-11-09 8 views
0

Linuxシステムで最後にリストを生成してから変更されたファイルのリストを生成する必要があります。私はユーザー空間でこれを行う必要があるので、解決策のようなFAMは私のために合っていません。Linuxユーザー空間から変更されたファイルを検出する

  1. ターゲットソリューションの両方ext2ext3ファイル・システム上で使用することができます。これを行うには、私は以下のいくつかの制約があります。
  2. ユーザ空間に実装する必要があります。カーネルの変更やモジュールは許可されていません。
  3. ファイルの変更時刻に依存してはいけません。少なくともファイルサイズを使用するか、より良いチェックサムアルゴリズムを使用してdeltaを生成する必要があります。
  4. リアルタイムである必要はなく、定期的に(たとえば10分ごとに)実行されます。

誰もがこのタスクのために既に実装されている解決策を知っていますか?私はこの目的のためにrsyncを使ってみましたが、rsyncは違いを計算するためにすべてのファイルのコピーが必要です。

EDIT

基本的に私は、再帰的に指定したディレクトリ下のファイルとそのデルタのリストをgenratesし、前のものと比較メカニズムが必要です。差分を生成するためにファイルサイズを使用する場合があります(rsync algorithmに似ています)。しかし、MD5やSHA1のような暗号化ハッシュアルゴリズムは、その性能のために私には適していません。私は何千ものファイルを持っているのではなく、これは暗号の場合ではありません。

カーネル上で変更が必要なリアルタイムソリューションまたは解決策(inotifykqueueFAMFuseなど)は、私にとっては適していません。

ありがとうございます。

+0

;-)これらの提案は、あなたがクールなツールを作成するのに役立つ願っていますが、偽の実行に-nスイッチにコマンド –

+0

@sputnickを持っていることは、将来のための違いを保存してい '切り替える-n'さえで実行されますか? –

+0

あなたに役立つPythonスクリプトを追加しました。それはまあまあまあです。あなたがマウントポイントを持っている場合は、それらをフィルタリングしてf.eを越えないようにすることができます。 '/ proc'です。 – hochl

答えて

1
  • あなたはファイルシステムを監視するためにinotify施設を使用することができます。わからない 既にツールを使用していて、のクイック検索の結果が多い場合は、たとえばhttps://github.com/rvoicilas/inotify-tools/wiki/となります。 の違いを検出するために

    find/-xdev -type f -print0 | xargs -0 md5sum -b >> /tmp/sums.txt

    今、あなたはそれらのファイルをソートし、それらを比較することができます:あなたは これを行うにmd5sumを使用することができます

  • sort -k 2 </tmp/sums.txt> /tmp/sums.sorted.txt

    は、私はあなたが得ると思いますアイデアはもちろんですが、これはロットあなたはチェックサムをしているのですべてのデータ。

EDIT:私は、ファイル名にファイルサイズを追加し、ファイルシステムツリーをダンプ迅速なスクリプトを書きました。 diffを使用すると、2回の実行の出力を比較して、変更内容を判断できます。もちろんこれは単なるスケッチであり、改善することができます。

#!/usr/bin/env python 

import os 
import sys 

# initialize variables. 
entries=[] 
if len(sys.argv) > 1: 
     rootdir=os.path.normpath(sys.argv[1]) 
else: 
     rootdir=os.curdir 

# walk filesystem tree. 
for root, dirs, files in os.walk(rootdir): 
     for name in sorted(files): 
       fullname=os.path.normpath(os.path.join(root, name)) 
       if os.path.islink(fullname) or not os.path.isfile(fullname): 
         entries.append(fullname) 
       else: 
         st=os.stat(fullname) 
         entries.append("%s %d" % (fullname, st.st_size)) 
     for name in sorted(dirs): 
       entries.append(os.path.normpath(os.path.join(root, name))) 

# print sorted list of found filesystem entries. 
for entry in sorted(entries): 
     print entry 

これは役に立ちますか?ディレクトリがマウントポイントで、散歩からそれを除外した場合

  • チェック:

    は、改善を提案しました。

  • 変更するファイルタイプを見つけるために、ダンプする前にタイプする文字(たとえば、f blub 6またはd test)。
  • 時間に基づいてファイルの変化を検出するファイルにst_mtime/st_atime/st_ctimeを追加します。
  • append md5最も一般的な変更を検出するファイルの先頭と最後の1,024バイトの合計です(ファイルがappenededデータを取得した場合)。
  • 完全なチェックサムをファイルの内容(たとえばCRC32)に追加します。

私はrsyncの

+0

私はパフォーマンス上の理由からリアルタイムソリューションは必要ないので、inotify(など)のようなイベントキューアルゴリズムは私には適していないかもしれません。チェックサムのとき、基本的に私はそれに似ている必要がありますが、もう少し効率的な方法です。 MD5は、多くのファイルやフォルダに対してMD5を使用することは適切ではないかもしれません。なぜなら、MD5は暗号化ハッシュアルゴリズムであるからです。 isは自分の仕事で超高速ですが、ファイルの差分のためには遅いです。 –

+0

あなたの努力に感謝していますが、ディレクトリの下に再帰的にファイルとそのサイズのリストを生成するだけです。私は変更を保存し、比較し、差別化するなどの、完全かつ効率的なシステムを必要としています。これは、コマンドがすでにOSによって提供されているため、リストを生成するために高速です。単純な生ファイルのリストを保存し、それらを 'diff'と比較すると、十分に速くないかもしれません。適切に索引付けされたファイルを使用してファイル情報を格納する必要があります。しかし、私はあなたの解決策を使用し、他の誰かがより良い答えを出すまで答えを受け入れます。ありがとうございました。 EmreYazıcı@ –

+0

:残念ながら、あなたはもう受け入れ答えを変更することはできません(5分決定的な受け入れ可能時間ウィンドウで) – sehe

0

あなたは

  • 仕掛け
  • rkhunterの
  • のrsyncで見ることができる(ただし、参照コピーを持っている必要があります)

rdiffbackupとrsnapshotはfullblown増分(deltifying)ですrsyncに基づくバックアップソリューション

また、zfs-fuseやzfsonlinuxで多くの用途があるかもしれません。これらのファイルシステムは、連続的なスナップショットをサポートしています。

SNAPID=$RANDOM # something unique, please 
zfs snapshot tank/[email protected]$SNAPID 
zfs send -i tank/[email protected] tank/[email protected]$SNAPID | 
    pbzip2 > dumpfile.$SNAPID.bz2 

受信側:

zfs receive -vFdn tank2/[email protected]$SNAPID < dumpfile.$SNAPID.bz2 

スナップショットのこの種のは、オンザフライで、住んで行われ、ZFSはログ構造化ファイルシステムがあるとして、非常によく実行することができますmerkel-treeベースのインテグリティチェックが組み込まれています。あなたは、各ファイルのチェックサムが実行ごとに再計算されていると満足している場合

+0

親愛なる人、私はバックアップソリューションを探していません。ヒューズのようなソリューションでは、私の制約のいくつかに違反するカーネルの修正が必要です。 –

+0

@EmreYazıcı:あなたがtripwireとrkhunterを無視したわけではありません。あなたの余分なコメントを読んで、私はtripwireがあなたが探しているものとぴったり合っているという強い印象を受けます。(ZFSはちょうど私の好みを持っている_happens_ - しかし、私の答えはブロードで、さまざまな目標だけでなく、バ​​ックアップに適し偉大なツールの多くを言及しているあなたは、私も_after_箇条書きまでバックアップを言及していないことがわかります。。) – sehe

+0

ext2/3の要件を取り除くと、btrfsのバージョン管理機能を使うことができます。 – hochl

1

、あなたは簡単な解決策を使用することができます。

find/(-not -path '/tmp/*' -and -type f) -print0 | xargs -0 md5sum > /tmp/current-listing 
diff /tmp/old-listing /tmp/current-listing 
mv /tmp/current-listing /tmp/old-listing 
+0

親愛なるthitonでは、たくさんのファイルとフォルダがあるので、実行ごとにチェックサムが受け入れられません。さらに、MD5をチェックサムアルゴリズムとして使用することは、ファイル差分アルゴリズムでは比較的遅いため、この場合(非暗号化)は適切ではない可能性があります。あなたのソリューションは、他のいくつかのケースでは間違いなく適しています。ありがとうございました。 –

関連する問題