xref: /onnv-gate/usr/src/grub/grub-0.97/util/mkbimage (revision 8044:b3af80bbf173)
1*8044SWilliam.Kucharski@Sun.COM#!/bin/sh
2*8044SWilliam.Kucharski@Sun.COM# MaKe a Bootable IMAGE --- 1.44, 2.88 and El Torito no-emulation mode
3*8044SWilliam.Kucharski@Sun.COM# C) 2001,2002,2003 Thierry Laronde <tlaronde@polynum.org>
4*8044SWilliam.Kucharski@Sun.COM# C) 2001,2002,2003 Robert Millan <robertmh@gnu.org>
5*8044SWilliam.Kucharski@Sun.COM
6*8044SWilliam.Kucharski@Sun.COM
7*8044SWilliam.Kucharski@Sun.COM# This program is free software; you can redistribute it and/or modify
8*8044SWilliam.Kucharski@Sun.COM# it under the terms of the GNU General Public License as published by
9*8044SWilliam.Kucharski@Sun.COM# the Free Software Foundation; either version 2, or (at your option)
10*8044SWilliam.Kucharski@Sun.COM# any later version.
11*8044SWilliam.Kucharski@Sun.COM#
12*8044SWilliam.Kucharski@Sun.COM# This program is distributed in the hope that it will be useful,
13*8044SWilliam.Kucharski@Sun.COM# but WITHOUT ANY WARRANTY; without even the implied warranty of
14*8044SWilliam.Kucharski@Sun.COM# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15*8044SWilliam.Kucharski@Sun.COM# GNU General Public License for more details.
16*8044SWilliam.Kucharski@Sun.COM#
17*8044SWilliam.Kucharski@Sun.COM# You should have received a copy of the GNU General Public License
18*8044SWilliam.Kucharski@Sun.COM# along with this program; if not, you can either send email to this
19*8044SWilliam.Kucharski@Sun.COM# program's maintainer or write to: The Free Software Foundation,
20*8044SWilliam.Kucharski@Sun.COM# Inc.; 59 Temple Place, Suite 330; Boston, MA 02111-1307, USA.
21*8044SWilliam.Kucharski@Sun.COM
22*8044SWilliam.Kucharski@Sun.COM# $Id: mkbimage,v 1.19 2004/07/21 14:43:04 robertmh Exp $
23*8044SWilliam.Kucharski@Sun.COM
24*8044SWilliam.Kucharski@Sun.COM# Global variables
25*8044SWilliam.Kucharski@Sun.COMtarfile=
26*8044SWilliam.Kucharski@Sun.COMdir=
27*8044SWilliam.Kucharski@Sun.COMfs= #file system type
28*8044SWilliam.Kucharski@Sun.COMdecompress=
29*8044SWilliam.Kucharski@Sun.COMimage_type=
30*8044SWilliam.Kucharski@Sun.COMuname=`uname -s`
31*8044SWilliam.Kucharski@Sun.COMPATH=/sbin:$PATH
32*8044SWilliam.Kucharski@Sun.COM
33*8044SWilliam.Kucharski@Sun.COM# You can set GRUB_PATH  if you need to use a specially located GRUB.
34*8044SWilliam.Kucharski@Sun.COM# This MUST end by a '/'!
35*8044SWilliam.Kucharski@Sun.COM
36*8044SWilliam.Kucharski@Sun.COM
37*8044SWilliam.Kucharski@Sun.COM#----------------------------DON'T CHANGE: INTERNALS
38*8044SWilliam.Kucharski@Sun.COM
39*8044SWilliam.Kucharski@Sun.COMblock_size=512
40*8044SWilliam.Kucharski@Sun.COMcylinders=
41*8044SWilliam.Kucharski@Sun.COMheads=
42*8044SWilliam.Kucharski@Sun.COMsectors=
43*8044SWilliam.Kucharski@Sun.COMcyl_size=
44*8044SWilliam.Kucharski@Sun.COMtype_option=
45*8044SWilliam.Kucharski@Sun.COMgeo_option=
46*8044SWilliam.Kucharski@Sun.COMimage=
47*8044SWilliam.Kucharski@Sun.COMbk_120=$((2 * 15 * 80))
48*8044SWilliam.Kucharski@Sun.COMbk_144=$((2 * 18 * 80))
49*8044SWilliam.Kucharski@Sun.COMbk_288=$((2 * 36 * 80))
50*8044SWilliam.Kucharski@Sun.COMbk_160=$((2 * 20 * 80))
51*8044SWilliam.Kucharski@Sun.COMbk_168=$((2 * 21 * 80))
52*8044SWilliam.Kucharski@Sun.COMbk_174=$((2 * 21 * 83))
53*8044SWilliam.Kucharski@Sun.COMlo_options=
54*8044SWilliam.Kucharski@Sun.COMdevice_map=
55*8044SWilliam.Kucharski@Sun.COMmkfs_options=
56*8044SWilliam.Kucharski@Sun.COMdebug=
57*8044SWilliam.Kucharski@Sun.COMstage2_os_name=
58*8044SWilliam.Kucharski@Sun.COM
59*8044SWilliam.Kucharski@Sun.COM# Name by which this script was invoked.
60*8044SWilliam.Kucharski@Sun.COMprogram=`echo "$0" | sed -e 's/[^\/]*\///g'`
61*8044SWilliam.Kucharski@Sun.COMversion_number='$Revision: 1.19 $'
62*8044SWilliam.Kucharski@Sun.COM
63*8044SWilliam.Kucharski@Sun.COMusage="
64*8044SWilliam.Kucharski@Sun.COMUsage: $program [-hVF] [-t TYPE] [-d DIRECTORY] [-s FS_TYPE] -f TAR_FILE
65*8044SWilliam.Kucharski@Sun.COMMake a Bootable IMAGE using GRUB as a bootloader
66*8044SWilliam.Kucharski@Sun.COM
67*8044SWilliam.Kucharski@Sun.COMOptions:
68*8044SWilliam.Kucharski@Sun.COM Actions:
69*8044SWilliam.Kucharski@Sun.COM -d DIRECTORY [default CWD]
70*8044SWilliam.Kucharski@Sun.COM	    Directory where the boot.image and the partition subdirectories
71*8044SWilliam.Kucharski@Sun.COM	    are/will be created
72*8044SWilliam.Kucharski@Sun.COM -f TAR_FILE
73*8044SWilliam.Kucharski@Sun.COM	    Name of the tar file containing the filesystem to install. Can
74*8044SWilliam.Kucharski@Sun.COM	    be a pure tar file [.tar] or a compressed tar file
75*8044SWilliam.Kucharski@Sun.COM	    [.tar.gz|.tar.bz2]
76*8044SWilliam.Kucharski@Sun.COM -s FS_TYPE
77*8044SWilliam.Kucharski@Sun.COM	    Type of the file system to create on the virtual disk. Choices
78*8044SWilliam.Kucharski@Sun.COM	    are:
79*8044SWilliam.Kucharski@Sun.COM		ext2 on GNU [default is ext2]
80*8044SWilliam.Kucharski@Sun.COM		ext2, minix or msdos on GNU/Linux [default is ext2]
81*8044SWilliam.Kucharski@Sun.COM
82*8044SWilliam.Kucharski@Sun.COM -t TYPE
83*8044SWilliam.Kucharski@Sun.COM	    Type of the image to create. Choices are '1.20', '1.44', '1.60',
84*8044SWilliam.Kucharski@Sun.COM	    '1.68', '1.74', '2.88' or 'hd' [default is hd]
85*8044SWilliam.Kucharski@Sun.COM -F
86*8044SWilliam.Kucharski@Sun.COM	    Force to set the set_dpt flag (unnecessary 99% of the time! Be
87*8044SWilliam.Kucharski@Sun.COM	    careful!
88*8044SWilliam.Kucharski@Sun.COM Informations:
89*8044SWilliam.Kucharski@Sun.COM -D
90*8044SWilliam.Kucharski@Sun.COM	    turn Debugging on [xtrace]
91*8044SWilliam.Kucharski@Sun.COM -h|--help
92*8044SWilliam.Kucharski@Sun.COM	    display this Help and exit
93*8044SWilliam.Kucharski@Sun.COM -V|--version
94*8044SWilliam.Kucharski@Sun.COM	    display Version information and exit
95*8044SWilliam.Kucharski@Sun.COM
96*8044SWilliam.Kucharski@Sun.COMCopyright (c) 2001,2002,2003 Thierry Laronde <tlaronde@polynum.org>.
97*8044SWilliam.Kucharski@Sun.COMCopyright (c) 2001,2002 Robert Millan <zeratul2@wanadoo.es>.
98*8044SWilliam.Kucharski@Sun.COMGPLed."
99*8044SWilliam.Kucharski@Sun.COM
100*8044SWilliam.Kucharski@Sun.COMversion="mkbimage $version_number
101*8044SWilliam.Kucharski@Sun.COM
102*8044SWilliam.Kucharski@Sun.COMWritten by Thierry Laronde and Robert Millan.
103*8044SWilliam.Kucharski@Sun.COM
104*8044SWilliam.Kucharski@Sun.COMCopyright (c) 2001,2002,2003 Thierry Laronde <tlaronde@polynum.org>.
105*8044SWilliam.Kucharski@Sun.COMCopyright (c) 2001,2002,2003 Robert Millan <zeratul2@wanadoo.es>.
106*8044SWilliam.Kucharski@Sun.COM
107*8044SWilliam.Kucharski@Sun.COMThis is free software under the GPL version 2 or later; see the source for
108*8044SWilliam.Kucharski@Sun.COMcopying conditions.  There is NO warranty, not even for MERCHANTABILITY or
109*8044SWilliam.Kucharski@Sun.COMFITNESS FOR A PARTICULAR PURPOSE."
110*8044SWilliam.Kucharski@Sun.COM
111*8044SWilliam.Kucharski@Sun.COM# Functions
112*8044SWilliam.Kucharski@Sun.COM
113*8044SWilliam.Kucharski@Sun.COMerror ()
114*8044SWilliam.Kucharski@Sun.COM{
115*8044SWilliam.Kucharski@Sun.COM	case $1 in
116*8044SWilliam.Kucharski@Sun.COM	bug) echo "This is a bug!";
117*8044SWilliam.Kucharski@Sun.COM		echo "$usage";;
118*8044SWilliam.Kucharski@Sun.COM	option) echo "Unknow option"; echo "$usage";;
119*8044SWilliam.Kucharski@Sun.COM	missing_argument) echo "You must give an argument to the option!";
120*8044SWilliam.Kucharski@Sun.COM		echo "$usage";;
121*8044SWilliam.Kucharski@Sun.COM	missing_option) echo "You must indicate at least one option!";
122*8044SWilliam.Kucharski@Sun.COM		echo "$usage";;
123*8044SWilliam.Kucharski@Sun.COM	must_be_root) echo "You must be root! (or install e2tools/mtools)";;
124*8044SWilliam.Kucharski@Sun.COM	unknown_fs)	if [ $uname = Linux ];
125*8044SWilliam.Kucharski@Sun.COM				then echo "The GNU/Linux supported fs are: ext2, minix or msdos!";
126*8044SWilliam.Kucharski@Sun.COM			elif [ $uname = GNU ];
127*8044SWilliam.Kucharski@Sun.COM				then echo "The GNU supported fs is ext2!";
128*8044SWilliam.Kucharski@Sun.COM			fi;;
129*8044SWilliam.Kucharski@Sun.COM	unknown_format) echo "The tar file must be .tar|.tar.gz|.tar.bz2!";;
130*8044SWilliam.Kucharski@Sun.COM	wont_fit) echo "The files won't fit on the selected type of media!";;
131*8044SWilliam.Kucharski@Sun.COM	wrong_directory) echo "Directory inexistant or not given!";
132*8044SWilliam.Kucharski@Sun.COM		echo "$usage";;
133*8044SWilliam.Kucharski@Sun.COM	wrong_file) echo "File inexistant or empty!";
134*8044SWilliam.Kucharski@Sun.COM		echo "$usage";;
135*8044SWilliam.Kucharski@Sun.COM	wrong_type) echo "The type specified is not a valid one!";
136*8044SWilliam.Kucharski@Sun.COM		echo "$usage";;
137*8044SWilliam.Kucharski@Sun.COM	esac
138*8044SWilliam.Kucharski@Sun.COM	exit 1
139*8044SWilliam.Kucharski@Sun.COM}
140*8044SWilliam.Kucharski@Sun.COM
141*8044SWilliam.Kucharski@Sun.COM# create a filesystem of type $fs in $image with offset $offset
142*8044SWilliam.Kucharski@Sun.COMmkbimage_mkfs ()
143*8044SWilliam.Kucharski@Sun.COM{
144*8044SWilliam.Kucharski@Sun.COM  case $offset in
145*8044SWilliam.Kucharski@Sun.COM    0)  lo_options="";;
146*8044SWilliam.Kucharski@Sun.COM    *) lo_options="-o $offset";;
147*8044SWilliam.Kucharski@Sun.COM  esac
148*8044SWilliam.Kucharski@Sun.COM
149*8044SWilliam.Kucharski@Sun.COM  if [ "$offset" = "0" ] ; then
150*8044SWilliam.Kucharski@Sun.COM    mkfs.$fs -F $image
151*8044SWilliam.Kucharski@Sun.COM  elif [ `id -u` = "0" ] ; then
152*8044SWilliam.Kucharski@Sun.COM    losetup $lo_options /dev/loop1 $image
153*8044SWilliam.Kucharski@Sun.COM    mkfs.$fs /dev/loop1
154*8044SWilliam.Kucharski@Sun.COM    losetup -d /dev/loop1
155*8044SWilliam.Kucharski@Sun.COM  else
156*8044SWilliam.Kucharski@Sun.COM    error must_be_root
157*8044SWilliam.Kucharski@Sun.COM  fi
158*8044SWilliam.Kucharski@Sun.COM}
159*8044SWilliam.Kucharski@Sun.COM
160*8044SWilliam.Kucharski@Sun.COM# copy ${image}1/* to ${image}:/, assuming ${image} contains a filesystem
161*8044SWilliam.Kucharski@Sun.COM# of type $fs in offset $offset
162*8044SWilliam.Kucharski@Sun.COMmkbimage_cp ()
163*8044SWilliam.Kucharski@Sun.COM{
164*8044SWilliam.Kucharski@Sun.COM  case $offset in
165*8044SWilliam.Kucharski@Sun.COM    0)  lo_options="";;
166*8044SWilliam.Kucharski@Sun.COM    *)  lo_options="-o $offset";;
167*8044SWilliam.Kucharski@Sun.COM  esac
168*8044SWilliam.Kucharski@Sun.COM  case $fs in
169*8044SWilliam.Kucharski@Sun.COM    ext2)
170*8044SWilliam.Kucharski@Sun.COM      cp="e2cp";
171*8044SWilliam.Kucharski@Sun.COM      mkdir="e2mkdir";;
172*8044SWilliam.Kucharski@Sun.COM    vfat)
173*8044SWilliam.Kucharski@Sun.COM      cp="mcopy";
174*8044SWilliam.Kucharski@Sun.COM      mkdir="mmd";;
175*8044SWilliam.Kucharski@Sun.COM    *)
176*8044SWilliam.Kucharski@Sun.COM      cp="";
177*8044SWilliam.Kucharski@Sun.COM      mkdir="";;
178*8044SWilliam.Kucharski@Sun.COM  esac
179*8044SWilliam.Kucharski@Sun.COM
180*8044SWilliam.Kucharski@Sun.COM  if [ "$offset" = 0 ] && which $cp > /dev/null ; then
181*8044SWilliam.Kucharski@Sun.COM    for dir in $(cd ${image}1 && find -type d) ; do
182*8044SWilliam.Kucharski@Sun.COM	$mkdir ${image}:$dir
183*8044SWilliam.Kucharski@Sun.COM    done
184*8044SWilliam.Kucharski@Sun.COM    for file in $(cd ${image}1 && find -type f) ; do
185*8044SWilliam.Kucharski@Sun.COM	$cp ${image}1/$file ${image}:$file
186*8044SWilliam.Kucharski@Sun.COM    done
187*8044SWilliam.Kucharski@Sun.COM  elif [ "`id -u`" = "0" ] ; then
188*8044SWilliam.Kucharski@Sun.COM    losetup $lo_options /dev/loop1 $image
189*8044SWilliam.Kucharski@Sun.COM    mkdir ${image}.mnt
190*8044SWilliam.Kucharski@Sun.COM    mount -t $fs /dev/loop1 ${image}.mnt
191*8044SWilliam.Kucharski@Sun.COM    cp -a ${image}1/* ${image}.mnt/ && sync
192*8044SWilliam.Kucharski@Sun.COM    umount ${image}.mnt
193*8044SWilliam.Kucharski@Sun.COM    rmdir ${image}.mnt
194*8044SWilliam.Kucharski@Sun.COM    losetup -d /dev/loop1
195*8044SWilliam.Kucharski@Sun.COM  else
196*8044SWilliam.Kucharski@Sun.COM    error must_be_root
197*8044SWilliam.Kucharski@Sun.COM  fi
198*8044SWilliam.Kucharski@Sun.COM}
199*8044SWilliam.Kucharski@Sun.COM
200*8044SWilliam.Kucharski@Sun.COM#**********************************************************************
201*8044SWilliam.Kucharski@Sun.COM#                          MAIN PROGRAM                               *
202*8044SWilliam.Kucharski@Sun.COM#**********************************************************************
203*8044SWilliam.Kucharski@Sun.COM
204*8044SWilliam.Kucharski@Sun.COM#---------------------- Getting the options
205*8044SWilliam.Kucharski@Sun.COM
206*8044SWilliam.Kucharski@Sun.COM[ $# -eq 0 ] && error missing_option;
207*8044SWilliam.Kucharski@Sun.COM
208*8044SWilliam.Kucharski@Sun.COMwhile [ $# -gt 0 ]; do
209*8044SWilliam.Kucharski@Sun.COM	case "$1" in
210*8044SWilliam.Kucharski@Sun.COM		-d) shift;
211*8044SWilliam.Kucharski@Sun.COM			dir="$1";
212*8044SWilliam.Kucharski@Sun.COM			[ ! -d "$1" ] && error wrong_directory;;
213*8044SWilliam.Kucharski@Sun.COM		-f) shift;
214*8044SWilliam.Kucharski@Sun.COM			tarfile="$1";
215*8044SWilliam.Kucharski@Sun.COM			[ -z "$tarfile" ] && error missing_argument;;
216*8044SWilliam.Kucharski@Sun.COM		-s) shift;
217*8044SWilliam.Kucharski@Sun.COM			fs="$1";;
218*8044SWilliam.Kucharski@Sun.COM		-t) shift;
219*8044SWilliam.Kucharski@Sun.COM			image_type="$1";;
220*8044SWilliam.Kucharski@Sun.COM		-F) geo_option="-F";;
221*8044SWilliam.Kucharski@Sun.COM		-D) debug="-v";
222*8044SWilliam.Kucharski@Sun.COM		    set -x;;
223*8044SWilliam.Kucharski@Sun.COM		-h|--help) echo "$usage"; exit 0;;
224*8044SWilliam.Kucharski@Sun.COM		-V|--version) echo "$version"; exit 0;;
225*8044SWilliam.Kucharski@Sun.COM	 	*) error option ;;
226*8044SWilliam.Kucharski@Sun.COM	esac
227*8044SWilliam.Kucharski@Sun.COMshift
228*8044SWilliam.Kucharski@Sun.COMdone
229*8044SWilliam.Kucharski@Sun.COM#---------------------- Sanity checks
230*8044SWilliam.Kucharski@Sun.COM[ ! "$tarfile" ] && error missing_argument;
231*8044SWilliam.Kucharski@Sun.COM[ ! -s "$tarfile" ] && error wrong_file;
232*8044SWilliam.Kucharski@Sun.COM
233*8044SWilliam.Kucharski@Sun.COMif [ ! "$image_type" ]; then
234*8044SWilliam.Kucharski@Sun.COM	image_type=hd;
235*8044SWilliam.Kucharski@Sun.COMelif [ "$image_type" != "1.20" ] && [ "$image_type" != "1.44" ] \
236*8044SWilliam.Kucharski@Sun.COM  && [ "$image_type" != "1.60" ] && [ "$image_type" != "1.68" ] \
237*8044SWilliam.Kucharski@Sun.COM  && [ "$image_type" != "2.88" ] && [ "$image_type" != "1.74" ] \
238*8044SWilliam.Kucharski@Sun.COM  && [ "$image_type" != "hd" ] && [ "$image_type" != "1.60" ] ; then
239*8044SWilliam.Kucharski@Sun.COM  error wrong_type ;
240*8044SWilliam.Kucharski@Sun.COMfi
241*8044SWilliam.Kucharski@Sun.COM
242*8044SWilliam.Kucharski@Sun.COM[ ! "$fs" ] && fs=ext2
243*8044SWilliam.Kucharski@Sun.COM
244*8044SWilliam.Kucharski@Sun.COM# Carlo Contavalli reported that I [TL] have forgotten to specify the
245*8044SWilliam.Kucharski@Sun.COM# partition ID for sfdisk to correctly fill the partition table (ext2 is the
246*8044SWilliam.Kucharski@Sun.COM# default on Linux, so this worked in this case...). This is fixed below.
247*8044SWilliam.Kucharski@Sun.COMcase "$fs" in
248*8044SWilliam.Kucharski@Sun.COM	ext2) mkfs_options="-m 0";
249*8044SWilliam.Kucharski@Sun.COM		  part_id="83";; # This is the default
250*8044SWilliam.Kucharski@Sun.COM#	ufs)	if [ $uname = Linux ];
251*8044SWilliam.Kucharski@Sun.COM#		then error unknown_fs;
252*8044SWilliam.Kucharski@Sun.COM#		fi;;
253*8044SWilliam.Kucharski@Sun.COM	minix)	if [ $uname = GNU ];
254*8044SWilliam.Kucharski@Sun.COM		then error unknown_fs;
255*8044SWilliam.Kucharski@Sun.COM		else
256*8044SWilliam.Kucharski@Sun.COM			mkfs_options="-v"; # Minix version 2
257*8044SWilliam.Kucharski@Sun.COM			part_id="81";
258*8044SWilliam.Kucharski@Sun.COM		fi;;
259*8044SWilliam.Kucharski@Sun.COM	msdos)	if [ $uname = GNU ];
260*8044SWilliam.Kucharski@Sun.COM		then error unknown_fs;
261*8044SWilliam.Kucharski@Sun.COM		else
262*8044SWilliam.Kucharski@Sun.COM			mkfs_options="-f 1 -F 12"; # the smallest...
263*8044SWilliam.Kucharski@Sun.COM			part_id="1";
264*8044SWilliam.Kucharski@Sun.COM		fi;;
265*8044SWilliam.Kucharski@Sun.COM	*) error unknown_fs;;
266*8044SWilliam.Kucharski@Sun.COMesac
267*8044SWilliam.Kucharski@Sun.COM
268*8044SWilliam.Kucharski@Sun.COM# What type of tar file has been given ?
269*8044SWilliam.Kucharski@Sun.COM
270*8044SWilliam.Kucharski@Sun.COMsuffix=`echo "$tarfile" | sed -n 's/^.*\.\([targbz2]\{2,3\}\)$/\1/p'`
271*8044SWilliam.Kucharski@Sun.COMcase "$suffix" in
272*8044SWilliam.Kucharski@Sun.COM	tar) decompress="cat";;
273*8044SWilliam.Kucharski@Sun.COM	gz) decompress="gunzip -c";;
274*8044SWilliam.Kucharski@Sun.COM	bz2) decompress="bunzip2 -c";;
275*8044SWilliam.Kucharski@Sun.COM	*) error unknown_format;;
276*8044SWilliam.Kucharski@Sun.COMesac
277*8044SWilliam.Kucharski@Sun.COM#---------------------- Initializations
278*8044SWilliam.Kucharski@Sun.COM
279*8044SWilliam.Kucharski@Sun.COM[ ! "$dir" ] && dir=`pwd`
280*8044SWilliam.Kucharski@Sun.COM
281*8044SWilliam.Kucharski@Sun.COMimage=$dir/$image_type.image
282*8044SWilliam.Kucharski@Sun.COMdevice_map=$dir/device.map
283*8044SWilliam.Kucharski@Sun.COM
284*8044SWilliam.Kucharski@Sun.COM# First, find the size of the tar file in block_size.
285*8044SWilliam.Kucharski@Sun.COMfile_size=`$decompress $tarfile | wc -c | tr -d ' '`
286*8044SWilliam.Kucharski@Sun.COMfile_size=$(($file_size / $block_size + 1))
287*8044SWilliam.Kucharski@Sun.COM
288*8044SWilliam.Kucharski@Sun.COM# Increase in order to be sure that with a fs there will be enough
289*8044SWilliam.Kucharski@Sun.COM# room (trying 110%)
290*8044SWilliam.Kucharski@Sun.COMfile_size=$(($file_size + $file_size / 10))
291*8044SWilliam.Kucharski@Sun.COM
292*8044SWilliam.Kucharski@Sun.COMcase "$image_type" in
293*8044SWilliam.Kucharski@Sun.COM  hd) heads=16;
294*8044SWilliam.Kucharski@Sun.COM    sectors=63;
295*8044SWilliam.Kucharski@Sun.COM    cyl_size=$((16 * 63));
296*8044SWilliam.Kucharski@Sun.COM    # Create the minimum number of cylinders. At the moment, we leave
297*8044SWilliam.Kucharski@Sun.COM    # some space by rounding everything up by adding 1 cylinder, plus
298*8044SWilliam.Kucharski@Sun.COM    # another one for MBR + reserved track.
299*8044SWilliam.Kucharski@Sun.COM    cylinders=$(($file_size / $cyl_size + 2));;
300*8044SWilliam.Kucharski@Sun.COM  1.20) [ $file_size -ge $bk_120 ] && error wont_fit;
301*8044SWilliam.Kucharski@Sun.COM    heads=2;
302*8044SWilliam.Kucharski@Sun.COM    sectors=15;
303*8044SWilliam.Kucharski@Sun.COM    cyl_size=$((2 * 15));
304*8044SWilliam.Kucharski@Sun.COM    cylinders=80;;
305*8044SWilliam.Kucharski@Sun.COM  1.44) [ $file_size -ge $bk_144 ] && error wont_fit;
306*8044SWilliam.Kucharski@Sun.COM    heads=2;
307*8044SWilliam.Kucharski@Sun.COM    sectors=18;
308*8044SWilliam.Kucharski@Sun.COM    cyl_size=$((2 * 18));
309*8044SWilliam.Kucharski@Sun.COM    cylinders=80;;
310*8044SWilliam.Kucharski@Sun.COM  1.60) [ $file_size -ge $bk_160 ] && error wont_fit;
311*8044SWilliam.Kucharski@Sun.COM    heads=2;
312*8044SWilliam.Kucharski@Sun.COM    sectors=20;
313*8044SWilliam.Kucharski@Sun.COM    cyl_size=$((2 * 20));
314*8044SWilliam.Kucharski@Sun.COM    cylinders=80;
315*8044SWilliam.Kucharski@Sun.COM    geo_option="-F";;
316*8044SWilliam.Kucharski@Sun.COM  1.68) [ $file_size -ge $bk_168 ] && error wont_fit;
317*8044SWilliam.Kucharski@Sun.COM    heads=2;
318*8044SWilliam.Kucharski@Sun.COM    sectors=21;
319*8044SWilliam.Kucharski@Sun.COM    cyl_size=$((2 * 21));
320*8044SWilliam.Kucharski@Sun.COM    cylinders=80;;
321*8044SWilliam.Kucharski@Sun.COM  1.74) [ $file_size -ge $bk_174 ] && error wont_fit;
322*8044SWilliam.Kucharski@Sun.COM    heads=2;
323*8044SWilliam.Kucharski@Sun.COM    sectors=21;
324*8044SWilliam.Kucharski@Sun.COM    cyl_size=$((2 * 21));
325*8044SWilliam.Kucharski@Sun.COM    cylinders=83;;
326*8044SWilliam.Kucharski@Sun.COM  2.88) [ $file_size -ge $bk_288 ] && error wont_fit;
327*8044SWilliam.Kucharski@Sun.COM    heads=2;
328*8044SWilliam.Kucharski@Sun.COM    sectors=36;
329*8044SWilliam.Kucharski@Sun.COM    cyl_size=$((2 * 36));
330*8044SWilliam.Kucharski@Sun.COM    cylinders=80;;
331*8044SWilliam.Kucharski@Sun.COM  *) error bug;;
332*8044SWilliam.Kucharski@Sun.COMesac
333*8044SWilliam.Kucharski@Sun.COM
334*8044SWilliam.Kucharski@Sun.COMtype_option="-t $image_type"
335*8044SWilliam.Kucharski@Sun.COM
336*8044SWilliam.Kucharski@Sun.COM# We start by creating a virtual disk which size is the number of
337*8044SWilliam.Kucharski@Sun.COM# cylinders of $cyl_size mandatory to put the files stocked in the $tarfile
338*8044SWilliam.Kucharski@Sun.COM# Create the empty virtual disk
339*8044SWilliam.Kucharski@Sun.COMdd if=/dev/zero of=$image bs=$block_size count=$(($cyl_size * $cylinders))
340*8044SWilliam.Kucharski@Sun.COM
341*8044SWilliam.Kucharski@Sun.COM# We then format the virtual disk
342*8044SWilliam.Kucharski@Sun.COM# NOTE: the El Torito specification wants only one partition. So we
343*8044SWilliam.Kucharski@Sun.COM# create the first, and the remaining 3 entries are empty.
344*8044SWilliam.Kucharski@Sun.COM
345*8044SWilliam.Kucharski@Sun.COMif [ "$image_type" = "hd" ]; then
346*8044SWilliam.Kucharski@Sun.COM  sfdisk -C $cylinders -H $heads -S $sectors -D $image<<EOT
347*8044SWilliam.Kucharski@Sun.COM,,$part_id,*,0,1,1
348*8044SWilliam.Kucharski@Sun.COM
349*8044SWilliam.Kucharski@Sun.COM
350*8044SWilliam.Kucharski@Sun.COMEOT
351*8044SWilliam.Kucharski@Sun.COM  offset="$(($sectors * $block_size))"
352*8044SWilliam.Kucharski@Sun.COM  type_option=
353*8044SWilliam.Kucharski@Sun.COMelse
354*8044SWilliam.Kucharski@Sun.COM  offset="0"
355*8044SWilliam.Kucharski@Sun.COMfi
356*8044SWilliam.Kucharski@Sun.COM
357*8044SWilliam.Kucharski@Sun.COM# It's time now to create the filesystem on the first partition.
358*8044SWilliam.Kucharski@Sun.COMmkbimage_mkfs
359*8044SWilliam.Kucharski@Sun.COM
360*8044SWilliam.Kucharski@Sun.COM# then untar the files
361*8044SWilliam.Kucharski@Sun.COM[ ! -e ${image}1 ] || { echo "${image}1 exists, please remove it first"; exit 1;}
362*8044SWilliam.Kucharski@Sun.COMmkdir -p ${image}1
363*8044SWilliam.Kucharski@Sun.COM$decompress $tarfile | tar -C ${image}1 $debug -xf -
364*8044SWilliam.Kucharski@Sun.COM
365*8044SWilliam.Kucharski@Sun.COM# copy the untarred files into the filesystem image
366*8044SWilliam.Kucharski@Sun.COMmkbimage_cp
367*8044SWilliam.Kucharski@Sun.COM
368*8044SWilliam.Kucharski@Sun.COM#We verify that the stage2 exists and we search the name
369*8044SWilliam.Kucharski@Sun.COMstage2_os_name=`find ${image}1 -name stage2 -type f`
370*8044SWilliam.Kucharski@Sun.COM
371*8044SWilliam.Kucharski@Sun.COM[ -r "$stage2_os_name" ] || { echo "I can't find stage2!"; exit 1;}
372*8044SWilliam.Kucharski@Sun.COM
373*8044SWilliam.Kucharski@Sun.COM#------------------------- GRUB stuff
374*8044SWilliam.Kucharski@Sun.COMif [ "$image_type" = "hd" ]; then
375*8044SWilliam.Kucharski@Sun.COM	device='(hd0)'
376*8044SWilliam.Kucharski@Sun.COM	root='(hd0,0)'
377*8044SWilliam.Kucharski@Sun.COMelse
378*8044SWilliam.Kucharski@Sun.COM	device='(fd0)'
379*8044SWilliam.Kucharski@Sun.COM	root='(fd0)'
380*8044SWilliam.Kucharski@Sun.COMfi
381*8044SWilliam.Kucharski@Sun.COM
382*8044SWilliam.Kucharski@Sun.COMcat<<EOT >$device_map
383*8044SWilliam.Kucharski@Sun.COM$device	${image}
384*8044SWilliam.Kucharski@Sun.COMEOT
385*8044SWilliam.Kucharski@Sun.COM
386*8044SWilliam.Kucharski@Sun.COM${GRUB_PATH}grub --device-map=$device_map --batch<<EOT
387*8044SWilliam.Kucharski@Sun.COMgeometry $device $cylinders $heads $sectors
388*8044SWilliam.Kucharski@Sun.COMroot $root
389*8044SWilliam.Kucharski@Sun.COMsetup $device
390*8044SWilliam.Kucharski@Sun.COMgeometry $geo_option -w $type_option $device $cylinders $heads $sectors
391*8044SWilliam.Kucharski@Sun.COMEOT
392*8044SWilliam.Kucharski@Sun.COM
393*8044SWilliam.Kucharski@Sun.COMecho "-------------------WHAT'S NEXT?-------------------------------------"
394*8044SWilliam.Kucharski@Sun.COMecho
395*8044SWilliam.Kucharski@Sun.COM
396*8044SWilliam.Kucharski@Sun.COMcat <<EOF
397*8044SWilliam.Kucharski@Sun.COMIf you have created an image aimed to a floppy, then something like:
398*8044SWilliam.Kucharski@Sun.COM
399*8044SWilliam.Kucharski@Sun.COMdd if=<type>.image of=/dev/fd0[u<size>] bs=512
400*8044SWilliam.Kucharski@Sun.COM
401*8044SWilliam.Kucharski@Sun.COMwill be more than enough... if you have formated the floppy correctly
402*8044SWilliam.Kucharski@Sun.COMusing \`superformat' to be found in \`fdutils' package.
403*8044SWilliam.Kucharski@Sun.COM
404*8044SWilliam.Kucharski@Sun.COMFor El Torito floppy emulation :
405*8044SWilliam.Kucharski@Sun.COM
406*8044SWilliam.Kucharski@Sun.COMmkisofs -b <image> -c boot.catalog -o raw.iso <dir>
407*8044SWilliam.Kucharski@Sun.COM
408*8044SWilliam.Kucharski@Sun.COMAnd for El Torito Hard Disk emulation:
409*8044SWilliam.Kucharski@Sun.COM
410*8044SWilliam.Kucharski@Sun.COMmkisofs -b <image> -hard-disk-boot -c boot.catalog -o raw.iso <dir> 
411*8044SWilliam.Kucharski@Sun.COM
412*8044SWilliam.Kucharski@Sun.COMEnjoy!
413*8044SWilliam.Kucharski@Sun.COMEOF
414*8044SWilliam.Kucharski@Sun.COM
415*8044SWilliam.Kucharski@Sun.COMrm -rf ${image}1
416*8044SWilliam.Kucharski@Sun.COM
417*8044SWilliam.Kucharski@Sun.COMexit 0
418