As promised and after a nudge from Bruce, here’s how I was able to get the Dropbox Linux CLI software running on a DreamHost VPS server. This isn’t super hard but it wasn’t a trivial install, because the Dropbox software is closed-source and it contains binaries compiled against glibc 2.4, whereas my VPS server is using glibc 2.3.
The first step is to get the Dropbox CLI software, unpack it, and move it somewhere of your choosing:
msabramo@wettoad:~/sw$ wget -O dropbox.tar.gz "http://www.dropbox.com/download/?plat=lnx.x86_64" msabramo@wettoad:~/sw$ tar xzf dropbox.tar.gz msabramo@wettoad:~/sw$ mv .dropbox-dist dropbox
At this point, if you try running the Dropbox daemon, you will likely run smack into the glibc problem:
msabramo@wettoad:~/sw$ cd dropbox msabramo@wettoad:~/sw/dropbox$ ./dropbox ./dropbox: /lib/libc.so.6: version `GLIBC_2.4' not found (required by ./dropbox)
The dropbox
executable is dynamically linked against /lib/libc.so.6
and expects it to be glibc 2.4. On my server, it is glibc 2.3, which can be ascertained by using the strings
command and grepping for GLIBC
(not shown). So we need to install glibc 2.4 and get dropbox to use it.
We start by downloading and building glibc 2.4. We specify a prefix so that the libraries get installed in a special directory dedicated to glibc 2.4 stuff. This is critical — if you install in a standard location, you will make a royal mess of the system, as tons of programs are expecting glibc 2.3:
msabramo@wettoad:~/sw$ wget http://ftp.gnu.org/gnu/glibc/glibc-2.4.tar.gz ... msabramo@wettoad:~/sw$ tzx glibc-2.4.tar.gz msabramo@wettoad:~/sw$ cd glibc-2.4 msabramo@wettoad:~/sw/glibc-2.4$ mkdir -p build/linux_2.6.33.7_x86_64 msabramo@wettoad:~/sw/glibc-2.4$ cd build/linux_2.6.33.7_x86_64 msabramo@wettoad:~/sw/glibc-2.4/build/linux_2.6.33.7_x86_64$ ../../configure \ > --prefix=/home/msabramo/run/glibc-2.4 --enable-kernel=2.6 --enable-addons \ > --enable-nptl --enable-tls && make && make install ... /home/msabramo/sw/glibc-2.4/build/linux_2.6.33.7_x86_64/elf/ldconfig: Can't open configuration file /home/msabramo/run/glibc-2.4/etc/ld.so.conf: No such file or directory make[1]: Leaving directory `/home/msabramo/sw/glibc-2.4'
Now here’s the part that took me a little while to figure out — getting dropbox
to use the new glibc. My first attempts involved using LD_LIBRARY_PATH
and LD_PRELOAD
, but these cause the process to immediately segfault. Then I realized that when you build glibc 2.4, you also build a new dynamic linker (ld.so) — i.e.: ld-2.4.so
. It turns out that you have to use that dynamic linker.
msabramo@wettoad:~/sw/glibc-2.4/build/linux_2.6.33.7_x86_64$ cd ~/sw/dropbox msabramo@wettoad:~/sw/dropbox$ cp ~/run/glibc-2.4/lib/ld-2.4.so . msabramo@wettoad:~/sw/dropbox$ ./ld-2.4.so ./dropbox This client is not linked to any account... Please visit https://www.dropbox.com/cli_link?host_id=a76023a26676cea22072d0a159d30b75 to link this machine.
Bingo. No segfault. At this point, you visit the URL and authorize the machine. Then some finishing touches (which you might do very differently, depending on your preferences):
msabramo@wettoad:~/sw/dropbox$ cd msabramo@wettoad:~$ ln -s ~/sw/dropbox/dropboxd ~/bin/dropboxd msabramo@wettoad:~$ which dropboxd /home/msabramo/bin/dropboxd msabramo@wettoad:~$ ls -l $(which dropboxd) lrwxrwxrwx 1 msabramo pg156676 34 Apr 14 14:37 /home/msabramo/bin/dropboxd -> /home/msabramo/sw/dropbox/dropboxd* msabramo@wettoad:~$ diff -u ~/sw/dropbox/dropboxd.2011-04-14-143625 ~/sw/dropbox/dropboxd --- /home/msabramo/sw/dropbox/dropboxd.2011-04-14-143625 2011-04-14 14:36:16.000000000 -0700 +++ /home/msabramo/sw/dropbox/dropboxd 2011-04-14 14:36:30.000000000 -0700 @@ -7,4 +7,4 @@ PAR=$(dirname $(readlink -f $0)) OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH LD_LIBRARY_PATH=$PAR:$LD_LIBRARY_PATH -exec $PAR/dropbox $@ +exec $PAR/ld-2.4.so $PAR/dropbox $@ msabramo@wettoad:~$ dropboxd
The last part above is tweaking the dropboxd
wraper shell script so that it invokes the new dynamic linker. Now we can start the dropbox process from anywhere by invoking dropboxd
.
Then I wanted to manage the dropbox process with supervisor, because I recently discovered supervisor and it is a nice way to start, stop, and monitor long-running processes. Here’s how I did it (this assumes supervisor is already installed, which typically can be done with pip install supervisor
or easy_install supervisor
):
msabramo@wettoad:~$ grep dropbox ~/run/etc/supervisord.conf [program:dropboxd] command=/home/msabramo/sw/dropbox/dropboxd msabramo@wettoad:~$ supervisorctl update dropboxd: added process group msabramo@wettoad:~$ supervisorctl status celeryd RUNNING pid 8715, uptime 0:02:03 dropboxd RUNNING pid 8442, uptime 0:02:21 msabramo@wettoad:$ pgrep -fl dropbox 8442 /home/msabramo/sw/dropbox/ld-2.4.so /home/msabramo/sw/dropbox/dropbox
Note that you don’t have to create the ~/Dropbox
directory. The dropbox
process will do that for you.
At this point, hopefully things are running, and you can see dropbox populating your directory with files.
msabramo@wettoad:~$ du -sh Dropbox 9.2M Dropbox msabramo@wettoad:~$ du -sh Dropbox 16M Dropbox msabramo@wettoad:~$ du -sh Dropbox 30M Dropbox
The one problem I have noticed is that the Dropbox process is using more than 260 MB of memory on my VPS, a pretty good chunk of the memory that I am paying for:
msabramo@wettoad:~$ ps uww $(pgrep -f dropbox) USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND msabramo 19073 0.0 6.5 270016 30016 ? Sl 16:49 0:08 /home/msabramo/sw/dropbox/ld-2.4.so /home/msabramo/sw/dropbox/dropbox msabramo@wettoad:~$ free -m total used free shared buffers cached Mem: 448 223 224 0 0 82 -/+ buffers/cache: 140 307 Swap: 0 0 0
This makes me nervous. If the memory usage gets too high, things like my web site and Subversion will start dying, unless I allocate more memory to the VPS, which costs me money. So it would be nice to get the memory usage down. If you have ideas on how to do this, please drop me a line.
Pingback: Dropbox + glibc 2.4 buildout « Marc Abramowitz
Would this work for shared dreamhost account?
I doubt it will survive too much… the famous process killer would keep stopping the process, and it’s possible that DH already tracks that kind of activity/process.
By the way… great instructions… just what I needed!
can you share a compiled binary that would work on dreamhost?
Thanks!
-Alex