2012-01-16 [長年日記]

Androidに写真を同期する(rsync編)

以前、WindowsでのWMPを使用した同期方法について書いたけど、今回macになってWMPが使用できなくなったため、新たな方法を模索した記録。いろいろと面倒なので素人にはオススメしない。あと日々の同期についてはもう少し簡略化したい。

前提条件としては、

  • macにマスターデータがある
  • Android端末にすべての写真をコピーしたい

といった感じ。

まずはmac版のdoubleTwistを使ってみたのだけど、MTPに対応していない*1ためUSBで接続してもデバイスの認識すらしなかった。doubleTwistのAirSyncも試してみたけど、写真に関しては端末側からPCに取り込みすることしか出来なかったため、こちらも却下。まあでもネットワーク経由(≒Wi-Fi経由)で同期かけられるのはいいよなーということで色々調べたところ、rsyncによるネットワーク越しの同期がよさそうだったので、その線で行くことに。

何はともあれ、Androidでのrsyncの実装がないと話にならないので、適当に検索したらrsync backup for Androidというアプリがあって、本来はAndroidのバックアップをリモートデバイスに作成するのが目的らしいのだけど、オプションの設定でリモートからローカルへの同期もできるということで、これをAndroid端末にインストールした。rsync for Androidはsshによる通信にのみ対応しているため、こちらの環境も整える必要がある。

ここでちょっと寄り道してubuntuで稼動しているサーバに写真その他をミラーリングしてバックアップ兼メディアサーバー用のデータにし、Androidはこのサーバから同期することに。mac-ubuntu間もAndroidと同様にrsync+sshを使用する。こんな感じ。

mac-(rsync+ssh)->ubuntu-(rsync+ssh)->Android

当然ubuntuの部分を省略してもいいし、windowsでもrsyncの実装があればできると思うけどやってない。windowsだとパーミッションの設定が面倒そう。

rsyncではファイルの所有者の情報をそのまま保持する超便利な機能があるのだけど、リモート側をrootで動かす必要があるし、今回は純粋なユーザデータでリモートからデータを取得したときのユーザ権限になっていればOKなので、rsyncで同期するデータを取り扱うためだけのユーザをubuntu側で適当に作成する。こんな感じ。

remote$sudo adduser --system --disabled-password --shell /bin/sh --group share

これでユーザshareが作成される。このユーザにsshでログインするために、mac側で公開鍵を作成。

local$ssh-keygen

で、鍵を作成し、公開鍵(id_rsa.pub)の内容を/home/share/.ssh/authorized_keysにコピペ。ディレクトリ掘ったり、パーミッションを正しく設定する必要があるけど割愛。適宜アドレス空間による制限やシェルの起動禁止などを行なってmac側からログインし、ログインできる(シェルを禁止した場合はその後すぐ切れる)ことを確認する。

あとはmac側からリモートに同期をかける。送信するファイルを区分するためにexclude,includeをファイルで生成して使用したほうが汎用性があるけど、今回は同期させたいファイル群をフォルダ単位で移動し、~/Pictures/original/機種名としてoriginal/でコマンドを実行している。

local$cd ~/Pictures/original/
local$pwd
/Users/username/Pictures/original/
local$rsync -rtpv . --exclude '.*' -e ssh share@remote:~/Pictures/

ドットファイルは除外。rtpで、再帰的、タイムスタンプ更新、パーミッション維持となるけど、リモート側がrootでない場合は-rtpvの代わりに-avでも同じ結果になる(ハズ)。最初は-nでdry runしたほうが無難。初回はすべてのファイルを送信するので時間がかかるけど、次回以降は差分だけを送信する。

次に、Androidへの同期だけど、書き疲れたのできょうはここまで。

*1 Android3.2ではUSBマスストレージクラス対応がないっぽい