Mac OS X 10.5 Leaopardで追加された新機能Time Machineは、Time Capsuleの登場により、リモートバックアップが可能となりました。MacBookユーザにとってはとても魅力的なバックアップソリューションですが、個人的にはTime Capsuleの購入は躊躇してしまいます。理由は以下の通りです。
- Time MachineはLeopard(10.5)でしか利用できない(ウチにはまだ、Tiger(10.4)のマシンが2台ある)
- AirMac Base Station(802.11gだけど)は既に持っているため、Time Capsuleはちょっとオーバースペック
- バックアップは確かに手軽だが、いざリストアが必要になったときには、また何時間もかけてリモート・リストアしなければいけない
rsyncを使用したバックアップサーバなら、rsyncでクローンしたバックアップHDをそのままMacBookに内蔵してブートさせることができます。ですので、もし内蔵HDに問題が起こったとしても、最初の復旧手順は内蔵HDとバックアップHDのディスク交換だけです。新しいバックアップHDは後でゆっくり買いにいけばいいのです。もちろん、rsyncはTime Machineのような効率的な世代管理はできませんが、投資と効果をバランスにかけた場合、私の場合はrsyncによるバックアップでよいと判断しました。
今回、rsyncのバックアップサーバを構築してみましたので、その手順を以下に示します。
準備するもの:
- rsyncサーバとなるMac OS Xマシン
- 1.に繋ぐバックアップ用の外付けハードディスク
私の自宅サーバは6年前に購入したiBook(Dual USB)です。CPUはPPC G3 600MHzととても非力ですが、ファイルサーバとメールサーバにしか使用していませんので、能力的には十分です。今までサーバにしているiBookにrsyncサーバを立てていなかったのは、iBookのUSBが1.1なため、とてもバックアップ用のUSB外付けHDを繋ぐ気にはなれなかったためです。今回、SATA-Firewire 2.5インチHDケースが入手できたため、rsyncサーバを構築してみる気になりました。
rsyncサーバとなるMac OS XマシンはLeopardでなくとも構いませんが、リソースフォーク対応の/usr/bin/rsyncが安定して動くTigerの比較的新しいバージョンをお勧めします。私のiBookの場合はMac OS X 10.4.11です。
なお、バックアップ用外付けHDをサーバに接続した後で、そのHDの「情報をみる」ウィンドウの「このボリュームの所有権を無視する」チェックを外すのを忘れずに行っておきます。
サーバ側の設定:
rsyncでファイルシステムをリモートに複製する場合、サーバとクライアント間でよく使われるプロトコルは、sshまたはrsync専用プロトコルの2つです。通常、以下のような書式でrsyncを実行すると、remote-hostにはssh接続が行われます。
$ rsync -aE local-dir remote-host:/remote-dir
個人のホームディレクトリを手動でバックアップするだけであれば、上記のやり方で手軽にバックアップすることができますが、OS全体をバックアップするためにはsshdにrootアカウントの接続を許可しなければなりません。また、cronで自動的にバックアップするためには、スクリプトにrootパスワードを書かなければならないため、セキュリティ的には好ましくありません。OS全体を自動でバックアップすることを目的とする場合には、rsyncサーバを用意し、rsync専用プロトコルで接続する方が適切です。
rsyncをサーバモードで起動するには、rsyncd.confとrsyncd.secretsの2つの設定ファイルを用意します。まず、rsyncd.confです。rsyncd.confのデフォルトの置き場所は/etc/rsyncd.confです。
# /etc/rsyncd.conf
#
# Global options
#
uid = root
gid = wheel
use chroot = yes
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
hosts allow = 10.0.0.0/24
hosts deny = *
#
# Module options
#
[macbook]
comment = rsync backup server for macbook
path = /Volumes/MacBook/
auth users = backup
secrets file = /etc/rsyncd.secrets
read only = no
pathオプションにはサーバに接続したバックアップ用外付けHDがマウントされているディレクトリを指定します。hosts allowオプション、およびhosts denyオプションはrsync接続を許可するホストを制限するためのオプションです。必要に応じて変更してください。
[macbook]の部分はモジュール名で、rsyncクライアントから指定する任意の名前です。auth usersオプションはrsync接続に使用する専用の仮想アカウントで、ここではbackupというユーザ名を指定しています。ユーザbackupのパスワードはsecrets fileオプションに指定したファイル/etc/rsyncd.secretsに以下のように定義します。
# /etc/rsyncd.secrets
#
backup:password
なお、rsyncd.secretsは、rsyncを実行するユーザ(root)のみが読み書きできるようにアクセスモードを変更しておく必要があります。
$ sudo chmod 600 /etc/rsyncd.secrets
rsyncd.confの詳細な設定項目は「man rsyncd.conf」コマンドで表示されるmanページを参照してください。以上の設定ができたら、rsyncをサーバモードで起動します。
$ sudo /usr/bin/rsync --daemon
また、rsyncがシステムの起動時に自動起動するように、/Library/LaunchDaemons/rsync.plistに以下のようなplistファイルを作成しておきます。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>rsync</string>
<key>ProgramArguments</key>
<array>
<string>/usr/bin/rsync</string>
<string>--daemon</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>
クライアント側の設定:
クライアント側に必要なファイルは、backupユーザのパスワードを記入したファイル(ここでは、/etc/rsync.passwd)と、rsyncを実行するシェルスクリプト(ここでは、~/bin/rsync_remote)です。
rsync.passwdは以下のようにbackupユーザのパスワードだけを記入したテキストファイルです。なお、このファイルはrsyncを実行するユーザ(root)だけが読み書きできるようにサーバ側と同様chmodコマンドでアクセス権を0600に変更しておきます。
password
そして、rsyncを実行するシェルスクリプトは、以前のエントリで紹介したものに--password-fileオプションでbackupユーザのパスワードファイルを指定し、コピー先にrsync:で始まるURIを指定したものになります。rsync-hostの部分はrsyncサーバのホスト名またはIPアドレスです。
#!/bin/sh
rsync -a -E --delete --stats --password-file=/etc/rsync.passwd \
--exclude="/dev/*" \
--exclude="/.vol/*" \
--exclude="/Network/*" \
--exclude="/automount/*" \
--exclude="/Volumes/*" \
--exclude="/net" \
--exclude="/home" \
--exclude="/private/tmp/*" \
--exclude="/private/var/launchd/*" \
--exclude="/private/var/run/*" \
--exclude="/private/var/tmp/*" \
--exclude="/private/var/vm/*" \
--exclude="/.Trashes/*" \
--exclude=".Trash/*" \
--exclude=".Spotlight-V100/*" \
--exclude=".TemporaryItems/*" \
--exclude=".hotfiles.btree" \
"/" "rsync://backup@rsync-host/macbook"
上記スクリプトでは、Leopardで変更なったオートマウントディレクトリ/netと/homeを--excludeオプションに追加しています。
このスクリプトを手動で実行する場合は、以下のようにrootで実行します。
$ sudo ~/bin/rsync_remote
rsyncクライアントの自動(スケジュール)実行について:
rsyncスクリプトを深夜に自動実行するするには、通常「sudo crontab -e」コマンドで以下のようなエントリをcronに追加するのが一般的です。
0 1 * * * /Users/steve/bin/rsync_remote > /tmp/rsync_remote.log 2>&1
デスクトップ型のMacであれば、システム環境設定の「省エネルギー」のスケジュールでスリープ解除時刻をcronが発火する同じ時刻に設定しておけば、Macはスリープ状態にしておくことができます。しかし、MacBookの場合はちょっと問題があります。MacBookのディスプレイを閉じて自動スリープにした場合、指定時刻にスリープ解除が行われても10秒程度で再びスリープ状態に移行してしまいます。この問題を避けるためには、rsyncが実行される時刻まではディスプレイを閉じないように注意します。ディスプレイを閉じない状態であれば「省エネルギー」のスリープ解除時刻設定とcron設定を併用することで、rsyncが実行されるまでスリープ状態で待機させておくことができます。
なお、不必要にMacBookの電源をONにしておくのは電源の無駄遣いになりますので、rsyncの実行が終わったら、自動的にスリープモードに移行するように、スクリプトrsync_remoteの最後に以下のコマンドを追加しておくとよいでしょう。
# Sleep. Good night...
/opt/local/sbin/sleepwatcher --now
なお、sleepwatcherコマンドはMacPortsを利用して予めインストールしておきます。
上記手順でリモートにrsyncしたディスクでリカバリまでは試していませんが、リモートバックアップしたHDをサーバから外し、MacBookに接続し直して正常にブートできるところまでは確認しています。
【追記 2008.2.19】
MacBookの場合、ディスプレイを閉じなければ「省エネルギー」のスケジュールとの併用は問題ないことが分かったため、rsyncの自動実行に関する記述を修正しました。また、osascriptコマンドによる'tell application "Finder" to sleep'はcronから実行ではうまく動作しないため、sleepwatcherコマンドによる方法に修正しました。
最近のコメント