2009/08/03
最近、ちょっと仕事が忙しくてブログを放置していたのだけれど、久しぶりに更新。
で、久しぶりの技術ネタ。
最近、社内用のバックアップ・プログラムを書いていて、いろいろハマったのでメモ。
■どんな方法でバックアップする?
フリーウェアでも、シェアウェアでも、商用ソフトウェアでも、バックアップ・ツールはいろいろある。
Windows Server 2003 であれば、標準で実装されているシャドウコピー機能で済ませるという選択肢もある。
しかし、社内のサーバは Unix 系も Windows 系もあるので、できるだけ単一のツールで統合的にバックアップを取れるようにしたい。
で、いろいろ悩んだのだけれど、Windows サーバに cygwin をインストールして、rsync でバックアップを実行する事にした。
■Windows 上で sshd を上げるか。
Windows系サーバに cygwin をインストールして、sshd を立ち上げてもいいのだけれど、WEBを漁ってみると、cwRsync という、Windows 上で rsync を行う最低限のモジュールを集めたパッケージを発見し、インストール一発で使える様になるようなので、ちょっと手を抜いてこれを使ってみる事にした。
■cwRsync でバックアップしてみる。
cwRsync をインストール、Linux サーバと接続してバックアップを行ってみる。
うん、無事、バックアップできた。
次は Windows サーバと接続してバックアップを行ってみる。
エラー。(T_T)
なんですとぉ?
どうも、「表」などの文字を含むファイル名でエラーになってしまう。
「バックスラッシュ」が含まれている漢字コードが処理できないらしい。
どうするべぇ。
■Unison
WEBを漁ってみると、Unison というソフトがあり、これにパッチを当ててコンパイルすると、漢字コードをきちんと処理できるらしい。
Unison のソースと、パッチをダウンロードして適用...と思ったら、パッチが対応しているバージョンが古いらしく、うまく当らない。(T_T)
パッチ自体はそれほど大きくないので、エディタでソースコードを開いて手動でパッチを適用。
コンパイル環境は、VC++でも、cygwin 上の gcc でもコンパイルできるらしいのだが、cygwin 上の gcc でコンパイル。
意外にすんなりコンパイルは通った。
さっそく、Windows サーバと接続してバックアップを行ってみる。
おぉ、「表」などの文字を含むファイル名のファイルがバックアップでした。
が...。
今度は、「ファイルのパスが長すぎる」エラー。(T_T)
ぐおぉ...。
どうも、ファイルのパスの長さは、Unison の制限ではなく、cygwin の制限事項らしい。
バックアップ対象のファイルのパスやファイル名を短く変える事は運用上難しいので、ちょっと無理。
くっそー、どうするべぇ。
■で、結局、cygwin
WEBを探ってみると、現在βテスト中である cygwin 1.7 が、漢字コードも正しく処理できて、かつ、パスの長さも拡大されているらしい。
まだβなので、導入するのはちょっと腰が引けるのだけれど、ここで諦めるのも悔しいし、近いうちに正式リリース版が出るだろうから、試してみる事にした。
cygwin 1.7 をインストールし、sshd を起動する様に設定。
先に使用した cwRsync は使用せず、直接 rsync を叩いてバックアップを実行してみる。
おぉ、Unix サーバからも、Windows サーバからも、きちんとバックアップができた。
いいぞいいぞ。
が...。
バックアップしたファイルを一旦削除しようとすると、削除できない。(T_T)
バックアップしたファイルやディレクトリのプロパティを見てみると、パーミッションが正しく付いていない。
何でやねん。
プログラム自体は、Administrator で実行しているので、パーミッションが付けられないなんて事はないはずだが...。
くっそー、どうするべぇ。
■CACLS or XCACLS
rsync のオプションである -p、-o、-g などを調整してみても、うまくいかない。
なんでだ?
仕方がないので、バックアップした後に Windows の CACLS コマンドと XCACLS を実行する様にして、パーミッションを変更してみる。
まぁ、これであれば、パーミッションは設定されるのだけれど、バックアップしたすべてのファイルのパーミッションを書き換えに行くので、死ぬほど遅い。
う~ん、どうするべぇ。
■オプション --chmod
rsync のヘルプを丹念に見てみると、--chmod というオプションがあるのを発見。
こんなオプションがあったのか、知らなかった。(^^;
さっそく、オプションを追加してバックアップを実行してみる。
おぉ、ちゃんと削除ができるパーミッションがセットされた。
しかしながら、ファイルのプロパティを見てみると、なぜか、「セキュリティ」タブ上では、Administrator に書き込み権限のチェックが付いてない。
しかし、詳細ボタンを押して、パーミッションの詳細を見ると、Administrator に書き込み権限が付いている。
何でだ?
まぁ、とりあえず、大きな問題ではなさそうなので、直接問題にはならないだろうから、とりあえず無視する事にした。(^^;
再び、バックアップしたディレクトリを削除してみる。
が...またしてもエラー。(T_T)
今度は、Windows 上にあってはならないファイル名である、ファイル名の最後がドット(.)であるファイルが生成されている事が判明。
なろー!
■オプション --exclude-from
本当は、何らかの形でファイル名を変換するのがまっとうな方法なのだろうけれど、ファイル名の末尾にドットになっているファイルは通常は作成する事はないので、バックアップから除外してしまう事にする。
rsync に --exclude-from を追加し、除外するパターンを記載したファイルを指定。
ついでに、コロン(:)を含むファイルも除外するように指定。
■ディスク容量バカ食い
バックアップを何世代か実行すると、当然の事ながら、ディスク容量をどんどん食っていく。
現在のディスク容量だと、5世代くらいしかバックアップできない。
なんとか差分だけをバックアップできないだろうか。
バックアップ・サーバが Unix 系であれば、rsync に --link-dest を使用すれば、ファイルをハード・リンクする事で、ディスク容量を抑止してくれるのだが、Windows ではできんのだろうか。
WEBを漁ってみると...。
あれ?
え?
Windows でもファイルでハード・リンクが使えるの?
Windows のリソースキットに linkd というコマンドがあって、フォルダをハード・リンクできる事は知っていたのだけれど、ファイルのハード・リンクは fsutil というコマンドでできるらしい。
知らなかった。(^^;
さっそく、rsync に --link-dest を指定してバックアップを実行してみる。
バックアップされたファイルを、cygwin 上で「ls -i」で確認してみると、おぉ、iノードの数値が同じだ。
試しに一方のファイルを開いて書き込んでみると、もう一方の内容も変更されている。
おぉ、これでディスクを大量に消費する事なくバックアップができるようになった。(^^)
おしおし、動いた。
まだ、バックアップ中にときどき rsync が落ちてしまう事があるけど、これは少しずつ調整していく事にしよう。
投稿者 zunbe : 2009/08/03 15:00:00
トラックバック
|
〔http://blog.zunbe.com/mt/mt-tb.cgi/1077〕
|
|