Blob Blame History Raw
#!/bin/bash

# This script builds the kata appliance initrd and image. It is invoked
# at RPM install %post time and via kata-osbuilder-generate.service

set -e

die()
{
    echo "ERROR: $*" >&2
    exit 1
}

[ "$(id -u)" -eq 0 ] || die "$0: must be run as root"

COMMAND="$1"
[ -z "$COMMAND" ] && COMMAND="check"
[ "$COMMAND" != "check" -a "$COMMAND" != "regenerate" ] && die "$0: Unknown command=$COMMAND"

IMAGE_TOPDIR="/var/cache/kata-containers"
KERNEL_SYMLINK="${IMAGE_TOPDIR}/vmlinuz.container"

KVERSION=`uname -r`
KERNEL_PATH=""
for VMNAME in vmlinuz vmlinux; do
    TRYPATH="/lib/modules/$KVERSION/$VMNAME"
    if [ -e "$TRYPATH" ] ; then
        KERNEL_PATH="$TRYPATH"
        break
    fi
done

[ -z "$KERNEL_PATH" ] && die "$0: Didn't find kernel path for version=$KVERSION"

if [ "regenerate" != "$COMMAND" ]; then
    LINKED_KERNEL=$(readlink -n "${KERNEL_SYMLINK}" || :)
    if [ "${KERNEL_PATH}" = "${LINKED_KERNEL}" ] ; then
        echo "$0: symlink=${KERNEL_SYMLINK} already points to host kernel=${KERNEL_PATH}"
        echo "$0: Nothing to generate. Exiting."
        exit 0
    fi
fi


cd /usr/libexec/kata-containers/osbuilder

DRACUT_OVERLAY=`mktemp --directory -t kata-dracut-overlay-XXXXXX`
DRACUT_ROOTFS=`mktemp --directory -t kata-dracut-rootfs-XXXXXX`
DRACUT_IMAGES=`mktemp --directory -t kata-dracut-images-XXXXXX`
trap "{ rm -rf ${DRACUT_OVERLAY} ${DRACUT_ROOTFS} ${DRACUT_IMAGES}; }" EXIT


export AGENT_SOURCE_BIN="/usr/libexec/kata-containers/osbuilder/agent/kata-agent"
TARGET_IMAGE="${DRACUT_IMAGES}/kata-containers.img" \
TARGET_INITRD="${DRACUT_IMAGES}/kata-containers-initrd.img" \
OSBUILDER_VERSION="fedora-osbuilder-version-unknown"
DRACUT_CONF_DIR="./dracut/dracut.conf.d"
DRACUT_KMODULES=`source ${DRACUT_CONF_DIR}/10-drivers.conf; echo "$drivers"`
DRACUT_OPTIONS="--no-compress --conf /dev/null --confdir ./dracut/dracut.conf.d"

# Build the dracut overlay fs
./rootfs-builder/rootfs.sh -o ${OSBUILDER_VERSION} -r ${DRACUT_OVERLAY}
mkdir -p ${DRACUT_OVERLAY}/etc/modules-load.d
echo ${DRACUT_KMODULES} | tr " " "\n" > ${DRACUT_OVERLAY}/etc/modules-load.d/kata-modules.conf

# Build the initrd
dracut ${DRACUT_OPTIONS} \
    --include ${DRACUT_OVERLAY} \
    / ${TARGET_INITRD} ${KVERSION}

# Extract initrd filesystem for image build
cat ${TARGET_INITRD} | \
    cpio --extract --preserve-modification-time --make-directories --directory=${DRACUT_ROOTFS}

# Build the FS image
./image-builder/image_builder.sh -o ${TARGET_IMAGE} ${DRACUT_ROOTFS}

# This is a workaround till issue[0] is fixed, released and packaged.
# [0]: https://github.com/kata-containers/osbuilder/issues/394
rm image-builder/nsdax


# Move images into place
IMAGE_OSBUILDER_DIR="${IMAGE_TOPDIR}/osbuilder-images"
IMAGE_DIR="${IMAGE_OSBUILDER_DIR}/$KVERSION"
INITRD_NAME="${IMAGE_DIR}/fedora-kata-${KVERSION}.initrd"
IMAGE_NAME="${IMAGE_DIR}/fedora-kata-${KVERSION}.img"

# This blows away the entire osbuilder-images/ dir, deleting any
# previously cached content
rm -rf "${IMAGE_OSBUILDER_DIR}"
mkdir -p "${IMAGE_DIR}"

ln -sf ${KERNEL_PATH} ${KERNEL_SYMLINK}

mv ${TARGET_INITRD} ${INITRD_NAME}
ln -sf ${INITRD_NAME} ${IMAGE_TOPDIR}/kata-containers-initrd.img

mv ${TARGET_IMAGE} ${IMAGE_NAME}
ln -sf ${IMAGE_NAME} ${IMAGE_TOPDIR}/kata-containers.img