ディレクトリ・ファイルのバックアップとリストアの設定 〜 CentOS6

MySQL データベースのバックアップ と同様に、ディレクトリ・ファイルのデータをバックアップします。手元のクライアント側の Mac(または他の CentOS マシンなど)に、 サーバー側のディレクトリを rsync でダウンロードしてバックアップします。cron で自動で定期実行して(午前4時)、世代別バックアップを行います。

スポンサーリンク

このエントリーは、CentOS 6.4 インストール~設定手順の目次 の一部です。

バックアップ用のディレクトリを作成

まずクライアント側 Mac に、バックアップ用のディレクトリを作成して書き込めるようにする。

ディレクトリの所有者を rsync の実行ユーザーに変更。rsync の実行ユーザーと揃えておかないとエラーになる。

rsync を用いたバックアップようのシェル・スクリプトを作成

クライアント側(Mac または CentOS)で rsync でダウンロードするシェルスクリプトを作成。howm wiki – Pdumpfs のシェルスクリプトを参考に修正する。バックアップ元は、テスト用に /home/username/test/ で作成、実際の運用時には適宜変更します。

シェル・スクリプトは以上です。

パーミッション設定。

バックアップ対象と除外のパスを設定するファイルを作成

次に、include-from.txt ファイルを作成して、バックアップ対象と除外のパスを設定します。バックアップ対象を以下のディレクトリとします。作業は、クライアント側の Mac で行いますが、指定するパスはサーバー機(バックアップ元)のものとなります。

/home/username/test/etc
/home/username/test/home

バックアップから除外が以下のディレクトリとします。

/home/username/test/home/www/cache/
/home/username/test/var
/home/username/test/usr

–include-from= に指定するファイルを作成。+ がバックアップ対象。- が除外。また、パスは $SOURCE(/home/username/test/)からの相対パスで指定する。

また、注意点として、”- home/www/cache/*” の行は先に書かないと期待した動作になりませんでした。以下のように書いたところ、”- home/www/cache/*” もコピーの対象となってしまって失敗。

include-from.txt ファイルも実際の運用時には適宜変更します。rsync の include-from オプションについては情報が少ないし、man もしょぼいのだけど以下が参考になりました。

RSYNCのinclude-from: misc

バックアップのテスト用データを作成

サーバーに SSH ログインしてテスト用のデータを作成後、バックアップをテスト実行してみる。

tree コマンドで確認します。入ってなければ tree コマンドをインストール。

作ったディレクトリ・ファイルを確認。

クライアント側からのバックアップの実行テスト

クライアントの Mac 側からバックアップスクリプトを実行。

バックアップしたファイルを確認します。

狙い通りにバックアップがとれています。もう一回実行。

今度は、ファイル変更がないので、同一ファイルに対してはハードリンクを作成しています。

iノード番号が同じであることから、ハードリンクが作成されているのを確認できます。では、test1.txt を変更してさらにバックアップをとってみます。サーバーにログイン後、ファイルを変更します。

クライアント Mac 側から、バックアップ実行。

etc/hoge/fuga/test1.txt がコピーされています。tree で確認。

ls で確認。

変更した test1.txt の iノード番号が 7404476 → 7405147 へと変わっているのを確認できます。これは、ハードリンクではなくて新たにファイルがコピーされたということです。

テスト終了後に、テスト用にバックアップしたファイルをを削除します。

サーバー側のテスト用バックアップ元も削除します。

以上でテスト終了です。

実際の運用のためにシェル・スクリプトを編集する

テストが終了したので、実際の運用での設定にします。クライアント側 Mac で作業し、まず $SOURCE を変更します。

また、ここで1つ注意点ですが、一般ユーザーで rsync を実行しようとすると、root 所有のパーミッションが 700 などのファイルがコピーできません。なので sudo rsync を実行する必要があります。よって、rsync 実行時に –rsync-path=”sudo rsync” のオプションを付加します。

したがって、編集箇所は2箇所、$SOURCE の変更と rsync コマンドに –rsync-path=”sudo rsync” を付加する部分。

シェル・スクリプトの編集は以上です。

rsync を実行するユーザーがパスワードなしで sudo rsync できる設定を行う

また、バックアップ元(サーバー側)で SSH 越しに rsync するユーザーが、パスワードなしで sudo rsync を実行できるように設定します。サーバーにログインして visudo から以下を追記。

これで、ユーザー username はパスワードなしで sudo rsync が実行できます。詳しくは以下を参考。

sudo + rsync on CentOS 5 – (・∂/Sheeplogh.
sudo + rsync | きぬろぐ

バックアップ対象と除外のパスを本番用に設定

続いて include-from.txt を本番用に設定します。今回私の場合は、CentOS サーバーの /etc, /home, /root, /usr, /var ディレクトリ以下をバックアップ対象とします。クライアント側 Mac での作業ですが、指定するパスはサーバー機(バックアップ元)のものとなります。

バックアップを実行して確認

バックアップを実行。

確認。

2回目は1回目より短時間で終わる。

サーバー側とクライアント側でちゃんとコピーができているか、バックアップ元とバックアップ先のファイル数を確認してみます。

サーバー側、バックアップ元。

クライアント側、バックアップ先。

ここでちょっとトラブルに遭遇。クライアント側の Mac でバックアップをさらに試した所、2回目以降の rsync バックアップ実行で以下のエラーが出ます。

ソケットやパイプなどへのハードリンクがうまくできてない模様… まあいいや、解決策が分からないので一旦後回し。【未解決】

続いて、クライアントの Mac 側で cron を設定。午前11時に1日1回実行。

以上で、ディレクトリ・ファイルのバックアップ設定は終了です。世代管理で、古い世代を削除する場合は、シェルスクリプトをもう少しいじる必要があります

スポンサーリンク
サーバ構築研究会の CentOS 本は、昔からお世話になっています。Linux の教科書は Linux の基本を学ぶのにおすすめです。
スポンサーリンク
 
Twitterを使っていますのでフォローお願いたします!ブログの更新情報もつぶやいてます^^
(英語学習用)

Leave Your Message!