From owner-svn-src-user@FreeBSD.ORG Wed Sep 10 20:23:11 2014 Return-Path: Delivered-To: svn-src-user@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 565AE6C1; Wed, 10 Sep 2014 20:23:11 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id 365BD8B3; Wed, 10 Sep 2014 20:23:11 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s8AKNBRj008012; Wed, 10 Sep 2014 20:23:11 GMT (envelope-from gjb@FreeBSD.org) Received: (from gjb@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s8AKNB0q008011; Wed, 10 Sep 2014 20:23:11 GMT (envelope-from gjb@FreeBSD.org) Message-Id: <201409102023.s8AKNB0q008011@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: gjb set sender to gjb@FreeBSD.org using -f From: Glen Barber Date: Wed, 10 Sep 2014 20:23:11 +0000 (UTC) To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r271404 - user/gjb/thermite X-SVN-Group: user MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-user@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: "SVN commit messages for the experimental " user" src tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 10 Sep 2014 20:23:11 -0000 Author: gjb Date: Wed Sep 10 20:23:10 2014 New Revision: 271404 URL: http://svnweb.freebsd.org/changeset/base/271404 Log: Update the mk-vmimage.sh script: - Use mkimg(1) to create the VMDK and VHD formats. - Skip qcow2 if qemu-img does not exist. - Use qemu-img for VHD and VMDK if mkimg(1) does not exist. Sponsored by: The FreeBSD Foundation Modified: user/gjb/thermite/mk-vmimage.sh Modified: user/gjb/thermite/mk-vmimage.sh ============================================================================== --- user/gjb/thermite/mk-vmimage.sh Wed Sep 10 19:53:31 2014 (r271403) +++ user/gjb/thermite/mk-vmimage.sh Wed Sep 10 20:23:10 2014 (r271404) @@ -41,117 +41,195 @@ usage () { exit 1 } -while getopts c: opt; do - case ${opt} in - c) - VM_CONFIG="${OPTARG}" - if [ ! -e "${VM_CONFIG}" ]; then - echo -n "ERROR: Configuration file ${VM_CONFIG}" - echo " does not exist." - exit 1 - fi - . ${VM_CONFIG} +check_prereq () { + rc=0 + case ${VM_TARGET_ARCH} in + i386|amd64) + # Ok to create vm image + ;; + *) + rc=1 + ;; + esac + case ${KERNEL} in + GENERIC) ;; - \?) - usage + *) + rc=1 ;; esac -done -# Force use of configuration file -if [ "X${VM_CONFIG}" = "X" ]; then - usage -fi + return ${rc} +} -check_prereq () { - rc=0 - if [ ! -x "/usr/local/bin/qemu-img" ]; then - rc=1 +create_etc() { + chroot ${CHROOTDIR} /usr/bin/newaliases + echo "# Custom /etc/fstab for FreeBSD VM images" \ + > ${CHROOTDIR}/vmimage/mnt/etc/fstab + echo "/dev/gpt/rootfs / ufs rw 2 2" \ + >> ${CHROOTDIR}/vmimage/mnt/etc/fstab + echo "/dev/gpt/swapfs none swap sw 0 0" \ + >> ${CHROOTDIR}/vmimage/mnt/etc/fstab + sync + while ! umount ${CHROOTDIR}/vmimage/mnt; do + sleep 1 + done +} + +create_vmimage_qemu() { + diskformats="qcow2" + if [ ! -x /usr/local/bin/qemu-img ]; then + echo "qemu-img not found, skipping qcow2 format." + return 0 fi - return ${rc} + + if [ ! -x /usr/bin/mkimg ]; then + # No mkimg(1) here, so use qemu-img for them all. + diskformats="${diskformats} vpc vmdk" + fi + + if [ -e "${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk" ]; then + rm -f "${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk" + fi + mkdir -p ${CHROOTDIR}/vmimage ${CHROOTDIR}/vmimage/mnt + touch ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk + truncate -s 20G ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk + mddev=$(mdconfig -a -t vnode -f ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk) + + gpart create -s gpt /dev/${mddev} + gpart add -t freebsd-boot -a 1m -s 512k -l bootfs /dev/${mddev} + gpart add -t freebsd-swap -a 1m -s 1G -l swapfs /dev/${mddev} + gpart add -t freebsd-ufs -a 1m -l rootfs /dev/${mddev} + gpart bootcode -b ${CHROOTDIR}/boot/pmbr \ + -p ${CHROOTDIR}/boot/gptboot -i 1 /dev/${mddev} + newfs -j -L rootfs /dev/${mddev}p3 + mount /dev/${mddev}p3 ${CHROOTDIR}/vmimage/mnt + + # Errors here are ok, 'set -e' is re-enabled below again. + set +e + mount -t devfs devfs ${CHROOTDIR}/dev + chroot ${CHROOTDIR} make -s -C /usr/src DESTDIR=/vmimage/mnt \ + installworld installkernel distribution + set -e + create_etc + + for f in ${diskformats}; do + _f=${f} + case ${_f} in + vpc) + _f=vhd + ;; + *) + ;; + esac + /usr/local/bin/qemu-img convert \ + -O ${f} ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk \ + ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.${_f} + xz ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.${_f} + done + mdconfig -d -u ${mddev} + mv ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk \ + ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.raw + xz ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.raw + return 0 } -VM_TARGET_ARCH=$(echo ${__CONFIG_NAME} | cut -f 2 -d -) +create_vmimage_mkimg() { + diskformats="vmdk vhdf" -case ${VM_TARGET_ARCH} in - # For now, only create amd64 and i386 vm images. - i386|amd64) - # Ok to create vm image - ;; - *) - exit 0 - ;; -esac - -case ${KERNEL} in - GENERIC) - ;; - *) - exit 0 - ;; -esac - -check_prereq || exit 0 - -# Use the build environment to get the branch revision (i.e., 10.0) and branch -# (i.e., -CURRENT, -STABLE) for the vm image name. -VM_IMAGE_NAME=$(make -C ${CHROOTDIR}/usr/src/release -V REVISION -V BRANCH | tr '\n' '-') -# Prefix the image name with OS name, and suffix with the vm architecture. -VM_IMAGE_NAME="$(uname -s)-${VM_IMAGE_NAME}${VM_TARGET_ARCH}" - -mkdir -p ${CHROOTDIR}/vmimage ${CHROOTDIR}/vmimage/mnt - -# This should only ever happen if the script is being run again after failure. -if [ -e "${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.disk" ]; then - rm -f "${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.disk" -fi - -touch ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.disk -truncate -s 20G ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.disk -mddev=$(mdconfig -a -t vnode -f ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.disk) -gpart create -s gpt /dev/${mddev} -gpart add -t freebsd-boot -s 512k -l bootfs /dev/${mddev} -gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 /dev/${mddev} -gpart add -t freebsd-swap -s 1G -l swapfs /dev/${mddev} -gpart add -t freebsd-ufs -l rootfs /dev/${mddev} -newfs /dev/${mddev}p3 -mount /dev/${mddev}p3 ${CHROOTDIR}/vmimage/mnt - -# Errors here are ok, 'set -e' is re-enabled below again. -set +e -mount -t devfs devfs ${CHROOTDIR}/dev -chroot ${CHROOTDIR} make -s -C /usr/src DESTDIR=/vmimage/mnt \ - installworld installkernel distribution -echo "# Custom /etc/fstab for FreeBSD VM images" \ - > ${CHROOTDIR}/vmimage/mnt/etc/fstab -echo "/dev/gpt/rootfs / ufs rw 2 2" \ - >> ${CHROOTDIR}/vmimage/mnt/etc/fstab -echo "/dev/gpt/swapfs none swap sw 0 0" \ - >> ${CHROOTDIR}/vmimage/mnt/etc/fstab -# Make sure we wait until the md(4) is unmounted before destroying it. -while ! umount /dev/${mddev}p3; do - sleep 1 -done -mdconfig -d -u ${mddev} -while ! umount ${CHROOTDIR}/dev; do - sleep 1 -done -set -e -diskformats="vmdk vpc qcow2" -for f in ${diskformats}; do - _f=${f} - case ${_f} in - vpc) - _f=vhd - ;; - *) - ;; - esac - /usr/local/bin/qemu-img convert -O ${f} ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.disk \ - ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.${_f} - xz ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.${_f} -done -cd ${CHROOTDIR}/vmimage -sha256 FreeBSD*.xz > CHECKSUM.SHA256 -md5 FreeBSD*.xz > CHECKSUM.MD5 + if [ ! -x /usr/bin/mkimg ]; then + return 0 + fi + + if [ ! -d ${CHROOTDIR}/R/ftp ]; then + echo "Error: Cannot find the ftp/*.txz files." + exit 1 + fi + + dists="base kernel games" + if [ -e ${CHROOTDIR}/R/ftp/lib32.txz ]; then + dists="${dists} lib32" + fi + + if [ -e "${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk" ]; then + rm -f "${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk" + fi + mkdir -p ${CHROOTDIR}/vmimage ${CHROOTDIR}/vmimage/mnt + touch ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk + truncate -s 20G ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk + mddev=$(mdconfig -a -t vnode -f ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk) + + newfs -j -L rootfs /dev/${mddev} + mount /dev/${mddev} ${CHROOTDIR}/vmimage/mnt + + for d in ${dists}; do + tar -xf ${CHROOTDIR}/R/ftp/${d}.txz -C ${CHROOTDIR}/vmimage/mnt + done + create_etc + mdconfig -d -u ${mddev} + + for f in ${diskformats}; do + case ${f} in + vhdf) + _f=vhd + ;; + *) + _f=${f} + ;; + esac + /usr/bin/mkimg -f ${f} \ + -s gpt -b ${CHROOTDIR}/boot/pmbr \ + -p freebsd-boot/bootfs:=${CHROOTDIR}/boot/gptboot \ + -p freebsd-swap/swapfs::1G \ + -p freebsd-ufs/rootfs:=${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk \ + -o ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.${_f} + xz ${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.${_f} + done + mdconfig -d -u ${mddev} + rm -f "${CHROOTDIR}/vmimage/${VM_IMAGE_NAME}.rawdisk" + return 0 +} + +main() { + while getopts c: opt; do + case ${opt} in + c) + VM_CONFIG="${OPTARG}" + ;; + \?) + usage + ;; + esac + done + + # Force use of configuration file + if [ "X${VM_CONFIG}" = "X" ]; then + usage + fi + if [ ! -e "${VM_CONFIG}" ]; then + echo "ERROR: Configuration file not found" + exit 1 + fi + . ${VM_CONFIG} + + VM_TARGET_ARCH=$(echo ${__CONFIG_NAME} | cut -f 2 -d -) + + # Use the build environment to get the branch revision (i.e., 10.0) + # and branch (i.e., -CURRENT, -STABLE) for the vm image name. + VM_IMAGE_REVISION=$(make -C ${CHROOTDIR}/usr/src/release -V REVISION) + VM_IMAGE_BRANCH=$(make -C ${CHROOTDIR}/usr/src/release -V BRANCH) + VM_IMAGE_NAME="${VM_IMAGE_REVISION}-${VM_IMAGE_BRANCH}" + VM_IMAGE_NAME="$(uname -s)-${VM_IMAGE_NAME}-${VM_TARGET_ARCH}" + + check_prereq || exit 0 + + create_vmimage_mkimg + create_vmimage_qemu + + cd ${CHROOTDIR}/vmimage + sha256 FreeBSD*.xz > CHECKSUM.SHA256 + md5 FreeBSD*.xz > CHECKSUM.MD5 + +} +main "$@"