From OPeNDAP Documentation
Revision as of 17:59, 8 January 2009 by Jimg (talk | contribs) (New page: CheapStix is a small project to build a VM using Ubuntu on VMware to deliver Hyrax. The VM will be copied onto cheap memory sticks and given out. It would be great if the stuff was ready f...)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

CheapStix is a small project to build a VM using Ubuntu on VMware to deliver Hyrax. The VM will be copied onto cheap memory sticks and given out. It would be great if the stuff was ready for the ESDSWG meeting which starts on 21 Oct.


  1. Find out a place to get memory sticks at a decent price
    1. How much/many? ~$11.50ea for 100 @ 2GB
    2. With a logo? + 0.99ea for each color after two
Sent in for quotes from (Styles: London and Chicago look good). Cost is ~$11.50ea plus 0.99ea for each color more than two if we get 100 2GB sticks. Lead-time of about a week
What about Chicago in Red or London in Silver?
Also requested quote from
Other sources:
  1. Build the VM
    1. Special dist of Ubuntu or not
      1. Ubuntu: Gets us experience with debian packages and maybe support for building them in Makefiles
      2. Cento gets us something we can use on our rented VMs, maybe
    2. VMware virtual appliance?

1 Update

29 Oct 2008 The project was completed on the 17th in time for the meeting and we presented a poster on the idea there.

I used and ordered 100 2GB Twister 1 drives in Blue with a two-color logo. Cost, including shipping was $10.25 ea.

The Thumb Drive

I've checked the logo (which is a vector graphics file, .ai) into the SVN graphics project.

2 Building the VMs

I built two VMs, both using Ubuntu 8.04 (Hardy). The first one uses the JeOS distribution of Hardy and does not contain a build environment or a GUI in its distribution form while the second does contain both of those things. However, I built the server binaries using a third version of the VM - JeOS with a build environment.

While doing this, make liberal use of the 'snapshot' feature of WS. I mention how I used it to go 'back in time' to a smaller VM, but I actually used it much more than to make just one snapshot (see the picture at right).

There is also a bug somewhere in Ubuntu and/or VMware involving network persistence. There's a subsection below on a fix for that.

2.1 Load a development environment and build & test Hyrax

Here's the procedure:

  1. Get VMware Workstation - I did all of the work in Workstation since it's much easier to build and fiddle with the VM in Workstation than server and the two are mutually exclusive.
  2. Download the ISO for JeOS - I got this from the main Ubuntu site.
  3. Crank up VM Workstation, make a new VM and tie the ISO image to the CDROM drive using the VM's configuration options. Also, turn on shared folders since they simplify transfer of stuff between the VM and the host.
  4. Boot the VM - There's an option to create an initial user. I used jimg and then had to hassle to change it to opendap later. Either way, it's set to use sudo and you do most of this as root (i.e., sudo su)
  5. Install VMware tools - Use the menu in Workstation (WS) and then in the VM as root:
cp -a /media/cdrom0/VMwareTools*.gz /tmp
cd /tmp
tar -xzf VMwareTools*.gz
cd vmware-tools-distrib
  1. Make a snapshot of the VM at this point so we can come back to this state (before we load up the VM with the development tools) later.
    Snapshots of the VM during various stages of development
  2. Now use apt-get to install stuff we need to build the server (i.e., sudo apt-get install <package>)
    1. build-essential
    2. libcurl3, curl, libcurl4-openssl-dev - I may have used libcurl3-dev and not needed curl...
    3. libxml2-dev
    4. subversion, autoconf, automake, libtool, flex, bison - probably not needed if you use the tar.gz distributions
    5. wget (curl works too, but I like wget)
    6. libreadline-dev
    7. libnetcdf-dev, libhdf4g-dev, libhdf5-serial-dev
    8. sun-java6-jre - this you need to run tomcat 6. Don't bother with the tomcat 5.5 code from apt-get
  3. Use subversion to get the code (or use the tar.gz dists from the web page)
  4. Build the BES:
    1. libdap 3.8.2 - configure using prefix (I built it in my own directory once and then again in /opt/Hyrax-1.4.2 which is where the code is on the distributions). Once built, add $prefix/bin to PATH and always use --prefix with configure.
    2. BES 3.6.2
    3. dap-server 3.8.5, netcdf_handler 3.7.9, hdf4_h 3.7.9, freeform 3.7.9, hdf5 1.2.3 - use make install and make bes-conf
    4. Add bes user and group (vi /etc/group and then useradd -g bes -d /dev/null -s /bin/false bes)
    5. Edited bes.conf to user the bes user/group. I added (mkdir) /opt/Hyrax-1.4.2/log and set the log file to /opt/Hyrax*/log/bes.log)
    6. chmod/grp bes /opt/Hyrax-1.4.2/ - so the log file works and may otherwise be needed.
    7. Worked That is, the BES starts and I can talk to it with bescmdln
  5. Get Tomcat - the tomcat 5.5 code available from apt-get is hosed. Instead, download tomcat from Apace (wget .../apache-tomcat-6.0.18.tar.gz)
  6. Unpack Tomcat in /opt - I made a sym link from /opt/tomcat to /opt/apache-tomcat-...
  7. Get the OLFS 1.4.2 webapp.jar from the web page, open and cp the opendap.war in /opt/apache-tomcat-.../webapps
  8. Start Tomcat - You need to set JAVA_HOME for this to work (export JAVA_HOME=/usr/lib/jvm/java-6-sun)
  9. Worked Given that the BES was already running and the make bes-conf targets installed sample data and modified the bes.conf file to match.

2.2 Shrink the JeOS VM

There is a trick I used to get the JeOS VM small: Load development packages to build the server, then go back to a snapshot before anything was loaded except VMware Tools and load only those runtime (not development) packages needed. For example, the dist VM uses libnetcdf4 instead of libnetcdf4-dev which was needed to build the server.

  1. Run make clean in the Hyrax source dirs or remove the source.
  2. Use tar to package the binary build - the entire /opt/Hyrax-1.4.2 tree
  3. Copy to the shared folder directory to put that tar on the host OS - the shared folder directory mounts under /mnt when VMware Tools is running.
  4. Now, shut down the VM and revert to the earlier snapshot where VMware tools had just been installed but nothing else was done. I did this by copying the VM directory on the host and then using the revert option in WS, but I think the copy was not really necessary so long as you take snapshots of any state to which you want to return.
  5. Boot the snapshot2 VM
  6. Copy the tar file from the shared folder to /opt and expand.
  7. Add /opt/Hyrax-1.4.2/bin to PATH
  8. Use apt-get to add libcurl3 and libxml2
  9. Now the client getdap (which was built/installed as part of the libdap build) works
  10. Starting The BES
    1. added the bes user: Use vi to add the bes group to /etc/group, then useradd -g bes -d /dev/null -s /bin/false bes
    2. apt-get libhdf4g, libhdf5-serial-1.6.5-0 libnetcdf4
    3. BES worked - start and then test with bescmdln
  11. Get Tomcat working
    1. apt-get sun-java6-jre
    2. Get tomcat 6.0.18.tar.gz (using wget)
    3. Expand that tar.gz file in /opt. I Made a symlink from /opt/tomcat to /opt/apache...
    4. Set JAVA_HOME to /var/lib/jvm/java-6-sun (note that it's not exactly the same as the package name)
    5. Copy opendap.war to tomcat's webapps
    6. Set CATALINA_HOME to /opt/tomcat - I don't know if this was necessary
    7. Start tomcat (assuming the BES is still running from before)
    8. Test with getdap
  12. Hyrax Workes

Now we have a small VM with a working Hyrax and only the packages needed to run the code - take a snapshot.

2.2.1 The udev hack

I found that sometimes the VM would start in WS with networking broken. I don't see a pattern, but looking at the network devices using ifconfig -a, eth0 is hosed (it does not say 'UP'). to fix, cd to /etc/udev and the file 70-persistent-net-rules to remove the line about eth0 and edit the line for eth1 replacing 'eth1' with 'eth0'. Restart udev and networking using the eponymous scripts in /etc/init.d. Now ifconfig should show eth0 as 'UP'

2.3 Package the VM for distribution

Now set the VM so that the image will prompt the first person to start it for a password. Since we're distributing the VM with a known username and password, this provides some assurance that the password really will be changed. This is also a good time to make permanent the changes to PATH and JAVA_HOME. Lastly, really shrink the VM.

Edit /etc/bash.bashrc so that it calls /opt/initial-config unless that has already been called (use a semaphore file)

export JAVA_HOME=/usr/lib/jvm/java-6-sun
export CATALINA_HOME=/opt/tomcat
export hyrax_prefix=/opt/Hyrax-1.4.2
export PATH=$hyrax_prefix/bin:$PATH

if [ ! -e /etc/opt/initial-config-run ]; then
    sudo touch /etc/opt/initial-config-run

I added the environment variable stuff here, too.

Here's the shell script it runs:


# Let's change the user's password
echo "Thank you for using the OPeNDAP Hyrax appliance"
echo "For the security of the appliance, we need you to change this user passwor
d now."

# You can add here any first user login actions that you require

Since the opendap user can run sudo, we could use sudo passwd opendap in place of passwd. The former would be slicker since the initial user would not be asked to type their password (which they have just entered and is well known) to then change their password.

2.3.1 Last steps

Remove anything that smacks of ssh. This means that if any ssh packages were loaded, remove them using apt-get --purge remove and also look for .ssh directories in login accounts. It's important to not distribute VMs with this stuff...

Now, shrink the disk files - to get the VM to fit in the smallest space without using compression, we need to do the following: Zero fill the disks (files, really) and then use a VMware tool to 'shrink' them. As root:

cat /dev/zero > zero.fill
sleep 1
rm -f zero.fill

Stop the VM (shutdown) and in the host OS run vmware-vdiskmanager -k <disk file master> (there are likely a bunch of 'vmdk' files, the 'master' file is named something like Ubuntu JeOS-000008-cl1.vmdk and is relatively small. Ignore the ones name ...s001.vmdk.

I used zip to compress the resulting VM (which is a directory). I could not figure out how to run zip from the command line, but Fedora/Gnome has a decent 'Create Archive...' option. I chose zip because I know windows users have it.

3 Running the VM

Use VM server to run the VM.

3.1 Data Access

To access data, the VM will need to either have a copy of the data on its local disk or use a network share. Let's assume the latter.

On the host OS, export the share using NFS or Samba. It's a good idea to export the share as read-only. On the VM use apt-get to add samba or nfs and configure it to mount the remote share. Edit /opt/Hyrax-1.4.2/etc/bes/bes.conf so that it uses the remote share as the DataRoot directory.

3.2 Network Access

VMware Server has extensive documentation on this topic.

The Hyrax VM is configured to use DHCP to dynamically request an IP address and DNS hosts when it starts. It looks on the eth0 network interface for this information. In many cases you should change this so that it uses a well know IP number - we didn't do this because the best choice for that number is a function of the network setup where the VM will run.

The VM supports both bridged and NAT networking options.