#!/bin/sh # This script generates FreeBSD images for OpenNebula, being heavily inspired # from srht's FreeBSD build image definition. It assumes running on a FreeBSD host. set -e set -x # XXX: Handle command-line arguments? RELEASE=13.0-RELEASE ARCH=amd64 IMAGE_PATH=freebsd-$RELEASE-$(date -I).img.qcow2 IMAGE_SIZE=10G DIST_BASE="https://download.freebsd.org/ftp/releases/$ARCH/$RELEASE" PORTS_BASE="https://download.freebsd.org/ftp/snapshots/$ARCH/13.0-STABLE" ONE_CONTEXT_PKG_URL="https://github.com/OpenNebula/addon-context-linux/releases/download/v5.12.0/one-context-5.12.0_1.txz" cleanup() { sync || true umount /mnt/dev || true umount /mnt || true mdconfig -du md0 || true } trap cleanup EXIT if [ "$(whoami)" != 'root' ]; then echo "This script must be run as root." >&2 exit 1 fi # Allocate and partition/format disk image. disk=$(mktemp) truncate -s 6G $disk mdconfig -a -t vnode -f $disk -u md0 gpart create -s gpt /dev/md0 gpart add -t freebsd-boot -l bootfs -b 40 -s 512K md0 gpart bootcode -b /boot/pmbr -p /boot/gptboot -i 1 md0 gpart add -t freebsd-ufs -l rootfs -b 1M -s 5G md0 newfs -U /dev/md0p2 # Mount allocated image. mount /dev/md0p2 /mnt mkdir -p /mnt/dev mount -t devfs devfs /mnt/dev # Download and extract base system. dist_files="kernel.txz base.txz" dist_dir="/usr/freebsd-dist/$ARCH/$RELEASE" mkdir -p "$dist_dir" for f in $dist_files do fetch -m -o "$dist_dir/$f" "$DIST_BASE/$f" tar -C /mnt -xJf "$dist_dir/$f" done # Configure new system. echo "/dev/gpt/rootfs / ufs rw,noatime 1 1" >/mnt/etc/fstab touch /mnt/firstboot echo 'autoboot_delay="-1"' >>/mnt/boot/loader.conf cat >>/mnt/etc/rc.conf <>/mnt/etc/ssh/sshd_config </mnt/usr/local/etc/pkg/repos/FreeBSD.conf <