From 23c86d6622b9d210297919af6f78b5f7201611e1 Mon Sep 17 00:00:00 2001 From: Pavel Mores Date: Jun 26 2020 16:28:24 +0000 Subject: Rename fedora-kata-osbuilder.sh to just kata-osbuilder.sh There's nothing specific to Fedora about that script any more. --- diff --git a/fedora-kata-osbuilder.sh b/fedora-kata-osbuilder.sh deleted file mode 100755 index 9fa36c3..0000000 --- a/fedora-kata-osbuilder.sh +++ /dev/null @@ -1,275 +0,0 @@ -#!/bin/bash - -set -o errexit -set -o nounset -set -o pipefail - -[ -n "${DEBUG:-}" ] && set -o xtrace - -readonly IMAGE_TOPDIR="/var/cache/kata-containers" -readonly KERNEL_SYMLINK="${IMAGE_TOPDIR}/vmlinuz.container" -readonly SCRIPTNAME="$0" - -readonly DRACUT_ROOTFS=`mktemp --directory -t kata-dracut-rootfs-XXXXXX` -readonly DRACUT_IMAGES=`mktemp --directory -t kata-dracut-images-XXXXXX` -trap exit_handler EXIT - -readonly GENERATED_IMAGE="${DRACUT_IMAGES}/kata-containers.img" -readonly GENERATED_INITRD="${DRACUT_IMAGES}/kata-containers-initrd.img" - -readonly DISTRO=`grep '^ID' /etc/os-release | awk '{print $2}' FS='='` - - -KVERSION=`uname -r` -KERNEL_PATH="" -COMMAND="" -OSBUILDER_DIR="/usr/libexec/kata-containers/osbuilder" -GENERATE_IMAGE="" - -# rpm %check sets this to run the script without overwriting host -# content, and not requiring root -TEST_MODE="${TEST_MODE:-}" - - -die() -{ - error "$*" - exit 1 -} - - -error() -{ - echo "ERROR: ${SCRIPTNAME}: $*" >&2 -} - - -info() -{ - echo "${SCRIPTNAME}: $*" -} - - -exit_handler() -{ - rm -rf "${DRACUT_ROOTFS}" "${DRACUT_IMAGES}" -} - - -usage() -{ - cat <> $loadfile - done -} - - -generate_rootfs() -{ - # To generate the rootfs, we build an initrd with dracut, extract - # the initrd content, and then discard the initrd. We then rebuild - # the initrd using the osbuilder native scripts. - # - # This is a bit wasteful, but it's the easiest way to work around - # obuilder script inflexibility for now, which expect that some rootfs.sh - # code is called on a fully populated distro root. - - local agent_dir="/usr/libexec/kata-containers/agent" - if [ -n "${TEST_MODE}" ] ; then - nsdax_bin="${OSBUILDER_DIR}/nsdax" - fi - - local agent_source_bin="${agent_dir}/usr/bin/kata-agent" - local osbuilder_version="${DISTRO}-osbuilder-version-unknown" - local dracut_conf_dir="./dracut/dracut.conf.d" - local tmp_initrd=`mktemp --tmpdir=${DRACUT_IMAGES}` - unlink "$tmp_initrd" - - # Build the initrd - echo -e "+ Building dracut initrd" - dracut \ - --confdir "${dracut_conf_dir}" \ - --no-compress \ - --conf /dev/null \ - ${tmp_initrd} ${KVERSION} - - # Extract the generated rootfs - echo "+ Extracting dracut initrd rootfs" - cat ${tmp_initrd} | \ - cpio --extract --preserve-modification-time --make-directories --directory=${DRACUT_ROOTFS} - - # Using the busybox dracut module sets /sbin/init -> busybox - # We don't want that. Reset it to systemd - ln -sf ../lib/systemd/systemd ${DRACUT_ROOTFS}/usr/sbin/init - - echo "+ Copying agent directory tree into place" - cp -ar ${agent_dir}/* ${DRACUT_ROOTFS} - - # Make kata specific adjustments to our rootfs - echo "Calling osbuilder rootfs.sh on extracted rootfs" - AGENT_SOURCE_BIN="${agent_source_bin}" \ - ./rootfs-builder/rootfs.sh \ - -o ${osbuilder_version} \ - -r ${DRACUT_ROOTFS} - - # Generate modules-load.d file - generate_modules_load_conf -} - - -move_images() -{ - # Move images into place - local image_osbuilder_dir="${IMAGE_TOPDIR}/osbuilder-images" - local image_dir="${image_osbuilder_dir}/$KVERSION" - local initrd_dest_path="${image_dir}/${DISTRO}-kata-${KVERSION}.initrd" - local image_dest_path="${image_dir}/${DISTRO}-kata-${KVERSION}.img" - local image_dest_link="${IMAGE_TOPDIR}/kata-containers.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 -Z ${GENERATED_INITRD} ${initrd_dest_path} - ln -sf ${initrd_dest_path} ${IMAGE_TOPDIR}/kata-containers-initrd.img - - if [ -n "${GENERATE_IMAGE}" ]; then - mv -Z ${GENERATED_IMAGE} ${image_dest_path} - ln -sf ${image_dest_path} ${image_dest_link} - else - rm -f ${image_dest_link} - fi -} - - -main() -{ - parse_args $* - - if [ -z "${TEST_MODE}" ]; then - [ "$(id -u)" -eq 0 ] || die "$0: must be run as root" - fi - - find_host_kernel_path - - cd "${OSBUILDER_DIR}" - - # Generate the rootfs using dracut - generate_rootfs - - if [ -n "${TEST_MODE}" ]; then - echo "+ Exiting TEST_MODE successfully" - return - fi - - # Build the initrd - echo "+ Calling osbuilder initrd_builder.sh" - ./initrd-builder/initrd_builder.sh -o ${GENERATED_INITRD} ${DRACUT_ROOTFS} - - if [ -n "${GENERATE_IMAGE}" ]; then - # Build the FS image - local nsdax_bin="/usr/libexec/kata-containers/osbuilder/nsdax" - echo "+ Calling osbuilder image_builder.sh" - NSDAX_BIN="${nsdax_bin}" \ - ./image-builder/image_builder.sh \ - -o ${GENERATED_IMAGE} ${DRACUT_ROOTFS} - fi - - move_images -} - - -main $* diff --git a/kata-osbuilder-generate.service b/kata-osbuilder-generate.service index 95264df..e2de244 100644 --- a/kata-osbuilder-generate.service +++ b/kata-osbuilder-generate.service @@ -3,8 +3,8 @@ Description=Generate Kata appliance image for host kernel [Service] Type=oneshot -ExecStart=/usr/libexec/kata-containers/osbuilder/fedora-kata-osbuilder.sh -c -ExecReload=/usr/libexec/kata-containers/osbuilder/fedora-kata-osbuilder.sh +ExecStart=/usr/libexec/kata-containers/osbuilder/kata-osbuilder.sh -c +ExecReload=/usr/libexec/kata-containers/osbuilder/kata-osbuilder.sh [Install] WantedBy=multi-user.target diff --git a/kata-osbuilder.sh b/kata-osbuilder.sh new file mode 100755 index 0000000..9fa36c3 --- /dev/null +++ b/kata-osbuilder.sh @@ -0,0 +1,275 @@ +#!/bin/bash + +set -o errexit +set -o nounset +set -o pipefail + +[ -n "${DEBUG:-}" ] && set -o xtrace + +readonly IMAGE_TOPDIR="/var/cache/kata-containers" +readonly KERNEL_SYMLINK="${IMAGE_TOPDIR}/vmlinuz.container" +readonly SCRIPTNAME="$0" + +readonly DRACUT_ROOTFS=`mktemp --directory -t kata-dracut-rootfs-XXXXXX` +readonly DRACUT_IMAGES=`mktemp --directory -t kata-dracut-images-XXXXXX` +trap exit_handler EXIT + +readonly GENERATED_IMAGE="${DRACUT_IMAGES}/kata-containers.img" +readonly GENERATED_INITRD="${DRACUT_IMAGES}/kata-containers-initrd.img" + +readonly DISTRO=`grep '^ID' /etc/os-release | awk '{print $2}' FS='='` + + +KVERSION=`uname -r` +KERNEL_PATH="" +COMMAND="" +OSBUILDER_DIR="/usr/libexec/kata-containers/osbuilder" +GENERATE_IMAGE="" + +# rpm %check sets this to run the script without overwriting host +# content, and not requiring root +TEST_MODE="${TEST_MODE:-}" + + +die() +{ + error "$*" + exit 1 +} + + +error() +{ + echo "ERROR: ${SCRIPTNAME}: $*" >&2 +} + + +info() +{ + echo "${SCRIPTNAME}: $*" +} + + +exit_handler() +{ + rm -rf "${DRACUT_ROOTFS}" "${DRACUT_IMAGES}" +} + + +usage() +{ + cat <> $loadfile + done +} + + +generate_rootfs() +{ + # To generate the rootfs, we build an initrd with dracut, extract + # the initrd content, and then discard the initrd. We then rebuild + # the initrd using the osbuilder native scripts. + # + # This is a bit wasteful, but it's the easiest way to work around + # obuilder script inflexibility for now, which expect that some rootfs.sh + # code is called on a fully populated distro root. + + local agent_dir="/usr/libexec/kata-containers/agent" + if [ -n "${TEST_MODE}" ] ; then + nsdax_bin="${OSBUILDER_DIR}/nsdax" + fi + + local agent_source_bin="${agent_dir}/usr/bin/kata-agent" + local osbuilder_version="${DISTRO}-osbuilder-version-unknown" + local dracut_conf_dir="./dracut/dracut.conf.d" + local tmp_initrd=`mktemp --tmpdir=${DRACUT_IMAGES}` + unlink "$tmp_initrd" + + # Build the initrd + echo -e "+ Building dracut initrd" + dracut \ + --confdir "${dracut_conf_dir}" \ + --no-compress \ + --conf /dev/null \ + ${tmp_initrd} ${KVERSION} + + # Extract the generated rootfs + echo "+ Extracting dracut initrd rootfs" + cat ${tmp_initrd} | \ + cpio --extract --preserve-modification-time --make-directories --directory=${DRACUT_ROOTFS} + + # Using the busybox dracut module sets /sbin/init -> busybox + # We don't want that. Reset it to systemd + ln -sf ../lib/systemd/systemd ${DRACUT_ROOTFS}/usr/sbin/init + + echo "+ Copying agent directory tree into place" + cp -ar ${agent_dir}/* ${DRACUT_ROOTFS} + + # Make kata specific adjustments to our rootfs + echo "Calling osbuilder rootfs.sh on extracted rootfs" + AGENT_SOURCE_BIN="${agent_source_bin}" \ + ./rootfs-builder/rootfs.sh \ + -o ${osbuilder_version} \ + -r ${DRACUT_ROOTFS} + + # Generate modules-load.d file + generate_modules_load_conf +} + + +move_images() +{ + # Move images into place + local image_osbuilder_dir="${IMAGE_TOPDIR}/osbuilder-images" + local image_dir="${image_osbuilder_dir}/$KVERSION" + local initrd_dest_path="${image_dir}/${DISTRO}-kata-${KVERSION}.initrd" + local image_dest_path="${image_dir}/${DISTRO}-kata-${KVERSION}.img" + local image_dest_link="${IMAGE_TOPDIR}/kata-containers.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 -Z ${GENERATED_INITRD} ${initrd_dest_path} + ln -sf ${initrd_dest_path} ${IMAGE_TOPDIR}/kata-containers-initrd.img + + if [ -n "${GENERATE_IMAGE}" ]; then + mv -Z ${GENERATED_IMAGE} ${image_dest_path} + ln -sf ${image_dest_path} ${image_dest_link} + else + rm -f ${image_dest_link} + fi +} + + +main() +{ + parse_args $* + + if [ -z "${TEST_MODE}" ]; then + [ "$(id -u)" -eq 0 ] || die "$0: must be run as root" + fi + + find_host_kernel_path + + cd "${OSBUILDER_DIR}" + + # Generate the rootfs using dracut + generate_rootfs + + if [ -n "${TEST_MODE}" ]; then + echo "+ Exiting TEST_MODE successfully" + return + fi + + # Build the initrd + echo "+ Calling osbuilder initrd_builder.sh" + ./initrd-builder/initrd_builder.sh -o ${GENERATED_INITRD} ${DRACUT_ROOTFS} + + if [ -n "${GENERATE_IMAGE}" ]; then + # Build the FS image + local nsdax_bin="/usr/libexec/kata-containers/osbuilder/nsdax" + echo "+ Calling osbuilder image_builder.sh" + NSDAX_BIN="${nsdax_bin}" \ + ./image-builder/image_builder.sh \ + -o ${GENERATED_IMAGE} ${DRACUT_ROOTFS} + fi + + move_images +} + + +main $* diff --git a/kata-osbuilder.spec b/kata-osbuilder.spec index da17a8e..b175b09 100644 --- a/kata-osbuilder.spec +++ b/kata-osbuilder.spec @@ -26,7 +26,7 @@ ExcludeArch: %{arm} ExcludeArch: %{ix86} Source0: %{git0}/archive/%{version}%{?rcstr}/osbuilder-%{version}%{?rcstr}.tar.gz -Source2: fedora-kata-osbuilder.sh +Source2: kata-osbuilder.sh Source3: kata-osbuilder-generate.service %if 0%{?fedora} Source5: 15-dracut-fedora.conf @@ -96,7 +96,7 @@ for kernelpath in /lib/modules/*/vmlinu*; do KVERSION="$(echo $kernelpath | cut -d "/" -f 4)" break done -TEST_MODE=1 %{buildroot}%{kataosbuilderdir}/fedora-kata-osbuilder.sh \ +TEST_MODE=1 %{buildroot}%{kataosbuilderdir}/kata-osbuilder.sh \ -o %{buildroot}%{kataosbuilderdir} \ -k "$KVERSION" @@ -112,7 +112,7 @@ if test -w %{katalocalstatecachedir}; then TMPOUT="$(mktemp -t kata-rpm-post-XXXXXX.log)" echo "Creating kata appliance initrd..." - bash %{kataosbuilderdir}/fedora-kata-osbuilder.sh > ${TMPOUT} 2>&1 + bash %{kataosbuilderdir}/kata-osbuilder.sh > ${TMPOUT} 2>&1 if test "$?" != "0" ; then echo "Building failed. Here is the log details:" cat ${TMPOUT}