Merge the following revisions from ^/projects/release-vmimage:
r273823-r273826, r273833, r273836, r273944, r274069-r274071, r274134, r274211, r274280-r274285, r274287-r274288, r274292, r274296-r274297, r274356, r274533, r274725, r274726, r274729, r274734, r274771, r274945-r274946, r277180, r277183-r277184, r277186-r277187, r277250-r277253, r277263-r277264, r277383-r277384, r277393-r277395, r277438-r277439, r277447, r277455: r273823: Move virtual machine / cloud provider targets and options from release/Makefile to their own Makefile. r273824: Add glue to allow enabling building cloud provider VM images by default. When WITH_CLOUDWARE is not empty, add CLOUDTARGETS to the release/Makefile 'release' target. r273825: Avoid hard-coding the Azure image file format. While here, avoid using OSRELEASE for the output file name. r273826: Remove a few vestiges of passing an exit code to panic(). r273833: Initial commit providing a mechanism to create openstack images as part of the release build. r273836: Fix output file name for openstack images. No further conversion is necessary for this VM file target, so there is no need to append the '.raw' suffix here. r273944: Uncomment the cloudinit rc.conf(5) line. r274069: Add line continuation so OPENSTACKCONF is actually included in the env(1). r274070: Add a 'vm-cloudware' target, used to drive all targets in CLOUDTARGETS. r274071: Add examples for WITH_CLOUDWARE to release.conf.sample. Add WITH_CLOUDWARE evaluation to RELEASE_RMAKEFLAGS. r274134: Initial rewrite to consolidate VM image build scripts into one. r274211: Add write_partition_layout() used to populate the final image. Fix duplicated mkimg(1) call in vm_create_disk(). Add primitive (untested) PowerPC/PowerPC64 VM image support. Note: As it is currently written, the /boot/pmbr and /boot/{gptboot,boot1.hfs} use the build host and not the target build. Fixing this is likely going to be a hack in itself. r274280: Return if vm_create_disk() is unsuccessful. r274281: Add CLEANFILES entry for VM targets r274282: Add vm_extra_pre_umount() prototype to vmimage.subr. r274283: Fix DESTDIR for installworld, and make sure it is created before use. r274284: Move usage() from vmimage.subr to mk-vmimage.sh, in case vmimage.subr has not been sourced. r274285: Spell 'OPTARG' correctly. Actually call vm_create_base(). r274287: Fix line continuation in write_partition_layout(). Remove variable test that is no longer needed. r274288: Fix scheme flag to mkimg(1). r274292: mount(8) and umount(8) devfs(5) as needed. r274296: Change path for mk-vmimage.sh from ${TARGET}/ to scripts/ now that it is consolidated into one file. Fix paths for the base image and output disk image files. r274297: Call cleanup() after everything is done. r274356: Remove a stray directory from CLEANFILES. r274533: Set the boot partition type to 'apple-boot' for powerpc. r274725: In vm_install_base(), copy the host resolv.conf into the build chroot before attempting to do anything that requires working DNS (i.e., pkg bootstrap). In vm_extra_pre_umount(), remove the resolv.conf before the disk image is unmounted from the backing md(4). r274726 (cperciva): Silence errors when umounting the chroot's /dev, since it probably doesn't exist when we're running this. Unmount filesystems before attempting to destroy the md which holds them. r274729 (cperciva): Unmount filesystem and destroy md before we read the vnode from disk and package it into a disk image. Otherwise we end up packaging an unclean filesystem. r274734 (cperciva): Merge duplicative vm-CLOUDTYPE targets before additional duplication gets added by the impending arrival of ec2 and gcloud. r274771 (cperciva): Add NOSWAP option which can be set by a vmimage.conf file to specify that no swap space should be created in the image. This will be used by EC2 builds, since FreeBSD/EC2 allocates swap space on "ephemeral" disks which are physically attached to the Xen host node. r274945: In vm_extra_install_packages(), only bootstrap pkg(8) if VM_EXTRA_PACKAGES is empty. In vm_extra_pre_umount(), cleanup downloaded packages if pkg(8) was bootstrapped earlier. r274946: Fix indentation nit. r277180: In vm_extra_install_base(), do not install waagent in the openstack image, because it is not used. This appears to be a copy mistake. Remove vm_extra_install_base() from the openstack.conf entirely, since it does not need to be overridden. r277183: Enable the textmode console by default for VM images, since there is no way to tell if the environment will be able to use the graphics-mode console. r277184: Enable password-less sudo for openstack images. r277186: Update the VM_EXTRA_PACKAGES list for the openstack images. The documentation suggests doing a "just fetch this and run it"-style bootstrap, from which the list of dependencies was obtained (in github, at: pellaeon/bsd-cloudinit-installer) There is one Python dependency unmet, oslo.config, which is not in the Ports Collection. r277187: Add a comment to note that setting hw.vga.textmode=1 is temporary. r277250: Remove vm_extra_install_base() for the Azure image, now that the waagent exists in the ports tree. Add sysutils/azure-agent to the VM_EXTRA_PACKAGES list. In vm_extra_pre_umount(), remove the explicit pkg(8) install list, as dependencies are resolved by sysutils/azure-agent. r277251: Add a 'list-cloudware' target to print the list of supported CLOUDWARE values and a description. Add the AZURE_DESC and OPENSTACK_DESC descriptions. r277252: Update release(7) r277253: Add 'list-vmtargets' target, which produces a list of all supported VM and cloud provider images. Add VHD_DESC, VMDK_DESC, QCOW2_DESC, RAW_DESC image descriptions. Format the output to make a bit more readable. Update release(7) to document the list-vmtargets target. r277263: Add initial support for the GCE (Google Compute Engine) cloud hosting provider image. r277264: Style and line length cleanup. r277383: Remove the console setting from rc.conf(5), which is not used there. While here, set console to include vidconsole in the loader.conf(5). r277384: Fix an indentation nit. No functional changes. r277393: Remove the pkg-clean(8) call from vm_extra_pre_umount() since the function is often overridden. Add vm_extra_pkg_rmcache() to call pkg-clean(8) to avoid duplicated code. r277394: Move resolv.conf(5) removal back to vm_extra_pre_umount() where it belongs. The GCE image needs resolv.conf(5) to exist (created as part of the image setup), so it cannot be removed. r277395: Comment the line that configures ttys(5) to 'off', which makes it impossible to test that the image boots. Add a note explaining why the line is commented, and not (yet) removed entirely. r277438: Move the 'install' bits that are specific to virtual machine images from the Makefile to Makefile.vm. Rename the 'install' target to 'release-install', and add a new 'vm-install' target. Add a new 'install' target that invokes the new targets. r277439: Add WITH_CLOUDWARE to the list of make(1) variables for the release build. r277447: Remove hw.vga.textmode=1 from the VM image loader.conf, which was included during test builds and not intended to be included when merging this project branch back to head. r277455: Remove mk-azure.sh, which is no longer needed. MFC after: 1 month X-MFC-To: stable/10 (requires mkimg(1)) Help from: cperciva, swills Relnotes: yes Sponsored by: The FreeBSD Foundation
This commit is contained in:
commit
2d4ff62f00
@ -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:
|
||||
install: release-install vm-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"
|
||||
|
111
release/Makefile.vm
Normal file
111
release/Makefile.vm
Normal file
@ -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
|
@ -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 "$@"
|
@ -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 "$@"
|
@ -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 "$@"
|
@ -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 "$@"
|
@ -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"
|
||||
|
@ -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=
|
||||
|
111
release/scripts/mk-vmimage.sh
Executable file
111
release/scripts/mk-vmimage.sh
Executable file
@ -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 "$@"
|
@ -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
|
||||
}
|
||||
|
100
release/tools/gce.conf
Normal file
100
release/tools/gce.conf
Normal file
@ -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
|
||||
}
|
25
release/tools/openstack.conf
Normal file
25
release/tools/openstack.conf
Normal file
@ -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
|
||||
}
|
185
release/tools/vmimage.subr
Normal file
185
release/tools/vmimage.subr
Normal file
@ -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
|
||||
}
|
||||
|
@ -24,7 +24,7 @@
|
||||
.\"
|
||||
.\" $FreeBSD$
|
||||
.\"
|
||||
.Dd October 2, 2014
|
||||
.Dd January 16, 2015
|
||||
.Dt RELEASE 7
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -406,6 +406,57 @@ See
|
||||
for valid format values
|
||||
.Pq requires version 20140927 or later .
|
||||
.El
|
||||
.Pp
|
||||
For a list of supported
|
||||
.Va VMFORMATS
|
||||
values
|
||||
.Pq including cloud hosting provider formats
|
||||
along with a brief description, run:
|
||||
.Bd -literal -offset indent
|
||||
cd /usr/src
|
||||
make -C release list-vmtargets
|
||||
.Ed
|
||||
.Sh CLOUD HOSTING MACHINE IMAGES
|
||||
The
|
||||
.Fx
|
||||
release build tools support building virtual machine images for various
|
||||
cloud hosting providers, each with their own specific configuration to
|
||||
include support for each hosting provider by default.
|
||||
.Pp
|
||||
The following
|
||||
.Xr make 1
|
||||
environment variables are supported:
|
||||
.Pp
|
||||
.Bl -tag -width Ev
|
||||
.It Va CLOUDWARE
|
||||
Set to a list of one or more cloud hosting providers, enclosed in quotes.
|
||||
Requires
|
||||
.Va WITH_CLOUDWARE
|
||||
to also be set.
|
||||
.It Va WITH_CLOUDWARE
|
||||
Set to a non-empty value to enable building virtual machine images
|
||||
for various cloud hosting providers.
|
||||
Requires
|
||||
.Va CLOUDWARE
|
||||
to also be set.
|
||||
.El
|
||||
.Pp
|
||||
Additionally, the
|
||||
.Va CLOUDWARE
|
||||
and
|
||||
.Va WITH_CLOUDWARE
|
||||
variables can be added to
|
||||
.Pa release.conf ,
|
||||
and used in conjunction with
|
||||
.Pa release.sh .
|
||||
.Pp
|
||||
For a list of supported
|
||||
.Va CLOUDWARE
|
||||
values, run:
|
||||
.Bd -literal -offset indent
|
||||
cd /usr/src
|
||||
make -C release list-cloudware
|
||||
.Ed
|
||||
.Sh MAKEFILE TARGETS
|
||||
The release makefile
|
||||
.Pq Pa src/release/Makefile
|
||||
@ -470,6 +521,23 @@ target requires the
|
||||
.Va WITH_VMIMAGES
|
||||
.Xr make 1
|
||||
envirionment variable to be set to a non-null value.
|
||||
.It Cm vm-cloudware
|
||||
Builds
|
||||
.Fx
|
||||
virtual machine images for various cloud hosting providers.
|
||||
See
|
||||
.Qq CLOUD HOSTING MACHINE IMAGES
|
||||
for implementation details.
|
||||
.It Cm list-cloudware
|
||||
Displays the list of valid
|
||||
.Va CLOUDWARE
|
||||
values.
|
||||
.It Cm list-vmtargets
|
||||
Displays the list of valid
|
||||
.Va VMFORMAT
|
||||
and
|
||||
.Va CLOUDWARE
|
||||
values.
|
||||
.El
|
||||
.Pp
|
||||
Major subtargets called by targets above:
|
||||
@ -576,8 +644,11 @@ Typically, one only needs to set
|
||||
.It Pa /usr/src/Makefile
|
||||
.It Pa /usr/src/Makefile.inc1
|
||||
.It Pa /usr/src/release/Makefile
|
||||
.It Pa /usr/src/release/Makefile.vm
|
||||
.It Pa /usr/src/release/release.sh
|
||||
.It Pa /usr/src/release/release.conf.sample
|
||||
.It Pa /usr/src/release/tools/*.conf
|
||||
.It Pa /usr/src/release/tools/vmimage.subr
|
||||
.El
|
||||
.Sh EXAMPLES
|
||||
The following sequence of commands can be used to build a
|
||||
|
Loading…
x
Reference in New Issue
Block a user