2012.06.14
他のオンラインバックアップサービスと違い、CrashPlan は「ローカルバックアップ」と呼ばれる、同じPC内のフォルダや外付けハードディスク、またはネットワーク経由で別のPCへのバックアップができる。

初めに思いついたのは、アカウントを2つ作り、自分のサーバ上に VirtualBox で Windows を走らせネットワーク経由でバックアップをとることだった。そこで調べてみたところ、
  1. アカウントは1つでよかった。複数のPCから同じアカウントでログインすると、お互いがバックアップ先として選択できるようになった。
  2. Windows 以外にも Mac、Linux、Solaris をサポートしてる。しかも "headless" モードをサポートしてるのでバックアップ先としてサーバ上で運用するのに最適。
ということが分かった。残念ながら FreeBSD はサポートされてないようだが、少しググってみると Linux emulation で動かしてる例が複数(ここここここ)見つかったので、大丈夫そうだ。ついでに、謎のバイナリ(と言っても Java で書かれてるようだが)を動かすならやっぱり Jail の中で動かしたいでしょう、ということでさくっと試してみた。

まずは、適当なPCに CrashPlan をダウンロード・インストールして起動、アカウントを作成しておく。(複数のPCにインストールして、お互いがバックアップ先として見えるか確認しておくとよいかも)

次にサーバ側の準備をする。初めに Jail の準備。
# setenv d /home/jails/jail
# mkdir -p $d
# cd /usr/src
# make buildworld
# make installworld DESTDIR=$d
# make distribution DESTDIR=$d
# cp -p /etc/resolv.conf $d/etc
# cp $d/etc/crontab $d/etc/crontab.orig
# cat $d/etc/crontab.orig | sed -e 's/^1,31/#1,31/' > $d/etc/crontab # adjkerntz を止める
# cp $d/etc/syslog.conf $d/etc/syslog.conf.orig
# cat $d/etc/syslog.conf.orig | sed -e 's/^\*.err;kern.warning;/#*.err;kern.warning;/' > $d/etc/syslog.conf # console への出力を止める
# mkdir -p /home/jails/crashplan/compat/linux/proc
# cat << EOF >> /etc/fstab.jail # Jail 内で Linux procfs が必要になる
linproc /home/jails/crashplan/compat/linux/proc linprocfs rw 0 0
EOF
# cat << EOF >> /etc/pf.conf # prisoner へのネットワークは pf の NAT で提供する。
ext_if="em0"
jail_subnet="192.168.0.0/24"
crashplan="192.168.0.1/32"

nat on $ext_if from $jail_subnet to ! $jail_subnet -> ($ext_if)
rdr on $ext_if proto tcp from any to ($ext_if) port 4242 -> $crashplan port 4242
rdr on $ext_if proto tcp from any to ($ext_if) port 4243 -> $crashplan port 4243 # こっちはあとで削除する
# cat << EOF >> /etc/rc.conf # Jail と pf の設定。
# pf
pf_enable="YES"
pf_rules="/etc/pf.conf"

# Jail
jail_enable="YES"
jail_list="jail"
jail_jail_rootdir="/home/jails/jail"
jail_jail_hostname="jail.local"
jail_jail_ip="lo0|192.168.0.1/24" # こういう書き方だと、Jail 起動時に自動的に lo0 にアドレスがつく
jail_jail_devfs_enable="YES"
jail_jail_mount_enable="YES"
EOF
Jail を起動。
# /etc/rc.d/jail start jail
# jls # Jail ID を確認する
# jexec X /bin/tcsh # Jail 内に入る
Jail 内で準備をする。(なお、linprocfs を mount することで、linux.ko と linprocfs.ko が自動的に load される)
jail# cat << EOF >> /etc/make.conf
OVERRIDE_LINUX_BASE_PORT=f10
OVERRIDE_LINUX_NONBASE_PORTS=f10
EOF
jail# cat << EOF >> /etc/rc.conf
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"
syslogd_flags="-ss"
crashplan_enable="YES" # 後で rc ファイルを作成する
EOF
jail# portsnap fetch extract
jail# cd /usr/ports/ports-mgmt/portmaster
jail# make install distclean
jail# portmaster emulators/linux_base-f10
jail# portmaster sysutils/linux-procps
jail# portmaster java/linux-sun-jre16
ここまでで Jail 内での Linux emulation の環境が整った。CrashPlan 本体のインストールは 'crashplan' という一般ユーザーを作って行なうことにする。
jail# adduser
(... add user 'crashplan' ...)
jail# su - crashplan
jail$ cd $HOME
jail$ setenv PATH /usr/local/linux-sun-jre1.6.0/bin/:$PATH
jail$ rehash
jail$ fetch http://download.crashplan.com/installs/linux/install/CrashPlan/CrashPlan_3.2.1_Linux.tgz
jail$ tar zxf CrashPlan_3.2.1_Linux.tgz
jail$ cd CrashPlan-install
jail$ /compat/linux/bin/bash install.sh

Welcome to the CrashPlan Installer.

Press enter to continue with installation.

Validating environment...

NOTE: You are apparently not installing as root. While it is recommended to
install as root it is not required. If you continue to install as crashplan
then CrashPlan will only be able to back up files readable by crashplan.

Would you like to switch users and install as root? (y/n) [y] n
installing as current user
44127 blocks

You must review and agree to the EULA before installation.

Press enter to read the EULA.
(...)

Do you accept and agree to be bound by the EULA? (yes/no) yes

What directory do you wish to install CrashPlan to? [/home/crashplan/crashplan]
/home/crashplan/crashplan does not exist. Create /home/crashplan/crashplan? (y/n) [y] y

What directory do you wish to store backups in? [/home/crashplan/crashplan/manifest]
/home/crashplan/crashplan/manifest does not exist. Create /home/crashplan/crashplan/manifest? (y/n) [y]

Your selections:
CrashPlan will install to: /home/crashplan/crashplan
And store datas in: /home/crashplan/crashplan/manifest

Is this correct? (y/n) [y]

Unpacking /./CrashPlan_3.2.1.cpi ...
44127 blocks
sed: 1: "/home/crashplan/crashpl ...": command c expects \ followed by text
cat: /proc/sys/fs/inotify/max_user_watches: No such file or directory # 単なるチェックなので無視する

Your Linux system is currently configured to watch files in real time.
We recommend using a larger value; see the CrashPlan support site for details

Starting CrashPlan Engine ... Using standard startup
OK

CrashPlan has been installed and the Service has been started automatically.

Press Enter to complete installation.

Important directories:
Installation:
/home/crashplan/crashplan
Logs:
/home/crashplan/crashplan/log
Default archive location:
/home/crashplan/crashplan/manifest

Start Scripts:
/home/crashplan/crashplan/bin/CrashPlanEngine start|stop
/home/crashplan/crashplan/bin/CrashPlanDesktop

You can run the CrashPlan Desktop UI locally as your own user or connect
a remote Desktop UI to this Service via port-forwarding and manage it
remotely. Instructions for remote management are in the readme files
placed in your installation directory:
/home/crashplan/crashplan/doc


To start the Desktop UI:
/home/crashplan/crashplan/bin/CrashPlanDesktop

Installation is complete. Thank you for installing CrashPlan for Linux.

jail$ cp crashplan/bin/run.conf crashplan/bin/run.conf.orig
jail$ sed -e 's/ttl=0"/ttl=0 -Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.PollSelectorProvider"/' < crashplan/bin/run.conf.orig > crashplan/bin/run.conf # http://wiki.freebsd.org/linux-kernel#Workarounds を参照
jail$ su -
jail# cat << EOF >> /usr/local/etc/rc.d/crashplan # rc ファイルを作る。'crashplan' ユーザで動かすため、少し変な書き方になってる。
#!/bin/sh
#

# PROVIDE: crashplan
# REQUIRE: NETWORKING
# KEYWORD: shutdown

. /etc/rc.subr

home="/home/crashplan/crashplan"
name="crashplan"
rcvar=`set_rcvar`
command="/usr/bin/su"
command_args="/compat/linux/bin/bash ${home}/bin/CrashPlanEngine"
pidfile="${home}/CrashPlanEngine.pid"
start_cmd="${command} -l ${name} -c \"${command_args} start\""
stop_cmd="${command} -l ${name} -c \"${command_args} stop\""
restart_cmd="${command} -l ${name} -c \"${command_args} restart\""
status_cmd="${command} -l ${name} -c \"${command_args} status\""

load_rc_config $name
run_rc_command "$1"
EOF
jail# chmod 755 /usr/local/etc/rc.d/crashplan
jail# exit
jail$ /usr/local/etc/rc.d/crashplan start
Starting CrashPlan Engine ... Using standard startup
OK
jail$ /usr/local/etc/rc.d/crashplan status
CrashPlan Engine (pid 57761
57760
57759
57758
57757
57756
57755
57754
57753
57752
57751
57750
57749
57748
57747
57746
57745
57744
57743
57742
57741
57740
57739
57738
57737
57736
57735
57734
57733
57732
57731
57730
57729
57728
57727
57726
57725
57724
57723
57722) is running.
jail$
ここまで来たらあと一息。CrashPlan のクライアントからこのサーバへつないで設定をする。(といっても、アカウントと紐付けるだけだけど) つなぎ方は CrashPlan のオフィシャルのページに Connect to a Headless CrashPlan Desktop として載ってる。

ただ Jail 内で動かすと(なのかどうかはよく分かってないけど)上記のページの説明とは違い CrashPlan Engine は(127.0.0.1:4243 ではなく) 192.168.0.1:4243 (192.168.0.1 は Jail に割り当てたIPアドレス)で Listen する。なので、わざわざ SSH tunnel を作る必要はなく、代わりに ui.properties の「#serviceHost=127.0.0.1」を「serviceHost=x.x.x.x」(サーバのグローバルIPアドレス)に変更してクライアントを立ち上げる。(なお、この時点では 4242 では Listen してないと思われるが気にしなくてよい) クライアントが立ち上がったら、他のPCで使ってるアカウントを使ってログインする。特に変更することがなければ、そのままクライアントは閉じてよい。これで準備完了。

4243 は認証がまったくないので pf.conf から「rdr on $ext_if proto tcp from any to ($ext_if) port 4243 -> $crashplan port 4243」の行を削除するかコメントアウトし、"pfctl -F all -f /etc/pf.conf" で再読み込み。(pfctl -s nat で確認)

最後に、他のPCのクライアントを起動して、サーバがバックアップ先として表示されるか確認する。されなかったら、Jail 内で netstat し 4242 で Listen してるかや、クライアントから telnet x.x.x.x 4242 などとして接続できるか確認する。うまくバックアップがとれれば crashplan/backupArchives の下にファイルが作られていく。
この記事へのコメント

この記事へのトラックバック
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力] (画像の中の文字を半角で入力してください。)



※ブログオーナーが承認したコメントのみ表示されます。
Rebuild at 2018/10/16 10:57
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。