rsyncで自動バックアップ
サーバーを運営していく上で重要なのがバックアップだ。パソコンの部品の中でもHDDはもっとも壊れやすく、サーバーの重要なデータが失われてしまうことがある。実際に自分もHDDのクラッシュを経験した。何か調子が悪いなと思いつつ動かし続けていたサーバーを、ある日再起動してみると途中でストップしてしまう。シングルユーザーモードで起動しても、fsckが動いてくれない。仕方なく新しいHDDに交換したが、別のパソコンにデータをバックアップしていたので被害を受けずにすんだ。
また、あやまってデータを消してしまうこともある。これも体験談だが、WindowsのSSHクライアントからサーバーに接続して作業していたときのこと。電話が入ってきて別の仕事に注意がいったとき、まちがえてクリップボードの中身をSSHクライアントにペーストしてしまったようなのだ。クリップボードの中身がコマンドとしてLinuxで実行されていく。まあ大部分は「command not found」となるけれど、何がどうなったのかホームディレクトリの中のファイルがごっそりと消えていた。rmとかそういう文字列があったのかもしれない。これもバックアップのおかげですぐに復旧できた。
最初のうちはftpでパソコンの側にバックアップをとっていたのだが、これでは面倒でついついバックアップがおろそかになる。そこでバックアップを自動的に行うことを考えた。使うコマンドは「rsync」である。
rsyncの使い方
rsyncはWindowsのxcopyコマンドに似ていて、ディレクトリの構造をたもったままコピーができる。たとえば、/homeディレクトリ以下をまとめてコピーするなんてことが簡単にできるわけだ。2回目以降のコピーでは更新や追加されたファイルだけがコピーされるので、バックアップが短時間で終わる。さらに削除したファイルはバックアップ先でも削除されるため、バックアップ元とバックアップ先の内容をまったく同じに保つことも可能だ。
本当は別のHDDやマシンにバックアップをとるべきだが、まずは同一HDDの別のディレクトリにバックアップをとってみよう。HDDの故障には対処できなくても、誤ってファイルを削除したときなどは役に立つ。ここでは/var/backupディレクトリを作成し、その中に/homeディレクトリ以下の内容をまるごとコピーしてみる。打ち込むコマンドは次の2行だ。
# mkdir /var/backup # rsync -a --delete /home /var/backup
rsyncの書式は「rsync (オプション) (コピー元) (コピー先)」となっている。指定できるオプションは次の表のようになっている。「-a --delete」はコピー元とコピー先を同期させたいときに使うオプションだ。
| -v | バックアップ中にコピーしているファイル名を表示する |
| -r | 指定したディレクトリ以下を再帰的にコピーする |
| -l | シンボリックリンクはそのままコピーする。指定しないとリンク先の実体がコピーされる |
| -H | ハードリンクはそのままコピーする。指定しないとリンク先の実体がコピーされる |
| -p | パーミッション属性をたもったままコピーする |
| -o | 所有者属性をたもったままコピーする。指定しないと属性はコピーしたユーザーのものになる |
| -g | グループ属性をたもったままコピーする。指定しないと属性はコピーしたユーザーのものになる |
| -t | タイムスタンプをたもったままコピーする |
| -D | デバイスファイルをたもったままコピーする |
| -z | データを圧縮して転送する |
| -u | 追加されたファイルだけをコピーする |
| -a | 上記のオプションで「rlptgoD」を同時に指定する |
| --existing | 更新されたファイルだけをコピーし、追加されたファイルは無視する |
| --delete | コピー元で削除されたファイルは、コピー先でも削除する。-aオプションと同時に指定するとコピー元とコピー先を同期できる |
| --exclude '**' | **に一致するファイルはコピーしない。「*.bak」「*~」など特定のファイルを除外したいときに使う |
| --stats | コピーの結果を表示する。指定しないといっさいのメッセージは表示されない |
| -e ssh | 暗号化してファイルを転送する。コピー先としてネットワークでつながった別のホストを指定するときに使う |
rsyncを自動実行
うまくバックアップができることを確認したら、cronで自動実行させるように設定しよう。/etc/crontabにコマンドを追加する。次の例は毎日午前3時10分にバックアップを自動実行させるときの設定だ。
# run-parts 01 * * * * root run-parts /etc/cron.hourly 02 4 * * * root run-parts /etc/cron.daily 22 4 * * 0 root run-parts /etc/cron.weekly 42 4 1 * * root run-parts /etc/cron.monthly 10 3 * * * root /usr/bin/rsync -a --delete /home /var/backup