|
#!/bin/bash |
|
# |
|
# Configurables: |
|
# |
|
# - Disk size is in GB |
|
# - Memory size is in MB |
|
# - SSH port is the local forwarded port to the VM:22 |
|
# |
|
# props: http://www.perkin.org.uk/posts/automated-virtualbox-smartos-installs.html |
|
|
|
usage() { |
|
echo "$0 [options]" |
|
echo " -d --disksize Size of disk in GB (default 32)" |
|
echo " -m --memsize Memory to allocate in MB (default 1024)" |
|
echo " -p --sshport SSH port to forward (default 2222)" |
|
} |
|
|
|
DISKSIZE="32" |
|
MEMSIZE="1024" |
|
SSHPORT="2222" |
|
|
|
while getopts ":d:m:p:" arg; do |
|
case "$arg" in |
|
d) DISKSIZE=${OPTARG} ;; |
|
m) MEMSIZE=${OPTARG} ;; |
|
p) SSHPORT=${OPTARG} ;; |
|
*) usage; exit;; |
|
esac |
|
done |
|
|
|
latest_path=$(curl "https://us-east.manta.joyent.com/Joyent_Dev/public/SmartOS/latest") |
|
dlsite="https://us-east.manta.joyent.com${latest_path}" |
|
|
|
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 '/\.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 |
|
|
|
vmname="SmartOS-${smartos_version}" |
|
|
|
# |
|
# 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" |
|
# VBoxManage modifyvm "${vmname}" --nic1 bridged \ |
|
# --bridgeadapter1 `ifconfig | awk -F: '/^en/ { print $1 }' | head -1` \ |
|
# --nicpromisc1 allow-all |
|
fi |
|
|
|
# |
|
# Start it up |
|
# |
|
echo "Starting Virtual Machine" |
|
VirtualBox --startvm "${vmname}" & |
@bixu also: long term plan is to have vagrant spin up global zone, then use a vagrant plugin to install and connect to local zones. Probably doesn't actually need to mount anything in the global zone, so in the short term it may also be better to try to skip this step.
possibly using http://rubygems.org/gems/vagrant-smartos, or at least something inspired by and heavily drawn from it.