Blame fedora-kata-osbuilder.sh

99df63b
#!/bin/bash
99df63b
67ede61
set -o errexit
67ede61
set -o nounset
67ede61
set -o pipefail
67ede61
67ede61
[ -n "${DEBUG:-}" ] && set -o xtrace
67ede61
67ede61
readonly IMAGE_TOPDIR="/var/cache/kata-containers"
67ede61
readonly KERNEL_SYMLINK="${IMAGE_TOPDIR}/vmlinuz.container"
67ede61
readonly KVERSION=`uname -r`
67ede61
readonly SCRIPTNAME="$0"
67ede61
67ede61
readonly DRACUT_ROOTFS=`mktemp --directory -t kata-dracut-rootfs-XXXXXX`
67ede61
readonly DRACUT_IMAGES=`mktemp --directory -t kata-dracut-images-XXXXXX`
67ede61
trap exit_handler EXIT
67ede61
67ede61
readonly GENERATED_IMAGE="${DRACUT_IMAGES}/kata-containers.img"
67ede61
readonly GENERATED_INITRD="${DRACUT_IMAGES}/kata-containers-initrd.img"
67ede61
67ede61
67ede61
KERNEL_PATH=""
67ede61
COMMAND=""
a3838f9
OSBUILDER_DIR="/usr/libexec/kata-containers/osbuilder"
67ede61
99df63b
8901165
die()
8901165
{
f3b26d0
    error "$*"
8901165
    exit 1
8901165
}
8901165
8901165
f3b26d0
error()
f3b26d0
{
f3b26d0
    echo "ERROR: ${SCRIPTNAME}: $*" >&2
f3b26d0
}
f3b26d0
f3b26d0
67ede61
info()
67ede61
{
67ede61
    echo "${SCRIPTNAME}: $*"
67ede61
}
8901165
ffd1b7e
67ede61
exit_handler()
67ede61
{
4e32777
    rm -rf "${DRACUT_ROOTFS}" "${DRACUT_IMAGES}"
67ede61
}
bc065b1
bc065b1
f3b26d0
usage()
f3b26d0
{
f3b26d0
    cat <
f3b26d0
f3b26d0
Usage: ${SCRIPTNAME} [options]
f3b26d0
f3b26d0
This script builds the kata appliance initrd and image and adds
f3b26d0
stable symlink paths in ${IMAGE_TOPDIR}
f3b26d0
f3b26d0
This script is called at kata-osbuilder at RPM install %post time and
f3b26d0
via kata-osbuilder-generate.service
f3b26d0
f3b26d0
Options:
a3838f9
  -h            Show this help message
a3838f9
a3838f9
  -c            Check if an initrd is already generated for the current
a3838f9
                kernel, and if so, simply exit
a3838f9
a3838f9
  -o DIRNAME    Use the passed directory for osbuilder code. Point
a3838f9
                To a git checkout if you want to use upstream osbuilder.
a3838f9
                Default: ${OSBUILDER_DIR}
f3b26d0
f3b26d0
EOT
f3b26d0
f3b26d0
    exit $1
f3b26d0
}
f3b26d0
f3b26d0
67ede61
parse_args()
67ede61
{
a3838f9
    while getopts "cho:" opt
f3b26d0
    do
f3b26d0
        case $opt in
f3b26d0
            c) COMMAND="check" ;;
a3838f9
            h) usage 0 ;;
a3838f9
            o) OSBUILDER_DIR="${OPTARG}" ;;
f3b26d0
            *) usage 1 ;;
f3b26d0
        esac
f3b26d0
    done
f3b26d0
    shift $(($OPTIND - 1))
f3b26d0
f3b26d0
    if [ -n "$*" ]; then
f3b26d0
        error "Unhandled options: '$*'"
f3b26d0
        usage 1
f3b26d0
    fi
67ede61
}
67ede61
67ede61
67ede61
find_host_kernel_path()
67ede61
{
67ede61
    local vmname
67ede61
    for vmname in vmlinuz vmlinux; do
67ede61
        local trypath="/lib/modules/$KVERSION/$vmname"
67ede61
        if [ -e "$trypath" ] ; then
67ede61
            KERNEL_PATH="$trypath"
67ede61
            break
67ede61
        fi
67ede61
    done
67ede61
67ede61
    [ -z "$KERNEL_PATH" ] && die "Didn't find kernel path for version=$KVERSION"
67ede61
f3b26d0
    if [ "$COMMAND" = "check" ]; then
67ede61
        local linked_kernel=$(readlink -n "${KERNEL_SYMLINK}" || :)
67ede61
        if [ "${KERNEL_PATH}" = "${linked_kernel}" ] ; then
67ede61
            info "symlink=${KERNEL_SYMLINK} already points to host kernel=${KERNEL_PATH}"
67ede61
            info "Nothing to generate. Exiting."
67ede61
            exit 0
67ede61
        fi
3e251c8
    fi
67ede61
}
3f4309b
bc065b1
4e32777
generate_rootfs()
4e32777
{
4e32777
    # To generate the rootfs, we build an initrd with dracut, extract
4e32777
    # the initrd content, and then discard the initrd. We then rebuild
4e32777
    # the initrd using the osbuilder native scripts.
4e32777
    #
4e32777
    # This is a bit wasteful, but it's the easiest way to work around
4e32777
    # obuilder script inflexibility for now, which expect that some rootfs.sh
4e32777
    # code is called on a fully populated distro root.
4e32777
4e32777
    local agent_source_bin="/usr/libexec/kata-containers/osbuilder/agent/kata-agent"
4e32777
    local osbuilder_version="fedora-osbuilder-version-unknown"
4e32777
    local dracut_conf_dir="./dracut/dracut.conf.d"
4e32777
    local dracut_kmodules=`source ${dracut_conf_dir}/10-drivers.conf; echo "$drivers"`
4e32777
    local tmp_initrd=`mktemp --tmpdir=${DRACUT_IMAGES}`
4e32777
    unlink "$tmp_initrd"
4e32777
4e32777
    # Build the initrd
4e32777
    echo -e "+ Building dracut initrd"
4e32777
    dracut  \
4e32777
        --confdir "${dracut_conf_dir}" \
4e32777
        --no-compress \
4e32777
        --conf /dev/null \
4e32777
        ${tmp_initrd} ${KVERSION}
4e32777
4e32777
    # Extract the generated rootfs
4e32777
    echo "+ Extracting dracut initrd rootfs"
4e32777
    cat ${tmp_initrd} | \
4e32777
        cpio --extract --preserve-modification-time --make-directories --directory=${DRACUT_ROOTFS}
4e32777
4e32777
    # Using the busybox dracut module sets /sbin/init -> busybox
4e32777
    # We don't want that. Reset it to systemd
4e32777
    ln -sf ../lib/systemd/systemd ${DRACUT_ROOTFS}/usr/sbin/init
4e32777
4e32777
    # Make kata specific adjustments to our rootfs
4e32777
    echo "Calling osbuilder rootfs.sh on extracted rootfs"
4e32777
    AGENT_SOURCE_BIN="${agent_source_bin}" \
4e32777
        ./rootfs-builder/rootfs.sh \
4e32777
        -o ${osbuilder_version} \
4e32777
        -r ${DRACUT_ROOTFS}
4e32777
4e32777
    # Add modules-load.d file for all our manually specified drivers
4e32777
    mkdir -p ${DRACUT_ROOTFS}/etc/modules-load.d
4e32777
    echo ${dracut_kmodules} | tr " " "\n" > ${DRACUT_ROOTFS}/etc/modules-load.d/kata-modules.conf
4e32777
}
4e32777
4e32777
67ede61
move_images()
67ede61
{
67ede61
    # Move images into place
67ede61
    local image_osbuilder_dir="${IMAGE_TOPDIR}/osbuilder-images"
67ede61
    local image_dir="${image_osbuilder_dir}/$KVERSION"
67ede61
    local initrd_dest_path="${image_dir}/fedora-kata-${KVERSION}.initrd"
67ede61
    local image_dest_path="${image_dir}/fedora-kata-${KVERSION}.img"
99df63b
67ede61
    # This blows away the entire osbuilder-images/ dir, deleting any
67ede61
    # previously cached content
67ede61
    rm -rf "${image_osbuilder_dir}"
67ede61
    mkdir -p "${image_dir}"
99df63b
67ede61
    ln -sf ${KERNEL_PATH} ${KERNEL_SYMLINK}
99df63b
67ede61
    mv ${GENERATED_INITRD} ${initrd_dest_path}
67ede61
    ln -sf ${initrd_dest_path} ${IMAGE_TOPDIR}/kata-containers-initrd.img
99df63b
67ede61
    mv ${GENERATED_IMAGE} ${image_dest_path}
67ede61
    ln -sf ${image_dest_path} ${IMAGE_TOPDIR}/kata-containers.img
67ede61
}
67ede61
67ede61
67ede61
main()
67ede61
{
f3b26d0
    parse_args $*
f3b26d0
67ede61
    [ "$(id -u)" -eq 0 ] || die "$0: must be run as root"
67ede61
67ede61
    find_host_kernel_path
99df63b
a3838f9
    cd "${OSBUILDER_DIR}"
99df63b
4e32777
    # Generate the rootfs using dracut
4e32777
    generate_rootfs
99df63b
67ede61
    # Build the initrd
4e32777
    echo "+ Calling osbuilder initrd_builder.sh"
4e32777
    ./initrd-builder/initrd_builder.sh -o ${GENERATED_INITRD} ${DRACUT_ROOTFS}
ffd1b7e
67ede61
    # Build the FS image
4e32777
    echo "+ Calling osbuilder image_builder.sh"
67ede61
    ./image-builder/image_builder.sh -o ${GENERATED_IMAGE} ${DRACUT_ROOTFS}
99df63b
67ede61
    # This is a workaround till issue[0] is fixed, released and packaged.
67ede61
    # [0]: https://github.com/kata-containers/osbuilder/issues/394
4e32777
    rm -f image-builder/nsdax
99df63b
67ede61
    move_images
67ede61
}
99df63b
99df63b
67ede61
main $*