From 6a07f96f2f97eaf4094cdbddc8c26405f04b38c0 Mon Sep 17 00:00:00 2001 From: Dmitry Tantsur Date: Thu, 26 Sep 2019 14:37:28 +0200 Subject: [PATCH] Recover iso-image-create script This script was removed from IPA with CoreOS support, but it seems to be quite generic. Recover and document it. Change-Id: I014ada4509e60541bf12ef2bce9915afd8858d54 --- doc/source/admin/dib.rst | 14 ++++ tools/iso-image-create | 168 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+) create mode 100755 tools/iso-image-create diff --git a/doc/source/admin/dib.rst b/doc/source/admin/dib.rst index c1ef962..18007e6 100644 --- a/doc/source/admin/dib.rst +++ b/doc/source/admin/dib.rst @@ -68,6 +68,20 @@ To use a specific branch of ironic-python-agent, use: export DIB_REPOREF_ironic_python_agent=origin/stable/queens +ISO Images +~~~~~~~~~~ + +Additionally, the IPA ramdisk can be packaged inside of an ISO for use with +some virtual media drivers. Use the ``iso-image-create`` utility, passing it +the initrd and the kernel, for example: + +.. code-block:: console + + ./tools/iso-image-create -o /path/to/output.iso -i /path/to/ipa.initrd -k /path/to/ipa.kernel + +This is a generic tool that can be used to combine any initrd and kernel into +a suitable ISO for booting, and so should work against any IPA ramdisk. + Advanced options ---------------- diff --git a/tools/iso-image-create b/tools/iso-image-create new file mode 100755 index 0000000..53b5246 --- /dev/null +++ b/tools/iso-image-create @@ -0,0 +1,168 @@ +#!/bin/bash +# +# Copyright 2012 Hewlett-Packard Development Company, L.P. +# All Rights Reserved. +# +# Licensed under the Apache License, Version 2.0 (the "License"); you may +# not use this file except in compliance with the License. You may obtain +# a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT +# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the +# License for the specific language governing permissions and limitations +# under the License. +# +# This script generates iso image from the given kernel and ramdisk + +SCRIPTNAME=`basename $0` +TMP_BUILD_DIR="/tmp/$SCRIPTNAME.$$" +QEMU_IMG="/usr/bin/qemu-img" +MKISOFS="/usr/bin/mkisofs" + + +function show_options() { + + echo "Usage: ${SCRIPTNAME} [options]" + echo + echo "Options:" + + echo " -o output filename " + echo " -i initrd " + echo " -k kernel " +} + +function cleanup() { + + v_print "Cleaning up.." + rm -rf $TMP_BUILD_DIR +} + +function err_print() { + echo "ERROR: $@" 1>&2; +} + +function v_print() { + + echo "$*" +} + + +# Parse command line options +ARGS=`getopt -o "o:i:k:" -l "output,initrd,kernel:" \ + -n "$SCRIPTNAME" -- "$@"` +if [ $? -ne 0 ]; +then + exit 1 +fi + +eval set -- "$ARGS" + +while true ; do + case "$1" in + -o) OUTPUT_FILENAME=$2; shift 2 ;; + -i) INITRD=$2; shift 2 ;; + -k) KERNEL=$2; shift 2 ;; + # *) show_options ; exit 1 ;; + --) shift; break ;; + esac +done + +# Verify whether kernel, initrd, and the image file is present +if [ -z "$OUTPUT_FILENAME" ]; then + err_print "Output filename not provided." + show_options + exit 1 +fi + +if [ -z "$INITRD" ]; then + err_print "Initrd not provided." + show_options + exit 1 +fi + +if [ -z "$KERNEL" ]; then + err_print "Kernel not provided." + show_options + exit 1 +fi + +# Create a temporary build directory for holiding the contents of iso +TMP_IMAGE_DIR="$TMP_BUILD_DIR/image" +v_print "Creating temporary directory $TMP_IMAGE_DIR" +mkdir -p "$TMP_IMAGE_DIR" + +# Copy isolinux bin to the isolinux directory +mkdir -p "$TMP_IMAGE_DIR/isolinux" +v_print "Copying isolinux.bin" +if [ -f /usr/share/syslinux/isolinux.bin ] +then + cp /usr/share/syslinux/isolinux.bin "$TMP_IMAGE_DIR/isolinux" + +elif [ -f /usr/lib/syslinux/isolinux.bin ] +then + cp /usr/lib/syslinux/isolinux.bin "$TMP_IMAGE_DIR/isolinux" + +elif [ -f /usr/lib/ISOLINUX/isolinux.bin ] +then + cp /usr/lib/ISOLINUX/isolinux.bin "$TMP_IMAGE_DIR/isolinux" + +else + err_print "Could not find isolinux.bin. Install syslinux or isolinux?" + cleanup + exit 1 +fi + +# Copy ldlinux.c32 to the isolinux directory +v_print "Copying ldlinux.c32" +if [ -f /usr/share/syslinux/ldlinux.c32 ] +then + cp /usr/share/syslinux/ldlinux.c32 "$TMP_IMAGE_DIR/isolinux" +elif [ -f /usr/lib/syslinux/modules/bios/ldlinux.c32 ] +then + cp /usr/lib/syslinux/modules/bios/ldlinux.c32 "$TMP_IMAGE_DIR/isolinux" +fi + +# Copy initrd, kernel +v_print "Copying kernel to $TMP_IMAGE_DIR/vmlinuz" +cp $KERNEL "$TMP_IMAGE_DIR/vmlinuz" +if [ $? -ne 0 ]; then + err_print "Failed to copy $KERNEL to $TMP_IMAGE_DIR" + cleanup + exit 1 +fi + +v_print "Copying initrd to $TMP_IMAGE_DIR/initrd" +cp $INITRD "$TMP_IMAGE_DIR/initrd" +if [ $? -ne 0 ]; then + err_print "Failed to copy $INITRD to $TMP_IMAGE_DIR" + cleanup + exit 1 +fi + +# Generate isolinux.cfg for default booting +v_print "Generating isolinux.cfg" +echo "\ +DEFAULT install +LABEL install + menu label "Install image" + kernel /vmlinuz + append initrd=/initrd boot_method=vmedia -- +TIMEOUT 5 +PROMPT 0 " > "$TMP_IMAGE_DIR/isolinux/isolinux.cfg" + +# Convert relative path output filename to absolute path +echo $OUTPUT_FILENAME | grep -q '^/' +if [ $? -ne 0 ]; then + OUTPUT_FILENAME="$PWD/$OUTPUT_FILENAME" +fi + +# Create the ISO +v_print "Generating the ISO" +cd $TMP_IMAGE_DIR && $MKISOFS -r -V "INSTALL_IMAGE" -cache-inodes -J -l -b isolinux/isolinux.bin -no-emul-boot -boot-load-size 4 -boot-info-table -o $OUTPUT_FILENAME . + +# Cleanup +cleanup +