home *** CD-ROM | disk | FTP | other *** search
/ H4CK3R 16 / hacker16 / 16_HACKER16.ISO / linux / tpm-security-server-1.2.1.iso / sbin / mkrescue < prev    next >
Encoding:
Text File  |  2004-01-27  |  10.8 KB  |  541 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. #
  18.  
  19. debug=false
  20. # set the version number on this command
  21. version=2.3
  22. # set the version of LILO required to run
  23. major=22
  24. minor=5
  25. revision=5
  26.  
  27.  
  28. usage () {
  29.     cat <<EOF
  30.  
  31. usage:    `basename $0` [--help]
  32.     `basename $0` [--version]
  33.     `basename $0` [--device <device>] [--fast] [--fs ext2|msdos|minix]
  34.         [--initrd <file> --kernel <file>] [--keymap <keymap.ktl>] 
  35.         [--append <string>] [--nocompact] [--noformat] [--root <device>]
  36.         [--size 1440|1200|2880]
  37.  
  38.   --device  is the floppy drive; e.g.,  /dev/fd0
  39.   --fast  specifies creation using a loopback device, which may be faster
  40.   --fs  is the filesystem to make on the device; e.g.,  ext2
  41.   --help  prints this helpfile
  42.   --iso  create a bootable ISO image to burn to a CD-R or CD-RW
  43.   --keymap  is the keyboard translation table; default to same as lilo.conf
  44.   --noformat  bypasses creation of a new filesystem on device
  45.   --nocompact  omits lilo map file compaction
  46.   --size  is assumed to be 1440 (1.44M), unless 1200 or 2880 is specified
  47.   --initrd and --kernel  are the initial ramdisk & kernel files
  48.   --append  is a string used to specify kernel options
  49.   --root  is the root filesystem for the boot floppy; e.g., current
  50.   --version  prints the version number of `basename $0`
  51.  
  52. Used without any arguments, `basename $0` will use the default kernel in
  53. /etc/lilo.conf, the companion initrd (if any), and the specified root
  54. filesystem to make a bootable rescue floppy.
  55.  
  56. EOF
  57. #
  58. # --install & --debug are undocumented above
  59. #
  60. #
  61.     exit $1
  62. }
  63.  
  64.  
  65.  
  66. lilo=/sbin/lilo
  67. #lilo=$(pwd)/lilo
  68. config=/etc/lilo.conf
  69. #config=$(pwd)/lilo.conf
  70.  
  71. compact=-c
  72. device=/dev/fd0
  73. fs=ext2
  74. mount=/tmp/mkrescue-flp
  75. mfile=/tmp/mkrescue-emu
  76. #loopback=loop4
  77. install=text
  78. isoimage=no
  79. format=yes
  80. root=current
  81. fast=slow
  82. size=0
  83. bootcmd=
  84. append=
  85. initrd=
  86. boot=/boot
  87. diag=no
  88. if [ -b /dev/hda ]; then
  89.     master=/dev/hda
  90. elif [ -b /dev/sda ]; then
  91.     master=/dev/sda
  92. elif [ -b /dev/ide/host0/bus0/target0/lun0/disc ]; then
  93.     master=/dev/ide/host0/bus0/target0/lun0/disc
  94. elif [ -b /dev/scsi/host0/bus0/target0/lun0/disc ]; then
  95.     master=/dev/scsi/host0/bus0/target0/lun0/disc
  96. else
  97.     master=
  98. fi
  99.  
  100.  
  101. VERSION=$($lilo -V | sed "/version/s/.*n //" | sed "/,/s/,.*//" )
  102.  
  103. NVERSION=$(echo $VERSION | sed "s/\\./ /g")
  104.  
  105. DASH=$(echo $VERSION | sed "/-/s/.*-//" )
  106. if [ "$DASH" = "$VERSION" ]; then
  107.     DASH=0
  108. else
  109.     NVERSION=$(echo $NVERSION | sed "s/-.*//")
  110. fi
  111. MAJOR=$(echo $NVERSION | sed "s/ .*//")
  112. MINOR=$(echo $NVERSION | sed -e "s/$MAJOR //" -e "s/ .*//" )
  113. if [ "$MINOR" = "$NVERSION" ]; then
  114.     MINOR=0
  115. fi
  116. REVISION=$(echo $NVERSION | sed "s/$MAJOR $MINOR //")
  117. if [ "$REVISION" = "$NVERSION" ]; then
  118.     REVISION=0
  119. fi
  120. REVISION=$(echo $REVISION | sed "s/ .*//")
  121. if [ "$MINOR" -gt 49 ]; then MINOR=$(expr $MINOR % 10); fi
  122.  
  123. if [ $debug = true ]; then
  124. echo ""
  125. echo VERSION $VERSION
  126. echo ""
  127. echo MAJOR $MAJOR
  128. echo MINOR $MINOR
  129. echo REVISION $REVISION
  130. echo DASH $DASH
  131. echo ""
  132. fi
  133.  
  134. if [ "$MAJOR" -lt "$major" \
  135.     -o "$MINOR" -lt "$minor" \
  136.         -o $REVISION -lt "$revision" ]
  137. then
  138.     echo `basename $0` version $version
  139.     echo "LILO version $major.$minor.$revision (or newer) is required."
  140.     exit 0
  141. fi
  142.  
  143. rm -rf $mount 2>/dev/null
  144.  
  145. #image=`cat /proc/cmdline | sed "s/.*BOOT_IMAGE=//" | sed "s/ .*//"`
  146. image=`$lilo -C $config -I " " D`
  147.  
  148. kernel=`$lilo -C $config -I $image i`
  149. if [ "$kernel" = "" ]; then exit 1;
  150. elif [ $debug = "true" ]; then echo kernel = "$kernel";
  151. fi
  152.  
  153. initrd=`$lilo -C $config -I $image r`
  154. if [ "$initrd" = "" ]; then exit 1;
  155. elif [ $debug = "true" ]; then echo initrd = "$initrd";
  156. fi
  157. if [ "$initrd" = "No initial ramdisk specified" ]; then initrd= ; fi
  158.  
  159. append=`$lilo -C $config -I $image a`
  160. if [ "$append" = "" ]; then exit 1;
  161. elif [ $debug = "true" ]; then echo append = \"$append\";
  162. fi
  163. if [ "$append" = "No append= was specified" ]; then append= ; fi
  164.  
  165. keymap=`$lilo -C $config -I $image k`
  166. if [ "$keymap" = "" ]; then exit 1;
  167. elif [ $debug = "true" ]; then echo keymap = "$keymap";
  168. fi
  169.  
  170. root=`mount | grep " on / type" | sed "s/ .*//"`
  171. if [ -z $root ]; then
  172.     echo "Cannot find mounted root partition"
  173.     echo "Using current root"
  174.     root=current
  175. fi
  176.  
  177.  
  178. while [ $# -gt 0 ]; do
  179.     case $1 in
  180.     --append)
  181.         shift
  182.         append=$1
  183.         ;;
  184.     --debug)
  185.         debug=true
  186.         ;;
  187.     --device)
  188.         shift
  189.         device=$1
  190.         ;;
  191.     --fast)
  192.         fast=fast
  193.         ;;
  194.     --fs)
  195.         shift
  196.         fs=$1
  197.         ;;
  198.     -h)
  199.         usage 0
  200.         ;;
  201.     --help)
  202.         usage 0
  203.         ;;
  204.     --initrd)
  205.         shift
  206.         initrd=$1
  207.         ;;
  208.     --install)
  209.         shift
  210.         install=$1
  211.         ;;
  212.     --iso)
  213.         isoimage=yes
  214.         ;;
  215.     --kernel)
  216.         shift
  217.         kernel=$1
  218.         ;;
  219.     --keymap)
  220.         shift
  221.         keymap=$1
  222.         ;;
  223.     --nocompact)
  224.         compact=
  225.         ;;
  226.     --noformat)
  227.         format=no
  228.         ;;
  229.     --root)
  230.         shift
  231.         root=$1
  232.         ;;
  233.     --size)
  234.         shift
  235.         size=$1
  236.         ;;
  237.     --version)
  238.         echo `basename $0` version $version
  239.         exit 0
  240.         ;;
  241.     *)
  242.         echo "unrecognized argument: " $1
  243.         usage 1
  244.         ;;
  245.     esac
  246.  
  247.     shift
  248. done
  249.  
  250. if [ $isoimage = yes ]; then
  251.     fast=fast
  252.     if [ $size = 0 ]; then
  253.     size=2880
  254.     fi
  255.     if [ $device = "/dev/fd0" ]; then
  256.     device=rescue.iso
  257.     fi
  258. else
  259.     umount $device 2>/dev/null 1>/dev/null
  260. fi
  261.  
  262. if [ $size = 0 ]; then
  263.     size=1440
  264. fi
  265.  
  266. if [ $size = 1200 ]; then
  267.     sects=15
  268. elif [ $size = 2880 ]; then
  269.     sects=36
  270.     install=menu
  271.     if [ -f $boot/diag1.img -a -f $boot/diag2.img ]; then
  272.     diag=yes
  273.     fi
  274. elif [ $size = 1440 ]; then
  275.     sects=18
  276. else
  277.     echo "--size must be 1200 or 1440; --size 1440 assumed."
  278.     sects=18
  279.     size=1440
  280. fi
  281.  
  282. if [ $fs != msdos -a $fs != ext2 -a $fs != minix ]; then
  283.     echo "illegal option:  --fs" $fs
  284.     echo "   must be either  msdos  or  ext2  or  minix"
  285.     exit 1
  286. fi
  287.  
  288. if [ $fs = msdos ]; then
  289.     mountconfig=$mount/lilo.cnf
  290. else
  291.     mountconfig=$mount/lilo.conf
  292. fi
  293.  
  294. if [ $debug = "true" ]; then
  295.     umount $mfile
  296.     echo lilo = $lilo
  297.     echo device = $device
  298.     echo image = $image
  299.     echo kernel = $kernel
  300.     echo initrd = $initrd
  301.     echo append = \"$append\"
  302.     echo install = $install
  303.     echo format = $format
  304.     echo fs = $fs
  305.     echo size = $size
  306.     echo root = $root
  307.     echo compact = $compact
  308.     echo keymap = $keymap
  309.     echo isoimage = $isoimage
  310.     echo master = $master
  311. fi
  312.  
  313. if [ ! -f $kernel ]; then
  314.     echo "Kernel file " $kernel " does not exist"
  315.     exit 1
  316. fi
  317.  
  318. if [ ! -z $initrd ]; then
  319.     if [ ! -f $initrd ]; then
  320.         echo "Initial ramdisk file " $initrd " does not exist"
  321.         exit 1
  322.     fi
  323. fi
  324.  
  325. if [ $isoimage != yes ]; then
  326.     echo ""
  327.     echo "Insert a blank floppy into $device"
  328.     echo "All information on this floppy will be destroyed"
  329.     echo "Press [Enter] to proceed, ^C to abort"
  330.     read aline
  331. fi
  332.  
  333. if [ "$fast" = fast ]; then
  334.  
  335.     rm -rf $mount $mfile
  336.     mkdir $mount
  337.     dd bs=1024 count=$size of=$mfile if=/dev/zero
  338.     echo Making filesystem
  339.     if [ "$fs" = ext2 ]; then
  340.         echo y | mkfs.$fs -N 24 -b 1024 $mfile $size
  341.     else
  342.         echo y | mkfs.$fs $mfile
  343.     fi
  344.     echo Mounting filesystem
  345.     mount -t $fs -o rw,loop $mfile $mount
  346.     if [ $debug = true ]; then
  347.         mount
  348.     fi
  349.     loopback=`mount | grep $mfile | sed -e "sX.*loop=/dev/XX" -e "s/).*//"`
  350.     disk="/dev/$loopback"
  351.     if [ $debug = true ]; then
  352.         echo "disk=$disk"
  353.     fi
  354.  
  355. else
  356.  
  357.     if [ "$format" = "yes" ]; then
  358.         echo Formatting $device with $fs filesystem...
  359.         dd of=$device if=/dev/zero bs=512 count=1
  360.         if [ "$fs" = ext2 ]; then
  361.             mkfs -t $fs -N 24 -b 1024 $device 1>/dev/null 2>/dev/null
  362.         else
  363.             mkfs -t $fs $device 1>/dev/null 2>/dev/null
  364.         fi
  365.         echo done.
  366.         echo ""
  367.     fi
  368.  
  369.     rm -rf $mount
  370.     mkdir $mount
  371.     mount -t $fs -o rw $device $mount
  372.  
  373.     rm -rf $mount/*
  374.     disk=$device
  375.  
  376. fi
  377.  
  378. cat > $mountconfig <<EOF
  379. #  Begin mkrescue $version configuration file
  380. install=$install
  381. boot=$device
  382. map=map
  383. backup=/dev/null
  384. message=message
  385. prompt
  386. timeout=150
  387. nowarn
  388. geometric
  389. disk=$disk bios=0x00
  390.   sectors=$sects heads=2 cylinders=80
  391. EOF
  392. if [ "$master" != "" -a $isoimage = yes ]; then
  393.     echo "disk=$master" >>$mountconfig
  394.     echo "  bios=0x80" >>$mountconfig
  395. elif [ "$master" != "" -a $debug = true ]; then
  396.     echo "disk=$master" >>$mountconfig
  397.     echo "  bios=0x80 inaccessible" >>$mountconfig
  398. fi
  399.  
  400. if [ $keymap != us.ktl ]; then 
  401.     echo "keytable=lang.ktl" >>$mountconfig
  402. fi
  403.  
  404. if [ $isoimage = yes ]; then 
  405.     echo "el-torito-bootable-CD" >>$mountconfig
  406. fi
  407.  
  408. echo " " >>$mountconfig
  409. echo "image=linux" >>$mountconfig
  410.  
  411. if [ ! -z $initrd ]; then
  412.     echo "  initrd=initrd" >>$mountconfig
  413. fi
  414.  
  415. if [ ! -z "$append" ]; then
  416.     echo "  append=\"$append\"" >>$mountconfig
  417. fi
  418.  
  419. cat >> $mountconfig <<EOF
  420.   root=$root
  421.   read-only
  422. EOF
  423.  
  424. if [ "$master" != "" -a $size = 2880 ]; then
  425. cat >> $mountconfig <<EOF
  426. other=$master
  427.   unsafe
  428.   label=hard_disk
  429. EOF
  430. fi
  431.  
  432. if [ "$diag" = yes ]; then
  433. cp -pv $boot/diag1.img $mount
  434. cp -pv $boot/diag2.img $mount
  435. cat >> $mountconfig <<EOF
  436. image=diag1.img
  437.   label=diagnostic_1
  438. image=diag2.img
  439.   label=diagnostic_2
  440. EOF
  441. fi
  442. echo >>$mountconfig "#  End of mkrescue-generated configuration file"
  443.  
  444. if [ $isoimage = yes ]; then
  445.     comment="El-Torito bootable-CD will boot at end of timeout"
  446. else
  447.     comment="floppy will boot in 15 seconds"
  448. fi
  449.  
  450. cat > $mount/message <<EOF
  451.  
  452. MKRESCUE version $version $comment
  453. Use  "boot: linux <options>"  to enter kernel options
  454. The root device is currently configured as  root=$root
  455.  
  456. EOF
  457. echo `uname --sysname` `uname --release` > $mount/$(uname --release)
  458.  
  459. sync
  460.  
  461. if [ $debug = true ]; then
  462.     echo ""
  463.     echo "pause after writing lilo.conf & message ..."
  464.     read aline
  465. fi
  466.  
  467. echo "Copying files..."
  468. if [ $keymap != us.ktl ]; then 
  469.     cp -pv $keymap $mount/lang.ktl
  470. fi
  471.  
  472. if [ ! -z $initrd ]; then
  473.     cp -pv $initrd $mount/initrd
  474. fi
  475.  
  476. cp -pv $kernel $mount/linux
  477. sync
  478.  
  479. echo "done."
  480. echo ""
  481.  
  482.  
  483.  
  484. log=$(pwd)/mkrescue.log
  485. pushd $mount >/dev/null 2>/dev/null
  486. if [ "$fast" = fast ]; then
  487.     bootcmd="-b /dev/$loopback"
  488. fi
  489.  
  490. echo Running $lilo ...
  491. if [ $debug = true ]; then
  492.  echo    $lilo -w+ -C $mountconfig $compact $bootcmd -v5 ">$log"
  493.     $lilo -w+ -C $mountconfig $compact $bootcmd -v5 >$log || fast=error
  494. else
  495.     $lilo -C $mountconfig $compact $bootcmd || fast=error
  496. fi
  497. popd >/dev/null 2>/dev/null
  498. if [ "$fast" = error ]; then
  499.     echo lilo failure.
  500. else
  501.     echo done.
  502. fi
  503. echo ""
  504.  
  505. umount $mount
  506.  
  507. if [ $fast = error ]; then
  508.     rm -rf $mount
  509.     exit 1
  510. fi
  511.  
  512. if [ $isoimage = yes ]; then
  513.     echo MKISOFS
  514.     out=$device
  515.     mv $mfile $mount/boot.bin
  516.     mkisofs -J -R -T \
  517.         -V LILO_BOOT -A "Linux Boot CD created by LILO mkrescue" \
  518.         -b boot.bin -c boot.cat -o $out $mount
  519.     cat <<EOF
  520.  
  521. END MKISOFS:  output is in  '$device'
  522.  
  523.  
  524. The bootable CD can be burned with the 'cdrecord' utility
  525. using a command of the form:
  526.  
  527.     cdrecord [<options>] [dev=<device>] $device
  528.  
  529. EOF
  530. elif [ "$fast" = fast ]; then
  531.     dd if=$mfile of=$device bs=1024
  532. fi
  533.  
  534. if [ $debug != true ]; then 
  535.     rm -f $mfile
  536. fi
  537.  
  538. echo "All done."
  539. echo ""
  540. exit 0
  541.