home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / boot / i386 / rescue / sbin / mkrescue < prev    next >
Text File  |  2006-11-29  |  14KB  |  690 lines

  1. #!/bin/bash
  2. #
  3. # mkrescue
  4. #
  5. #    30-Oct-2001    original version 1.0
  6. #
  7. # Revision history:
  8. #    09-Apr-2002    John Coffman    modify for lilo 22.3   1.1
  9. #    09-Jun-2002    John Coffman    get keyboard translation table 1.2
  10. #                    (suggested by Qing Liu)
  11. #    07-May-2003    John Coffman    add nowarn for lilo 22.5.2  1.3
  12. #    13-May-2003    John Coffman    use default image, add append=  1.4
  13. #    24-May-2003    John Coffman    specify ext2 params for xtra space
  14. #    26-May-2003    John Coffman    el-torito-bootable-CD   2.1
  15. #    30-May-2003       "        add lilo version check  2.1
  16. #    07-Jul-2003       "        determine loopback dynamically 2.3
  17. #    29-Aug-2004       "        allow --root LABEL=lblname  2.4
  18. #    01-Sep-2004       "        fix check for LILO version  2.4
  19. #    03-Oct-2004       "        get root= from /etc/fstab   2.5
  20. #    15-Nov-2004       "        support --iso --size HD        3.0
  21. #
  22.  
  23. debug=false
  24. #debug=true
  25. log=$(pwd)/mkrescue.log
  26. #log=
  27. # set the version number on this command
  28. version=3.0
  29. # set the version of LILO required to run
  30. major=22
  31. minor=6
  32. revision=1
  33.  
  34.  
  35. usage () {
  36.     cat <<EOF
  37.  
  38. usage:    `basename $0` [--help]
  39.     `basename $0` [--version]
  40.     `basename $0` [--device <device>] [--fast] [--fs ext2|msdos|minix]
  41.         [--image <label>] [--install text|menu] [--keymap <keymap.ktl>] 
  42.         [--initrd <file> --kernel <file>] [--append <string>]
  43.         [--root <device>] [--nocompact] [--noformat]
  44.         [--iso] [--size 1440|1200|2880|HD]
  45.  
  46.   --device  is the floppy drive; e.g.,  /dev/fd0
  47.   --fast  specifies creation using a loopback device, which may be faster
  48.   --fs  is the filesystem to make on the device; e.g.,  ext2
  49.   --help  prints this helpfile
  50.   --iso  create a bootable ISO image to burn to a CD-R or CD-RW
  51.   --keymap  is the keyboard translation table; default to same as lilo.conf
  52.   --noformat  bypasses creation of a new filesystem on device
  53.   --nocompact  omits lilo map file compaction
  54.   --size  is assumed to be 1440 (1.44M), unless 1200 or 2880 is specified
  55.     HD may be specified for ISO images
  56.   --image  specifies the label of the kernel/initrd if not the default
  57.   --install  text is the default for floppies, menu for ISO images
  58.   --initrd and --kernel  are the initial ramdisk & kernel files
  59.   --append  is a string used to specify kernel options
  60.   --root  is the root filesystem for the boot floppy; e.g., current
  61.   --version  prints the version number of `basename $0`
  62.  
  63. Used without any arguments, `basename $0` will use the default kernel in
  64. /etc/lilo.conf, the companion initrd (if any), and the specified root
  65. filesystem to make a bootable rescue floppy.
  66.  
  67. EOF
  68. #
  69. # --install & --debug are undocumented above
  70. #
  71. #
  72.     exit $1
  73. }
  74.  
  75. if [ $debug != false ]; then
  76.     lilo=$(pwd)/lilo
  77.     config=$(pwd)/lilo.conf
  78. else
  79.     lilo=/sbin/lilo
  80.     config=/etc/lilo.conf
  81. fi
  82.  
  83. compact=-c
  84. device=/dev/fd0
  85. fs=ext2
  86. tmpbase=${TMPDIR:-/tmp}/mkrescue_$$
  87. mount=$tmpbase/mkrescue-flp
  88. mfile=$tmpbase/mkrescue-emu
  89. mtemp=$tmpbase/mkrescue-tmp
  90. loopback=loop0
  91. looppart=loop1
  92. install=text
  93. isoimage=no
  94. format=yes
  95. image=
  96. root=
  97. bios=0x00
  98. fast=slow
  99. size=0
  100. heads=2
  101. sectors=18
  102. cylinders=80
  103. hdsize=16384
  104. bootcmd=
  105. append=
  106. initrd=
  107. boot=/boot
  108. diag=no
  109. if [ -b /dev/hda ]; then
  110.     master=/dev/hda
  111. elif [ -b /dev/sda ]; then
  112.     master=/dev/sda
  113. elif [ -b /dev/ide/host0/bus0/target0/lun0/disc ]; then
  114.     master=/dev/ide/host0/bus0/target0/lun0/disc
  115. elif [ -b /dev/scsi/host0/bus0/target0/lun0/disc ]; then
  116.     master=/dev/scsi/host0/bus0/target0/lun0/disc
  117. else
  118.     master=
  119. fi
  120.  
  121.  
  122. VERSION=$($lilo -V | sed "/version/s/.*n //" | sed "/,/s/,.*//" )
  123.  
  124. NVERSION=$(echo $VERSION | sed "s/\\./ /g")
  125.  
  126. DASH=$(echo $VERSION | sed "/-/s/.*-//" )
  127. if [ "$DASH" = "$VERSION" ]; then
  128.     DASH=0
  129. else
  130.     NVERSION=$(echo $NVERSION | sed "s/-.*//")
  131. fi
  132. MAJOR=$(echo $NVERSION | sed "s/ .*//")
  133. MINOR=$(echo $NVERSION | sed -e "s/$MAJOR //" -e "s/ .*//" )
  134. if [ "$MINOR" = "$NVERSION" ]; then
  135.     MINOR=0
  136. fi
  137. REVISION=$(echo $NVERSION | sed "s/$MAJOR $MINOR //")
  138. if [ "$REVISION" = "$NVERSION" ]; then
  139.     REVISION=0
  140. fi
  141. REVISION=$(echo $REVISION | sed "s/ .*//")
  142. if [ "$MINOR" -gt 49 ]; then MINOR=$(expr $MINOR % 10); fi
  143.  
  144. if [ $debug = true ]; then
  145. echo ""
  146. echo VERSION $VERSION
  147. echo ""
  148. echo MAJOR $MAJOR
  149. echo MINOR $MINOR
  150. echo REVISION $REVISION
  151. echo DASH $DASH
  152. echo ""
  153. fi
  154.  
  155. #if [ "$MAJOR" -lt "$major" \
  156. #    -o "$MINOR" -lt "$minor" \
  157. #         -o $REVISION -lt "$revision" ]
  158. skip=false
  159. if [ "$REVISION" -lt "$revision" ]
  160. then
  161. skip=true
  162. #echo $REVISION lt $revision
  163. fi
  164. if [ "$MINOR" -gt "$minor" ]
  165. then
  166. skip=false
  167. #echo $MINOR gt $minor
  168. fi
  169. if [ "$MAJOR" -gt "$major" ]
  170. then
  171. skip=false
  172. #echo $MAJOR gt $major
  173. fi
  174. if [ "$skip" = "true" ]
  175. then
  176.     echo `basename $0` version $version
  177.     echo "LILO version $major.$minor.$revision (or newer) is required."
  178.     exit 0
  179. fi
  180.  
  181. umount $mount 2>/dev/null
  182. rm -rf $tmpbase 2>/dev/null
  183. mkdir $tmpbase || {
  184.     echo "Could not create temporary directory."
  185.     exit 1
  186. }
  187.  
  188.  
  189. while [ $# -gt 0 ]; do
  190.     case $1 in
  191.     --append)
  192.         shift
  193.         append=$1
  194.         ;;
  195.     --debug)
  196.         debug=true
  197.         ;;
  198.     --device)
  199.         shift
  200.         device=$1
  201.         ;;
  202.     --fast)
  203.         fast=fast
  204.         ;;
  205.     --fs)
  206.         shift
  207.         fs=$1
  208.         ;;
  209.     -h)
  210.         usage 0
  211.         ;;
  212.     --help)
  213.         usage 0
  214.         ;;
  215.     --image)
  216.         shift
  217.         image=$1
  218.         ;;
  219.     --initrd)
  220.         shift
  221.         initrd=$1
  222.         ;;
  223.     --install)
  224.         shift
  225.         install=$1
  226.         ;;
  227.     --iso)
  228.         isoimage=yes
  229.         ;;
  230.     --kernel)
  231.         shift
  232.         kernel=$1
  233.         ;;
  234.     --keymap)
  235.         shift
  236.         keymap=$1
  237.         ;;
  238.     --nocompact)
  239.         compact=
  240.         ;;
  241.     --noformat)
  242.         format=no
  243.         ;;
  244.     --root)
  245.         shift
  246.         root=$1
  247.         ;;
  248.     --size)
  249.         shift
  250.         size=$1
  251.         ;;
  252.     --version)
  253.         echo `basename $0` version $version
  254.         exit 0
  255.         ;;
  256.     *)
  257.         echo "unrecognized argument: " $1
  258.         usage 1
  259.         ;;
  260.     esac
  261.  
  262.     shift
  263. done
  264.  
  265. if [ -z $image ]; then
  266. #    image=`cat /proc/cmdline | sed "s/.*BOOT_IMAGE=//" | sed "s/ .*//"`
  267.     image=`$lilo -C $config -I " " D`
  268. fi
  269.  
  270. if [ -z $kernel ]; then
  271.     kernel=`$lilo -C $config -I $image i`
  272.     if [ "$kernel" = "" ]; then exit 1;
  273.     elif [ $debug = "true" ]; then echo kernel = "$kernel";
  274.     fi
  275. fi
  276.  
  277. if [ -z $root ]; then
  278.     root=`$lilo -C $config -I $image R`
  279.     if [ "$root" = "No root specified" ]; then
  280.         root=`grep </etc/fstab -v "^[ \t]*#" |
  281.             grep "[[:space:]]/[[:space:]]" | \
  282.                 sed -e "s/^[ \t]*//" -e "s/[ \t].*//"`
  283.         if [ -z $root ]; then
  284.             root=`mount | grep " on / type" | sed "s/ .*//"`
  285.         fi
  286.         if [ -z $root ]; then
  287.             echo "Cannot find mounted root partition"
  288.             echo "Using current root"
  289.             root=current
  290.         fi
  291.     fi
  292.     if [ $debug = true ]; then echo root = "$root";
  293.     fi
  294. fi
  295.  
  296. if [ -z $initrd ]; then
  297.     initrd=`$lilo -C $config -I $image r`
  298.     if [ "$initrd" = "" ]; then exit 1;
  299.     elif [ $debug = "true" ]; then echo initrd = "$initrd";
  300.     fi
  301. fi
  302. if [ "$initrd" = "No initial ramdisk specified" ]; then initrd= ; fi
  303.  
  304. if [ -z $append ]; then
  305.     append=`$lilo -C $config -I $image a`
  306.     if [ "$append" = "" ]; then exit 1;
  307.     elif [ $debug = "true" ]; then echo append = \"$append\";
  308.     fi
  309. fi
  310. if [ "$append" = "No append= was specified" ]; then append= ; fi
  311.  
  312. if [ -z $keymap ]; then
  313.     keymap=`$lilo -C $config -I $image k`
  314.     if [ "$keymap" = "" ]; then exit 1;
  315.     elif [ $debug = "true" ]; then echo keymap = "$keymap";
  316.     fi
  317. fi
  318.  
  319. if [ $isoimage = yes ]; then
  320.     fast=fast
  321.     if [ $size = 0 ]; then
  322.     size=2880
  323.     elif [ $size = HD -o $size = hd ]; then
  324.     size=$hdsize
  325.     fi
  326.     if [ $device = "/dev/fd0" ]; then
  327.     device=rescue.iso
  328.     fi
  329. else
  330.     umount $device 2>/dev/null 1>/dev/null
  331. fi
  332.  
  333. if [ $size = 0 ]; then
  334.     size=1440
  335. fi
  336.  
  337. if [ $size = 1200 ]; then
  338.     sectors=15
  339. elif [ $size = 1440 ]; then
  340.     sectors=18
  341. elif [ $size = 2880 ]; then
  342.     sectors=36
  343.     install=menu
  344.     if [ -f $boot/diag1.img -a -f $boot/diag2.img ]; then
  345.     diag=yes
  346.     fi
  347. elif [ $size = $hdsize ]; then
  348.     sectors=32
  349.     heads=8
  350.     cylinders=$(($size/$sectors/$heads*2))
  351.     if [ $size != $(($sectors*$heads*$cylinders/2)) ]; then
  352.     echo Internal error in HDsize
  353.     exit 1
  354.     fi
  355.     install=menu
  356.     if [ -f $boot/diag1.img -a -f $boot/diag2.img ]; then
  357.     diag=yes
  358.     fi
  359. elif [ $size = HD -o $size = hd ]; then
  360.     echo "--size $size  may only be used with the  --iso  option."
  361.     exit 1
  362. else
  363.     echo "--size must be 1200 or 1440; --size 1440 assumed."
  364.     sectors=18
  365.     size=1440
  366. fi
  367.  
  368. if [ $fs != msdos -a $fs != ext2 -a $fs != minix ]; then
  369.     echo "illegal option:  --fs" $fs
  370.     echo "   must be either  msdos  or  ext2  or  minix"
  371.     exit 1
  372. fi
  373.  
  374. if [ $fs = msdos ]; then
  375.     mountconfig=$mount/lilo.cnf
  376. else
  377.     mountconfig=$mount/lilo.conf
  378. fi
  379.  
  380. if [ $debug = "true" ]; then
  381.     umount $mfile
  382.  
  383.     echo ""
  384.  
  385.     echo lilo = $lilo
  386.     echo device = $device
  387.     echo image = $image
  388.     echo kernel = $kernel
  389.     echo initrd = $initrd
  390.     echo append = \"$append\"
  391.     echo install = $install
  392.     echo format = $format
  393.     echo fs = $fs
  394.     echo size = $size
  395.     echo root = $root
  396.     echo compact = $compact
  397.     echo keymap = $keymap
  398.     echo isoimage = $isoimage
  399.     echo master = $master
  400.     echo ""
  401.     echo pause after parameter display
  402.     read aline
  403. fi
  404.  
  405. if [ ! -f $kernel ]; then
  406.     echo "Kernel file " $kernel " does not exist"
  407.     exit 1
  408. fi
  409.  
  410. if [ ! -z $initrd ]; then
  411.     if [ ! -f $initrd ]; then
  412.         echo "Initial ramdisk file " $initrd " does not exist"
  413.         exit 1
  414.     fi
  415. fi
  416.  
  417. if [ $isoimage != yes ]; then
  418.     echo ""
  419.     echo "Insert a blank floppy into $device"
  420.     echo "All information on this floppy will be destroyed"
  421.     echo "Press [Enter] to proceed, ^C to abort"
  422.     read aline
  423. fi
  424.  
  425. if [ "$fast" = fast ]; then
  426.  
  427.     rm -rf $mount $mfile
  428.     mkdir $mount
  429.     dd bs=1024 count=$size of=$mfile if=/dev/zero
  430.     bsize=$size
  431.     mpart=$mfile
  432.     if [ $size = $hdsize ]; then
  433.         bios=0x80
  434.         bsize=$(($size-$sectors))
  435.         cat > $mtemp <<EOF
  436. n
  437. p
  438. 1
  439.  
  440.  
  441. a
  442. 1
  443. w
  444. EOF
  445.         echo Partitioning HD "file   (this will take a minute)"
  446.         fdisk -b 512 -S $sectors -H $heads -C $cylinders \
  447.         $mfile < $mtemp > /dev/null 2> /dev/null
  448.         rm -f $mtemp
  449.         echo bsize = $bsize
  450. #read aline
  451.         losetup -d /dev/$loopback 2>/dev/null
  452.             losetup -d /dev/$looppart 2>/dev/null
  453.             losetup /dev/$loopback $mfile
  454.         losetup -o $(($sectors*512)) /dev/$looppart $mfile
  455.         mpart=/dev/$looppart
  456.     fi
  457.     echo Making filesystem
  458.     if [ "$fs" = ext2 ]; then
  459.         echo y | mkfs.$fs -N 24 -b 1024 $mpart $bsize
  460.     else
  461.         echo y | mkfs.$fs $mpart
  462.     fi
  463.     echo Mounting filesystem
  464. #read aline
  465.     if [ $size != $hdsize ]; then
  466.         mount -t $fs -o rw,loop $mfile $mount
  467.         loopback=`mount | grep $mfile | sed -e "sX.*loop=/dev/XX" -e "s/).*//"`
  468.     else
  469.         mount -t $fs -o rw $mpart $mount
  470.     fi
  471.     if [ $debug = true ]; then
  472.         mount
  473.     fi
  474.     disk="/dev/$loopback"
  475.     if [ $debug = true ]; then
  476.         echo "disk=$disk"
  477.     fi
  478.  
  479. else
  480.  
  481.     if [ "$format" = "yes" ]; then
  482.         echo Formatting $device with $fs filesystem...
  483.         dd of=$device if=/dev/zero bs=512 count=1
  484.         if [ "$fs" = ext2 ]; then
  485.             mkfs -t $fs -N 24 -b 1024 $device 1>/dev/null 2>/dev/null
  486.         else
  487.             mkfs -t $fs $device 1>/dev/null 2>/dev/null
  488.         fi
  489.         echo done.
  490.         echo ""
  491.     fi
  492.  
  493.     rm -rf $mount
  494.     mkdir $mount
  495.     mount -t $fs -o rw $device $mount
  496.  
  497.     rm -rf $mount/*
  498.     disk=$device
  499.  
  500. fi
  501.  
  502. cat > $mountconfig <<EOF
  503. #  Begin mkrescue $version configuration file
  504. install=$install
  505. boot=$device
  506. map=map
  507. backup=/dev/null
  508. message=message
  509. prompt
  510. timeout=150
  511. nowarn
  512. geometric
  513. disk=$disk bios=$bios
  514.   sectors=$sectors heads=$heads cylinders=$cylinders
  515. EOF
  516. if [ $size = $hdsize ]; then
  517.     echo "  max-partitions=7" >>$mountconfig
  518.     echo "  partition=/dev/$looppart  start=$sectors" >>$mountconfig
  519.     echo static-bios-codes >>$mountconfig
  520.     bios=0x81
  521. else
  522.     bios=0x80
  523. fi
  524.  
  525. if [ "$master" != "" -a $isoimage = yes ]; then
  526.     echo "disk=$master" >>$mountconfig
  527.     echo "  bios=$bios" >>$mountconfig
  528. elif [ "$master" != "" -a $debug = true ]; then
  529.     echo "disk=$master" >>$mountconfig
  530.     echo "  bios=$bios" >>$mountconfig
  531. fi
  532.  
  533. if [ $keymap != us.ktl ]; then 
  534.     echo "keytable=lang.ktl" >>$mountconfig
  535. fi
  536.  
  537. if [ $isoimage = yes ]; then 
  538.     echo "el-torito-bootable-CD" >>$mountconfig
  539. fi
  540.  
  541. echo " " >>$mountconfig
  542. echo "image=linux" >>$mountconfig
  543.  
  544. if [ ! -z $initrd ]; then
  545.     echo "  initrd=initrd" >>$mountconfig
  546. fi
  547.  
  548. if [ ! -z "$append" ]; then
  549.     echo "  append=\"$append\"" >>$mountconfig
  550. fi
  551.  
  552. cat >> $mountconfig <<EOF
  553.   root="$root"
  554.   read-only
  555. EOF
  556.  
  557. if [ "$master" != "" -a $isoimage = yes ]; then
  558. cat >> $mountconfig <<EOF
  559. other=$master
  560.   unsafe
  561.   label=hard_disk
  562. EOF
  563. fi
  564.  
  565. if [ "$diag" = yes ]; then
  566. cp -pv $boot/diag1.img $mount
  567. cp -pv $boot/diag2.img $mount
  568. cat >> $mountconfig <<EOF
  569. image=diag1.img
  570.   label=diagnostic_1
  571. image=diag2.img
  572.   label=diagnostic_2
  573. EOF
  574. fi
  575. echo >>$mountconfig "#  End of mkrescue-generated configuration file"
  576.  
  577. if [ $isoimage = yes ]; then
  578.     comment="El-Torito bootable-CD will boot at end of timeout"
  579. else
  580.     comment="floppy will boot in 15 seconds"
  581. fi
  582.  
  583. rm -rf $mount/lost+found
  584. cat > $mount/message <<EOF
  585.  
  586. MKRESCUE version $version $comment
  587. Use  "boot: linux <options>"  to enter kernel options
  588. The root device is currently configured as  root="$root"
  589.  
  590. EOF
  591. echo `uname --sysname` `uname --release` > $mount/$(uname --release)
  592.  
  593. sync
  594.  
  595. if [ $debug = true ]; then
  596.     echo root=\"$root\"
  597.     echo ""
  598.     echo "pause after writing lilo.conf & message ..."
  599.     read aline
  600. fi
  601.  
  602. echo "Copying files..."
  603. if [ $keymap != us.ktl ]; then 
  604.     cp -pv $keymap $mount/lang.ktl
  605. fi
  606.  
  607. if [ ! -z $initrd ]; then
  608.     cp -pv $initrd $mount/initrd
  609. fi
  610.  
  611. cp -pv $kernel $mount/linux
  612. sync
  613.  
  614. echo "done."
  615. echo ""
  616.  
  617.  
  618.  
  619. pushd $mount >/dev/null 2>/dev/null
  620. if [ "$fast" = fast ]; then
  621.     bootcmd="-b /dev/$loopback"
  622. fi
  623.  
  624. echo Running $lilo ...
  625. if [ $debug = true ]; then
  626. if [ -z $log ]; then
  627.  echo    $lilo -w+ -C $mountconfig $compact $bootcmd -v5
  628.     $lilo -w+ -C $mountconfig $compact $bootcmd -v5 || fast=error
  629. else
  630.  echo    $lilo -w+ -C $mountconfig $compact $bootcmd -v5 ">$log"
  631.     $lilo -w+ -C $mountconfig $compact $bootcmd -v5 >$log || fast=error
  632. fi
  633. else
  634.     $lilo -C $mountconfig $compact $bootcmd || fast=error
  635. fi
  636. popd >/dev/null 2>/dev/null
  637. if [ "$fast" = error ]; then
  638.     echo -n `$lilo -V`
  639.     echo " failure."
  640. else
  641.     echo done.
  642. fi
  643. echo ""
  644.  
  645. umount $mount
  646.  
  647. if [ $fast = error ]; then
  648.     rm -rf $mount
  649.     exit 1
  650. fi
  651.  
  652. if [ $isoimage = yes ]; then
  653.     echo MKISOFS
  654.     out=$device
  655.     opt=
  656.     if [ $size = $hdsize ]; then
  657.         losetup -d /dev/$looppart
  658.         losetup -d /dev/$loopback
  659.         opt=-hard-disk-boot
  660.     fi
  661.     mv $mfile $mount/boot.bin
  662.     mkisofs $opt -J -R -T \
  663.         -V LILO_BOOT -A "Linux Boot CD created by LILO mkrescue" \
  664.         -b boot.bin -c boot.cat -o $out $mount
  665.     cat <<EOF
  666.  
  667. END MKISOFS:  output is in  '$device'
  668.  
  669.  
  670. The bootable CD can be burned with the 'cdrecord' utility
  671. using a command of the form:
  672.  
  673.     cdrecord [<options>] [dev=<device>] $device
  674.  
  675. EOF
  676. elif [ "$fast" = fast ]; then
  677.     if [ $debug = true ]; then
  678.         echo Pause before transfering to $device
  679.         read aline
  680.     fi
  681.     dd if=$mfile of=$device bs=1024
  682. fi
  683.  
  684. if [ $debug != true ]; then 
  685.     rm -rf $tmpbase
  686. fi
  687.  
  688. echo "All done."
  689. echo ""
  690. exit 0