summaryrefslogtreecommitdiffstats
path: root/release
diff options
context:
space:
mode:
Diffstat (limited to 'release')
-rw-r--r--release/Makefile82
-rw-r--r--release/Makefile.vm111
-rwxr-xr-xrelease/amd64/mk-azure.sh173
-rwxr-xr-xrelease/amd64/mk-vmimage.sh197
-rwxr-xr-xrelease/i386/mk-azure.sh173
-rwxr-xr-xrelease/i386/mk-vmimage.sh197
-rw-r--r--release/release.conf.sample8
-rwxr-xr-xrelease/release.sh7
-rwxr-xr-xrelease/scripts/mk-vmimage.sh111
-rw-r--r--release/tools/azure.conf30
-rw-r--r--release/tools/gce.conf100
-rw-r--r--release/tools/openstack.conf25
-rw-r--r--release/tools/vmimage.subr185
13 files changed, 586 insertions, 813 deletions
diff --git a/release/Makefile b/release/Makefile
index b69aba4..e462bf3 100644
--- a/release/Makefile
+++ b/release/Makefile
@@ -9,7 +9,9 @@
# mini-memstick: Builds minimal memory stick image (mini-memstick.img)
# ftp: Sets up FTP distribution area (ftp)
# release: Build all media and FTP distribution area
-# install: Copies all release media into ${DESTDIR}
+# install: Invokes the release-install and vm-install targets
+# release-install: Copies all release installation media into ${DESTDIR}
+# vm-install: Copies all virtual machine images into ${DESTDIR}
#
# Variables affecting the build process:
# WORLDDIR: location of src tree -- must have built world and default kernel
@@ -26,6 +28,7 @@
# WITH_VMIMAGES: if set, build virtual machine images with the release
# WITH_COMPRESSED_VMIMAGES: if set, compress virtual machine disk images
# with xz(1) (extremely time consuming)
+# WITH_CLOUDWARE: if set, build cloud hosting disk images with the release
# TARGET/TARGET_ARCH: architecture of built release
#
@@ -103,12 +106,6 @@ IMAGES+= memstick.img
IMAGES+= mini-memstick.img
.endif
-VMTARGETS= vm-base vm-image
-VMFORMATS?= vhd vmdk qcow2 raw
-VMSIZE?= 20G
-VMBASE?= vm
-AZURECONF?= ${.CURDIR}/tools/azure.conf
-
CLEANFILES= packagesystem *.txz MANIFEST system ${IMAGES}
.if defined(WITH_COMPRESSED_IMAGES) && !empty(WITH_COMPRESSED_IMAGES)
. for I in ${IMAGES}
@@ -118,22 +115,7 @@ CLEANFILES+= ${I}.xz
.if defined(WITH_DVD) && !empty(WITH_DVD)
CLEANFILES+= pkg-stage
.endif
-.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
-CLEANFILES+= ${VMBASE}.img
-. for FORMAT in ${VMFORMATS}
-CLEANFILES+= ${VMBASE}.${FORMAT}
-. endfor
-.endif
CLEANDIRS= dist ftp release bootonly dvd
-.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
-CLEANDIRS+= ${VMTARGETS}
-.endif
-.if exists(${.CURDIR}/${TARGET}/mk-azure.sh)
-CLEANFILES+= ${OSRELEASE}.vhd \
- ${OSRELEASE}.vhd.raw \
- azure.img
-CLEANDIRS+= vm-azure
-.endif
beforeclean:
chflags -R noschg .
.include <bsd.obj.mk>
@@ -299,8 +281,13 @@ release:
.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${VMTARGETS}
.endif
+.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE)
+ ${MAKE} -C ${.CURDIR} ${.MAKEFLAGS} ${CLOUDTARGETS}
+.endif
+
+install: release-install vm-install
-install:
+release-install:
.if defined(DESTDIR) && !empty(DESTDIR)
mkdir -p ${DESTDIR}
.endif
@@ -313,52 +300,5 @@ install:
.endfor
cd ${DESTDIR} && sha256 ${OSRELEASE}* > ${DESTDIR}/CHECKSUM.SHA256
cd ${DESTDIR} && md5 ${OSRELEASE}* > ${DESTDIR}/CHECKSUM.MD5
-.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
- mkdir -p ${DESTDIR}/vmimages
-. for FORMAT in ${VMFORMATS}
- cp -p ${VMBASE}.${FORMAT} \
- ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT}
-. endfor
-. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES)
-# This is very time consuming, so defer it after the images are moved to
-# the DESTDIR.
-. for FORMAT in ${VMFORMATS}
- # Don't keep the originals. There is a copy in ${.OBJDIR} if needed.
- ${XZCMD} ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT}
-. endfor
-. endif
- cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \
- ${DESTDIR}/vmimages/CHECKSUM.SHA256
- cd ${DESTDIR}/vmimages && md5 ${OSRELEASE}* > \
- ${DESTDIR}/vmimages/CHECKSUM.MD5
-.endif
-vm-base:
-.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
-. if exists(${.CURDIR}/${TARGET}/mk-vmimage.sh)
- env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
- ${.CURDIR}/${TARGET}/mk-vmimage.sh ${.TARGET} \
- ${VMBASE}.img ${WORLDDIR} ${.OBJDIR}/${.TARGET} ${VMSIZE}
-. endif
-.endif
- touch ${.TARGET}
-
-vm-image: vm-base
-.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
-. if exists(${.CURDIR}/${TARGET}/mk-vmimage.sh)
-. for FORMAT in ${VMFORMATS}
- env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
- ${.CURDIR}/${TARGET}/mk-vmimage.sh ${.TARGET} \
- ${VMBASE}.img ${FORMAT} ${VMBASE}.${FORMAT}
-. endfor
-. endif
-.endif
- touch ${.TARGET}
-
-vm-azure:
-.if exists(${.CURDIR}/${TARGET}/mk-azure.sh)
- env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} AZURECONF=${AZURECONF} \
- ${.CURDIR}/${TARGET}/mk-azure.sh ${.TARGET} azure.img \
- ${WORLDDIR} ${.TARGET} ${VMSIZE} ${OSRELEASE}.vhd
-.endif
- touch ${.TARGET}
+.include "${.CURDIR}/Makefile.vm"
diff --git a/release/Makefile.vm b/release/Makefile.vm
new file mode 100644
index 0000000..9b5f543
--- /dev/null
+++ b/release/Makefile.vm
@@ -0,0 +1,111 @@
+#
+# $FreeBSD$
+#
+#
+# Makefile for building virtual machine and cloud provider disk images.
+#
+
+VMTARGETS= vm-image
+VMFORMATS?= vhd vmdk qcow2 raw
+VMSIZE?= 20G
+VMBASE?= vm
+
+VHD_DESC= Azure, VirtualPC, Hyper-V, Xen disk image
+VMDK_DESC= VMWare, VirtualBox disk image
+QCOW2_DESC= Qemu, KVM disk image
+RAW_DESC= Unformatted raw disk image
+
+CLOUDWARE?= AZURE \
+ GCE \
+ OPENSTACK
+AZURE_FORMAT= vhdf
+AZURE_DESC= Microsoft Azure platform image
+GCE_FORMAT= raw
+GCE_DESC= Google Compute Engine image
+OPENSTACK_FORMAT=qcow2
+OPENSTACK_DESC= OpenStack platform image
+
+.if defined(WITH_CLOUDWARE) && !empty(WITH_CLOUDWARE) && !empty(CLOUDWARE)
+. for _CW in ${CLOUDWARE}
+CLOUDTARGETS+= vm-${_CW:tl}
+CLEANDIRS+= vm-${_CW:tl}
+CLEANFILES+= ${_CW:tl}.img \
+ ${_CW:tl}.${${_CW:tu}_FORMAT} \
+ ${_CW:tl}.${${_CW:tu}_FORMAT}.raw
+${_CW:tu}IMAGE= ${_CW:tl}.${${_CW:tu}_FORMAT}
+. if exists(${.CURDIR}/tools/${_CW:tl}.conf) && !defined(${_CW:tu}CONF)
+${_CW:tu}CONF?= ${.CURDIR}/tools/${_CW:tl}.conf
+. endif
+
+vm-${_CW:tl}:
+ mkdir -p ${.OBJDIR}/${.TARGET}
+ env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
+ ${.CURDIR}/scripts/mk-vmimage.sh \
+ -C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \
+ -i ${.OBJDIR}/${_CW:tl}.img -s ${VMSIZE} -f ${${_CW}_FORMAT} \
+ -S ${WORLDDIR} -o ${.OBJDIR}/${${_CW}IMAGE} -c ${${_CW}CONF}
+ touch ${.TARGET}
+. endfor
+.endif
+
+.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
+CLEANDIRS+= ${VMTARGETS}
+CLEANFILES+= ${VMBASE}.img
+. for FORMAT in ${VMFORMATS}
+CLEANFILES+= ${VMBASE}.${FORMAT}
+. endfor
+.endif
+
+vm-base: vm-image
+
+vm-image:
+.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
+. for FORMAT in ${VMFORMATS}
+ mkdir -p ${.OBJDIR}/${.TARGET}
+ env TARGET=${TARGET} TARGET_ARCH=${TARGET_ARCH} \
+ ${.CURDIR}/scripts/mk-vmimage.sh \
+ -C ${.CURDIR}/tools/vmimage.subr -d ${.OBJDIR}/${.TARGET} \
+ -i ${.OBJDIR}/${VMBASE}.img -s ${VMSIZE} -f ${FORMAT} \
+ -S ${WORLDDIR} -o ${.OBJDIR}/${VMBASE}.${FORMAT}
+. endfor
+.endif
+ touch ${.TARGET}
+
+vm-cloudware: ${CLOUDTARGETS}
+
+list-vmtargets: list-cloudware
+ @${ECHO}
+ @${ECHO} "Supported virtual machine disk image formats:"
+.for FORMAT in ${VMFORMATS:tu}
+ @${ECHO} " ${FORMAT:tl}: ${${FORMAT}_DESC}"
+.endfor
+
+list-cloudware:
+.if !empty(CLOUDWARE)
+ @${ECHO}
+ @${ECHO} "Supported cloud hosting provider images:"
+. for _CW in ${CLOUDWARE}
+ @${ECHO} " ${_CW:tu}: ${${_CW:tu}_DESC}"
+. endfor
+.endif
+
+vm-install:
+.if defined(WITH_VMIMAGES) && !empty(WITH_VMIMAGES)
+ mkdir -p ${DESTDIR}/vmimages
+. for FORMAT in ${VMFORMATS}
+ cp -p ${VMBASE}.${FORMAT} \
+ ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT}
+. endfor
+. if defined(WITH_COMPRESSED_VMIMAGES) && !empty(WITH_COMPRESSED_VMIMAGES)
+# This is very time consuming, so defer it after the images are moved to
+# the DESTDIR.
+. for FORMAT in ${VMFORMATS}
+ # Don't keep the originals. There is a copy in ${.OBJDIR} if needed.
+ ${XZCMD} ${DESTDIR}/vmimages/${OSRELEASE}.${FORMAT}
+. endfor
+. endif
+ cd ${DESTDIR}/vmimages && sha256 ${OSRELEASE}* > \
+ ${DESTDIR}/vmimages/CHECKSUM.SHA256
+ cd ${DESTDIR}/vmimages && md5 ${OSRELEASE}* > \
+ ${DESTDIR}/vmimages/CHECKSUM.MD5
+.endif
diff --git a/release/amd64/mk-azure.sh b/release/amd64/mk-azure.sh
deleted file mode 100755
index 45b70ae..0000000
--- a/release/amd64/mk-azure.sh
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/bin/sh
-#-
-# Copyright (c) 2014 The FreeBSD Foundation
-# All rights reserved.
-#
-# This software was developed by Glen Barber under sponsorship
-# from the FreeBSD Foundation.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# mk-azure.sh: Create virtual machine disk images for Microsoft Azure
-#
-# $FreeBSD$
-#
-
-export PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin"
-
-usage() {
- echo "Usage:"
- echo -n "$(basename ${0}) vm-azure <base image>"
- echo " <source tree> <dest dir> <disk image size> <vm image name>"
- exit 1
-}
-
-panic() {
- msg="${@}"
- printf "${msg}\n"
- if [ ! -z "${mddev}" ]; then
- mdconfig -d -u ${mddev}
- fi
- # Do not allow one failure case to chain through any remaining image
- # builds.
- exit 0
-}
-
-vm_create_azure() {
- # Arguments:
- # vm-azure <base image> <source tree> <dest dir> <disk image size> <vm image name>
-
- VMBASE="${1}"
- WORLDDIR="${2}"
- DESTDIR="${3}"
- VMSIZE="${4}"
- VMIMAGE="${5}"
-
- if [ -z "${VMBASE}" -o -z "${WORLDDIR}" -o -z "${DESTDIR}" \
- -o -z "${VMSIZE}" -o -z "${VMIMAGE}" ]; then
- usage
- fi
-
- trap "umount ${DESTDIR}/dev ${DESTDIR}" INT QUIT TRAP ABRT TERM
-
- i=0
- mkdir -p ${DESTDIR}
- truncate -s ${VMSIZE} ${VMBASE}
- mddev=$(mdconfig -f ${VMBASE})
- newfs -j /dev/${mddev}
- mkdir -p ${DESTDIR}
- mount /dev/${mddev} ${DESTDIR}
- make -C ${WORLDDIR} DESTDIR=$(realpath ${DESTDIR}) \
- installworld installkernel distribution || \
- panic 1 "\n\nCannot install the base system to ${DESTDIR}."
- mount -t devfs devfs ${DESTDIR}/dev
- chroot ${DESTDIR} /usr/bin/newaliases
- echo '# Custom /etc/fstab for FreeBSD VM images' \
- > ${DESTDIR}/etc/fstab
- echo '/dev/gpt/rootfs / ufs rw 2 2' \
- >> ${DESTDIR}/etc/fstab
- # Although a swap partition is created, it is not used in Azure.
- echo '#/dev/gpt/swapfs none swap sw 0 0' \
- >> ${DESTDIR}/etc/fstab
-
- chroot ${DESTDIR} /etc/rc.d/ldconfig forcestart
- chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg bootstrap -y
- chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg install -y \
- python python2 python27 py27-asn1 sudo bash
- if [ ! -z "${VM_EXTRA_PACKAGES}" ]; then
- chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg install -y \
- ${VM_EXTRA_PACKAGES}
- fi
-
- fetch -o ${DESTDIR}/usr/sbin/waagent \
- http://people.freebsd.org/~gjb/waagent
- chmod +x ${DESTDIR}/usr/sbin/waagent
- rm -f ${DESTDIR}/etc/resolv.conf
- chroot ${DESTDIR} /usr/sbin/waagent -verbose -install
- yes | chroot ${DESTDIR} /usr/sbin/waagent -deprovision
- echo 'sshd_enable="YES"' > ${DESTDIR}/etc/rc.conf
- echo 'ifconfig_hn0="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf
- echo 'waagent_enable="YES"' >> ${DESTDIR}/etc/rc.conf
-
- echo 'console="comconsole vidconsole"' >> ${DESTDIR}/boot/loader.conf
- echo 'comconsole_speed="115200"' >> ${DESTDIR}/boot/loader.conf
-
- if [ ! -z "${VM_RC_LIST}" ]; then
- for _rcvar in ${VM_RC_LIST}; do
- echo ${_rcvar}_enable="YES" >> ${DESTDIR}/etc/rc.conf
- done
- fi
-
- sync
-
- while ! umount ${DESTDIR}/dev ${DESTDIR}; do
- i=$(( $i + 1 ))
- if [ $i -ge 10 ]; then
- # This should never happen. But, it has happened.
- msg="Cannot umount(8) ${DESTDIR}\n"
- msg="${msg}Something has gone horribly wrong."
- panic 1 "${msg}"
- fi
- sleep 1
- done
-
- echo "Creating image... Please wait."
-
- mkimg -f vhdf -s gpt \
- -b /boot/pmbr -p freebsd-boot/bootfs:=/boot/gptboot \
- -p freebsd-swap/swapfs::1G \
- -p freebsd-ufs/rootfs:=${VMBASE} \
- -o ${VMIMAGE}.raw
-
- if [ ! -x "/usr/local/bin/qemu-img" ]; then
- env ASSUME_ALWAYS_YES=yes pkg install -y emulators/qemu-devel
- fi
-
- size=$(qemu-img info -f raw --output json ${VMIMAGE}.raw | awk '/virtual-size/ {print $2}' | tr -d ',')
- size=$(( ( ${size} / ( 1024 * 1024 ) + 1 ) * ( 1024 * 1024 ) ))
- qemu-img resize ${VMIMAGE}.raw ${size}
- qemu-img convert -f raw -o subformat=fixed -O vpc ${VMIMAGE}.raw ${VMIMAGE}
-
- return 0
-}
-
-main() {
- cmd="${1}"
- shift 1
-
- if [ -e "${AZURECONF}" -a ! -c "${AZURECONF}" ]; then
- . ${AZURECONF}
- fi
-
- case ${cmd} in
- vm-azure)
- eval vm_create_azure "$@" || return 0
- ;;
- *|\?)
- usage
- ;;
- esac
-
- return 0
-}
-
-main "$@"
diff --git a/release/amd64/mk-vmimage.sh b/release/amd64/mk-vmimage.sh
deleted file mode 100755
index b3ffd23..0000000
--- a/release/amd64/mk-vmimage.sh
+++ /dev/null
@@ -1,197 +0,0 @@
-#!/bin/sh
-#-
-# Copyright (c) 2014 The FreeBSD Foundation
-# All rights reserved.
-#
-# This software was developed by Glen Barber under sponsorship
-# from the FreeBSD Foundation.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# mk-vmimage.sh: Create virtual machine disk images in various formats.
-#
-# $FreeBSD$
-#
-
-PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
-export PATH
-
-usage_vm_base() {
- echo -n "$(basename ${0}) vm-base <base image> <source tree>"
- echo " <dest dir> <disk image size>"
- return 0
-}
-
-usage_vm_image() {
- echo -n "$(basename ${0}) vm-image <base image> <image format>"
- echo " <output image>"
- return 0
-}
-
-usage() {
- echo "Usage:"
- echo "$(basename ${0}) [vm-base|vm-image] [...]"
- echo
- usage_vm_base
- echo
- usage_vm_image
- exit 1
-}
-
-panic() {
- msg="${@}"
- printf "${msg}\n"
- if [ ! -z "${mddev}" ]; then
- mdconfig -d -u ${mddev}
- fi
- case ${cmd} in
- vm-base)
- # If the vm-base target fails, the vm-image target
- # cannot possibly succeed. Touch the .TARGET file
- # so it is not attempted.
- touch vm-image
- ;;
- *)
- # FALLTHROUGH
- ;;
- esac
- # Do not allow one failure case to chain through any remaining image
- # builds.
- return 1
-}
-
-vm_create_baseimage() {
- # Creates the UFS root filesystem for the virtual machine disk,
- # written to the formatted disk image with mkimg(1).
- #
- # Arguments:
- # vm-base <base image> <source tree> <dest dir> <disk image size>
-
- VMBASE="${1}"
- WORLDDIR="${2}"
- DESTDIR="${3}"
- VMSIZE="${4}"
-
- if [ -z "${VMBASE}" -o -z "${WORLDDIR}" -o -z "${DESTDIR}" \
- -o -z "${VMSIZE}" ]; then
- usage
- fi
-
- i=0
- mkdir -p ${DESTDIR}
- truncate -s ${VMSIZE} ${VMBASE}
- mddev=$(mdconfig -f ${VMBASE})
- newfs -j /dev/${mddev}
- mount /dev/${mddev} ${DESTDIR}
- cd ${WORLDDIR} && \
- make DESTDIR=${DESTDIR} \
- installworld installkernel distribution || \
- panic "\n\nCannot install the base system to ${DESTDIR}."
- chroot ${DESTDIR} /usr/bin/newaliases
- echo '# Custom /etc/fstab for FreeBSD VM images' \
- > ${DESTDIR}/etc/fstab
- echo '/dev/gpt/rootfs / ufs rw 2 2' \
- >> ${DESTDIR}/etc/fstab
- echo '/dev/gpt/swapfs none swap sw 0 0' \
- >> ${DESTDIR}/etc/fstab
- sync
- while ! umount ${DESTDIR}; do
- i=$(( $i + 1 ))
- if [ $i -ge 10 ]; then
- # This should never happen. But, it has happened.
- msg="Cannot umount(8) ${DESTDIR}\n"
- msg="${msg}Something has gone horribly wrong."
- panic "${msg}"
- fi
- sleep 1
- done
-
- return 0
-}
-
-vm_create_vmdisk() {
- # Creates the virtual machine disk image from the raw disk image.
- #
- # Arguments:
- # vm-image <base image> <image format> <output image>"
-
- VMBASE="${1}"
- FORMAT="${2}"
- VMIMAGE="${3}"
-
- if [ -z "${VMBASE}" -o -z "${FORMAT}" -o -z "${VMIMAGE}" ]; then
- usage
- fi
-
- mkimg_version=$(mkimg --version 2>/dev/null | awk '{print $2}')
-
- # We need mkimg(1) '--version' output, at minimum, to be able to
- # tell what virtual machine disk image formats are available.
- # Bail if mkimg(1) reports an empty '--version' value.
- if [ -z "${mkimg_version}" ]; then
- msg="Cannot determine mkimg(1) version.\n"
- msg="${msg}Cannot continue without a known mkimg(1) version."
- panic "${msg}"
- fi
-
- if ! mkimg --formats 2>/dev/null | grep -q ${FORMAT}; then
- panic "'${FORMAT}' is not supported by this mkimg(1).\n"
- fi
-
- case ${FORMAT} in
- vhd)
- mkimg_format=vhdf
- ;;
- *)
- mkimg_format=${FORMAT}
- ;;
- esac
-
- mkimg -f ${mkimg_format} -s gpt \
- -b /boot/pmbr -p freebsd-boot/bootfs:=/boot/gptboot \
- -p freebsd-swap/swapfs::1G \
- -p freebsd-ufs/rootfs:=${VMBASE} \
- -o ${VMIMAGE}
-
- return 0
-}
-
-main() {
- cmd="${1}"
- shift 1
-
- case ${cmd} in
- vm-base)
- eval vm_create_baseimage "$@" || return 0
- ;;
- vm-image)
- eval vm_create_vmdisk "$@" || return 0
- ;;
- *|\?)
- usage
- ;;
- esac
-
- return 0
-}
-
-main "$@"
diff --git a/release/i386/mk-azure.sh b/release/i386/mk-azure.sh
deleted file mode 100755
index 45b70ae..0000000
--- a/release/i386/mk-azure.sh
+++ /dev/null
@@ -1,173 +0,0 @@
-#!/bin/sh
-#-
-# Copyright (c) 2014 The FreeBSD Foundation
-# All rights reserved.
-#
-# This software was developed by Glen Barber under sponsorship
-# from the FreeBSD Foundation.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# mk-azure.sh: Create virtual machine disk images for Microsoft Azure
-#
-# $FreeBSD$
-#
-
-export PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin"
-
-usage() {
- echo "Usage:"
- echo -n "$(basename ${0}) vm-azure <base image>"
- echo " <source tree> <dest dir> <disk image size> <vm image name>"
- exit 1
-}
-
-panic() {
- msg="${@}"
- printf "${msg}\n"
- if [ ! -z "${mddev}" ]; then
- mdconfig -d -u ${mddev}
- fi
- # Do not allow one failure case to chain through any remaining image
- # builds.
- exit 0
-}
-
-vm_create_azure() {
- # Arguments:
- # vm-azure <base image> <source tree> <dest dir> <disk image size> <vm image name>
-
- VMBASE="${1}"
- WORLDDIR="${2}"
- DESTDIR="${3}"
- VMSIZE="${4}"
- VMIMAGE="${5}"
-
- if [ -z "${VMBASE}" -o -z "${WORLDDIR}" -o -z "${DESTDIR}" \
- -o -z "${VMSIZE}" -o -z "${VMIMAGE}" ]; then
- usage
- fi
-
- trap "umount ${DESTDIR}/dev ${DESTDIR}" INT QUIT TRAP ABRT TERM
-
- i=0
- mkdir -p ${DESTDIR}
- truncate -s ${VMSIZE} ${VMBASE}
- mddev=$(mdconfig -f ${VMBASE})
- newfs -j /dev/${mddev}
- mkdir -p ${DESTDIR}
- mount /dev/${mddev} ${DESTDIR}
- make -C ${WORLDDIR} DESTDIR=$(realpath ${DESTDIR}) \
- installworld installkernel distribution || \
- panic 1 "\n\nCannot install the base system to ${DESTDIR}."
- mount -t devfs devfs ${DESTDIR}/dev
- chroot ${DESTDIR} /usr/bin/newaliases
- echo '# Custom /etc/fstab for FreeBSD VM images' \
- > ${DESTDIR}/etc/fstab
- echo '/dev/gpt/rootfs / ufs rw 2 2' \
- >> ${DESTDIR}/etc/fstab
- # Although a swap partition is created, it is not used in Azure.
- echo '#/dev/gpt/swapfs none swap sw 0 0' \
- >> ${DESTDIR}/etc/fstab
-
- chroot ${DESTDIR} /etc/rc.d/ldconfig forcestart
- chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg bootstrap -y
- chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg install -y \
- python python2 python27 py27-asn1 sudo bash
- if [ ! -z "${VM_EXTRA_PACKAGES}" ]; then
- chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg install -y \
- ${VM_EXTRA_PACKAGES}
- fi
-
- fetch -o ${DESTDIR}/usr/sbin/waagent \
- http://people.freebsd.org/~gjb/waagent
- chmod +x ${DESTDIR}/usr/sbin/waagent
- rm -f ${DESTDIR}/etc/resolv.conf
- chroot ${DESTDIR} /usr/sbin/waagent -verbose -install
- yes | chroot ${DESTDIR} /usr/sbin/waagent -deprovision
- echo 'sshd_enable="YES"' > ${DESTDIR}/etc/rc.conf
- echo 'ifconfig_hn0="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf
- echo 'waagent_enable="YES"' >> ${DESTDIR}/etc/rc.conf
-
- echo 'console="comconsole vidconsole"' >> ${DESTDIR}/boot/loader.conf
- echo 'comconsole_speed="115200"' >> ${DESTDIR}/boot/loader.conf
-
- if [ ! -z "${VM_RC_LIST}" ]; then
- for _rcvar in ${VM_RC_LIST}; do
- echo ${_rcvar}_enable="YES" >> ${DESTDIR}/etc/rc.conf
- done
- fi
-
- sync
-
- while ! umount ${DESTDIR}/dev ${DESTDIR}; do
- i=$(( $i + 1 ))
- if [ $i -ge 10 ]; then
- # This should never happen. But, it has happened.
- msg="Cannot umount(8) ${DESTDIR}\n"
- msg="${msg}Something has gone horribly wrong."
- panic 1 "${msg}"
- fi
- sleep 1
- done
-
- echo "Creating image... Please wait."
-
- mkimg -f vhdf -s gpt \
- -b /boot/pmbr -p freebsd-boot/bootfs:=/boot/gptboot \
- -p freebsd-swap/swapfs::1G \
- -p freebsd-ufs/rootfs:=${VMBASE} \
- -o ${VMIMAGE}.raw
-
- if [ ! -x "/usr/local/bin/qemu-img" ]; then
- env ASSUME_ALWAYS_YES=yes pkg install -y emulators/qemu-devel
- fi
-
- size=$(qemu-img info -f raw --output json ${VMIMAGE}.raw | awk '/virtual-size/ {print $2}' | tr -d ',')
- size=$(( ( ${size} / ( 1024 * 1024 ) + 1 ) * ( 1024 * 1024 ) ))
- qemu-img resize ${VMIMAGE}.raw ${size}
- qemu-img convert -f raw -o subformat=fixed -O vpc ${VMIMAGE}.raw ${VMIMAGE}
-
- return 0
-}
-
-main() {
- cmd="${1}"
- shift 1
-
- if [ -e "${AZURECONF}" -a ! -c "${AZURECONF}" ]; then
- . ${AZURECONF}
- fi
-
- case ${cmd} in
- vm-azure)
- eval vm_create_azure "$@" || return 0
- ;;
- *|\?)
- usage
- ;;
- esac
-
- return 0
-}
-
-main "$@"
diff --git a/release/i386/mk-vmimage.sh b/release/i386/mk-vmimage.sh
deleted file mode 100755
index b3ffd23..0000000
--- a/release/i386/mk-vmimage.sh
+++ /dev/null
@@ -1,197 +0,0 @@
-#!/bin/sh
-#-
-# Copyright (c) 2014 The FreeBSD Foundation
-# All rights reserved.
-#
-# This software was developed by Glen Barber under sponsorship
-# from the FreeBSD Foundation.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions
-# are met:
-# 1. Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# 2. Redistributions in binary form must reproduce the above copyright
-# notice, this list of conditions and the following disclaimer in the
-# documentation and/or other materials provided with the distribution.
-#
-# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
-# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
-# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
-# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
-# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
-# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
-# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
-# SUCH DAMAGE.
-#
-# mk-vmimage.sh: Create virtual machine disk images in various formats.
-#
-# $FreeBSD$
-#
-
-PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
-export PATH
-
-usage_vm_base() {
- echo -n "$(basename ${0}) vm-base <base image> <source tree>"
- echo " <dest dir> <disk image size>"
- return 0
-}
-
-usage_vm_image() {
- echo -n "$(basename ${0}) vm-image <base image> <image format>"
- echo " <output image>"
- return 0
-}
-
-usage() {
- echo "Usage:"
- echo "$(basename ${0}) [vm-base|vm-image] [...]"
- echo
- usage_vm_base
- echo
- usage_vm_image
- exit 1
-}
-
-panic() {
- msg="${@}"
- printf "${msg}\n"
- if [ ! -z "${mddev}" ]; then
- mdconfig -d -u ${mddev}
- fi
- case ${cmd} in
- vm-base)
- # If the vm-base target fails, the vm-image target
- # cannot possibly succeed. Touch the .TARGET file
- # so it is not attempted.
- touch vm-image
- ;;
- *)
- # FALLTHROUGH
- ;;
- esac
- # Do not allow one failure case to chain through any remaining image
- # builds.
- return 1
-}
-
-vm_create_baseimage() {
- # Creates the UFS root filesystem for the virtual machine disk,
- # written to the formatted disk image with mkimg(1).
- #
- # Arguments:
- # vm-base <base image> <source tree> <dest dir> <disk image size>
-
- VMBASE="${1}"
- WORLDDIR="${2}"
- DESTDIR="${3}"
- VMSIZE="${4}"
-
- if [ -z "${VMBASE}" -o -z "${WORLDDIR}" -o -z "${DESTDIR}" \
- -o -z "${VMSIZE}" ]; then
- usage
- fi
-
- i=0
- mkdir -p ${DESTDIR}
- truncate -s ${VMSIZE} ${VMBASE}
- mddev=$(mdconfig -f ${VMBASE})
- newfs -j /dev/${mddev}
- mount /dev/${mddev} ${DESTDIR}
- cd ${WORLDDIR} && \
- make DESTDIR=${DESTDIR} \
- installworld installkernel distribution || \
- panic "\n\nCannot install the base system to ${DESTDIR}."
- chroot ${DESTDIR} /usr/bin/newaliases
- echo '# Custom /etc/fstab for FreeBSD VM images' \
- > ${DESTDIR}/etc/fstab
- echo '/dev/gpt/rootfs / ufs rw 2 2' \
- >> ${DESTDIR}/etc/fstab
- echo '/dev/gpt/swapfs none swap sw 0 0' \
- >> ${DESTDIR}/etc/fstab
- sync
- while ! umount ${DESTDIR}; do
- i=$(( $i + 1 ))
- if [ $i -ge 10 ]; then
- # This should never happen. But, it has happened.
- msg="Cannot umount(8) ${DESTDIR}\n"
- msg="${msg}Something has gone horribly wrong."
- panic "${msg}"
- fi
- sleep 1
- done
-
- return 0
-}
-
-vm_create_vmdisk() {
- # Creates the virtual machine disk image from the raw disk image.
- #
- # Arguments:
- # vm-image <base image> <image format> <output image>"
-
- VMBASE="${1}"
- FORMAT="${2}"
- VMIMAGE="${3}"
-
- if [ -z "${VMBASE}" -o -z "${FORMAT}" -o -z "${VMIMAGE}" ]; then
- usage
- fi
-
- mkimg_version=$(mkimg --version 2>/dev/null | awk '{print $2}')
-
- # We need mkimg(1) '--version' output, at minimum, to be able to
- # tell what virtual machine disk image formats are available.
- # Bail if mkimg(1) reports an empty '--version' value.
- if [ -z "${mkimg_version}" ]; then
- msg="Cannot determine mkimg(1) version.\n"
- msg="${msg}Cannot continue without a known mkimg(1) version."
- panic "${msg}"
- fi
-
- if ! mkimg --formats 2>/dev/null | grep -q ${FORMAT}; then
- panic "'${FORMAT}' is not supported by this mkimg(1).\n"
- fi
-
- case ${FORMAT} in
- vhd)
- mkimg_format=vhdf
- ;;
- *)
- mkimg_format=${FORMAT}
- ;;
- esac
-
- mkimg -f ${mkimg_format} -s gpt \
- -b /boot/pmbr -p freebsd-boot/bootfs:=/boot/gptboot \
- -p freebsd-swap/swapfs::1G \
- -p freebsd-ufs/rootfs:=${VMBASE} \
- -o ${VMIMAGE}
-
- return 0
-}
-
-main() {
- cmd="${1}"
- shift 1
-
- case ${cmd} in
- vm-base)
- eval vm_create_baseimage "$@" || return 0
- ;;
- vm-image)
- eval vm_create_vmdisk "$@" || return 0
- ;;
- *|\?)
- usage
- ;;
- esac
-
- return 0
-}
-
-main "$@"
diff --git a/release/release.conf.sample b/release/release.conf.sample
index c79ed9f..f6cfadc 100644
--- a/release/release.conf.sample
+++ b/release/release.conf.sample
@@ -98,3 +98,11 @@ PORTBRANCH="ports/head@rHEAD"
## image formats to create. Valid values are listed in the mkimg(1)
## manual page, as well as 'mkimg --formats' output.
#VMFORMATS="vhdf vmdk qcow2 raw"
+
+## Set to a non-empty value to build virtual machine images for various
+## cloud providers as part of the release build.
+#WITH_CLOUDWARE=
+
+## If WITH_CLOUDWARE is set to a non-empty value, this is a list of providers
+## to create disk images.
+#CLOUDWARE="AZURE OPENSTACK"
diff --git a/release/release.sh b/release/release.sh
index 87b3697..616ae96 100755
--- a/release/release.sh
+++ b/release/release.sh
@@ -94,6 +94,10 @@ WITH_COMPRESSED_IMAGES=
WITH_VMIMAGES=
WITH_COMPRESSED_VMIMAGES=
+# Set to non-empty value to build virtual machine images for various
+# cloud providers as part of the release.
+WITH_CLOUDWARE=
+
usage() {
echo "Usage: $0 [-c release.conf]"
exit 1
@@ -174,7 +178,8 @@ CHROOT_DMAKEFLAGS="${CONF_FILES}"
RELEASE_WMAKEFLAGS="${MAKE_FLAGS} ${WORLD_FLAGS} ${ARCH_FLAGS} ${CONF_FILES}"
RELEASE_KMAKEFLAGS="${MAKE_FLAGS} ${KERNEL_FLAGS} KERNCONF=\"${KERNEL}\" ${ARCH_FLAGS} ${CONF_FILES}"
RELEASE_RMAKEFLAGS="${ARCH_FLAGS} KERNCONF=\"${KERNEL}\" ${CONF_FILES} \
- ${DOCPORTS} WITH_DVD=${WITH_DVD} WITH_VMIMAGES=${WITH_VMIMAGES}"
+ ${DOCPORTS} WITH_DVD=${WITH_DVD} WITH_VMIMAGES=${WITH_VMIMAGES} \
+ WITH_CLOUDWARE=${WITH_CLOUDWARE}"
# Force src checkout if configured
FORCE_SRC_KEY=
diff --git a/release/scripts/mk-vmimage.sh b/release/scripts/mk-vmimage.sh
new file mode 100755
index 0000000..b6122a5
--- /dev/null
+++ b/release/scripts/mk-vmimage.sh
@@ -0,0 +1,111 @@
+#!/bin/sh
+#-
+# Copyright (c) 2014 The FreeBSD Foundation
+# All rights reserved.
+#
+# This software was developed by Glen Barber under sponsorship
+# from the FreeBSD Foundation.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# mk-vmimage.sh: Create virtual machine disk images in various formats.
+#
+# $FreeBSD$
+#
+
+usage() {
+ echo "${0} usage:"
+ echo "${@}"
+ return 1
+}
+
+main() {
+ local arg
+ while getopts "C:c:d:f:i:o:s:S:" arg; do
+ case "${arg}" in
+ C)
+ VMBUILDCONF="${OPTARG}"
+ ;;
+ c)
+ VMCONFIG="${OPTARG}"
+ ;;
+ d)
+ DESTDIR="${OPTARG}"
+ ;;
+ f)
+ VMFORMAT="${OPTARG}"
+ ;;
+ i)
+ VMBASE="${OPTARG}"
+ ;;
+ o)
+ VMIMAGE="${OPTARG}"
+ ;;
+ s)
+ VMSIZE="${OPTARG}"
+ ;;
+ S)
+ WORLDDIR="${OPTARG}"
+ ;;
+ *)
+ ;;
+ esac
+ done
+ shift $(( ${OPTIND} - 1))
+
+ if [ -z "${VMBASE}" -o \
+ -z "${WORLDDIR}" -o \
+ -z "${DESTDIR}" -o \
+ -z "${VMSIZE}" -o \
+ -z "${VMIMAGE}" -o \
+ -z "${VMCONFIG}" ];
+ then
+ usage
+ fi
+
+ if [ -z "${VMBUILDCONF}" ] || [ ! -e "${VMBUILDCONF}" ]; then
+ echo "Must provide the path to vmimage.subr."
+ return 1
+ fi
+
+ . "${VMBUILDCONF}"
+
+ if [ ! -z "${VMCONFIG}" ] && [ -e "${VMCONFIG}" ]; then
+ . "${VMCONFIG}"
+ fi
+
+ vm_create_base
+ vm_install_base
+ vm_extra_install_base
+ vm_extra_install_packages
+ vm_extra_install_ports
+ vm_extra_enable_services
+ vm_extra_pre_umount
+ vm_extra_pkg_rmcache
+ cleanup
+ vm_create_disk || return 0
+ vm_extra_create_disk
+
+ return 0
+}
+
+main "$@"
diff --git a/release/tools/azure.conf b/release/tools/azure.conf
index 8f16acc..922f8d9 100644
--- a/release/tools/azure.conf
+++ b/release/tools/azure.conf
@@ -6,9 +6,37 @@
# Set to a list of packages to install.
# Example:
#export VM_EXTRA_PACKAGES="www/apache24"
-export VM_EXTRA_PACKAGES=
+export VM_EXTRA_PACKAGES="sysutils/azure-agent"
# Set to a list of third-party software to enable in rc.conf(5).
# Example:
#export VM_RC_LIST="apache24"
export VM_RC_LIST=
+
+vm_extra_pre_umount() {
+ chroot ${DESTDIR} /usr/sbin/waagent -verbose -install
+ yes | chroot ${DESTDIR} /usr/sbin/waagent -deprovision
+ echo 'sshd_enable="YES"' >> ${DESTDIR}/etc/rc.conf
+ echo 'ifconfig_hn0="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf
+ echo 'waagent_enable="YES"' >> ${DESTDIR}/etc/rc.conf
+ echo 'console="comconsole vidconsole"' >> ${DESTDIR}/boot/loader.conf
+ echo 'comconsole_speed="115200"' >> ${DESTDIR}/boot/loader.conf
+
+ rm -f ${DESTDIR}/etc/resolv.conf
+
+ return 0
+}
+
+vm_extra_create_disk() {
+ if [ ! -x "/usr/local/bin/qemu-img" ]; then
+ env ASSUME_ALWAYS_YES=yes pkg install -y emulators/qemu-devel
+ fi
+
+ mv ${VMIMAGE} ${VMIMAGE}.raw
+ size=$(qemu-img info -f raw --output json ${VMIMAGE}.raw | awk '/virtual-size/ {print $2}' | tr -d ',')
+ size=$(( ( ${size} / ( 1024 * 1024 ) + 1 ) * ( 1024 * 1024 ) ))
+ qemu-img resize ${VMIMAGE}.raw ${size}
+ qemu-img convert -f raw -o subformat=fixed -O vpc ${VMIMAGE}.raw ${VMIMAGE}
+
+ return 0
+}
diff --git a/release/tools/gce.conf b/release/tools/gce.conf
new file mode 100644
index 0000000..216a419
--- /dev/null
+++ b/release/tools/gce.conf
@@ -0,0 +1,100 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+
+# Set to a list of packages to install.
+export VM_EXTRA_PACKAGES="firstboot-freebsd-update firstboot-pkgs \
+ google-cloud-sdk google-daemon panicmail sudo firstboot-growfs \
+ google-startup-scripts"
+
+# Set to a list of third-party software to enable in rc.conf(5).
+export VM_RC_LIST="google_accounts_manager ntpd"
+
+vm_extra_install_base() {
+ echo 'search google.internal' > ${DESTDIR}/etc/resolv.conf
+ echo 'nameserver 169.254.169.254' >> ${DESTDIR}/etc/resolv.conf
+ echo 'nameserver 8.8.8.8' >> ${DESTDIR}/etc/resolv.conf
+}
+
+vm_extra_pre_umount() {
+ cat << EOF >> ${DESTDIR}/etc/rc.conf
+dumpdev="AUTO"
+ifconfig_vtnet0="SYNCDHCP mtu 1460"
+ntpd_sync_on_start="YES"
+ntpd_enable="YES"
+sshd_enable="YES"
+google_accounts_manager_enable="YES"
+#disabled until I can figure out why the reboot for updates is hanging
+#firstboot_freebsd_update_enable="YES"
+#firstboot_pkgs_enable="YES"
+# need to fill in something here
+#firstboot_pkgs_list=""
+panicmail_autosubmit="YES"
+firstboot_growfs_enable="YES"
+google_startup_enable="YES"
+EOF
+
+ cat << EOF >> ${DESTDIR}/boot/loader.conf
+autoboot_delay="-1"
+beastie_disable="YES"
+loader_logo="none"
+hw.memtest.tests="0"
+console="comconsole,vidconsole"
+hw.vtnet.mq_disable=1
+kern.timecounter.hardware=ACPI-safe
+aesni_load="YES"
+nvme_load="YES"
+EOF
+
+ echo '169.254.169.254 metadata.google.internal metadata' > \
+ ${DESTDIR}/etc/hosts
+
+ # overwrite ntp.conf
+ cat << EOF > ${DESTDIR}/etc/ntp.conf
+server metadata.google.internal iburst
+
+restrict default kod nomodify notrap nopeer noquery
+restrict -6 default kod nomodify notrap nopeer noquery
+
+restrict 127.0.0.1
+restrict -6 ::1
+restrict 127.127.1.0
+EOF
+
+ cat << EOF >> ${DESTDIR}/etc/syslog.conf
+*.err;kern.warning;auth.notice;mail.crit /dev/console
+EOF
+
+ cat << EOF >> ${DESTDIR}/etc/ssh/sshd_config
+ChallengeResponseAuthentication no
+X11Forwarding no
+AcceptEnv LANG
+Ciphers aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc
+AllowAgentForwarding no
+ClientAliveInterval 420
+EOF
+
+ cat << EOF >> ${DESTDIR}/etc/crontab
+0 3 * * * root /usr/sbin/freebsd-update cron
+EOF
+
+ cat << EOF >> ${DESTDIR}/etc/sysctl.conf
+net.inet.icmp.drop_redirect=1
+net.inet.ip.redirect=0
+net.inet.tcp.blackhole=2
+net.inet.udp.blackhole=1
+kern.ipc.somaxconn=1024
+debug.trace_on_panic=1
+debug.debugger_on_panic=0
+EOF
+
+ ## XXX: Verify this is needed. I do not see this requirement
+ ## in the docs, and it impairs the ability to boot-test a copy
+ ## of the image prior to packaging for upload to GCE.
+ #sed -E -i '' 's/^([^#].*[[:space:]])on/\1off/' ${DESTDIR}/etc/ttys
+
+ touch ${DESTDIR}/firstboot
+
+ return 0
+}
diff --git a/release/tools/openstack.conf b/release/tools/openstack.conf
new file mode 100644
index 0000000..5d188bb
--- /dev/null
+++ b/release/tools/openstack.conf
@@ -0,0 +1,25 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+
+# Set to a list of packages to install.
+export VM_EXTRA_PACKAGES="net/cloud-init devel/py-pbr devel/py-iso8601 \
+ net/py-eventlet net/py-netaddr comms/py-serial devel/py-six \
+ devel/py-babel net/py-oauth net/py-netifaces"
+
+# Set to a list of third-party software to enable in rc.conf(5).
+export VM_RC_LIST="cloudinit"
+
+vm_extra_pre_umount() {
+ echo 'sshd_enable="YES"' >> ${DESTDIR}/etc/rc.conf
+ echo 'ifconfig_DEFAULT="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf
+
+ # Openstack wants sudo(8) usable by default without a password.
+ echo 'ALL ALL=(ALL) NOPASSWD:ALL' >> \
+ ${DESTDIR}/usr/local/etc/sudoers.d/cloud-init
+
+ rm -f ${DESTDIR}/etc/resolv.conf
+
+ return 0
+}
diff --git a/release/tools/vmimage.subr b/release/tools/vmimage.subr
new file mode 100644
index 0000000..6207440
--- /dev/null
+++ b/release/tools/vmimage.subr
@@ -0,0 +1,185 @@
+#!/bin/sh
+#
+# $FreeBSD$
+#
+#
+# Common functions for virtual machine image build scripts.
+#
+
+export PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
+trap "cleanup" INT QUIT TRAP ABRT TERM
+
+write_partition_layout() {
+ if [ -z "${NOSWAP}" ]; then
+ SWAPOPT="-p freebsd-swap/swapfs::1G"
+ fi
+
+ case "${TARGET}:${TARGET_ARCH}" in
+ amd64:amd64 | i386:i386)
+ mkimg -s gpt -b /boot/pmbr \
+ -p freebsd-boot/bootfs:=/boot/gptboot \
+ ${SWAPOPT} \
+ -p freebsd-ufs/rootfs:=${VMBASE} \
+ -o ${VMIMAGE}
+ ;;
+ powerpc:powerpc*)
+ mkimg -s apm \
+ -p apple-boot/bootfs:=/boot/boot1.hfs \
+ ${SWAPOPT} \
+ -p freebsd-ufs/rootfs:=${VMBASE} \
+ -o ${VMIMAGE}
+ ;;
+ *)
+ # ENOTSUPP
+ return 1
+ ;;
+ esac
+
+ return 0
+}
+
+err() {
+ printf "${@}\n"
+ cleanup
+ return 1
+}
+
+cleanup() {
+ umount ${DESTDIR}/dev 2>/dev/null
+ umount ${DESTDIR}
+ if [ ! -z "${mddev}" ]; then
+ mdconfig -d -u ${mddev}
+ fi
+
+ return 0
+}
+
+vm_create_base() {
+ # Creates the UFS root filesystem for the virtual machine disk,
+ # written to the formatted disk image with mkimg(1).
+
+ mkdir -p ${DESTDIR}
+ truncate -s ${VMSIZE} ${VMBASE}
+ mddev=$(mdconfig -f ${VMBASE})
+ newfs -j /dev/${mddev}
+ mount /dev/${mddev} ${DESTDIR}
+
+ return 0
+}
+
+vm_install_base() {
+ # Installs the FreeBSD userland/kernel to the virtual machine disk.
+
+ cd ${WORLDDIR} && \
+ make DESTDIR=${DESTDIR} \
+ installworld installkernel distribution || \
+ err "\n\nCannot install the base system to ${DESTDIR}."
+
+ echo '# Custom /etc/fstab for FreeBSD VM images' \
+ > ${DESTDIR}/etc/fstab
+ echo '/dev/gpt/rootfs / ufs rw 1 1' \
+ >> ${DESTDIR}/etc/fstab
+ if [ -z "${NOSWAP}" ]; then
+ echo '/dev/gpt/swapfs none swap sw 0 0' \
+ >> ${DESTDIR}/etc/fstab
+ fi
+
+ mkdir -p ${DESTDIR}/dev
+ mount -t devfs devfs ${DESTDIR}/dev
+ chroot ${DESTDIR} /usr/bin/newaliases
+ chroot ${DESTDIR} /etc/rc.d/ldconfig forcestart
+ umount ${DESTDIR}/dev
+
+ cp /etc/resolv.conf ${DESTDIR}/etc/resolv.conf
+
+ return 0
+}
+
+vm_extra_install_base() {
+ # Prototype. When overridden, runs extra post-installworld commands
+ # as needed, based on the target virtual machine image or cloud
+ # provider image target.
+
+ return 0
+}
+
+vm_extra_enable_services() {
+ if [ ! -z "${VM_RC_LIST}" ]; then
+ for _rcvar in ${VM_RC_LIST}; do
+ echo ${_rcvar}_enable="YES" >> ${DESTDIR}/etc/rc.conf
+ done
+ fi
+
+ return 0
+}
+
+vm_extra_install_packages() {
+ if [ -z "${VM_EXTRA_PACKAGES}" ]; then
+ return 0
+ fi
+ mkdir -p ${DESTDIR}/dev
+ mount -t devfs devfs ${DESTDIR}/dev
+ chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \
+ /usr/sbin/pkg bootstrap -y
+ chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \
+ /usr/sbin/pkg install -y ${VM_EXTRA_PACKAGES}
+ umount ${DESTDIR}/dev
+
+ return 0
+}
+
+vm_extra_install_ports() {
+ # Prototype. When overridden, installs additional ports within the
+ # virtual machine environment.
+
+ return 0
+}
+
+vm_extra_pre_umount() {
+ # Prototype. When overridden, installs additional ports within the
+ # virtual machine environment.
+
+ rm -f ${DESTDIR}/etc/resolv.conf
+ return 0
+}
+
+vm_extra_pkg_rmcache() {
+ if [ -e ${DESTDIR}/usr/local/sbin/pkg ]; then
+ chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \
+ /usr/local/sbin/pkg clean -y -a
+ fi
+
+ return 0
+}
+
+vm_umount_base() {
+ i=0
+ sync
+ while ! umount ${DESTDIR}/dev ${DESTDIR}; do
+ i=$(( $i + 1 ))
+ if [ $i -ge 10 ]; then
+ # This should never happen. But, it has happened.
+ msg="Cannot umount(8) ${DESTDIR}\n"
+ msg="${msg}Something has gone horribly wrong."
+ err "${msg}"
+ fi
+ sleep 1
+ done
+
+ return 0
+}
+
+vm_create_disk() {
+ echo "Creating image... Please wait."
+ echo
+
+ write_partition_layout || return 1
+
+ return 0
+}
+
+vm_extra_create_disk() {
+
+ return 0
+}
+
OpenPOWER on IntegriCloud