#!/bin/sh
|
|
#
|
|
# This is a contributed script to create a bootable ISO image from your
|
|
# rescue target build.
|
|
#
|
|
# It uses isolinux (syslinux) to create a non-emu bootable image.
|
|
# It uses memdisk (syslinux) to add grub to the list of choices.
|
|
#
|
|
# (C) 2004 Tobias Hintze
|
|
#
|
|
|
|
[ -z "$GRUBSRC" ] && GRUBSRC="/usr/share/grub"
|
|
[ -z "$SYSLINUXSRC" ] && SYSLINUXSRC="/usr/lib/syslinux"
|
|
|
|
set -e
|
|
|
|
usage() {
|
|
echo "Usage:"
|
|
echo " $0 ISODIR"
|
|
echo " creates the iso image from iso-dir"
|
|
echo
|
|
echo " $0 -c KERNEL INITRD[.gz] SYSTEM [OVERLAY]"
|
|
echo " creates iso-dir"
|
|
echo
|
|
echo " $0 -C KERNEL INITRD[.gz] SYSTEM [OVERLAY]"
|
|
echo " creates the iso image from kernel, initrd and system tarball"
|
|
echo ""
|
|
echo "Example usage (most commonly used):"
|
|
echo "(You get an iso image with default configuration and given files.)"
|
|
echo ""
|
|
echo "$0 -C vmlinuz initrd.img system.tar.bz2"
|
|
echo ""
|
|
echo "Using the -C option is like using the -c option except that after creating"
|
|
echo "the temporary iso-dir the script calls itself to create the image from that"
|
|
echo "dir (first usage option). The iso-dir is deleted on success afterwards."
|
|
echo ""
|
|
echo "* initrd.img and system.tar.bz2 are generated during the rescue-target build."
|
|
echo "* kernel must have support for devfs"
|
|
echo "* kernel must have support for initrd"
|
|
echo "* kernel must have support for iso9660"
|
|
echo ""
|
|
exit 1
|
|
}
|
|
|
|
die() {
|
|
echo "$1"
|
|
exit 2
|
|
}
|
|
|
|
check_reqs() {
|
|
[ -z "`type -p grub`" ] && \
|
|
die "You need grub to create an image with this script."
|
|
[ -z "`type -p e2fsimage`" ] && \
|
|
die "You need e2fsimage to create an image with this script."
|
|
[ -z "`type -p mkisofs`" ] && \
|
|
die "You need mkisofs to create an image with this script."
|
|
[ -d "$GRUBSRC" ] || die "No grub stages at $GRUBSRC. I need them!"
|
|
[ -d "$SYSLINUXSRC" ] || die "No syslinux at $SYSLINUXSRC. I need it!"
|
|
echo "requirements ok."
|
|
}
|
|
|
|
|
|
test -z "$1" && usage
|
|
case "$1" in
|
|
-c|-C)
|
|
CREATEDIR=1
|
|
[[ "$1" == "-C" ]] && CREATEDIR=2
|
|
[[ $# == 4 || $# == 5 ]] || usage
|
|
[ -r $2 ] || exec echo "failed to read kernel image $2"
|
|
[ -r $3 ] || exec echo "failed to read initrd image $3"
|
|
[ -r $4 ] || exec echo "failed to read system $4"
|
|
KERNEL=$2
|
|
INITRD=$3
|
|
SYSTEM=$4
|
|
|
|
[[ $# == 5 ]] && {
|
|
[ -r $5 ] || exec echo "failed to read overlay $5"
|
|
OVERLAY=$5
|
|
}
|
|
;;
|
|
*)
|
|
[[ $# == 1 ]] || usage
|
|
[ -r $1 ] || exec echo "failed to read iso-dir $1"
|
|
esac
|
|
|
|
[[ "$CREATEDIR" != 1 ]] && [ -e iso ] && die "file \"iso\" is in my way."
|
|
|
|
check_reqs
|
|
|
|
GRUBSRC="$( find $GRUBSRC -type d -mindepth 1 -maxdepth 1 | head -n 1 )"
|
|
[ -r $GRUBSRC/stage1 -a -r $GRUBSRC/stage2 ] || die "grub stage1 or stage2 missing."
|
|
|
|
[ -r $SYSLINUXSRC/isolinux.bin -a \
|
|
-r $SYSLINUXSRC/memdisk ] || die "isolinux.bin or memdisk missing."
|
|
|
|
if [ -n "$CREATEDIR" ]
|
|
then
|
|
TMPDIR=/var/tmp/rescuecd.$$
|
|
mkdir $TMPDIR || die "failed to create tmp-dir \"$TMPDIR\"."
|
|
mkdir -pv $TMPDIR/iso/isolinux $TMPDIR/iso/rescue $TMPDIR/fd
|
|
|
|
|
|
#
|
|
# prepare the directory
|
|
#
|
|
|
|
# syslinux
|
|
cp -v $SYSLINUXSRC/isolinux.bin $SYSLINUXSRC/memdisk $TMPDIR/iso/isolinux/
|
|
|
|
# kernel
|
|
cp -v $KERNEL $TMPDIR/iso/isolinux/krescue
|
|
|
|
# initrd
|
|
if [ "`file -bi $INITRD`" == "application/x-gzip" ] ; then
|
|
cp -v $INITRD $TMPDIR/iso/isolinux/rdrescue.gz
|
|
else
|
|
echo "compressing initrd image..."
|
|
cat $INITRD | gzip -c > $TMPDIR/iso/isolinux/rdrescue.gz
|
|
fi
|
|
|
|
cp -v $SYSTEM $TMPDIR/iso/rescue/system.tb2
|
|
[ -n "$OVERLAY" ] && cp -v $OVERLAY $TMPDIR/iso/rescue/overlay.tb2
|
|
|
|
#
|
|
# create grub fd
|
|
#
|
|
echo "creating bootable grub fd image"
|
|
mkdir -v $TMPDIR/fd/grub
|
|
cp -v $GRUBSRC/*stage* $TMPDIR/fd/grub/
|
|
e2fsimage -f $TMPDIR/iso/isolinux/fdgrub.img -d $TMPDIR/fd -v -s 360
|
|
rm -f $TMPDIR/device.map
|
|
echo "(fd0) $TMPDIR/iso/isolinux/fdgrub.img" > $TMPDIR/device.map
|
|
[[ "`id -u`" == "0" ]] && {
|
|
echo "i don't want to run grub as root. destructive potential too high."
|
|
echo "if you want to do it on your own issue the following command: "
|
|
echo
|
|
echo "grub --device-map=$TMPDIR/device.map --batch <<EOF"
|
|
echo "root (fd0)"
|
|
echo "setup (fd0)"
|
|
echo "EOF"
|
|
echo
|
|
die "Cowardly refusing to endanger your MBR and disks."
|
|
}
|
|
grub --device-map=$TMPDIR/device.map --batch <<EOF
|
|
root (fd0)
|
|
setup (fd0)
|
|
EOF
|
|
echo ""
|
|
echo "finished creating fdgrub.img"
|
|
|
|
# create isolinux.cfg
|
|
cat > $TMPDIR/iso/isolinux/isolinux.cfg << EOF
|
|
DEFAULT rescue
|
|
TIMEOUT 300
|
|
PROMPT 1
|
|
|
|
DISPLAY display.txt
|
|
|
|
LABEL rescue
|
|
KERNEL krescue
|
|
APPEND initrd=rdrescue.gz root=/dev/ram boot=iso9660:/dev/cdroms/cdrom0 system=/mnt_boot/rescue/system.tb2 overlay=/mnt_boot/rescue/overlay.tb2 panic=60
|
|
|
|
LABEL grub
|
|
KERNEL memdisk
|
|
APPEND initrd=fdgrub.img
|
|
|
|
EOF
|
|
cat > $TMPDIR/iso/isolinux/display.txt << "EOF"
|
|
|
|
____ ___ ___ _ __ _
|
|
| _ \ / _ \ / __| |/ / | | _ _ __ _ _ _ _
|
|
| . _/| | | | | | '_/ | | |_| '_ \| | | | \/ |
|
|
| |\ \| |_| | |__| . \ | |__| | | | | `_' |> <
|
|
|_| \_\ ___/ \___|_|\_\ |____|_|_| |_|\___/|_/\_|
|
|
[============> http://www.rocklinux.org/ <============]
|
|
|
|
|
|
Actions:
|
|
--------
|
|
|
|
<ENTER> Boot into rescue system (ramdisk)
|
|
grub <ENTER> Run grub from emulated floppy image
|
|
rescue options <ENTER> Boot into rescue system with given options
|
|
|
|
|
|
"EOF"
|
|
EOF
|
|
|
|
if [ "$CREATEDIR" == "1" ] ; then
|
|
echo "ready. you might want to run:"
|
|
echo "$0 $TMPDIR/iso"
|
|
elif [ "$CREATEDIR" == "2" ] ; then
|
|
echo "running $0 $TMPDIR/iso"
|
|
$0 $TMPDIR/iso
|
|
rm -rfv $TMPDIR
|
|
fi
|
|
exit 0
|
|
fi
|
|
|
|
test -z "$1" && usage
|
|
ISODIR=$1
|
|
|
|
test -d $ISODIR || die "ISODIR \"$ISODIR\" not a directory."
|
|
|
|
create_iso_image() {
|
|
test -e iso && die "file \"iso\" is in my way."
|
|
mkisofs -b isolinux/isolinux.bin -c isolinux/boot.cat \
|
|
-no-emul-boot -boot-load-size 4 \
|
|
-boot-info-table -o iso $ISODIR
|
|
}
|
|
|
|
create_iso_image
|