MY-NOTEBOOK

Wednesday, January 7, 2009

Mac OS X(Leopard) + Time Capsule + rsyncによる遠隔地ミラーバックアップ(コロケーション)環境の構築

Time Capsule は、Time Machineのバックアップ用として使われるようにデザインされていますが、普通のNASとしても使うことができます。

今回、タイムカプセルとMacMiniを組み合わせて、ファイルサーバを構築した上で、遠隔地にあるバックアップクライアントから 自動でrsync を使ってミラーバックアップを行う環境を構築しました。(いわゆるコロケーションです。)

手順

以下に、手順を簡単に整理しました。

Time Capsule を NASとして Windows,Mac OS Xクライアント混在環境で使う

Time Capsule はNASとして使えますが、普通のNASにあるユーザ管理機能... いわゆるディレクトリサービスは付属していないようです。
したがって、アクセスしてきたクライアントごとに、NAS上のファイルのアクセス権をコントロールしたい、といったことはできません。単なる共有ファイルサーバとして使います。

Time Capsuleの設定とクライアントの設定

はじめに、Time Capsule を NAS として既存のネットワークに参加するように設定しておきます。
また、ウインドウズファイル共有設定もイキにしておきます。
(設定は、AirMac設定アシスタントを使って簡単に設定できます。)
このとき、以下の条件で設定したことで以下、説明します。

  • 名前 : TC
  • IPアドレス :192.168.0.100 (固定IP)
  • パスワード : hogehoge

※設定時のトラブルを避けるために、Time Capsule の名前に日本語や半角スペースを含めない方がいいと思います。
(実際には試していないので、日本語が含んでいても問題ないかもしれません。)

Mac OS X クライアントからアクセスする

  1. Finderのメニューから【移動 - サーバへ接続】
  2. 192.168.0.100 を入力
  3. パスワードを hogehoge を入力

Windows XP クライアントからアクセスする

  1. Windows Explorer のメニューから【ツール - ネットワークドライブの割り当て】
  2. \\\\192.168.0.100\\TC\\
  3. ユーザ: TC , パスワード: hogehoge (※ユーザ名はどんな名前でも通る気がするのだが、そこまでは未調査)

MacMiniを sshd サーバとしてセットアップ

次に、タイムカプセル上のデータを遠隔地にあるバックアップクライアントから
rsync を使ってミラーバックアップする準備をします。

rsync は ssh を使って、データ転送を行うことができます。
そこで、ssh で外部から Time Capsuleのディスク領域にアクセスできるようにしたい。
しかし、Time Capsule には sshd はないため MacMini を別途用意してそこで sshd を起動し、MacMini経由で Time Capsule にアクセスできるようにします。

  1. MacMini(Mac OS X Leopard)を用意
  2. MacMiniのIPアドレスを固定IPに設定
  3. リモートログインにチェックして sshd を起動
  4. MacMiniからTime Capsuleをマウント
  5. 外部から ssh で MacMini にリモートログインできるようにする

以下の説明では、

  • MacMiniの固定IP : 192.168.0.101
  • MacMiniのユーザ : foo , パスワード : foobar

と設定したことにして話を進めます。

MacMini(Leopard) を用意して sshd を起動

  • 【システム環境設定 - 共有 】 リモートログインにチェック
  • 【システム環境設定 - 省電力設定 】 スリープなしに設定

これで sshd が起動します。(外部から sshクライアントでログインできるようになります。)
また、MacMiniがスリープしないよう省電力設定でスリープなしに設定しておきます。

sshによる接続テスト

外部のマシンから接続テストを行います。

    local $ ssh foo@192.168.0.101
    password: ******(※foobarと入力)
    macmini $

ssh でログインできたら、scp , rsync コマンドでも同様にうまく作動するか試します。

scp テスト

    local $ echo "hello macmini." > hello.txt
    local $ scp hello.txt foo@192.168.0.101:/Users/foo/hello.txt
    password :

※Macminiの /Users/foo/hello.txt にファイルがコピーされたか確認します。

rsync テスト

事前に MacMini に /Users/foo/test/ ディレクトリを作成した上で...

    local $ mkdir test
    local $ echo "hello macmini." > test/hello.txt 
    local $ rsync  --progress -av -e ssh test/ foo@192.168.0.101:/Users/foo/test/
    password :

※Macminiの /Users/foo/test/ ディレクトリがミラーされたか確認します。

MacMiniからTime Capsuleを自動マウント

遠隔地のバックアップクライアントが MacMini にアクセスし、そこから Time Capusle のディスク領域を読み取れるようにするため、MacMini から Time Capsule をマウントします。

Terminalを使って Time Capsule を手動マウント

MacMini から Time Capusle をマウントするには、以下の方法でマウントできます。

macmini $ mkdir /Users/foo/tc
macmini $ mount -t afp afp://winz:hogehoge@192.168.0.100/TC/ /Users/foo/tc

cron を使ってMacMini起動時に自動マウント

先ほどの mount コマンドを /Users/foo/bin/auto-mount-tc.sh に記述しておき、MacMini 起動時にこのスクリプトを動かせば、結果として、自動マウントが実現します。
MacMini起動時にスクリプトを動かす方法の一つは、cron を使う方法です。

Step1) auto-mount-tc.sh の用意

#!/bin/sh
/sbin/mount -t afp afp://foo:hogehoge@192.168.0.100/TC/ /Users/foo/tc

※ foo:hogehoge@192.168.0.100 の部分で “ユーザ:パスワード@TimeCapusleのIPアドレス” を表現しています。

Step2) cronの設定

crontab -e にて以下の記述を追加

@reboot /Users/foo/bin/auto-mount-tc.sh

/Users/foo/bin/auto-mount-tc.sh
実行権を付与しておきます。

macmini $ chmod 755 /Users/foo/bin/auto-mount-tc.sh

以上の設定により、MacMini電源さえ入れておけば、/Users/foo/tc 以下にTime Capusleをマウントした状態になります。
あとは、このディレクトリを遠隔地のバックアップクライアントから rsync を使ってミラーバックアップするだけです。

MacMiniをマウス・キーボード・ディスプレイレスで運用

Time Capusleのマウントは、Finderメニューから行うこともできますが、mountコマンドと cron を組み合わせることで、マシンの起動時に自動でTime Capusleをマウントできます。
この方法を使えば、MacMiniは、マウスとキーボードとディスプレイなしにMacMiniを運用することができます。

遠隔地のバックアップクライアントから rsync にてミラーバックアップする(手動)

以上の設定ができていれば、同じローカルネットワーク内のクライアントマシンから以下のコマンドでミラーバックアップができます。

local $ rsync --progress -z -av -e ssh foo@192.168.0.101:/Users/foo/tc/ /path/to/backup-hdd

ローカルではなく、インターネット越しの遠隔地にあるバックアップ用クライアントから rsync するには、どうすればいいか?

それは、インターネットから MacMini に ssh を使って接続できる環境をつくる必要があります。
もし、インターネットから foobar.net でこのMacMiniにアクセスできるとすれば... 以下のコマンドでミラーバックアップできます。

$ rsync --progress -z -av -e ssh foo@foobar.net:/Users/foo/tc/ /path/to/backup-hdd

インターネットからMacMiniを見えるようにするには...

一番簡単なのは、192.168.0.101 のIPで設定してきた「MacMini」をインターネットから直接アクセスできるところに設置し、グローバルな固定IPアドレスを設定することです。

ただ、普通は、そういうことはしません。
ルータを設定して、ルータ経由でMacMiniに ssh (ポート22)接続できるようにします。
「ssh,ルータ,設定」などでググれば情報が出てくると思います。

また、それ以前の問題として、ほとんどのケースで、固定IPを使ってインターネット接続しているところはないと思います。
そのような場合、インターネットに接続するIPアドレスは定期的に変わってしまうため、IPアドレスが固定化していないネットワークに外部からアクセスするには、DynamicDNSサービスなどを併用する必要があります。

遠隔地のバックアップクライアントから rsync にてミラーバックアップする(自動)

「遠隔地のバックアップクライアントから rsync にてミラーバックアップする(手動)」では、毎回 パスワードを入力しないとバックアップできません。
バックアップは定期的に自動で行うのが普通なので、これは不都合です。

ここではパスワードを入力しないで、rsync を実行する手順を説明します。

  • 遠隔地のバックアップクライアント : remote $
  • TimeCapusleをマウントしているsshdを起動した MacMini : macmini $

として説明します。
手順が若干ややこしいですが、やっていることは、遠隔地バックアップクライアントが MacMiniから信頼されるように、鍵を生成して、公開鍵を MacMiniにコピーする、という内容です。

Step1) 鍵の生成

remote $ ssh-keygen -t dsap. このときパスフレーズの入力を求められますが、*空* にします。
ここがポイントです。

以下の2つのファイルが生成されます。

* ~/.ssh/id\_dsa
* ~/.ssh/id\_dsa.pub

Step2) 公開鍵のMacMiniへのコピーと設置

Step1 で生成した公開鍵 id\_dsa.pub の内容を MacMini の ~/.ssh/authorized\_keys2 に追加します。
ここでは話を簡単にするために、MacMini には ~/.ssh/authorized\_keys2 は存在していなかったこととして説明します。
(存在している場合はバックアップをとってからやってください。)

remote $ scp ~/.ssh/id_dsa.pub foo@foobar.net:~/.ssh/authorized_keys2

※ @foobar.net のところは、MacMiniを表すIPアドレスまたはドメイン名を入れます。

Step3) remoteから rsync で MacMiniにアクセスして rsync によりミラーバックアップ

remote $ rsync -av -e "ssh -i ~/.ssh/id_dsa " foo@foobar.net:/Users/foo/tc/ /path/to/backup-hdd

うまく設定できていれば、パスワードなしでアクセスすることができます。

Step4) バックアップスクリプトの作成

/Users/tomo/bin/myrsync.sh として以下のスクリプトを作成

#!/bin/sh

LOG=/Users/tomo/var/log

#DELETEOPT=--delete
DELETEOPT=""

MACMINI=foobar.net

#MACMINI=192.168.0.101


# rsync

R=`/bin/df | grep backup | grep Volumes`

if [ -z "$R" ] 
then
        echo "error, USB HDD not mounted." > $LOG
else
        echo "ok ... do sync" > $LOG
        /usr/bin/rsync --progress -z -av -e "ssh -i /Users/tomo/.ssh/id_dsa " $DELETEOPT 
        $USER@$MACMINI:/Users/foo/tc/ 
        /Volumes/backup/tc/ >> $LOG
        /bin/df | grep backup | grep Volumes >> $LOG
fi

# copy log
MYDATE=`/bin/date +%Y%m%d-%H%M`
/usr/bin/scp -i /Users/tomo/.ssh/id_dsa  $LOG $USER@$MACMINI:~/var/log.$MYDATE 
rm -f $LOG
処理内容
  1. “backup” と名付けた外付けHDDが /Volumes/backup マウントされているか確認
  2. 問題がなければ rsync を実行
  3. ログをMacMini にscp で転送

Step5) cron への登録

crontab -e にて、myrsync.sh を 毎日 6:00, 12:00,18:00,0:00 に実行するようにセット。

0 6 * * *     /Users/tomo/bin/myrsync.sh
0 12 * * *     /Users/tomo/bin/myrsync.sh
0 18 * * *     /Users/tomo/bin/myrsync.sh
0 0 * * *     /Users/tomo/bin/myrsync.sh

※ myrsync.sh は chmod 755 などで実行権限を設定しておくこと。

まとめ

Mac OS X は 簡単なところは、簡単にGUIで設定でき、細かい部分に関しては、UNIXの流儀で設定していける、さらにUNIXツールがそのまま搭載されているため、UNIX,Linuxの豊富なネット上のドキュメントも参照しながら設定が行える、という利点をあらためて実感しました。

今回の環境構築も事前の調査は時間がかかりましたが、設定自体は、まる一日程度で完了しています。

Mac OS XもLeopardになり、Sambaのバージョンがあがって、Windowsとのファイル共有でそれ以前にはあった、日本語ファイル・ロングファイルネームのトラブルがほとんどないという情報を得て今回、Mac OS X ベースでコロケーション環境を構築しました。
まだ本当にトラブルがないのかはこれからの検証になりますが。

© 2006-2012 Tomoaki Oshima