home *** CD-ROM | disk | FTP | other *** search
/ PC World 2000 February / PCWorld_2000-02_cd.bin / live / usr / sbin / liloconfig < prev    next >
Text File  |  1999-02-02  |  7KB  |  208 lines

  1. #!/usr/bin/perl
  2. #
  3. # /usr/sbin/liloconfig    configure lilo automatically
  4. #
  5. # Author:    Bruce Perens <bruce@Pixar.com>
  6. # Maintainer:    Bernd Eckenfels <ecki@debian.org>
  7. #
  8. # Updated on 1999/01/24 -- Vincent Renardias <vincent@ldsol.com>
  9. #  - never return 0 on error.
  10. #  - updated the template to produce a more helpfull (commentwise)
  11. #      resulting lilo.conf
  12. #
  13. # This script is from Bruce's debian.postinst and need to be more
  14. # intelligent. It should be possible to install lilo in the MBR, too.
  15. #
  16.  
  17. $|=1;
  18.  
  19. if ( ! (-f "/etc/fstab") ) {
  20.     print "Huh, bad karma: file /etc/fstab is missing!\n";
  21.     exit(1);
  22. }
  23. print "LILO, the LInux LOader, sets up your system to boot Linux directly\n";
  24. print "from your hard disk, without the need for a boot floppy.\n";
  25.  
  26. @header = (
  27.     "# Generated by liloconfig\n",
  28.     "\n",
  29.     "# Specifies the boot device\n"
  30.     );
  31.  
  32. @rootheader = (
  33.     "\n",
  34.     "# Specifies the device that should be mounted as root.\n",
  35.     "# If the special name CURRENT is used, the root device is set to the\n",
  36.     "# device on which the root file system is currently mounted. If the root\n",
  37.     "# has been changed with  -r , the respective device is used. If the\n",
  38.     "# variable ROOT is omitted, the root device setting contained in the\n",
  39.     "# kernel image is used. It can be changed with the rdev program.\n"
  40.     );
  41.  
  42. @boilerplate = (
  43.     "\n",
  44.     "# Enables map compaction:\n",
  45.     "# Tries to merge read requests for adjacent sectors into a single\n",
  46.     "# read request. This drastically reduces load time and keeps the map\n",
  47.     "# smaller. Using COMPACT is especially recommended when booting from a\n",
  48.     "# floppy disk.\n",
  49.     "compact\n",
  50.     "\n",
  51.     "# Install the specified file as the new boot sector.\n",
  52.     "# If INSTALL is omitted, /boot/boot.b is used as the default.\n",
  53.     "install=/boot/boot.b\n",
  54.     "\n",
  55.     "# Specifies the number of _tenths_ of a second LILO should\n",
  56.     "# wait before booting the first image.  LILO\n",
  57.     "# doesn't wait if DELAY is omitted or if DELAY is set to zero.\n",
  58.     "delay=20\n",
  59.     "\n",
  60.     "# Specifies the location of the map file. If MAP is\n",
  61.     "# omitted, a file /boot/map is used.\n",
  62.     "\nmap=/boot/map\n",
  63.     "\n",
  64.     "# Specifies the VGA text mode that should be selected when\n",
  65.     "# booting. The following values are recognized (case is ignored):\n",
  66.     "#   NORMAL  select normal 80x25 text mode.\n",
  67.     "#   EXTENDED  select 80x50 text mode. The word EXTENDED can be\n",
  68.     "#     abbreviated to EXT.\n",
  69.     "#   ASK  stop and ask for user input (at boot time).\n",
  70.     "#   <number>  use the corresponding text mode. A list of available modes\n",
  71.     "#     can be obtained by booting with  vga=ask  and pressing [Enter].\n",
  72.     "vga=normal\n",
  73.     "\n",
  74.     "image=/vmlinuz\n",
  75.     "    label=Linux\n",
  76.     "    read-only\n",
  77.     "\n",
  78.     "# If you have another OS on this machine (say DOS),\n",
  79.     "# you can boot if by uncommenting the following lines\n",
  80.     "# (Of course, change /dev/hda2 to wherever your DOS partition is.)\n",
  81.     "# other=/dev/hda2\n",
  82.     "#   label=dos\n",
  83.     "\n"
  84. );
  85.  
  86. sub asky {
  87.     print @_,"? [Yes] ";
  88.     $answer=<STDIN>;
  89.     return ( !($answer =~ /^[nN].*/) );
  90. }
  91.  
  92. sub askn {
  93.     print @_,"? [No] ";
  94.     $answer=<STDIN>;
  95.     return ( $answer =~ /^[yY].*/ );
  96. }
  97.  
  98. system('grep -qv "^#" /etc/lilo.conf');
  99. if ( $? == 0 ) {
  100.     # Trust and use the existing lilo.conf.
  101.     # FIX: If the current lilo.conf installs a master boot record, ask
  102.     #    to edit it to a partition boot record and install the master boot
  103.     #    record to chain to that.
  104.     print "\n";
  105.     print "You already have a LILO configuration in the file /etc/lilo.conf\n";
  106.     if ( &asky("Install a boot block using your current LILO configuration") ) {
  107.         print "\nchecking your /etc/lilo.conf for incompatible options...\n\n";
  108.         system('egrep "^[^#]*any_" /etc/lilo.conf');
  109.         if ( $? == 0 ) {
  110.             print "WARNING: You have an old incompatible Configuration Line\n";
  111.             print "         Read the File /usr/doc/lilo/INCOMPAT.gz and restart\n";
  112.             print "         /sbin/lilo to write the changes to your boot sectors\n\n";
  113.             exit(1);
  114.         } else {
  115.             print "WARNING: Even if lilo runs successfully, see /usr/doc/lilo/INCOMPAT.gz\n";
  116.                         print "         for changes in the usage of the /etc/lilo.conf file.\n";
  117.             print "         If needed: edit /etc/lilo.conf and rerun '/sbin/lilo -v'\n\n";
  118.         }
  119.         print "Running lilo\n";
  120.         system("/sbin/lilo -v") || exit(0);
  121.         print "\nERROR: correct /etc/lilo.conf manually and rerun /sbin/lilo\n\n";
  122.         exit(1);
  123.     }
  124.     else {
  125.         print "\n";
  126.         if ( &askn("Wipe out your old LILO configuration and make a new one") ) {
  127.             print "Saving configuration in /etc/lilo.conf.OLD\n";
  128.             rename("/etc/lilo.conf", "/etc/lilo.conf.OLD");
  129.         }
  130.         else {
  131.             print "No changes made.\n";
  132.             exit(0);
  133.         }
  134.     }
  135. }
  136.  
  137. # Create a lilo.conf if one doesn't exist.
  138. open(FSTAB, "</etc/fstab");
  139. while ( $line=<FSTAB> ) {
  140.     if ( $line =~ m/^\#/ ) {
  141.         next;
  142.     }
  143.     ($device,$filesystem)=split(/[ \t]+/, $line);
  144.     if ( $filesystem =~ m:^/$: ) {
  145.         last;
  146.     }
  147. }
  148. if ( ! $filesystem =~ m:^/$: ) {
  149.     exit(0);
  150. }
  151.  
  152. $disk = $device;
  153. $disk =~ s/[0-9]+$//;
  154. $partition = $device;
  155. $partition =~ s/$disk//;
  156.  
  157. print "\n";
  158. print "You must do three things to make the Linux system boot from the\n";
  159. print "hard disk. Install a partition boot record, install a master boot\n";
  160. print "record, and set the partition active. You'll be asked to perform\n";
  161. print "each of these tasks. You may skip any or all of them, and perform\n";
  162. print "them manually later on.\n";
  163. print "\n";
  164. if ( &asky("Install a partition boot record to boot Linux from ", $device)) {
  165.     print "Creating small lilo.conf and running lilo.\n";
  166.     umask(022);
  167.     open(CONF, ">/etc/lilo.conf");
  168.     chown(0, 0, "/etc/lilo.conf");
  169.     print CONF @header, "boot=".$device, "\n", @rootheader, "root=".$device, "\n", @boilerplate;
  170.     close(CONF);
  171.     system("/sbin/lilo") || exit(0);
  172.     print "\nERROR: correct /etc/lilo.conf manually and rerun /sbin/lilo\n\n";
  173.     exit(1);
  174. }
  175. print "\n";
  176. print "A master boot record is required to run the paritition boot record.\n";
  177. print "If you are already using a boot manager, and want to keep it,\n";
  178. print "answer \"no\" to the following question. If you don't know\n";
  179. print "what a boot manager is or whether you have one, answer \"yes\".\n";
  180.  
  181. if ( &askn("Install a master boot record on ", $disk) ) {
  182.     print "Installing MBR on $disk\n";
  183.     system("dd if=/boot/mbr.b of=$disk bs=444 count=1");
  184. }
  185. print "\n";
  186. print "The master boot record will boot the active partition.\n";
  187. print "If you want your system to boot another operating system,\n";
  188. print "such as DOS or Windows, by default, answer \"no\" to the following\n";
  189. print "question. You may still use your boot manager or the master\n";
  190. print "boot record to boot Linux. If you want the system to boot Linux.\n";
  191. print "by default, answer \"yes\".\n";
  192.  
  193. if ( &asky("Make ", $device, " the active partition") ) {
  194.     print "Activating Partition $partition on disk $disk.\n";
  195.     system("/sbin/activate $disk $partition");
  196. }
  197. else {
  198.     print "\n";
  199.     print "OK. If you installed the master boot record, and the partition\n";
  200.     print "boot record, you may boot Linux by holding down the shift key\n";
  201.     print "as the system boots, and then pressing the $partition key\n";
  202.     print "when you see the \"1234F:\" prompt.\n";
  203.     print "";
  204.     print "For more information, see /usr/doc/mbr/README, and the files\n";
  205.     print "in the /usr/doc/lilo directory.\n";
  206. }
  207. exit(0);
  208.