|
#!/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}" & |
FYI, any zfs filesystem on Illumos can be exported over NFS by setting an attribute like so:
zfs set sharenfs=on
This could potentially be your SmartOS zone...