ローカルファイルシステムのディレクトリに定期的にバックアップするアプリケーションがあります。このディレクトリにはいくつかのファイルとディレクトリがあります。
バックアップリポジトリにコピーできるすべてのファイルの「スナップショット」を作成したいと思います。
最も重要なのは、この「スナップショット」をアトミックに生成するにはどうすればよいですか?これらのファイルはバックアップデーモンによって変更され、「スナップショット」が一貫していない可能性があることに注意してください。
編集する:
それはおそらく、システムにext4
ファイルシステムがあることを言及するはずです。
答え1
どのプロセスがそのディレクトリにファイルを書き込んでいるかを知っている場合は、そのファイルを凍結してバックアップを作成し、kill -SIGSTOP <pid>
復元プロセスを使用できますkill -SIGCONT <pid>
。
答え2
私が知る限り、ext4自体は、データに同時にアクセスするアプリケーションの協力なしに、そのようなトランザクションの原子性を保証することはできません。ブロックデバイスレベルで一貫した状態を取得するには、デフォルトでファイルシステムをアンマウント(または少なくとも-roを再マウント)する必要があるため、デフォルトのデバイスマッパーでいくつかのスナップショットメカニズムを使用することは機能しません。
アプリケーションの動作に関する追加の知識がなければ、これは非常に複雑になると思います。したがって、最も簡単な方法は、任意の方法でアプリケーションを変更することです(たとえば、ロックファイルの導入)。しかし、これをブラックボックスとして扱う必要がある場合は、これについていくつかの仮定をします。
- アプリケーションの定期バックアップは、実行間隔に比べて短時間です。
- バックアップが完了すると、次のバックアップが実行されるまですべてのファイルハンドルが閉じます。
これらの仮定に基づいて、私は楽観的なアプローチをお勧めします。つまり、ディレクトリの正規の再帰的で非原子的なコピーを作成し、アプリケーションがファイルに触れたことを確認します。もしそうなら、残念ながら、あなたのコピーはアプリケーションの定期的な自己バックアップと一致します。その場合は、作成したコピーを削除してもう一度やり直してください。しばらくしてリソースを消費する無限ループを避けてください。
プロセス中にコピーするファイルを監視する手段として、Linuxのinotifyメカニズムを使用することでこれを実現できます。単純なシェルスクリプトが必要な場合は見てください。イノティファイツール。ほとんどのディストリビューションに含まれています。ファイルがすでに開いているときにinotifyがどのように機能するかを完全にはわかりませんlsof
。太陽後ろにinotify watchを設定しました。
だからこれは私があなたの状況を解決する方法です。実際の実装スケッチを省略しても大丈夫です。不明な点がございましたら、お気軽にお問い合わせください。
答え3
/sbin/fsfreeze --freeze /data
# do a backup
/sbin/fsfreeze --unfreeze /data
fsfreeze - ファイルシステム(Ext3/4、ReiserFS、JFS、XFS)へのアクセスを一時停止します。
追加情報が必要な場合:https://manpages.ubuntu.com/manpages/focus/man8/fsfreeze.8.html