Automated VirtualBox SmartOS installs

Apr 12, 2012

This is a quick script I wrote to:

  • Download the latest live ISO image of SmartOS
  • Create a VirtualBox VM, or update an existing VM with the latest ISO
  • Configure the VM with a zones disk, and boot it!

For the first install you’ll need to:

  • Configure the network (likely just “dhcp”)
  • Add c0d0 as the zones disk
  • Set a root password

After that it will just update the live ISO and use existing settings. By default it will create a port forward so that you can ssh -p 8322 root@localhost into the VM.

Here’s the script in full (or you can download it here):

#!/bin/sh
#
# Configurables:
#
#  - Disk size is in GB
#  - Memory size is in MB
#  - SSH port is the local forwarded port to the VM:22
#
disksize="32"
memsize="1024"
sshport="8322"
vmname="SmartOS"
dlsite="https://download.joyent.com/pub/iso"

vboxdir=$(VBoxManage list systemproperties \
            | awk '/^Default.machine.folder/ { print $4 }')

#
# Find a suitable md5sum program.
#
if type md5 >/dev/null 2>&1; then
    md5sum='md5'
    column='NF'
elif type digest >/dev/null 2>&1 &&
     digest md5 /dev/null >/dev/null 2>&1; then
    md5sum='digest md5'
    column='NF'
elif type digest >/dev/null 2>&1 &&
     digest -a md5 /dev/null >/dev/null 2>&1; then
    md5sum='digest -a md5'
    column='1'
elif type md5sum >/dev/null 2>&1; then
    md5sum='md5sum'
    column='1'
elif type openssl >/dev/null 2>&1 &&
     openssl md5 -hex /dev/null >/dev/null 2>&1; then
    md5sum='openssl md5 -hex'
    column='NF'
else
    echo "ERROR: Sorry, could not find an md5 program" 1>&2
    exit 1
fi

#
# Download MD5 file and parse it for the latest ISO image and checksum
#
curl -o smartos-sums.txt ${dlsite}/md5sums.txt 2>/dev/null
latest_md5=$(awk '/latest.iso/ { print $1 }' smartos-sums.txt)
smartos_version=$(sed -ne "/^${latest_md5}/s/.*-\(.*\).iso/\1/p" \
                    smartos-sums.txt)
if [ -z "${smartos_version}" ]; then
  echo "ERROR: Couldn't determine latest version"
  exit 1
fi

#
# Download the latest ISO image and verify
#
mkdir -p "${vboxdir}/${vmname}"
if [ ! -f "${vboxdir}/${vmname}/smartos-${smartos_version}.iso" ]; then
  echo "Downloading ${dlsite}/smartos-${smartos_version}.iso"
  curl -o "${vboxdir}/${vmname}/smartos-${smartos_version}.iso" \
          ${dlsite}/smartos-${smartos_version}.iso
  dl_md5=$(${md5sum} "${vboxdir}/${vmname}/smartos-${smartos_version}.iso" \
             | awk '{ print $'${column}' }')
  if [ -z "${dl_md5}" ]; then
    echo "ERROR: Couldn't fetch ISO image"
    exit 1
  fi
  if [ "${latest_md5}" != "${dl_md5}" ]; then
    echo "ERROR: md5 checksums do not match"
    exit 1
  fi
fi

#
# Create VirtualBox VM
#
echo "Creating/Updating Virtual Machine"
VBoxManage showvminfo "${vmname}" >/dev/null 2>&1
if [ $? -eq 0 ]; then
    # VM already exists, just update the ISO image
    VBoxManage storageattach "${vmname}" --storagectl "IDE Controller" \
      --port 1 --device 0 --type dvddrive \
      --medium "${vboxdir}/${vmname}/smartos-${smartos_version}.iso"
else
    # Create the VM
    VBoxManage createvm --name "${vmname}" --ostype OpenSolaris_64 --register
    VBoxManage storagectl "${vmname}" --name "IDE Controller" --add ide

    # Attach the ISO image
    VBoxManage storageattach "${vmname}" --storagectl "IDE Controller" \
      --port 1 --device 0 --type dvddrive \
      --medium "${vboxdir}/${vmname}/smartos-${smartos_version}.iso"

    # Create and attach the zone disk
    VBoxManage createhd --filename "${vboxdir}/${vmname}/smartos-zones.vdi" \
      --size $(echo "${disksize}*1024" | bc)
    VBoxManage storageattach "${vmname}" --storagectl "IDE Controller" \
      --port 0 --device 0 --type hdd \
      --medium "${vboxdir}/${vmname}/smartos-zones.vdi"

    # Set misc settings
    VBoxManage modifyvm "${vmname}" --boot1 dvd --boot2 disk --boot3 none
    VBoxManage modifyvm "${vmname}" --memory ${memsize}
    VBoxManage modifyvm "${vmname}" --natpf1 "SSH,tcp,,${sshport},,22"
fi

#
# Start it up
#
echo "Starting Virtual Machine"
VirtualBox --startvm "${vmname}" &

Hopefully there will be a follow-up post which updates my pkgsrc on Solaris for SmartOS, including zone setup etc.

Share this post on Twitter, HackerNews, Facebook or Google+

All Posts