# MaKe a Bootable IMAGE --- 1.44, 2.88 and El Torito no-emulation mode
# C) 2001,2002,2003 Thierry Laronde <tlaronde@polynum.org>
# C) 2001,2002,2003 Robert Millan <robertmh@gnu.org>
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2, or (at your option)
# any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, you can either send email to this
# program's maintainer or write to: The Free Software Foundation,
# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
# $Id: mkbimage,v 1.19 2004/07/21 14:43:04 robertmh Exp $
# Global variables
dir=
fs= #file system type
# You can set GRUB_PATH if you need to use a specially located GRUB.
# This MUST end by a '/'!
#----------------------------DON'T CHANGE: INTERNALS
block_size=512
# Name by which this script was invoked.
version_number='$Revision: 1.19 $'
usage="
Usage: $program [-hVF] [-t TYPE] [-d DIRECTORY] [-s FS_TYPE] -f TAR_FILE
Make a Bootable IMAGE using GRUB as a bootloader
Options:
Actions:
-d DIRECTORY [default CWD]
Directory where the boot.image and the partition subdirectories
-f TAR_FILE
Name of the tar file containing the filesystem to install. Can
be a pure tar file [.tar] or a compressed tar file
-s FS_TYPE
Type of the file system to create on the virtual disk. Choices
are:
ext2 on GNU [default is ext2]
-t TYPE
Type of the image to create. Choices are '1.20', '1.44', '1.60',
'1.68', '1.74', '2.88' or 'hd' [default is hd]
-F
Force to set the set_dpt flag (unnecessary 99% of the time! Be
careful!
Informations:
-D
turn Debugging on [xtrace]
-h|--help
display this Help and exit
-V|--version
display Version information and exit
Copyright (c) 2001,2002,2003 Thierry Laronde <tlaronde@polynum.org>.
Copyright (c) 2001,2002 Robert Millan <zeratul2@wanadoo.es>.
GPLed."
version="mkbimage $version_number
Written by Thierry Laronde and Robert Millan.
Copyright (c) 2001,2002,2003 Thierry Laronde <tlaronde@polynum.org>.
Copyright (c) 2001,2002,2003 Robert Millan <zeratul2@wanadoo.es>.
This is free software under the GPL version 2 or later; see the source for
copying conditions. There is NO warranty, not even for MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE."
# Functions
error ()
{
case $1 in
unknown_fs) if [ $uname = Linux ];
then echo "The GNU supported fs is ext2!";
fi;;
esac
exit 1
}
# create a filesystem of type $fs in $image with offset $offset
{
esac
else
fi
}
# copy ${image}1/* to ${image}:/, assuming ${image} contains a filesystem
# of type $fs in offset $offset
mkbimage_cp ()
{
esac
ext2)
vfat)
*)
esac
done
done
else
fi
}
#**********************************************************************
# MAIN PROGRAM *
#**********************************************************************
#---------------------- Getting the options
while [ $# -gt 0 ]; do
case "$1" in
-d) shift;
dir="$1";
-f) shift;
tarfile="$1";
-s) shift;
fs="$1";;
-t) shift;
image_type="$1";;
-F) geo_option="-F";;
-D) debug="-v";
set -x;;
esac
shift
done
#---------------------- Sanity checks
if [ ! "$image_type" ]; then
fi
# Carlo Contavalli reported that I [TL] have forgotten to specify the
# partition ID for sfdisk to correctly fill the partition table (ext2 is the
# default on Linux, so this worked in this case...). This is fixed below.
# ufs) if [ $uname = Linux ];
# then error unknown_fs;
# fi;;
then error unknown_fs;
else
part_id="81";
fi;;
then error unknown_fs;
else
part_id="1";
fi;;
*) error unknown_fs;;
esac
# What type of tar file has been given ?
*) error unknown_format;;
esac
#---------------------- Initializations
# First, find the size of the tar file in block_size.
# Increase in order to be sure that with a fs there will be enough
# room (trying 110%)
case "$image_type" in
sectors=63;
# Create the minimum number of cylinders. At the moment, we leave
# some space by rounding everything up by adding 1 cylinder, plus
# another one for MBR + reserved track.
heads=2;
sectors=15;
cylinders=80;;
heads=2;
sectors=18;
cylinders=80;;
heads=2;
sectors=20;
cylinders=80;
geo_option="-F";;
heads=2;
sectors=21;
cylinders=80;;
heads=2;
sectors=21;
cylinders=83;;
heads=2;
sectors=36;
cylinders=80;;
esac
type_option="-t $image_type"
# We start by creating a virtual disk which size is the number of
# cylinders of $cyl_size mandatory to put the files stocked in the $tarfile
# Create the empty virtual disk
# We then format the virtual disk
# NOTE: the El Torito specification wants only one partition. So we
# create the first, and the remaining 3 entries are empty.
if [ "$image_type" = "hd" ]; then
,,$part_id,*,0,1,1
EOT
else
offset="0"
fi
# It's time now to create the filesystem on the first partition.
# then untar the files
# copy the untarred files into the filesystem image
#We verify that the stage2 exists and we search the name
stage2_os_name=`find ${image}1 -name stage2 -type f`
#------------------------- GRUB stuff
if [ "$image_type" = "hd" ]; then
device='(hd0)'
root='(hd0,0)'
else
device='(fd0)'
root='(fd0)'
fi
cat<<EOT >$device_map
$device ${image}
EOT
geometry $device $cylinders $heads $sectors
root $root
setup $device
geometry $geo_option -w $type_option $device $cylinders $heads $sectors
EOT
echo "-------------------WHAT'S NEXT?-------------------------------------"
echo
cat <<EOF
If you have created an image aimed to a floppy, then something like:
dd if=<type>.image of=/dev/fd0[u<size>] bs=512
will be more than enough... if you have formated the floppy correctly
using \`superformat' to be found in \`fdutils' package.
For El Torito floppy emulation :
mkisofs -b <image> -c boot.catalog -o raw.iso <dir>
And for El Torito Hard Disk emulation:
mkisofs -b <image> -hard-disk-boot -c boot.catalog -o raw.iso <dir>
Enjoy!
EOF
exit 0