I wrote an earlier post about installing CrashPlan on Nexenta. However, it seems that CrashPlan have changed their Linux installer's modus operandi, and it tries to install a (Linux) JRE of its own. Of course, that won't work; it needs the Nexenta JRE (but I get the whole JDK, as you never know when you'll need to brew up some Java):
$ sudo apt-get install sun-java6-jdk
Anyhow, I received some comments and emails about setting all this up, and figured I'd break it down a little more for people who still want to get it all working. It's a process of hacking things together, though, not a blind recipe; that's why I'm proceeding almost as if it's a debugging session.
Anyhow, once we have a JRE installed (from apt-get above), we can try and extract out the guts of the Linux installer, so rather than running its install.sh, we can set it up manually.
I went to the CrashPlan Linux download web page, and started downloading the installer in a scratch folder (this was the URL at the time of writing):
$ wget http://download.crashplan.com/installs/linux/install/CrashPlan/CrashPlan_2010-03-08_Linux.tgz
That's a gzipped tar archive, so I extracted it:
$ tar xzf CrashPlan_2010-03-08_Linux.tgz $ cd CrashPlan-install # the dir it extracted $ ls CrashPlan_2010-03-08.cpi EULA.txt INSTALL README install.sh scripts uninstall.sh
I didn't know what the big CrashPlan*.cpi file was, so I checked:
$ file CrashPlan_2010-03-08.cpi CrashPlan_2010-03-08.cpi: gzip compressed data, was "CrashPlan_2010-03-08.cpi", from Unix, max compression
So it's a gzipped file! I decompressed it, and tested the result:
$ gunzip < CrashPlan_2010-03-08.cpi > test $ file test test: ASCII cpio archive (pre-SVR4 or odc)
A cpio archive! I extracted that too, but in a separate directory:
$ mkdir t; cd t; cpio -i ../test $ ls bin conf doc jniwrap.lic lang lib libjniwrap.so libjniwrap64.so libjtux.so libjtux64.so log skin upgrade
Now this looks very close to the root listing of my actual current CrashPlan install on Nexenta, and by and large it is. Here's a rough difference between the two (listing.curr is my actual install, listing is extracted from the installer):
--- listing.curr 2010-11-15 06:32:12.548701734 +0000 +++ listing 2010-11-15 06:31:40.726884007 +0000 -CrashPlanEngine.pid -bin/CrashPlanDesktop -bin/CrashPlanEngine -bin/CrashPlanEngine.lsb -bin/run.conf -bin/vars.sh -conf/my.service.xml -conf/service.login -conf/service.model -install.vars -libjtux.so.lsb -libjtux.so.sol
Let's go through those. This install tree is almost complete; it can be put in /usr/local/crashplan (that's where I have mine) or wherever you like, so long as the configuration bits are also hooked up appropriately.
CrashPlanEngine.pid is just the pidfile, a text file containing the process id of the currently running instance. I'm not sure why it's in the crashplan directory rather than somewhere like /var/run, but it is. I believe the crashplan service will create it.
CrashPlan* are all shell wrappers for Java applications; *.lsb (LSB for Linux Standard Base) are the original versions (I think I renamed them to this). I don't have an X server or libraries on my Nexenta install, so I'm uninterested in CrashPlanDesktop. CrashPlanEngine however is important; it's the main daemon file. Here's mine, which seems to work; I think I may have edited it to work with some GNU utils rather than Solaris utils, as I believe this came from the Solaris installer (or vice versa; actually that's probably more likely):
#!/bin/bash TARGETDIR="`dirname ${0}`/.." . ${TARGETDIR}/install.vars . ${TARGETDIR}/bin/run.conf cd ${TARGETDIR} case $1 in start) PID=`/usr/bin/ps -Af -o pid,ppid,args | grep 'app=CrashPlanService' | grep -v grep | cut -f2 -d' '` if [ -n "$PID" ]; then echo CrashPlan is already running with pid $PID exit 1; fi echo "Starting CrashPlan Engine ... " nice -n 19 ${JAVACOMMON} ${SRV_JAVA_OPTS} -classpath "./lib/com.backup42.desktop.jar:./lang" com.backup42.service.CPService > ${TARGETDIR}/log/engine_output.log 2> ${TARGETDIR}/log/engine_error.log & if [ $! -gt 0 ]; then echo $! > ${TARGETDIR}/CrashPlanEngine.pid echo "OK" else echo "FAIL" exit 1 fi ;; stop) echo "Stopping CrashPlan Engine ... " if [ -f ${TARGETDIR}/CrashPlanEngine.pid ] ; then kill `cat ${TARGETDIR}/CrashPlanEngine.pid` sleep 5 fi PID=`/usr/bin/ps -Af -o pid,ppid,args | grep 'app=CrashPlanService' | grep -v grep | cut -f2 -d' '` if [ -n "$PID" ]; then echo Still running, killing PID=$PID kill -9 $PID fi rm -f ${TARGETDIR}/CrashPlanEngine.pid echo "OK" ;; *) echo "$0" exit 1 ;; esac
As you can see, that script sources (includes) a couple of other guys, bin/run.conf and install.vars. bin/run.conf looks like this:
SRV_JAVA_OPTS="-Dfile.encoding=UTF-8 -Dapp=CrashPlanService -DappBaseName=CrashPlan -Xms20m -Xmx512m -Dsun.net.inetaddr.ttl=300 -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.negative.ttl=0 -Dnetworkaddress.cache.negative.ttl=0" GUI_JAVA_OPTS="-Dfile.encoding=UTF-8 -Dapp=CrashPlanDesktop -DappBaseName=CrashPlan -Xms20m -Xmx512m -Dsun.net.inetaddr.ttl=300 -Dnetworkaddress.cache.ttl=300 -Dsun.net.inetaddr.negative.ttl=0 -Dnetworkaddress.cache.negative.ttl=0"
install.vars looks like this (for my current install):
TARGETDIR=/usr/local/crashplan BINSDIR=/usr/local/bin MANIFESTDIR=/tank/share/backup/crashplan INITDIR=/etc/init.d RUNLVLDIR=/etc/rc3.d INSTALLDATE=20100310 APP_BASENAME=CrashPlan DIR_BASENAME=crashplan DOWNLOAD_HOST=download.crashplan.com JAVACOMMON=/usr/bin/java
The MANIFESTDIR variable points to a directory I expect I provided when I ran the original install.sh, but there's nothing currently in it. The other paths are as you'd expect.
As far as I can make out, the conf/* files are created by CrashPlan itself in coordination with the configuration utility, which, as I linked in my previous post, can be run remotely from a Windows (or other OS) install of CrashPlan. There's a default.service.xml as a prototypical my.service.xml, while service.{login,model} appear to be login and encryption keys.
That leaves libjtux.so.*. These are renamed versions of the file libjtux.so which differs between Linux and Solaris. Primarily they differ in which C library they link against (note: running ldd on untrusted binaries is unsafe, but I trust these binaries):
$ ldd libjtux.so.* warning: ldd: libjtux.so.lsb: is not executable libjtux.so.lsb: librt.so.1 => /lib/librt.so.1 libnsl.so.1 => /lib/libnsl.so.1 libc.so.6 => (file not found) libmp.so.2 => /lib/libmp.so.2 libmd.so.1 => /lib/libmd.so.1 libscf.so.1 => /lib/libscf.so.1 libc.so.1 => /lib/libc.so.1 libuutil.so.1 => /lib/libuutil.so.1 libgen.so.1 => /lib/libgen.so.1 libm.so.2 => /lib/libm.so.2 warning: ldd: libjtux.so.sol: is not executable libjtux.so.sol: librt.so.1 => /lib/librt.so.1 libsocket.so.1 => /lib/libsocket.so.1 libnsl.so.1 => /lib/libnsl.so.1 libc.so.1 => /lib/libc.so.1 libmp.so.2 => /lib/libmp.so.2 libmd.so.1 => /lib/libmd.so.1 libscf.so.1 => /lib/libscf.so.1 libuutil.so.1 => /lib/libuutil.so.1 libgen.so.1 => /lib/libgen.so.1 libm.so.2 => /lib/libm.so.2
Anyhow, we need to get the right version of libjtux.so. It seems to be an open-source project and getting a version wouldn't be difficult, but the one in the CrashPlan Solaris installer works fine; let's get that one:
# current version when I ran this $ wget http://download.crashplan.com/installs/solaris/install/CrashPlan/CrashPlan_2010-03-08_Solaris.tar.gz $ tar xzf CrashPlan_2010-03-08_Solaris.tar.gz $ cd CrashPlan/root/opt/sfw/crashplan $ ls bin client-build.properties conf doc installer jniwrap.lic lang lib libjtux.so skin upgrade
So here we have the entrails of a CrashPlan for Solaris install, and we can pick and choose which organs we need to transplant; and the thing that's particularly needed is libjtux.so; it needs to replace the Linux version.
All that should be left is getting CrashPlan to start at boot-up, which is easiest manually done in Nexenta with the init.d system. Here's the executable crashplan script I have in /etc/init.d:
#!/bin/bash SCRIPTNAME=/usr/local/crashplan/bin/CrashPlanEngine case "$1" in start) $SCRIPTNAME start ;; stop) $SCRIPTNAME stop ;; restart) $SCRIPTNAME restart ;; force-reload) $SCRIPTNAME force-reload ;; status) $SCRIPTNAME status ;; *) echo "Usage: $0" >&2 exit 3 ;; esac exit 0
And the symlink in rc3.d:
$ ls -l /etc/rc3.d/S99crashplan lrwxrwxrwx 1 root root 21 Mar 10 2010 rc3.d/S99crashplan -> ../init.d/crashplan
That's it!