116 lines
2.8 KiB
Bash
Executable file
116 lines
2.8 KiB
Bash
Executable file
#!/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 <<EOF
|
|
ntpd_enable=YES
|
|
sshd_enable=YES
|
|
growfs_enable=YES
|
|
hostname="freebsd"
|
|
EOF
|
|
|
|
cp /etc/resolv.conf /mnt/etc/resolv.conf
|
|
tzsetup -s -C /mnt UTC
|
|
|
|
cat >>/mnt/etc/ssh/sshd_config <<EOF
|
|
PermitRootLogin yes
|
|
PasswordAuthentication no
|
|
PermitEmptyPasswords no
|
|
EOF
|
|
|
|
mkdir -p /mnt/usr/local/etc/pkg/repos/
|
|
cat >/mnt/usr/local/etc/pkg/repos/FreeBSD.conf <<EOF
|
|
FreeBSD: {
|
|
url: pkg+http://pkg.FreeBSD.org/\$\{ABI\}/latest
|
|
enabled: yes
|
|
}
|
|
EOF
|
|
|
|
# freebsd-update is only supported for RELEASE
|
|
if [ "${release%-RELEASE}" != "$RELEASE" ]
|
|
then
|
|
env PAGER=true /usr/sbin/freebsd-update \
|
|
-b /mnt \
|
|
--currently-running "$RELEASE" \
|
|
--not-running-from-cron -F \
|
|
fetch install
|
|
fi
|
|
|
|
env ASSUME_ALWAYS_YES=YES pkg -c /mnt bootstrap -f
|
|
env ASSUME_ALWAYS_YES=YES pkg -c /mnt install bash curl
|
|
|
|
curl -L "$ONE_CONTEXT_PKG_URL" -o /mnt/one-context.txz
|
|
env ASSUME_ALWAYS_YES=YES pkg -c /mnt add one-context.txz
|
|
rm /mnt/one-context.txz
|
|
|
|
fetch -m -o "$dist_dir/ports.txz" "$PORTS_BASE/ports.txz"
|
|
tar -C /mnt -xJf "$dist_dir/ports.txz"
|
|
|
|
cleanup
|
|
trap : EXIT
|
|
|
|
mkdir -p "$ARCH"
|
|
qemu-img convert -f raw -O qcow2 "$disk" "$IMAGE_PATH"
|
|
rm "$disk"
|
|
|
|
# Filesystem will be enlarged by growfs(7) on next startup
|
|
qemu-img resize "$IMAGE_PATH" "$IMAGE_SIZE"
|