« 2008年1月 | トップページ | 2008年3月 »

rsyncでリモート・バックアップ・サーバの構築(Time Capsuleの代替案)

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のバックアップサーバを構築してみましたので、その手順を以下に示します。

準備するもの:

  1. rsyncサーバとなるMac OS Xマシン
  2. 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.confrsyncd.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コマンドによる方法に修正しました。

| | コメント (0) | トラックバック (0)

Mac OS X 10.5.2 Update: X11.appの日本語環境問題なども改善

本日、Mac OS X 10.5.2 Updateがソフトウェア・アップデートを通じてインストール可能になりました。サポートサイトのアップデートの内容には記述はありませんが、X11.appも2.0から2.1.1にバージョンが上がり、以前のエントリで指摘した以下の問題が解決しています。

  • 日本語キーボード配列を自動認識しない →2.1.1で改善
  • UTF-8対応のxtermがない →2.1.1で改善
  • Cmd-TabでX11.appに切り替えたときXのウィンドウが手前に来ない →2.1.1で改善

まず、日本語配列のキーボードが自動認識されるようになったため、Mac OS X 10.4 (Tiger)時代のシンプルな~/.Xmodmapに戻しました。

私の場合は、shiftキー横の一番右下のキーで「_」(underscore)と「\」(backslash)がきちんと入力できるようにしたことと、emacs用にCmdキーにMeta_Lを割り当てただけのシンプルな定義です。

!
! ~/.Xmodmap
!
keysym underscore = backslash underscore
clear Mod1
clear Mod2
keycode 66 = Meta_L
add Mod2 = Meta_L

また、xtermコマンドはきちんとUTF-8に対応しているため、ロケールがja_JP.UTF-8に設定されていれば、日本語の表示およびkinput2+cannaでの入力も可能になりました。もう、urxvtに頼る必要はありません。

Cmd-Tabでの切り替え時にもX11のウィンドウが手前に表示されるようになったため、LeopardでもX11がやっとまともに使えるようになりました。

X11_211

| | コメント (0) | トラックバック (0)

1.1.3 jailbreak: iPhone Dev Team Official vs. iJailBreak 0.4.1

iPhone/iPod touchをファームウェア1.1.3のjailbreak環境にするには、iPhone Dev Teamによるオフィシャルな方法とiJailBreak 0.4.1の2つの方法が知られています。どちらを選択すべきかは、皆さんの環境や1.1.3環境の出来上がり具合で判断する必要がありそうです。

具体的な手順は他の方のブログサイトに譲るとして、ここではそれぞれの方法の利点と欠点を紹介し、自分にとってどちらの手順が好ましいかを判断するための情報を紹介しようと思います。

iPhone Devチーム・オフィシャル手順の特徴:

まず、オフィシャル版の手順の大まかな流れは、以下の図のようになります。

113_jailbreak_official_2

ここで注意しなければならない点は、1.1.3 jailbreakへ変更するためには1.1.2 jailbreak環境が必要なのですが、1.1.1 jailbreakから1.1.2 jailbreakに変更するにはiTunes 7.5環境が必要になってしまう点です。既に、iTunes 7.6にアップデートしてしまっている場合は、もう一台のMac/PC環境でiTunes 7.5を用意する必要があります。物理的に別のマシンが用意できない場合は、VMWareやPallarelsなどのWindows仮想環境を利用するとよいでしょう。

1.1.1の状態から始めると非常にたくさんのステップを踏む必要がありますが、それほど複雑な手順はなく、出来上がる1.1.3 jailbreak環境も日本語表示されていますので、基本的にはオフィシャル版の方法がお勧めです。以下に、オフィシャル版手順の特徴をまとめます。

利点

  • 手順は難しくない
  • 日本語のリソースがきちんと反映されている

欠点

  • 1.1.2 jailbreakを用意するために、iTunes 7.5環境が必要
  • リカバリ手順が長い
  • 追加アプリケーションはiTunes 7.6から購入する必要がある(¥2,480)
  • 追加アプリケーションを有効にしないとアイコン位置の編集機能も使えない

詳細手順

手順の詳細は、iPod touchラボさんのガイドで分かりやすく説明されていますので、そちらを参考にしてください。

iJailBreak 0.4.1手順の特徴:

一方、iJailBreakの手順では、最新のiTunes 7.6の環境のままで問題ありません。また、1.1.1 jailbreakと1.1.2 jailbreakのどちらからでも1.1.3 jailbreak環境に移行することができます。

Ijailbreak_041


しかし、iJailBreak 0.4.1は、Mac OS Xでのみ利用可能であること、現状、intel Macでのみ実行可能であるという制約があります(iJailBreak 0.5.xではPPCもサポートされました)。

また、iJailBreakが完了すると、1.1.3アップグレードユーザが本来¥2,480($20)払わなければ入手できないはずの追加アプリケーションもインストールされます。リリースノートには、合法的であるとの記述がありますが、実際のところは私にもよく分からないため、各自の判断で利用してください。ただ、実際にはオフィシャル版の手順でもファームウェアをアップグレードしただけで/Applications配下にMobileMail.appやMaps.appは存在し、SpringBoard上に表示されないだけの状況になっています。仕組みとしてはiTunesにおける1月のアップデート購入のタイミングでこれらの追加アプリケーションがダウンロードされるわけではなく、表示が有効になるということのようです(QuickTimeの有償Pro機能と同様)。従って、iJailBreakが行っている処理もSpringBoradに対して、これら追加アプリケーションの表示を有効にしているだけだろうと想像されます。

なお、残念なことに、iJailBreak後の1.1.3は、日本語のリソースバンドルがインストールされないため、表示が全て英語表記になります。もちろん、日本語キーボードは使用できますし、リソース以外の日本語の入力/表示は全く問題はありませんが、英語表記が気になる方は現状ではiJailBreakの手順はお勧めしません。以下に、iJailBreakの場合の特徴をまとめます。

利点

  • 1.1.1 jailbreak、1.1.2 jailbreakどちらからでも移行が可能
  • iTunes 7.5環境が必要ない
  • 追加アプリを購入しなくてもインストールされる

欠点

  • PPC MacおよびWindowsでは利用できない
  • 日本語リソースがインストールされない
  • 手順がやや分かりにくい
  • 追加アプリを購入しなくてもインストールされる(合法的?)

詳細手順

iJailBreak 0.4.1の詳細な手順は、iPod loveさんのページで画面のスナップショット付きで大変分かりやすく解説されています。

なお、iJailBreak完了後は、/var/root/Media/softupgrade/に300MBのインストールイメージの残骸が残っていますので、手動で削除するか、Installer.appから"1.1.3 Soft Upg. Cleaner"をインストール/アンインストールしてください(アンインストールしたタイミングで該当ディレクトリが削除されます)。

【追記 2008.2.13】

iJailBreakは、0.5.xでPowerPC Macがサポートされたようです(個人的には未確認)。

| | コメント (2) | トラックバック (0)

1.1.3 jailbreak後にパスワードを変更するとSpringBoardが再起動を繰り返す問題

iPhone/iPod touchを1.1.3 jailbreakした後、passwdコマンドでパスワードを変更すると、SpringBoardが数秒毎に再起動を繰り返してしまう問題が発生します。これは、BSD Subsystemに含まれるpasswdコマンドがファームウェア1.1.3の/etc/passwdおよび/etc/master.passwdファイルを壊してしまうことにより引き起こされる問題のようです。

したがって、BSD Subsystemのこの問題が解決されるまでpasswdコマンドを実行してはいけません。かといって、ユーザrootとmobileのパスワードをデフォルトのalpineにしておくわけにはいきませんので、以下の手順に従って/etc/master.passwdを直接編集しておくことをお勧めします。

/etc/master.passwdは以下のように1カラム目がユーザ名、2カラム目がDESエンコードしたパスワードになっています。

##
nobody:*:-2:-2::0:0:Unprivileged User:/var/empty:/usr/bin/false
root:/smx7MYTQIi2M:0:0::0:0:System Administrator:/var/root:/bin/sh
mobile:/smx7MYTQIi2M:501:501::0:0:Mobile User:/var/mobile:/bin/sh
daemon:*:1:1::0:0:System Services:/var/root:/usr/bin/false
unknown:*:99:99::0:0:Unknown User:/var/empty:/usr/bin/false
_securityd:*:64:64::0:0:securityd:/var/empty:/usr/bin/false

この2カラム目をviなどを使用して編集すれば問題は解決します。Mac OS Xにはcryptコマンドがありませんので、代わりにperlのcrypt()関数を使用してDES暗号化されたパスワード文字列を取得します。

$ perl -e 'print crypt("YOUR_PASSWORD", "SA"), "\n";'
SAb.ud/B16dTo

ここで、YOUR_PASSWORDの部分を実際に使用するパスワードに変更してください。SAの部分はsaltと呼ばれる暗号化の種ですので、任意の2文字を与えてください(例えば、パスワードalpineの暗号化には"/s"が使われています)。crypt()関数の実行結果としてsalt2文字から始まる13バイトの文字列が得られますので、これを/etc/master.passwd内のパスワード(/smx7MYTQIi2Mの部分)と置き換えて保存します。

【追記 2008.3.01】

apptapp Installerから導入されるBSD Subsystemでは未だに解決されていませんが、Jay Freeman氏による新しいパッケージマネージャCydiaからインストールされるBSD Subsystem互換セットではこの問題が解決されています。

| | コメント (9) | トラックバック (0)

« 2008年1月 | トップページ | 2008年3月 »