#!/bin/sh # # Copyright 1994, 1998, 1999 Patrick Volkerding, Moorhead, Minnesota USA # Copyright 2002, 2003 Slackware Linux, Inc, Concord, CA # Copyright 2007, 2008, 2011, 2013, 2018, 2020, 2024 Patrick Volkerding, Sebeka, Minnesota, USA # All rights reserved. # # Redistribution and use of this script, with or without modification, is # permitted provided that the following conditions are met: # # 1. Redistributions of this script must retain the above copyright # notice, this list of conditions and the following disclaimer. # # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED # WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF # MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO # EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; # OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR # OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF # ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # TMP=/var/log/setup/tmp CONSOLETYPE=standard unset UTFVT # Most of the time LILO is not used on UEFI machines (in fact, it is useless # unless the machine is running in legacy BIOS mode). So, we'll detect if # this is a machine running UEFI and suggest skipping LILO installation. # We'll still allow it if the user wants it, though. It won't hurt anything, # and might be useful for booting in Legacy BIOS mode later. if [ -d /sys/firmware/efi ]; then dialog --title "UEFI FIRMWARE DETECTED" \ --backtitle "LILO (Linux Loader) installation" \ --menu \ "Since LILO (the traditional Linux Loader) does not work with machines \ running UEFI firmware (except in Legacy BIOS mode), you probably do not \ need to install it. Instead, you'll need ELILO, which is a version of \ LILO designed to work with EFI/UEFI systems." \ 12 70 2 \ "skip" "Skip installing LILO and proceed to ELILO installation" \ "install" "Install LILO anyway" 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then exit fi REPLY="$(cat $TMP/reply)" rm -f $TMP/reply if [ "$REPLY" = "skip" ]; then exit fi fi # Set the OS root directory (called T_PX for some unknown reason). # If an argument is given to this script and it is a directory, it # is taken to be the root directory. First though, we check for a # directory named $T_PX, and that gets the first priority. if [ ! -d "$T_PX" ]; then if [ ! "$1" = "" ]; then if [ -d "$1" ]; then T_PX="$1" fi else # Are we on the installer image? if [ -r /usr/lib/setup/SeTpartitions ]; then T_PX=/mnt # Or, are we on a running system? elif [ -r /etc/slackware-version ]; then T_PX=/ # One more installer-likely thing: elif [ -r /usr/lib/setup/setup ]; then T_PX=/mnt else # We will have to assume we're on an installed and running system. T_PX=/ fi fi fi # If os-prober is availible, we will use it to filter out unbootable # FAT/NTFS partitions. If it is not availble, we'll use /bin/true # instead to avoid filtering. if which os-prober > /dev/null ; then OSPROBER=os-prober else OSPROBER=true fi # Determine LILO documentation directory: LILODOCDIR="$(ls -d $T_PX/usr/doc/lilo-* 2> /dev/null | tail -n 1)" if [ ! -d "$LILODOCDIR" ]; then LILODOCDIR="/usr/doc/lilo/" fi # If there's no boot_message.txt, start the header for one now: if [ ! -r $T_PX/boot/boot_message.txt ]; then cat << EOF > $T_PX/boot/boot_message.txt Welcome to the LILO Boot Loader! Please enter the name of the partition you would like to boot at the prompt below. The choices are: EOF fi # The default install location may be set here: DEFAULT=" --default-item MBR " # This is a different 'probe' than the function below. PROBE() { if [ -x /sbin/probe ]; then /sbin/probe -c else # use fdisk directly: fdisk -l 2> /dev/null | sed -e "s/Linux filesystem/Linux/g" fi } # Function to ask if the Slackware logo boot screen should be used. ask_boot_splash() { dialog --title "OPTIONAL SLACKWARE LOGO BOOT SCREEN" \ --yesno \ "Would you like to use a boot screen with the Slackware logo \ against a black background? If you answer no here, the standard \ LILO menu will be used.\n\ " 7 65 2> $TMP/reply RETVAL=$? return $RETVAL } boot_bmp() { cat << EO_BMP # Boot BMP Image. # Bitmap in BMP format: 640x480x8 bitmap = /boot/slack.bmp # Menu colors (foreground, background, shadow, highlighted # foreground, highlighted background, highlighted shadow): bmp-colors = 255,0,255,0,255,0 # Location of the option table: location x, location y, number of # columns, lines per column (max 15), "spill" (this is how many # entries must be in the first column before the next begins to # be used. We don't specify it here, as there's just one column. bmp-table = 60,6,1,16 # Timer location x, timer location y, foreground color, # background color, shadow color. bmp-timer = 65,27,0,255 EO_BMP } # Menu to check if we want to use VESA framebuffer support: use_framebuffer() { if cat /proc/devices | grep "29 fb" 1> /dev/null ; then dialog --title "CONFIGURE LILO TO USE FRAME BUFFER CONSOLE?" \ --default-item standard \ --menu "Looking at /proc/devices, it seems your kernel has support for \ the VESA frame buffer console. If we enable this in /etc/lilo.conf, it \ will allow more rows and columns of text on the screen and give you a cool \ penguin logo at boot time. However, the frame buffer text console is \ slower than a standard text console. In addition, not every video card \ or monitor supports all of these video modes, and some X drivers could be \ confused by them. Would you like to use the frame buffer console, \ or the standard Linux console?" 0 0 0 \ "standard" "Use the standard Linux console (the safe choice)" \ "ask" "Ask about using VESA modes at boot; time out to standard" \ "640x480x64k" "Frame buffer console, 640x480x64k" \ "800x600x64k" "Frame buffer console, 800x600x64k" \ "1024x768x64k" "Frame buffer console, 1024x768x64k" \ "640x480x32k" "Frame buffer console, 640x480x32k" \ "800x600x32k" "Frame buffer console, 800x600x32k" \ "1024x768x32k" "Frame buffer console, 1024x768x32k" \ "640x480x256" "Frame buffer console, 640x480x256" \ "800x600x256" "Frame buffer console, 800x600x256" \ "1024x768x256" "Frame buffer console, 1024x768x256" \ 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then exit fi # Frame buffer modes above 1024x768 look terrible except # on LCD panels, and 32 bit color is slow. Since we don't # even need to run a framebuffer console to run framebuffer # X anymore, these modes aren't of much real use. # "1280x1024x256" "Frame buffer console, 1280x1024x256" \ # "1600x1200x256" "Frame buffer console, 1600x1200x256" \ # "1280x1024x32k" "Frame buffer console, 1280x1024x32k" \ # "1600x1200x32k" "Frame buffer console, 1600x1200x32k" \ # "1280x1024x64k" "Frame buffer console, 1280x1024x64k" \ # "1600x1200x64k" "Frame buffer console, 1600x1200x64k" \ # "640x480x16m" "Frame buffer console, 640x480x16.8m" \ # "800x600x16m" "Frame buffer console, 800x600x16.8m" \ # "1024x768x16m" "Frame buffer console, 1024x768x16.8m" \ # "1280x1024x16m" "Frame buffer console, 1280x1024x16.8m" \ # "1600x1200x16m" "Frame buffer console, 1600x1200x16.8m" CONSOLETYPE="$(cat $TMP/reply)" if [ "$CONSOLETYPE" = "1600x1200x16m" ]; then CONSOLENUM=799 elif [ "$CONSOLETYPE" = "1600x1200x64k" ]; then CONSOLENUM=798 elif [ "$CONSOLETYPE" = "1600x1200x32k" ]; then CONSOLENUM=797 elif [ "$CONSOLETYPE" = "1600x1200x256" ]; then CONSOLENUM=796 elif [ "$CONSOLETYPE" = "1280x1024x16m" ]; then CONSOLENUM=795 elif [ "$CONSOLETYPE" = "1280x1024x64k" ]; then CONSOLENUM=794 elif [ "$CONSOLETYPE" = "1280x1024x32k" ]; then CONSOLENUM=793 elif [ "$CONSOLETYPE" = "1280x1024x256" ]; then CONSOLENUM=775 elif [ "$CONSOLETYPE" = "1024x768x16m" ]; then CONSOLENUM=792 elif [ "$CONSOLETYPE" = "1024x768x64k" ]; then CONSOLENUM=791 elif [ "$CONSOLETYPE" = "1024x768x32k" ]; then CONSOLENUM=790 elif [ "$CONSOLETYPE" = "1024x768x256" ]; then CONSOLENUM=773 elif [ "$CONSOLETYPE" = "800x600x16m" ]; then CONSOLENUM=789 elif [ "$CONSOLETYPE" = "800x600x64k" ]; then CONSOLENUM=788 elif [ "$CONSOLETYPE" = "800x600x32k" ]; then CONSOLENUM=787 elif [ "$CONSOLETYPE" = "800x600x256" ]; then CONSOLENUM=771 elif [ "$CONSOLETYPE" = "640x480x16m" ]; then CONSOLENUM=786 elif [ "$CONSOLETYPE" = "640x480x64k" ]; then CONSOLENUM=785 elif [ "$CONSOLETYPE" = "640x480x32k" ]; then CONSOLENUM=784 elif [ "$CONSOLETYPE" = "640x480x256" ]; then CONSOLENUM=769 fi fi } # A function to ask for append= parameters. ask_append() { dialog --title "OPTIONAL LILO append=\"\" LINE" --inputbox \ "Some systems might require extra parameters to be passed to the kernel. \ If you needed to pass parameters to the kernel when you booted the Slackware \ bootdisk, you'll probably want to enter the same ones here. Most \ systems won't require any extra parameters. If you don't need any, just \ hit ENTER to continue.\n\ " 12 72 2> $TMP/reply RETVAL=$? return $RETVAL } # This function scans for bootable partitions (making some assumptions along # the way which may or may not be correct, but usually work), and sets up # LILO in either the superblock, or the MBR. simplelilo() { use_framebuffer; ask_append; if [ $? = 1 -o $? = 255 ]; then APPEND="" fi APPEND="$(cat $TMP/reply)" # If we got here, we either don't have boot manager or don't want to use it # Note 3/2018: or OS/2 Boot Manager cruft was removed ;-) dialog --title "SELECT LILO DESTINATION" $DEFAULT --menu \ "LILO can be installed to a variety of places:\n\ \n\ 1. The superblock of your root Linux partition. (which could\n\ be made the bootable partition with Windows or Linux fdisk, or\n\ booted with a program like OS/2 Boot Manager)\n\ 2. A formatted floppy disk.\n\ 3. The Master Boot Record of your first hard drive.\n\ \n\ Options 1 and 2 are the safest, but option 1 does require a little\n\ extra work later (setting the partition bootable with fdisk).\n\ Which option would you like?" \ 20 72 3 \ "Root" "Install to superblock (not for use with XFS)" \ "Floppy" "Install to a formatted floppy in /dev/fd0 (A:)" \ "MBR" "Install to Master Boot Record" \ 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then exit fi TG="$(cat $TMP/reply)" rm -r $TMP/reply dialog --infobox "\nScanning partitions and generating /etc/lilo.conf..." 5 57 sleep 1 if [ "$TG" = "MBR" ]; then MBR_TARGET=/dev/sda echo $MBR_TARGET > $TMP/LILOMBR cat /proc/partitions | while read LINE ; do MAJOR="$(echo $LINE | cut -f 1 -d ' ')" MINOR="$(echo $LINE | cut -f 2 -d ' ')" if [ ! "$MINOR" = "0" -a ! "$MINOR" = "64" ]; then # ignore whole devices to weed out CD drives if [ "$MAJOR" = "3" ]; then MBR_TARGET=/dev/hda echo $MBR_TARGET > $TMP/LILOMBR elif [ "$MAJOR" = "22" -a ! "$MBR_TARGET" = "/dev/hda" ]; then MBR_TARGET=/dev/hdc echo $MBR_TARGET > $TMP/LILOMBR elif [ "$MAJOR" = "33" -a ! "$MBR_TARGET" = "/dev/hda" -a ! "$MBR_TARGET" = "/dev/hdc" ]; then MBR_TARGET=/dev/hde echo $MBR_TARGET > $TMP/LILOMBR elif [ "$MAJOR" = "34" -a ! "$MBR_TARGET" = "/dev/hda" -a ! "$MBR_TARGET" = "/dev/hdc" -a ! "$MBR_TARGET" = "/dev/hde" ]; then MBR_TARGET=/dev/hdg echo $MBR_TARGET > $TMP/LILOMBR elif [ "$MAJOR" = "259" -a ! "$MBR_TARGET" = "/dev/hda" -a ! "$MBR_TARGET" = "/dev/hdc" -a ! "$MBR_TARGET" = "/dev/hde" -a ! "$MBR_TARGET" = "/dev/hdg" ]; then if [ "$(echo $LINE | cut -f 4 -d ' ' | cut -b 1-4)" = "nvme" ]; then MBR_TARGET="/dev/$(echo $LINE | cut -f 4 -d ' ' | cut -f 1 -d p)" echo $MBR_TARGET > $TMP/LILOMBR fi fi if dmidecode 2> /dev/null | grep -q QEMU 2> /dev/null ; then if [ -r /dev/vda ]; then MBR_TARGET=/dev/vda echo $MBR_TARGET > $TMP/LILOMBR fi fi fi done LILO_TARGET=$(cat $TMP/LILOMBR) elif [ "$TG" = "Root" ]; then LILO_TARGET=$(echo $ROOT_DEVICE) elif [ "$TG" = "Floppy" ]; then LILO_TARGET="/dev/fd0" fi cat << EOF > $T_PX/etc/lilo.conf # LILO configuration file # generated by 'liloconfig' # # Start LILO global section EOF #if [ ! "$APPEND" = "" -o ! "$UTFVT" = "" ]; then echo "# Append any additional kernel parameters:" >> $T_PX/etc/lilo.conf echo "append=\"$APPEND $UTFVT\"" >> $T_PX/etc/lilo.conf echo >> $T_PX/etc/lilo.conf #fi if echo $LILO_TARGET | grep -q vda 2>/dev/null ; then echo "disk = /dev/vda bios=0x80 max-partitions=7" >> $T_PX/etc/lilo.conf fi cat << EOF >> $T_PX/etc/lilo.conf boot = $LILO_TARGET # This option loads the kernel and initrd much faster: compact # Boot BMP Image. # Bitmap in BMP format: 640x480x8 bitmap = /boot/slack.bmp # Menu colors (foreground, background, shadow, highlighted # foreground, highlighted background, highlighted shadow): bmp-colors = 255,0,255,0,255,0 # Location of the option table: location x, location y, number of # columns, lines per column (max 15), "spill" (this is how many # entries must be in the first column before the next begins to # be used. We don't specify it here, as there's just one column. bmp-table = 60,6,1,16 # Timer location x, timer location y, foreground color, # background color, shadow color. bmp-timer = 65,27,0,255 # Standard menu. # Or, you can comment out the bitmap menu above and # use a boot message with the standard menu: #message = /boot/boot_message.txt # Wait until the timeout to boot (if commented out, boot the # first entry immediately): prompt # Timeout before the first entry boots. # This is given in tenths of a second, so 600 for every minute: timeout = 1200 # Override dangerous defaults that rewrite the partition table: change-rules reset EOF if [ $CONSOLETYPE = standard ]; then cat << EOF >> $T_PX/etc/lilo.conf # Normal VGA console vga = normal # Ask for video mode at boot (time out to normal in 30s) #vga = ask EOF elif [ $CONSOLETYPE = ask ]; then cat << EOF >> $T_PX/etc/lilo.conf # Ask for video mode at boot (time out to normal in 30s) vga = ask # Normal VGA console #vga = normal EOF else cat << EOF >> $T_PX/etc/lilo.conf # VESA framebuffer console @ $CONSOLETYPE vga = $CONSOLENUM # Normal VGA console #vga = normal # Ask for video mode at boot (time out to normal in 30s) #vga = ask EOF fi cat << EOF >> $T_PX/etc/lilo.conf # VESA framebuffer console @ 1024x768x64k #vga=791 # VESA framebuffer console @ 1024x768x32k #vga=790 # VESA framebuffer console @ 1024x768x256 #vga=773 # VESA framebuffer console @ 800x600x64k #vga=788 # VESA framebuffer console @ 800x600x32k #vga=787 # VESA framebuffer console @ 800x600x256 #vga=771 # VESA framebuffer console @ 640x480x64k #vga=785 # VESA framebuffer console @ 640x480x32k #vga=784 # VESA framebuffer console @ 640x480x256 #vga=769 EOF cat << EOF >> $T_PX/etc/lilo.conf # End LILO global section EOF # OK, now let's look for Windows partitions: # If we have os-prober, use the Windows partition list from that: if which os-prober > /dev/null ; then DOSP="$(os-prober 2> /dev/null | grep :Windows: | cut -f 1 -d :)" else # use PROBE output: DOSP="$(PROBE -l | grep "DOS Win W95 FAT12 FAT16 HPFS" | grep -v "Ext'd" | grep -v "Extend" | sort )" DOSP="$(echo $DOSP | cut -f 1 -d ' ')" fi if [ ! "$DOSP" = "" ]; then TABLE="$(echo $DOSP | cut -b1-8)" cat << EOF >> $T_PX/etc/lilo.conf # Windows bootable partition config begins other = $DOSP label = Windows table = $TABLE # Windows bootable partition config ends EOF echo "Windows - (Windows FAT/NTFS partition)" >> $T_PX/boot/boot_message.txt fi # Next, we search for Linux partitions: LNXP="$(PROBE -l | grep "Linux$")" LNXP="$(echo $LNXP | cut -f 1 -d ' ' | sort)" if [ ! "$LNXP" = "" ]; then if [ -z "$INITRD" ]; then cat << EOF >> $T_PX/etc/lilo.conf # Linux bootable partition config begins image = $KERNEL root = $ROOT_DEVICE label = Linux read-only # Partitions should be mounted read-only for checking # Linux bootable partition config ends EOF else cat << EOF >> $T_PX/etc/lilo.conf # Linux bootable partition config begins image = $KERNEL initrd = $INITRD root = $ROOT_DEVICE label = Linux read-only # Partitions should be mounted read-only for checking # Linux bootable partition config ends EOF fi echo "Linux - (Linux partition)" >> $T_PX/boot/boot_message.txt fi # DEAD CODE, BUT IN CASE OS/2 MAKES A COMEBACK! # # OK, hopefully we can remember how to deal with OS/2 :^) # OS2P="$(PROBE -l | grep "HPFS")" # OS2P="$(echo $OS2P | cut -f 1 -d ' ' | sort)" # if [ ! "$OS2P" = "" ]; then # TABLE="$(echo $OS2P | cut -b1-8)" # if [ "$TABLE" = "/dev/hda" ]; then # cat << EOF >> $T_PX/etc/lilo.conf ## OS/2 bootable partition config begins #other = $OS2P # label = OS2 # table = $TABLE ## OS/2 bootable partition config ends #EOF # else # cat << EOF >> $T_PX/etc/lilo.conf ## OS/2 bootable partition config begins #other = $OS2P # label = OS2 # table = $TABLE # loader = /boot/os2_d.b ## map-drive = 0x80 ## to = 0x81 ## map-drive = 0x81 ## to = 0x80 ## OS/2 bootable partition config ends #EOF # echo "OS2 - OS/2 Warp (HPFS partition)" >> $T_PX/boot/boot_message.txt # fi # fi echo >> $T_PX/boot/boot_message.txt # Done, now we must install lilo: installcolor; } checkp_text() { if [ ! -r $1 ]; then echo echo "I can't find a device named '$1'!" echo echo -n "Are you sure you want to use this device name [y]es, [n]o? " read use_device; if [ ! "$use_device" = "y" ]; then return 1; fi return 0; fi } checkp_dialog() { if [ ! -r $1 ]; then dialog --title "DEVICE FILE NOT FOUND" --yesno "I can't find a \ device named '$1'. Are you sure you want to use this device \ name?" 7 60 return $?; fi } checkbootsplash() { if [ "$(uname -m)" = "x86_64" ]; then if [ -r $LILODOCDIR/sample/slack64.bmp ]; then cp -a $LILODOCDIR/sample/slack64.bmp /boot/slack.bmp fi else if [ -r $LILODOCDIR/sample/slack.bmp ]; then cp -a $LILODOCDIR/sample/slack.bmp /boot/slack.bmp fi fi if [ -r $HOME/1337 ]; then if [ -r $LILODOCDIR/sample/sl1337.bmp ]; then cp -a $LILODOCDIR/sample/sl1337.bmp /boot/slack.bmp fi fi # Mayan calendar easter egg if [ "$(date "+%Y%m%d")" = "20121221" ]; then if [ -r $LILODOCDIR/sample/slack14.0.2012.bmp ]; then cp -a $LILODOCDIR/sample/slack14.0.2012.bmp /boot/slack.bmp fi fi } installcolor() { checkbootsplash; dialog --infobox "\nInstalling the Linux Loader..." 5 35 if [ "$T_PX" = "/" ]; then lilo 1> /dev/null 2> /etc/lilo-error.$$ SUCCESS=$? else lilo -r $T_PX -m /boot/map -C /etc/lilo.conf 1> /dev/null 2> /etc/lilo-error.$$ SUCCESS=$? fi if [ ! "$SUCCESS" = "0" ]; then # edit file to try lba32 mode: cat $T_PX/etc/lilo.conf | while read line ; do echo $line if [ "$line" = "# Start LILO global section" ] ; then echo "lba32 # Allow booting past 1024th cylinder with a recent BIOS" fi done > $T_PX/etc/lilo.conf.lba32 mv $T_PX/etc/lilo.conf.lba32 $T_PX/etc/lilo.conf if [ "$T_PX" = "/" ]; then lilo 1> /dev/null 2> /etc/lilo-error.$$ SUCCESS=$? else lilo -r $T_PX -m /boot/map -C /etc/lilo.conf 1> /dev/null 2> /etc/lilo-error.$$ SUCCESS=$? fi fi sleep 1 if [ ! "$SUCCESS" = "0" ]; then # some LILO error occured echo >> /etc/lilo-error.$$ cat << EOF >> /etc/lilo-error.$$ Sorry, but the attempt to install LILO has returned an error, so LILO \ has not been correctly installed. You'll have to use a bootdisk \ to start your \ machine instead. It should still be possible to get LILO working by \ editing the /etc/lilo.conf and reinstalling LILO manually. See the \ LILO man page and documentation in $LILODOCDIR for more help. \ The error message may be seen above. EOF dialog --msgbox "$(cat /etc/lilo-error.$$)" 0 0 fi } installtext() { checkbootsplash; echo "Installing the Linux Loader..." if [ "$T_PX" = "/" ]; then lilo SUCCESS=$? else lilo -r $T_PX -m /boot/map -C /etc/lilo.conf SUCCESS=$? fi if [ ! "$SUCCESS" = "0" ]; then # try lba32 mode: cat $T_PX/etc/lilo.conf | while read line ; do echo $line if [ "$line" = "# Start LILO global section" ] ; then echo "lba32 # Allow booting past 1024th cylinder with a recent BIOS" fi done > $T_PX/etc/lilo.conf.lba32 mv $T_PX/etc/lilo.conf.lba32 $T_PX/etc/lilo.conf if [ "$T_PX" = "/" ]; then lilo 1> /dev/null 2> /dev/null SUCCESS=$? else lilo -r $T_PX -m /boot/map -C /etc/lilo.conf 1> /dev/null 2> /dev/null SUCCESS=$? fi fi sleep 1 if [ ! "$SUCCESS" = "0" ]; then # some LILO error occured cat << EOF LILO INSTALL ERROR # $SUCCESS Sorry, but the attempt to install LILO has returned an error, so LILO has not been correctly installed. You'll have to use a bootdisk to start your machine instead. It should still be possible to get LILO working by editing the /etc/lilo.conf and reinstalling LILO manually. See the LILO man page and documentation in $LILODOCDIR for more help. EOF fi } # 'probe()' borrowed from LILO QuickInst. probe() { [ ! -z "$(dd if=$1 bs=1 count=1 2>/dev/null | tr '\0' x)" ] return } # Figure out if we're installing from the hard drive if [ -r $TMP/SeTT_PX ]; then T_PX="$(cat $TMP/SeTT_PX)" else if [ "$T_PX" = "" -a ! "$1" = "" ]; then T_PX=$1 else T_PX=/ fi fi HDR="no" # this means the header section of /etc/lilo.conf has not yet # been configured LNX="no" # this means no Linux partition has been defined as bootable # through LILO. Both of these must change to "yes" before LILO will # install from this script. # Determine the root partition (such as /dev/hda2) ROOT_DEVICE=$2 if [ "$ROOT_DEVICE" = "" ]; then if [ -r $TMP/SeTrootdev ]; then ROOT_DEVICE="$(cat $TMP/SeTrootdev)" else ROOT_DEVICE="$(mount | grep " on $T_PX " | cut -f 1 -d " " | head -n 1)" fi fi # Figure out where the kernel is: ARCHTYPE=i386 if [ -r $T_PX/boot/vmlinuz-generic ]; then KERNEL=/boot/vmlinuz-generic elif [ -r $T_PX/boot/vmlinuz ]; then KERNEL=/boot/vmlinuz elif [ -r $T_PX/usr/src/linux/arch/$ARCHTYPE/boot/bzImage ]; then KERNEL=/usr/src/linux/arch/$ARCHTYPE/boot/bzImage else echo "ERROR: could not find a Linux kernel." echo "Tried: $T_PX/boot/vmlinuz-generic $T_PX/boot/vmlinuz $T_PX/usr/src/linux/arch/$ARCHTYPE/boot/bzImage" exit 99 fi # Figure out where the initrd is: if [ -r $T_PX/boot/initrd-generic.img ]; then INITRD=/boot/initrd-generic.img elif [ -r $T_PX/boot/initrd.gz ]; then INITRD=/boot/initrd.gz else # Having an initrd is not mandatory. unset INITRD fi # OK, now let's see if we should automate things: dialog --title "INSTALL LILO" --menu "LILO (Linux Loader) is a generic \ boot loader. There's a simple installation which tries to automatically \ set up LILO to boot Linux (also Windows if found). For \ more advanced users, the expert option offers more control over the \ installation process. Since LILO does not work in all cases (and can \ damage partitions if incorrectly installed), there's the third (safe) \ option, which is to skip installing LILO for now. You can always install \ it later with the 'liloconfig' command. Which option would you like?" \ 18 67 3 \ "simple" "Try to install LILO automatically" \ "expert" "Use expert lilo.conf setup menu" \ "skip" "Do not install LILO" 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then exit fi REPLY="$(cat $TMP/reply)" rm -f $TMP/reply if [ "$REPLY" = "skip" ]; then exit elif [ "$REPLY" = "simple" ]; then # Do simple LILO setup simplelilo exit fi # drop through to last option: (use the expert menus) while [ 0 ]; do dialog --title "EXPERT LILO INSTALLATION" --menu \ "This menu directs the creation of the LILO config file, lilo.conf. \ To install, you make a new LILO configuration file by creating a new header \ and then adding one or more bootable partitions to the file. Once you've done \ this, you can select the install option. Alternately, if you already have an \ /etc/lilo.conf, you may reinstall using that. If you make a mistake, you can \ always start over by choosing 'Begin'. \ Which option would you like?" 21 73 8 \ "Begin" "Start LILO configuration with a new LILO header" \ "Linux" "Add a Linux partition to the LILO config" \ "Windows" "Add a Windows FAT or NTFS partition to the LILO config" \ "Install" "Install LILO" \ "Recycle" "Reinstall LILO using the existing lilo.conf" \ "Skip" "Skip LILO installation and exit this menu" \ "View" "View your current /etc/lilo.conf" \ "Help" "Read the Linux Loader HELP file" 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then REPLY="Skip" else REPLY="$(cat $TMP/reply)" fi rm -r $TMP/reply if [ "$REPLY" = "Begin" ]; then ask_append; if [ $? = 1 -o $? = 255 ]; then APPEND="" HDR="no" continue; else APPEND="$(cat $TMP/reply)" fi #ask_utf; #if [ $? = 1 -o $? = 255 ]; then # UTFVT="vt.default_utf8=0" #else # UTFVT="vt.default_utf8=1" #fi use_framebuffer; dialog --title "SELECT LILO TARGET LOCATION" $DEFAULT --menu "LILO can be installed \ to a variety of places: \ the superblock of your root Linux partition (which could then be made the \ bootable partition with fdisk), a formatted floppy disk, \ or the master boot record of your first hard drive. If you're using \ a boot system such as Boot Manager, you should use the "Root" \ selection. Please pick a target location:" 15 65 3 \ "Root" "Install to superblock (not for use with XFS)" \ "Floppy" "Use a formatted floppy disk in the boot drive" \ "MBR" "Use the Master Boot Record (possibly unsafe)" \ 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then HDR="no" continue; else LNX="no" TG="$(cat $TMP/reply)" fi rm -r $TMP/reply if [ "$TG" = "MBR" ]; then MBR_TARGET=/dev/sda echo $MBR_TARGET > $TMP/LILOMBR cat /proc/partitions | while read LINE ; do MAJOR="$(echo $LINE | cut -f 1 -d ' ')" MINOR="$(echo $LINE | cut -f 2 -d ' ')" if [ ! "$MINOR" = "0" -a ! "$MINOR" = "64" ]; then # ignore whole devices to weed out CD drives if [ "$MAJOR" = "3" ]; then MBR_TARGET=/dev/hda echo $MBR_TARGET > $TMP/LILOMBR elif [ "$MAJOR" = "22" -a ! "$MBR_TARGET" = "/dev/hda" ]; then MBR_TARGET=/dev/hdc echo $MBR_TARGET > $TMP/LILOMBR elif [ "$MAJOR" = "33" -a ! "$MBR_TARGET" = "/dev/hda" -a ! "$MBR_TARGET" = "/dev/hdc" ]; then MBR_TARGET=/dev/hde echo $MBR_TARGET > $TMP/LILOMBR elif [ "$MAJOR" = "34" -a ! "$MBR_TARGET" = "/dev/hda" -a ! "$MBR_TARGET" = "/dev/hdc" -a ! "$MBR_TARGET" = "/dev/hde" ]; then MBR_TARGET=/dev/hdg echo $MBR_TARGET > $TMP/LILOMBR fi if dmidecode 2> /dev/null | grep -q QEMU 2> /dev/null ; then if [ -r /dev/vda ]; then MBR_TARGET=/dev/vda echo $MBR_TARGET > $TMP/LILOMBR fi fi fi done LILO_TARGET=$(cat $TMP/LILOMBR) dialog --title "CONFIRM LOCATION TO INSTALL LILO" --inputbox \ "The auto-detected location to install the LILO boot block is shown below. \ If you need to make any changes, you can make them below. Otherwise, hit \ ENTER to accept the target location shown." 11 60 $LILO_TARGET 2> $TMP/reply if [ $? = 0 ]; then LILO_TARGET="$(cat $TMP/reply)" fi rm -f $TMP/reply elif [ "$TG" = "Root" ]; then LILO_TARGET=$(echo $ROOT_DEVICE) elif [ "$TG" = "Floppy" ]; then LILO_TARGET="/dev/fd0" else HDR="no" continue; fi dialog --title "CHOOSE LILO TIMEOUT" --menu "At boot time, how long would \ you like LILO to wait for you to select an operating system? If you \ let LILO time out, it will boot the first OS in the configuration file by \ default." 13 74 4 \ "None" "Don't wait at all - boot straight into the first OS" \ "5" "5 seconds" \ "30" "30 seconds" \ "Forever" "Present a prompt and wait until a choice is made" 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then HDR="no" continue; else TIMEOUT="$(cat $TMP/reply)" fi rm -r $TMP/reply if [ "$TIMEOUT" = "None" ]; then PROMPT="#prompt" TIMEOUT="#timeout = 5" elif [ "$TIMEOUT" = "5" ]; then PROMPT="prompt" TIMEOUT="timeout = 50" elif [ "$TIMEOUT" = "30" ]; then PROMPT="prompt" TIMEOUT="timeout = 300" elif [ "$TIMEOUT" = "Forever" ]; then PROMPT="prompt" TIMEOUT="#timeout = 300" else HDR="no" continue; fi cat << EOF > $TMP/lilo.conf # LILO configuration file # generated by 'liloconfig' # # Start LILO global section boot = $LILO_TARGET # This option loads the kernel and initrd much faster: compact EOF # Boot splash if [ "$PROMPT" = "prompt" ]; then if ask_boot_splash ; then boot_bmp >> $TMP/lilo.conf cat << EOF >> $TMP/lilo.conf # Standard menu. # Or, you can comment out the bitmap menu above and # use a boot message with the standard menu: #message = /boot/boot_message.txt EOF fi else cat << EOF >> $TMP/lilo.conf # Standard menu. message = /boot/boot_message.txt EOF fi #if [ ! "$APPEND" = "" -o ! "$UTFVT" = "" ]; then echo "# Append any additional kernel parameters:" >> $TMP/lilo.conf echo "append=\"$APPEND $UTFVT\"" >> $TMP/lilo.conf #fi if echo $LILO_TARGET | grep -q vda 2>/dev/null ; then echo "disk = /dev/vda bios=0x80 max-partitions=7" >> $TMP/lilo.conf fi cat << EOF >> $TMP/lilo.conf $PROMPT $TIMEOUT EOF if [ "$CONSOLETYPE" = "standard" ]; then cat << EOF >> $TMP/lilo.conf # Normal VGA console vga = normal # Ask for video mode at boot (time out to normal in 30s) #vga = ask EOF elif [ "$CONSOLETYPE" = "ask" ]; then cat << EOF >> $TMP/lilo.conf # Ask for video mode at boot (time out to normal in 30s) vga = ask # Normal VGA console #vga = normal EOF else cat << EOF >> $TMP/lilo.conf # VESA framebuffer console @ $CONSOLETYPE vga = $CONSOLENUM # Normal VGA console #vga = normal # Ask for video mode at boot (time out to normal in 30s) #vga = ask EOF fi cat << EOF >> $TMP/lilo.conf # VESA framebuffer console @ 1024x768x64k # vga=791 # VESA framebuffer console @ 1024x768x32k # vga=790 # VESA framebuffer console @ 1024x768x256 # vga=773 # VESA framebuffer console @ 800x600x64k # vga=788 # VESA framebuffer console @ 800x600x32k # vga=787 # VESA framebuffer console @ 800x600x256 # vga=771 # VESA framebuffer console @ 640x480x64k # vga=785 # VESA framebuffer console @ 640x480x32k # vga=784 # VESA framebuffer console @ 640x480x256 # vga=769 EOF cat << EOF >> $TMP/lilo.conf # ramdisk = 0 # paranoia setting # End LILO global section EOF HDR="yes" elif [ "$REPLY" = "Linux" ]; then dialog --infobox "\nScanning for Linux partitions..." 5 37 sleep 1 if [ "$HDR" = "yes" ]; then if [ "$ROOT_DEVICE" != "" ]; then DEFROOT="--default-item $ROOT_DEVICE" fi echo "dialog --title \"SELECT LINUX PARTITION\" $DEFROOT --menu \\" > $TMP/tmpmsg echo "\"Which Linux partition would you like LILO to boot?\n\ \n\ Partition Start End Sectors ID\" 22 74 13 \\" >> $TMP/tmpmsg PROBE -l 2> /dev/null | grep "Linux$" | sort | while read STR; do STR1="$(echo -n "$STR" | cut -f 1 -d ' ')" STR2="$(echo -n "$STR" | cut -f 2- -d ' ')" echo "\"$STR1\" \"$STR2\" \\" >> $TMP/tmpmsg done echo "2> $TMP/reply" >> $TMP/tmpmsg . $TMP/tmpmsg if [ $? = 1 -o $? = 255 ]; then rm $TMP/tmpmsg continue fi rm $TMP/tmpmsg LINUX_PART="$(cat $TMP/reply)" checkp_dialog $LINUX_PART if [ ! $? = 0 ]; then continue; fi dialog --title "SELECT PARTITION NAME FOR $LINUX_PART" --inputbox \ "Now you must select a short, unique name for this partition. \ You'll use this name if you specify a partition to boot at the \ LILO prompt. 'Linux' might not be a bad choice. THIS MUST BE A \ SINGLE WORD." 11 60 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then continue fi LABEL="$(cat $TMP/reply)" if [ -z "$INITRD" ]; then cat << EOF >> $TMP/lilo.conf # Linux bootable partition config begins image = $KERNEL root = $LINUX_PART label = $LABEL read-only # Partitions should be mounted read-only for checking # Linux bootable partition config ends EOF else cat << EOF >> $TMP/lilo.conf # Linux bootable partition config begins image = $KERNEL initrd = $INITRD root = $LINUX_PART label = $LABEL read-only # Partitions should be mounted read-only for checking # Linux bootable partition config ends EOF fi else dialog --title "CAN'T ADD LINUX PARTITION" --msgbox "You can't add \ partitions unless you start over with a new LILO header." 6 60 continue fi LNX="yes" # MORE OS/2 DEAD CODE... DOESN'T HURT. # THIS ITEM HAS LONG BEEN REMOVED FROM THE MENU... elif [ "$REPLY" = "OS/2" ]; then if [ "$HDR" = "yes" ]; then echo "These are possibly OS/2 partitions. They will be treated" > $TMP/tmpmsg echo "as such if you install them using this menu." >> $TMP/tmpmsg echo >> $TMP/tmpmsg echo " Device Boot Start End Blocks Id System" >> $TMP/tmpmsg PROBE -l | grep DOS | sort >> $TMP/tmpmsg PROBE -l | grep HPFS | sort >> $TMP/tmpmsg echo >> $TMP/tmpmsg echo "Which one would you like LILO to boot?" >> $TMP/tmpmsg dialog --title "SELECT OS/2 PARTITION" --no-collapse --inputbox \ "$(cat $TMP/tmpmsg)" 20 74 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then rm $TMP/tmpmsg continue fi rm $TMP/tmpmsg OS_2_PART="$(cat $TMP/reply)" checkp_dialog $OS_2_PART if [ ! $? = 0 ]; then continue; fi dialog --title "SELECT PARTITION NAME" --inputbox \ "Now you must select a short, unique name for this partition. \ You'll use this name if you specify a partition to boot at the \ LILO prompt. 'OS/2' might not be a bad choice. THIS MUST BE A \ SINGLE WORD." 11 60 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then continue fi LABEL="$(cat $TMP/reply)" TABLE="$(echo $OS_2_PART | cut -b1-8)" if [ "$(echo $TABLE | cut -b6-8)" = "hda" ]; then cat << EOF >> $TMP/lilo.conf # OS/2 bootable partition config begins other = $OS_2_PART label = $LABEL table = $TABLE # OS/2 bootable partition config ends EOF else cat << EOF >> $TMP/lilo.conf # OS/2 bootable partition config begins other = $OS_2_PART label = $LABEL table = $TABLE loader = /boot/os2_d.b # map-drive = 0x80 # to = 0x81 # map-drive = 0x81 # to = 0x80 # OS/2 bootable partition config ends EOF fi else dialog --title "CAN'T ADD OS/2 PARTITION" --msgbox "You can't add \ partitions unless you start over with a new LILO header." 6 60 continue fi LNX="yes" elif [ "$REPLY" = "Windows" ]; then dialog --infobox "\nScanning for Windows partitions..." 5 39 sleep 1 if [ "$HDR" = "yes" ]; then echo "These are possibly Windows partitions. They will be treated as" > $TMP/tmpmsg echo "such if you install them using this menu." >> $TMP/tmpmsg echo >> $TMP/tmpmsg echo " Device Boot Start End Blocks Id System" >> $TMP/tmpmsg PROBE -l | grep "DOS Win W95 FAT12 FAT16 HPFS" | grep -v "Ext'd" | grep -v "Extend" | sort | grep "$($OSPROBER 2> /dev/null | grep :Windows: | cut -f 1 -d :)" >> $TMP/tmpmsg echo >> $TMP/tmpmsg echo "Which one would you like LILO to boot?" >> $TMP/tmpmsg dialog --title "SELECT WINDOWS PARTITION" --no-collapse --inputbox \ "$(cat $TMP/tmpmsg)" 20 74 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then rm $TMP/tmpmsg continue fi rm $TMP/tmpmsg DOSPART="$(cat $TMP/reply)" checkp_dialog $DOSPART if [ ! $? = 0 ]; then continue; fi dialog --title "SELECT PARTITION NAME" --inputbox \ "Now you must select a short, unique name for this partition. \ You'll use this name if you specify a partition to boot at the \ LILO prompt. 'Windows' might not be a bad choice. THIS MUST BE A \ SINGLE WORD." 11 60 2> $TMP/reply if [ $? = 1 -o $? = 255 ]; then continue fi LABEL="$(cat $TMP/reply)" unset USE_LOADER TABLE="$(echo $DOSPART | cut -b1-8)" if [ "$(echo $TABLE | cut -b6-8)" = "hda" ]; then USE_LOADER="no" fi if [ "$(echo $TABLE | cut -b6-8)" = "sda" ]; then if probe /dev/hda; then USE_LOADER="yes" else USE_LOADER="no" fi fi if [ "$USE_LOADER" = "no" ]; then cat << EOF >> $TMP/lilo.conf # Windows bootable partition config begins other = $DOSPART label = $LABEL table = $TABLE # Windows bootable partition config ends EOF else cat << EOF >> $TMP/lilo.conf # Windows bootable partition config begins other = $DOSPART label = $LABEL # map-drive = 0x80 # to = 0x81 # map-drive = 0x81 # to = 0x80 table = $TABLE # Windows bootable partition config ends EOF fi else dialog --title "CAN'T ADD WINDOWS PARTITION" --msgbox "You can't add \ partitions unless you start over with a new LILO header." 6 60 continue fi LNX="yes" elif [ "$REPLY" = "Install" -o "$REPLY" = "Recycle" ]; then if [ "$REPLY" = "Recycle" -a -r $T_PX/etc/lilo.conf ]; then LNX="yes" fi if [ "$LNX" = "no" ]; then dialog --title "CAN'T INSTALL LILO" --msgbox "LILO could not be \ installed. If you have not created a LILO configuration file by defining \ a new header and adding at least one bootable partition to it, you must do \ so before installing LILO. If you were attempting to use an existing LILO \ configuration file, it could not be found. Try making a new one." 9 70 continue else if [ "$REPLY" = "Install" ]; then if [ -r $TMP/lilo.conf ]; then if [ -r $T_PX/etc/lilo.conf ]; then mv $T_PX/etc/lilo.conf $T_PX/etc/lilo.conf.bak fi cp $TMP/lilo.conf $T_PX/etc/lilo.conf chmod 644 $T_PX/etc/lilo.conf fi fi installcolor; fi rm -f $TMP/tmpmsg $TMP/reply break elif [ "$REPLY" = "Skip" ]; then rm -f $TMP/tmpmsg $TMP/reply break elif [ "$REPLY" = "View" ]; then if [ -r $TMP/lilo.conf ]; then dialog --title "YOUR NEW /etc/lilo.conf" --textbox "$TMP/lilo.conf" 22 70 else if [ -r $T_PX/etc/lilo.conf ]; then dialog --title "YOUR OLD /etc/lilo.conf" --textbox "$T_PX/etc/lilo.conf" 22 70 elif [ "$T_PX" = "/" -a -r /etc/lilo.conf ]; then dialog --title "YOUR OLD /etc/lilo.conf" --textbox "/etc/lilo.conf" 22 70 else dialog --title "NO CONFIG FILE FOUND" --msgbox "Sorry, but you don't \ have a LILO configuration file that can be viewed." 6 60 fi fi elif [ "$REPLY" = "Help" ]; then dialog --title "LILO INSTALLATION HELP" --textbox "$T_PX/var/log/setup/text.lilohelp" 22 68 fi done