diff options
author | gjb <gjb@FreeBSD.org> | 2014-11-05 13:22:19 +0000 |
---|---|---|
committer | gjb <gjb@FreeBSD.org> | 2014-11-05 13:22:19 +0000 |
commit | b70ef7c982f0509a990aca256050a1d5ef721431 (patch) | |
tree | 6f87eab2bc67b1c4241bb8f9b509e3531dbbfb4f /release/tools | |
parent | 47dc31278a9555f9cf19e395d87a0950344ea008 (diff) | |
download | FreeBSD-src-b70ef7c982f0509a990aca256050a1d5ef721431.zip FreeBSD-src-b70ef7c982f0509a990aca256050a1d5ef721431.tar.gz |
Initial rewrite to consolidate VM image build scripts into one.
There may be some very sharp edges here while refactoring.
- Move amd64/mk-vmimage.sh -> scripts/mk-vmimage.sh.
- Remove vm-base target from Makefile.vm.
- In vm-image target, use getopts flags for argument passing.
- Create tools/vmimage.subr, containing default and prototype
for the following functions that are used to drive the build,
run in this order:
vm_install_base()
vm_extra_install_base()
vm_extra_install_packages()
vm_extra_install_ports()
vm_extra_enable_services()
vm_extra_pre_umount()
vm_create_disk()
vm_extra_create_disk()
- In tools/azure.conf, override:
vm_extra_install_base()
vm_extra_pre_umount()
vm_extra_create_disk()
- In tools/openstack.conf, override:
vm_extra_install_base()
vm_extra_pre_umount()
Sponsored by: The FreeBSD Foundation
Diffstat (limited to 'release/tools')
-rw-r--r-- | release/tools/azure.conf | 37 | ||||
-rw-r--r-- | release/tools/openstack.conf | 16 | ||||
-rw-r--r-- | release/tools/vmimage.subr | 150 |
3 files changed, 203 insertions, 0 deletions
diff --git a/release/tools/azure.conf b/release/tools/azure.conf index 8f16acc..16c207d 100644 --- a/release/tools/azure.conf +++ b/release/tools/azure.conf @@ -12,3 +12,40 @@ export VM_EXTRA_PACKAGES= # Example: #export VM_RC_LIST="apache24" export VM_RC_LIST= + +vm_extra_install_base() { + fetch -o ${DESTDIR}/usr/sbin/waagent \ + http://people.freebsd.org/~gjb/waagent + chmod +x ${DESTDIR}/usr/sbin/waagent + rm -f ${DESTDIR}/etc/resolv.conf + + return 0 +} + +vm_extra_pre_umount() { + chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes /usr/sbin/pkg install -y \ + python python2 python27 py27-asn1 sudo bash + 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 + + 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/openstack.conf b/release/tools/openstack.conf index b43ad76..6aa1749 100644 --- a/release/tools/openstack.conf +++ b/release/tools/openstack.conf @@ -8,3 +8,19 @@ export VM_EXTRA_PACKAGES="net/cloud-init" # Set to a list of third-party software to enable in rc.conf(5). export VM_RC_LIST="cloudinit" + +vm_extra_install_base() { + fetch -o ${DESTDIR}/usr/sbin/waagent \ + http://people.freebsd.org/~gjb/waagent + chmod +x ${DESTDIR}/usr/sbin/waagent + rm -f ${DESTDIR}/etc/resolv.conf + + return 0 +} + +vm_extra_pre_umount() { + echo 'sshd_enable="YES"' >> ${DESTDIR}/etc/rc.conf + echo 'ifconfig_DEFAULT="SYNCDHCP"' >> ${DESTDIR}/etc/rc.conf + + return 0 +} diff --git a/release/tools/vmimage.subr b/release/tools/vmimage.subr new file mode 100644 index 0000000..622e0fc --- /dev/null +++ b/release/tools/vmimage.subr @@ -0,0 +1,150 @@ +#!/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 + +mkimg_bootcode="/boot/pmbr" +mkimg_partitions="-p freebsd-boot/bootfs:=/boot/gptboot" +mkimg_partitions="${mkimg_partitions} -p freebsd-swap/swapfs::1G" +mkimg_partitions="${mkimg_partitions} freebsd-ufs/rootfs:=${VMBASE}" + +usage() { + echo "${0} usage:" + echo "${@}" + return 1 +} + +err() { + printf "${@}\n" + cleanup + return 1 +} + +cleanup() { + if [ ! -z "${mddev}" ]; then + mdconfig -d -u ${mddev} + fi + umount ${DESTDIR}/dev + umount ${DESTDIR} + + 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 + echo '/dev/gpt/swapfs none swap sw 0 0' \ + >> ${DESTDIR}/etc/fstab + + chroot ${DESTDIR} /usr/bin/newaliases + chroot ${DESTDIR} /etc/rc.d/ldconfig forcestart + + 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() { + chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \ + /usr/sbin/pkg bootstrap -y + if [ ! -z "${VM_EXTRA_PACKAGES}" ]; then + chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \ + /usr/sbin/pkg install -y ${VM_EXTRA_PACKAGES} + fi + + return 0 +} + +vm_extra_install_ports() { + # Prototype. When overridden, installs additional ports within the + # virtual machine environment. + + 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() { + if [ -z "${mkimg_paritions}" ]; then + err "No partition types specified. Skipping." + return 1 + fi + echo "Creating image... Please wait." + echo + mkimg -f ${mkimg_format} -s ${mkimg_scheme} \ + ${mkimg_bootcode} \ + ${mkimg_partitions} \ + ${mkimg_outfile} + + mkimg -b /boot/pmbr -p freebsd-boot/bootfs:=/boot/gptboot \ + -p freebsd-swap/swapfs::1G \ + -p freebsd-ufs/rootfs:=${VMBASE} \ + -o ${VMIMAGE}.raw + + return 0 +} + +vm_extra_create_disk() { + + return 0 +} + |