svn commit: r271404 - user/gjb/thermite
Glen Barber
gjb at FreeBSD.org
Wed Sep 10 20:23:11 UTC 2014
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 "$@"
More information about the svn-src-user
mailing list