1#!/bin/sh 2# 3# $FreeBSD$ 4# 5# 6# Common functions for virtual machine image build scripts. 7# 8 9export PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin:/usr/local/sbin" 10trap "cleanup" INT QUIT TRAP ABRT TERM 11 12write_partition_layout() { 13 if [ -z "${NOSWAP}" ]; then 14 SWAPOPT="-p freebsd-swap/swapfs::1G" 15 fi 16 17 case "${TARGET}:${TARGET_ARCH}" in 18 amd64:amd64 | i386:i386) 19 mkimg -s gpt -b /boot/pmbr \ 20 -p freebsd-boot/bootfs:=/boot/gptboot \ 21 ${SWAPOPT} \ 22 -p freebsd-ufs/rootfs:=${VMBASE} \ 23 -o ${VMIMAGE} 24 ;; 25 powerpc:powerpc*) 26 mkimg -s apm \ 27 -p apple-boot/bootfs:=/boot/boot1.hfs \ 28 ${SWAPOPT} \ 29 -p freebsd-ufs/rootfs:=${VMBASE} \ 30 -o ${VMIMAGE} 31 ;; 32 *) 33 # ENOTSUPP 34 return 1 35 ;; 36 esac 37 38 return 0 39} 40 41err() { 42 printf "${@}\n" 43 cleanup 44 return 1 45} 46 47cleanup() { 48 umount ${DESTDIR}/dev 2>/dev/null 49 umount ${DESTDIR} 50 if [ ! -z "${mddev}" ]; then 51 mdconfig -d -u ${mddev} 52 fi 53 54 return 0 55} 56 57vm_create_base() { 58 # Creates the UFS root filesystem for the virtual machine disk, 59 # written to the formatted disk image with mkimg(1). 60 61 mkdir -p ${DESTDIR} 62 truncate -s ${VMSIZE} ${VMBASE} 63 mddev=$(mdconfig -f ${VMBASE}) 64 newfs -j /dev/${mddev} 65 mount /dev/${mddev} ${DESTDIR} 66 67 return 0 68} 69 70vm_install_base() { 71 # Installs the FreeBSD userland/kernel to the virtual machine disk. 72 73 cd ${WORLDDIR} && \ 74 make DESTDIR=${DESTDIR} \ 75 installworld installkernel distribution || \ 76 err "\n\nCannot install the base system to ${DESTDIR}." 77 78 echo '# Custom /etc/fstab for FreeBSD VM images' \ 79 > ${DESTDIR}/etc/fstab 80 echo '/dev/gpt/rootfs / ufs rw 1 1' \ 81 >> ${DESTDIR}/etc/fstab 82 if [ -z "${NOSWAP}" ]; then 83 echo '/dev/gpt/swapfs none swap sw 0 0' \ 84 >> ${DESTDIR}/etc/fstab 85 fi 86 87 mkdir -p ${DESTDIR}/dev 88 mount -t devfs devfs ${DESTDIR}/dev 89 chroot ${DESTDIR} /usr/bin/newaliases 90 chroot ${DESTDIR} /etc/rc.d/ldconfig forcestart 91 umount ${DESTDIR}/dev 92 93 cp /etc/resolv.conf ${DESTDIR}/etc/resolv.conf 94 95 return 0 96} 97 98vm_extra_install_base() { 99 # Prototype. When overridden, runs extra post-installworld commands 100 # as needed, based on the target virtual machine image or cloud 101 # provider image target. 102 103 return 0 104} 105 106vm_extra_enable_services() { 107 if [ ! -z "${VM_RC_LIST}" ]; then 108 for _rcvar in ${VM_RC_LIST}; do 109 echo ${_rcvar}_enable="YES" >> ${DESTDIR}/etc/rc.conf 110 done 111 fi 112 113 return 0 114} 115 116vm_extra_install_packages() { 117 if [ -z "${VM_EXTRA_PACKAGES}" ]; then 118 return 0 119 fi 120 mkdir -p ${DESTDIR}/dev 121 mount -t devfs devfs ${DESTDIR}/dev 122 chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \ 123 /usr/sbin/pkg bootstrap -y 124 chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \ 125 /usr/sbin/pkg install -y ${VM_EXTRA_PACKAGES} 126 umount ${DESTDIR}/dev 127 128 return 0 129} 130 131vm_extra_install_ports() { 132 # Prototype. When overridden, installs additional ports within the 133 # virtual machine environment. 134 135 return 0 136} 137 138vm_extra_pre_umount() { 139 # Prototype. When overridden, installs additional ports within the 140 # virtual machine environment. 141 142 rm -f ${DESTDIR}/etc/resolv.conf 143 return 0 144} 145 146vm_extra_pkg_rmcache() { 147 if [ -e ${DESTDIR}/usr/local/sbin/pkg ]; then 148 chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \ 149 /usr/local/sbin/pkg clean -y -a 150 fi 151 152 return 0 153} 154 155vm_umount_base() { 156 i=0 157 sync 158 while ! umount ${DESTDIR}/dev ${DESTDIR}; do 159 i=$(( $i + 1 )) 160 if [ $i -ge 10 ]; then 161 # This should never happen. But, it has happened. 162 msg="Cannot umount(8) ${DESTDIR}\n" 163 msg="${msg}Something has gone horribly wrong." 164 err "${msg}" 165 fi 166 sleep 1 167 done 168 169 return 0 170} 171 172vm_create_disk() { 173 echo "Creating image... Please wait." 174 echo 175 176 write_partition_layout || return 1 177 178 return 0 179} 180 181vm_extra_create_disk() { 182 183 return 0 184} 185 186