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