[技術ブログvol.3] Local HostとRemote Hostとのファイルを簡単に比較する方法

これまでは自社でサーバを動かしていたけど、クラウドに移したい。

そんな声を最近よく聞くようになってきました。
そんなサーバのリプレイス作業でデータを移行する際、rsyncを使って、リプレイス元とリプレイス先サーバのデータ同期をすることがあると思います。

この時、データ同期後に、本当に同期できたか簡単に確認したいと思ったことはないでしょうか?
基本的には、rsyncしてエラーが出なければ、同期は完了したと判断しますが、念の為、別の方法で確認して、想定の作業が正常に完了したことを記録しておきたい、ということがあります。

そこで、以下の2点を確認して、同期作業が正常に完了した、としようと思います。

  • 同期対象のディレクトリで、ディレクトリ名、ファイル名が全て同じであること
  • 対象ディレクトリにあるファイルのタイムスタンプが全て同じであること

もっと厳密にするには、1ファイル毎に中身を比較していくのがベストですが、それだと「お手軽」ではなくなるので、そこまではやらないことにします。

では、これをどうやって確認するか考えてみます。
確認した環境として、host1のカレントディレクトリに、host2の「/var/log/httpd/」を同期させて、この2つのホストのデータが正常に同期できたかどうかを確認してみます。

まずは同期させます。

「access_log」と「error_log」の2ファイルが同期されました。

実際、host1とhost2には、この2ファイルしかありません。

[host1でのファイルの確認]

[host2でのファイルの確認]
※host1とhost2の文字コードが異なっていたので、日時が英語と日本語表記で異なりますが、気にしないでください(苦笑)

次に、host1とhost2のファイルのタイムスタンプが同一であることを以下のコマンドで確認します。

「diff <(コマンド) <(コマンド)」となっていることがポイントです。

この意味としては、host2の「/var/log/httpd」以下と、host1の同期ディレクトリの中身を「ls -lt」でタイムスタンプでソートして、その結果をdiffで比較している、というものです。

※「<(コマンド) 」の部分については、下の方の「オマケ その1」で簡単な説明を書いていますので、そちらも併せて読んで頂ければと思います。

今回の結果では、コマンドの結果に何も表示されなかったので、差がなかったことが分かります。

では、次にhost2のaccess_logをtouchしてタイムスタンプを更新して、結果がどうなるか見てみます。

access_logのタイムスタンプが更新されました。

次に、再度、差を確認してみます。

確かに、access_logのタイムスタンプが変わったので、その差を検出できています。

今度は、host2で新たにファイル「test.log」を作成してみます。

再度、差を確認します。

新たにtest.logが作成されたことを検出できています。
以上により、rsyncなどでデータの同期を行った後に、ファイルを更新したり、新たに作成、削除したら、その差を検出できることが確認出来ました。

これで何がうれしいかというと、最後にデータ同期させた後に、どちらかのホストのファイルを更新した場合、それがどのファイルなのか目grepで確認しなくても簡単に分かって便利だね、というところがうれしい点です(笑)
あまり、使いドコロが無いかもしれませんが、機会があれば、是非活用してみて下さい。

オマケ その1
diffコマンドの際に、<(コマンド)というものを使っていましたが、これは、bashの持つ「Process Substitution」という機能で、コマンドの結果をパイプで読むことができるものです。
diffの対象にコマンド結果を渡す為に、このようなことをしています。
bashの他には、zshでも使えるみたいです。

この方法以外だと、mktempなどで比較用の一時ファイルを作って、そこに出力して・・・という手間をかけないといけませんが、そういう一時ファイルを作る必要がなく、便利な機能です。

その正体は、以下のコマンドを実行してみるとわかりますが、実行結果に/dev/fd/62、63番のファイルディスクリプタが割り当てられて、比較していることが分かります。

オマケ その2
今回実施した、リモートとローカルのディレクトリ比較をする際は、SSH接続の際にパスフレーズなしに接続できる必要があります。

今回は、パスフレーズなしの公開鍵認証を行う設定にして、動作確認を行いました。
ここは、それぞれの環境に合わせて、ssh-agentを使うとか、ホストベース認証などから選択して下さい。

オマケ その3
RHEL(CentOS)6系のOSと5系のOSで「ls -l」すると、6系からはSELinuxの影響で、パーミッションの表示に「.(ドット)」の有無が表示されるので、データの同期を行なっても、全て差があると表示されてしまいます。

5系の場合

6系の場合

このドットがあることで、ファイルの中身やタイムスタンプが同一であっても、比較するファイルの中身としては、ドットの分だけずれてしまいます。こういう場合は、比較には「ls -t1」といったオプションで確認すれば、いいかと思います。
その代わり、「ls -l」オプションを使えないので、結果の見た目がわかりづらくなってしまうところが注意ポイントですね。

▼次回予定
最近、ニュースサイトやテレビニュースなどで、頻繁にITセキュリティのことが取り上げられるようになって来ました。そこで次回は、Linuxサーバセキュリティについて、WebやFTPなど身近なところから、ご紹介しようと思います。

更新予定は、8月中旬頃です。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA