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