jumble

アクセスカウンタ

zoom RSS rsyncによるバックアップ

<<   作成日時 : 2012/02/26 23:32   >>

ブログ気持玉 0 / トラックバック 1 / コメント 0

rsyncによるバックアップ


Seagate製のハードディスクの問題(ここここ)は落ち着いたが、あらためてバックアップの重要性を思い知った。
現在レンタルサーバーを借りて、必要なデータをアップロードしているのだが、それをバックアップしていなかったのだ。
サーバーにアップしたデータを過信しすぎていることに気付いた。
さすがにサーバー側でバックアップなどはしてくれているだろうが、それでもデータを失う可能性は0ではない。
以前借りていたレンタルサーバーで、Webのトップページが改竄されたことがあった。
幸いデータを削除されたということは無かったようだが。
取り合えず、パスワードをもっと強固なものに変更した。
なぜ、第三者に侵入されたか?
最初そのレンタルサーバーを疑ってしまったのだが、悪いのはおそらく自分だ。
まず、パスワードが貧弱だったので、当てずっぽうでたまたまログインされた可能性がある。
もう1つは、自宅のパソコンなどがキーロガーなどのスパイウェアにかかっていたかもしれない。
いずれにせよ、パスワードが盗まれたら、いくら物理的なバックアップを取っていてもどうしようもない。
自宅のパソコンにセキュリティソフトをいくつか入れた。

もう1つは、自分の操作ミスによるデータ喪失だ。
これも前レンタルサーバーで実際やってしまったことだ。
自分はデータのバックアップにrsyncというコマンドを使っている。
このコマンドは単なるcpやrcpなどと比較して次のような点で非常に便利だ。
・差分で同期してくれるので、同期元と同期先の差分が小さい場合、非常に効率的。
・--deleteというオプションがあり、同期元で削除されたものは同期先でも削除してくれる。
ただ便利な半面、非常に危険なコマンドでもある。
特に--deleteオプションをつけた場合、使い方を一歩間違うと全データ喪失につながるのだ。
落とし穴として、同期元のディレクトリの指定がある。
最後に/(スラッシュ)を付ける・付けないで意味が変わってくるのだ。
例えば、
rsync a b
は a が b の下にできるが、
rsync a/ b
は a の配下の全てが b の下にできる。つまり次と同じ。
rsync a/* b
これを知らないととんでもないことになる。
例えば b の下に c があるとする。その状況で a を b の下に複製したいとする。
つまり、結果として b の下に a と c があるようにしたい。
で、次のように実行したとする。
rsync -a --delete a/ b
この場合、期待通りにはならず、b の下にあった c は消えることになる。
ただし同期先に関しては、/の有り無しは関係ないようだ。
怖えー。
以前、これと同じミスをレンタルサーバー上でやってしまい、全データを失ったことがある。
rsyncの怖さを重々承知していたはずなのに、今回またやってしまった。

レンタルサーバー上に置いたデータも万全ではないことを思い出し、バックアップを取ろうと思った。
悲劇はそこから始まったので皮肉なものだ。
バックアップはWindowsのcygwinから次のような感じのバッチファイルを実行した。

cd d:
cd aaa/bbb
rsync -a --delete --force xxx@yyy.zzz:~/ .

実行時、何かのメッセージが出ていたが、文字化けで読めなかった。
何だろうと思いつつ、そのまま別の事をしていると、しばらくしてcygwinの画面でエラーになっている。
rsyncで何らかのディレクトリの削除ができないという趣旨らしい。
え?
何故そんなディレクトリを消そうとしているんだ?
やばい。
慌ててCtrl-Cで止めたが、時既に遅し。
D:ドライブの大半のデータを失ってしまった。
何が起こったのか?
恐らく実行直後のメッセージは、cdコマンドが失敗したということだろう。
そのため、D:ドライブの直下で rsyncコマンドを実行してしまったのだ。
何ということ。
D:はデータ用のハードディスクなので最も大切なものだ。
途方に暮れたが、幸いにもその直前にD:ドライブの内容をE:ドライブにバックアップしていた。
で、E:の全ての内容をD:にコピーして復元しようとした。
当然、Windowsのエクスプローラを使ってなのだがそれができないのだ。

xxx をコピーできません。アクセスできません。
ディスクがいっぱいでないか、書き込み禁止になっていないか、またはファイルが使用中でないか確認してください。

というエラーがでる。
D:はほとんど空なのでディスクが一杯な訳ないし、エクスプローラで確認しても書き込み禁止にはなってない。
他に思い当たる節もない。
いろいろやってみると、E:ドライブ配下のデータにはどれにもアクセスできないようだ。
非常にやばい。
でも、データが壊れているようにはみえない。
落ち着け。
とりあえず、cygwinからcpコマンドを試したらうまくいくようだ。
で実行。
そうだ、-pを付けないと日時などが引き継がれず、実行時のものになってしまう。
rsyncなどでは同一であるかどうかの判定に日時を使用する場合があるのでそれでは困る。
途中で中断し、再度-pを付けて実行し直し。
何とか無事復旧できたものの、E:ドライブのデータはWindowsから使えないままだ。
何が原因だ?
しばらくして分かったのだが、E:ドライブの全てのファイルの所有ユーザーが意味不明になっている。
それは、cygwin から ls -l を打って始めて分かった。
恐らく、Seagateの一件でユーザーIDが変わってしまっているからだろう。
でこれまたcygwinから全ファイルの所有ユーザーを自分のものに変更した。
そうするとE:ドライブのデータが使用可能になった。
やれやれ。
Windows付属のエクスプローラでは所有ユーザーが分からないため、今回の原因が特定できなかった。
まあ、コマンドプロンプトでdirコマンドに/qオプションを付ければ見えるようなのだが。
それでいいのか?
少なくとも、エクスプローラで所有ユーザーが見えれば、もっと早く分かったはずだ。
Windowsはやはり使いにくい。
基本的にいろんなことをユーザーから隠そうとするからだ。
未だXPを使っている方が悪いという意見もあるだろう。
が、Vistaや 7 が取り入れているのはUACというさらに分かりづらい制御。
特に"書き込みエラーの仮想化"という機能があり、これが最悪中の最悪だ。
まあいいや。
Windowsは特定の用途にしか使わないし、XPからバージョンを上げる気もない。
Windowsには何も期待していない。

話を戻す。
rsyncをcdの後に実行するのは非常に危険なことが分かった。
もう1つはcygwinに関する落とし穴。
cygwinから、./xxxの様な感じで直接ファイルを実行した場合、Windowsのバッチとして解釈されることがある。
ファイル名によって解釈が変わるようだ。
拡張子が.batの場合はWindowsのバッチ、それ以外だとbashと解釈されるっぽい。
うむむ。何だそりゃ。
自分のファイルがbashでなく、Windowsのバッチとして解釈されるのは拡張子が原因だったらしい。
まあ、何となく拡張子を.batにしていた自分もマヌケなのだが。
それに気付かず、バックアップ用の実行ファイルは仕方なしにWindowsバッチとして作った。
大体次のような感じ。

echo off
cd d:
if exist aaa/bbb (
    cd aaa/bbb
    cd
    rsync -a --delete --force xxx@yyy.zzz:~/ .
) else (
    echo error!
)

移動先のディレクトリが存在する場合のみ実行するようにした。
また、rsyncの実行直前にカレントディレクトリを確認するようにした。
Windowsでは引数なしのcdはbashでのpwdに相当する。
だが、実はこれも何となく危険である。
引数なしのcdコマンドは、bashだとホームディレクトリに戻る。
上のバッチファイルがもしbashと解釈されるとどうなるか?
実際、./xxx.batではなく、. xxx.batまたは、sh xxx.batと実行するとそうなるのだ。
ifの使い方などが違うためエラーとなるだろうが、もしなんかの間違いで実行されたら。。。
ホームディレクトリ以下がまた被害に遭う。
やはり、cdで目的のディレクトリに移動した後にrsyncを実行するのは危険極まりない。
ということで、rsyncは絶対パスを使って一発でやるに限る。
もし、同期元のディレクトリが存在しない場合はrsync自体がエラーになるから問題ない。
同期先はどうか?
存在しない場合は作成しようとする。
できなければやはりエラーになるだろう。
その方がよっぽど安全だ。

もう1つ。
実はこれが一番重要だ。
rsyncに-n(または--dry-run)をつけること。
ただ、そのままでは何も出力されないので、-vと一緒に使う。
つまり、まず-nvオプションをつけて実行すること。
これで、実際の実行は行わず、何をしようとしているかを確認できる。
具体的にはこんな感じになる。

rsync -nv -a --delete --force xxx@yyy.zzz:~/ /cygdrive/d/aaa/bbb/

自分の意図通りのことをやろうとしていることが確認できたら、その後、-nvを消して再度実行する。
これに尽きるね。
今までも、そんなオプションがあるというのは薄々知っていたのだが使ってなかった。
二度痛い目に遭うまでこれを使わなかったというのが今回の大いなる反省点だ。

テーマ

関連テーマ 一覧


月別リンク

ブログ気持玉

クリックして気持ちを伝えよう!
ログインしてクリックすれば、自分のブログへのリンクが付きます。
→ログインへ

トラックバック(1件)

タイトル (本文) ブログ名/日時
レイバン メガネ
rsyncによるバックアップ jumble/ウェブリブログ ...続きを見る
レイバン メガネ
2013/07/05 10:11

トラックバック用URL help


自分のブログにトラックバック記事作成(会員用) help

タイトル
本 文

コメント(0件)

内 容 ニックネーム/日時

コメントする help

ニックネーム
本 文
rsyncによるバックアップ jumble/BIGLOBEウェブリブログ
文字サイズ:       閉じる