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 mkdir -p ${DESTDIR}/dev 118 mount -t devfs devfs ${DESTDIR}/dev 119 chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \ 120 /usr/sbin/pkg bootstrap -y 121 if [ ! -z "${VM_EXTRA_PACKAGES}" ]; then 122 chroot ${DESTDIR} env ASSUME_ALWAYS_YES=yes \ 123 /usr/sbin/pkg install -y ${VM_EXTRA_PACKAGES} 124 fi 125 umount ${DESTDIR}/dev 126 127 return 0 128} 129 130vm_extra_install_ports() { 131 # Prototype. When overridden, installs additional ports within the 132 # virtual machine environment. 133 134 return 0 135} 136 137vm_extra_pre_umount() { 138 # Prototype. When overridden, installs additional ports within the 139 # virtual machine environment. 140 141 rm -f ${DESTDIR}/etc/resolv.conf 142 143 return 0 144} 145 146vm_umount_base() { 147 i=0 148 sync 149 while ! umount ${DESTDIR}/dev ${DESTDIR}; do 150 i=$(( $i + 1 )) 151 if [ $i -ge 10 ]; then 152 # This should never happen. But, it has happened. 153 msg="Cannot umount(8) ${DESTDIR}\n" 154 msg="${msg}Something has gone horribly wrong." 155 err "${msg}" 156 fi 157 sleep 1 158 done 159 160 return 0 161} 162 163vm_create_disk() { 164 echo "Creating image... Please wait." 165 echo 166 167 write_partition_layout || return 1 168 169 return 0 170} 171 172vm_extra_create_disk() { 173 174 return 0 175} 176 177