slackware-current/source/installer/sources/initrd/usr/lib/setup/setup
Patrick J Volkerding 6b6caf66ba Tue Mar 21 21:18:59 UTC 2023
a/elilo-3.16-x86_64-15.txz:  Rebuilt.
  eliloconfig: drop support for old EFI vars interface.
  Mount efivarfs on /sys/firmware/efi/efivars if we find that the directory
  is empty.
d/indent-2.2.13-x86_64-1.txz:  Upgraded.
d/scons-4.5.2-x86_64-1.txz:  Upgraded.
x/libva-2.18.0-x86_64-1.txz:  Upgraded.
xap/mozilla-firefox-111.0.1-x86_64-1.txz:  Upgraded.
  This is a bugfix release.
  For more information, see:
    https://www.mozilla.org/en-US/firefox/111.0.1/releasenotes/
xfce/xfce4-clipman-plugin-1.6.3-x86_64-1.txz:  Upgraded.
extra/tigervnc/tigervnc-1.13.1-x86_64-1.txz:  Upgraded.
isolinux/initrd.img:  Rebuilt.
  Make sure efivarfs is mounted on UEFI systems.
usb-and-pxe-installers/usbboot.img:  Rebuilt.
  Make sure efivarfs is mounted on UEFI systems.
2023-03-21 23:41:13 +01:00

515 lines
19 KiB
Bash
Executable file

#!/bin/bash
#
# Copyright 1993, 1994, 1999 Patrick Volkerding, Moorhead, Minnesota USA
# Copyright 2001, 2003, 2004 Slackware Linux, Inc., Concord, CA
# Copyright 2006, 2007, 2018, 2021, 2022, 2023 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.
#
# As always, bug reports, suggestions, etc: volkerdi@slackware.com
#
TMP=/var/log/setup/tmp
if [ ! -d $TMP ]; then
mkdir -p $TMP
fi
# Wipe the probe md5sum to force rescanning partitions if setup is restarted:
rm -f $TMP/SeTpartition.md5
## FLOPPY? Comment out this obsolete code. We ain't gonna need it.
## Use /tmp on floppy for now:
#/usr/lib/setup/unmigrate.sh
rm -f $TMP/SeT*
# If a keymap was set up, restore that data:
if [ -r $TMP/Pkeymap ]; then
cp $TMP/Pkeymap $TMP/SeTkeymap
fi
echo "on" > $TMP/SeTcolor # turn on color menus
PATH="$PATH:/usr/lib/setup"
export PATH;
export COLOR=on
dialog --backtitle "Slackware Linux Setup" --infobox "\n
Scanning your system for partition information...\n
\n" 5 55
# In case the machine is full of fast SSDs:
sleep 1
# Before probing, activate any LVM partitions
# that may exist from before the boot:
vgchange -ay 1> /dev/null 2> /dev/null
if probe -l 2> /dev/null | grep -E 'Linux$' 1> /dev/null 2> /dev/null ; then
probe -l 2> /dev/null | grep -E 'Linux$' | sort | uniq 1> $TMP/SeTplist 2> /dev/null
else
dialog --title "NO LINUX PARTITIONS DETECTED" \
--msgbox "There don't seem to be any partitions on this machine of type \
Linux. You'll need to make at least one of these to install Linux. \
To do this, you'll need to leave 'setup', and make the partitions using \
'cfdisk' (MBR partitions) or 'cgdisk' (GPT partitions). For more \
information, read the 'setup' help file from the next menu." 10 64
fi
if [ -d /sys/firmware/efi ]; then
# First, let's make sure that efivarfs is active:
if [ "$(/bin/ls /sys/firmware/efi/efivars 2> /dev/null | wc -l)" = "0" ]; then
mount -t efivarfs none /sys/firmware/efi/efivars
fi
if ! probe -l 2> /dev/null | grep "EFI System Partition" 1> /dev/null 2> /dev/null ; then
dialog --title "NO EFI SYSTEM PARTITION DETECTED" \
--msgbox "This machine appears to be using EFI/UEFI, but no EFI System \
Partition was found. You'll need to make an EFI System Partition in order \
to boot from the hard drive. To do this, leave 'setup', and \
use 'cgdisk' to make a 100MB partition of type EF00. For more information, \
read the 'setup' help file from the next menu." 10 64
fi
fi
T_PX="/mnt"
echo "$T_PX" > $TMP/SeTT_PX
ROOT_DEVICE="`mount | grep "on / " | cut -f 1 -d ' '`"
echo "$ROOT_DEVICE" > $TMP/SeTrootdev
if mount | grep /var/log/mount 1> /dev/null 2> /dev/null ; then # clear source location:
# In case of bind mounts, try to unmount them first:
umount /var/log/mount/dev 2> /dev/null
umount /var/log/mount/proc 2> /dev/null
umount /var/log/mount/sys 2> /dev/null
# Unmount target partition:
umount /var/log/mount
fi
# Anything mounted on /var/log/mount now is a fatal error:
if mount | grep /var/log/mount 1> /dev/null 2> /dev/null ; then
echo "Can't umount /var/log/mount. Reboot machine and run setup again."
exit
fi
# If the mount table is corrupt, the above might not do it, so we will
# try to detect Linux and FAT32 partitions that have slipped by:
if [ -d /var/log/mount/lost+found -o -d /var/log/mount/recycled \
-o -r /var/log/mount/io.sys ]; then
echo "Mount table corrupt. Reboot machine and run setup again."
exit
fi
rm -f /var/log/mount 2> /dev/null
rmdir /var/log/mount 2> /dev/null
mkdir /var/log/mount 2> /dev/null
while [ 0 ]; do
dialog --title "Slackware Linux Setup (version 15.1)" \
--menu \
"Welcome to Slackware Linux Setup.\n\
Select an option below using the UP/DOWN keys and SPACE or ENTER.\n\
Alternate keys may also be used: '+', '-', and TAB." 18 72 9 \
"HELP" "Read the Slackware Setup HELP file" \
"KEYMAP" "Remap your keyboard if you're not using a US one" \
"ADDSWAP" "Set up your swap partition(s)" \
"TARGET" "Set up your target partitions" \
"SOURCE" "Select source media" \
"SELECT" "Select categories of software to install" \
"INSTALL" "Install selected software" \
"CONFIGURE" "Reconfigure your Linux system" \
"EXIT" "Exit Slackware Linux Setup" 2> $TMP/hdset
if [ ! $? = 0 ]; then
rm -f $TMP/hdset $TMP/SeT*
exit
fi
MAINSELECT="`cat $TMP/hdset`"
rm $TMP/hdset
# Start checking what to do. Some modules may reset MAINSELECT to run the
# next item in line.
if [ "$MAINSELECT" = "HELP" ]; then
SeTfdHELP
fi
if [ "$MAINSELECT" = "KEYMAP" ]; then
SeTkeymap
if [ -r $TMP/SeTkeymap ]; then
MAINSELECT="ADDSWAP"
fi
fi
if [ "$MAINSELECT" = "MAKE TAGS" ]; then
SeTmaketag
fi
if [ "$MAINSELECT" = "ADDSWAP" ]; then
SeTswap
if [ -r $TMP/SeTswap ]; then
MAINSELECT="TARGET"
elif [ -r $TMP/SeTswapskip ]; then
# Go ahead to TARGET without swap space:
MAINSELECT="TARGET"
fi
fi
if [ "$MAINSELECT" = "TARGET" ]; then
SeTpartitions
SeTEFI
SeTDOS
if [ -r $TMP/SeTnative ]; then
MAINSELECT="SOURCE"
fi
fi
if [ "$MAINSELECT" = "SOURCE" ]; then
SeTmedia
if [ -r $TMP/SeTsource ]; then
MAINSELECT="SELECT"
fi
fi
if [ "$MAINSELECT" = "SELECT" ]; then
if [ -r /var/log/mount/isolinux/setpkg ]; then
sh /var/log/mount/isolinux/setpkg
else
SeTPKG
fi
if [ -r $TMP/SeTSERIES ]; then
MAINSELECT="INSTALL"
fi
fi
if [ "$MAINSELECT" = "INSTALL" ]; then
if [ ! -r $TMP/SeTSERIES -o ! -r $TMP/SeTsource -o ! -r $TMP/SeTnative ]; then
dialog --title "CANNOT INSTALL SOFTWARE YET" --msgbox "\
\n\
Before you can install software, complete the following tasks:\n\
\n\
1. Select your source media.\n\
2. Set up your target Linux partition(s).\n\
3. Select which software categories to install.\n\
\n\
You may also optionally remap your keyboard and set up your\n\
swap partition(s). \n\
\n\
Press ENTER to return to the main menu." 16 68
continue
fi
SERIES="`cat $TMP/SeTSERIES`"
SOURCE_DEVICE="`cat $TMP/SeTsource`"
IGNORE_TAGFILES=""
while [ 0 ]; do
dialog --title "SELECT PROMPTING MODE" --default-item "terse" --menu \
"Now you must select the type of prompts you'd like to see during the \
installation process. If you have the drive space, the 'full' option \
is quick, easy, and by far the most foolproof choice. The 'newbie' \
mode provides the most information but is much more time-consuming \
(presenting the packages one by one) than the menu-based choices. \
Otherwise, you can pick packages from menus \
using 'expert' or 'menu' mode. Which type of prompting would you like \
to use?" \
20 76 7 \
"full" "Install everything (15+ GB of software, RECOMMENDED!)" \
"terse" "Like 'full', but display one line per package during install" \
"menu" "Choose individual packages from interactive menus" \
"expert" "This is actually the same as the \"menu\" option" \
"newbie" "Use verbose prompting (the X series takes one year)" \
"custom" "Use custom tagfiles in the package directories" \
"tagpath" "Use tagfiles in the subdirectories of a custom path" \
"help" "Read the prompt mode help file" 2> $TMP/SeTpmode
if [ ! $? = 0 ]; then
rm -f $TMP/SeTpmode
exit
fi
MODE="`cat $TMP/SeTpmode`"
rm -f $TMP/SeTtagext
if [ "$MODE" = "help" ]; then
dialog --title "PROMPT MODE HELP" --exit-label OK --textbox "/usr/lib/setup/PROMPThelp" 19 65
fi
if [ "$MODE" = "tagpath" ]; then
dialog --title "PROVIDE A CUSTOM PATH TO YOUR TAGFILES" --inputbox \
"If you're installing from CD or DVD, it's impossible to edit the \
tagfiles that are in the package directories. In this case, you might \
want to provide a path to your custom tagfiles. As an example, you \
could create a /tagfiles directory and mount a floppy disk containing \
the tagfiles on that directory. Then you'd enter '/tagfiles' at the \
prompt below. The setup program will look for your tagfile in \
SUBDIRECTORIES of the path you provide, such as /tagfiles/a, \
/tagfiles/ap, /tagfiles/d, and so on. You only need to provide a \
subdirectory and tagfile for the first disk of each series to be \
installed. If a custom tagfile is not found at the path you provide, \
setup will revert to the default tagfiles. Please enter the path to your \
custom tagfiles:" \
19 71 2> $TMP/SeTtagpath
if [ ! $? = 0 ]; then
continue
fi
if [ -r $TMP/SeTtagpath ]; then
if [ "`cat $TMP/SeTtagpath`" = "" ]; then
rm -f $TMP/SeTtagpath
elif [ ! -d "$(cat $TMP/SeTtagpath)" ]; then
dialog --title "NOT A VALID DIRECTORY" --msgbox \
"Sorry, but the $(cat $TMP/SeTtagpath) directory could not be located. \
Press ENTER to go back to the SELECT PROMPTING MODE menu." \
7 65
rm -f $TMP/SeTtagpath
continue
fi
fi
break;
fi
if [ "$MODE" = "newbie" ]; then
dialog --infobox "'newbie' prompt mode selected. Using default tagfiles \
and verbose package prompting." 4 50
break;
fi
if [ "$MODE" = "custom" ]; then
dialog --title "ENTER CUSTOM EXTENSION" --inputbox "Now, enter the custom \
extension you have used for your tagfiles. This must be a valid MS-DOS format \
file extension consisting of a period followed by three characters. For \
example, I use '.pat'. You might see my tagfiles on your disks. :^)" \
12 60 2> $TMP/SeTtagext
if [ ! $? = 0 ]; then
continue
fi
if [ -r $TMP/SeTtagext ]; then
if [ "`cat $TMP/SeTtagext`" = "" ]; then
rm -f $TMP/SeTtagext
fi
fi
dialog --infobox "'custom' prompt mode selected. Using prompting defaults \
found in custom tagfiles." 4 50
break;
fi
if [ "$MODE" = "full" ]; then
IGNORE_TAGFILES="-ignore_tagfiles"
dialog --infobox "Full installation mode. Installing all software \
packages without prompting." 4 45
break;
fi
if [ "$MODE" = "terse" ]; then
setterm -background cyan -foreground black -blank 0
clear
IGNORE_TAGFILES="-ignore_tagfiles"
echo
echo
echo "Full (terse display) installation mode."
echo
echo "A one-line description will be displayed as each package is installed."
echo
break;
fi
if [ "$MODE" = "menu" ]; then
dialog --infobox "'menu' prompt mode selected. Using interactive menus \
to choose subsystems of related packages." 4 60
break;
fi
if [ "$MODE" = "expert" ]; then
dialog --infobox "'expert' prompt mode selected. Using interactive menus \
to choose packages individually." 4 60
break;
fi
done
export MAKETAG;
sleep 1
# On a new system, make /etc/mtab a symlink to /proc/mounts:
if [ ! -r $T_PX/etc/mtab ]; then
mkdir -p $T_PX/etc
( cd $T_PX/etc ; ln -sf /proc/mounts mtab )
fi
# Do the package install:
if [ -r $TMP/SeTCDdev ]; then # only try to remount media if it's a CD/DVD
slackinstall --device `cat $TMP/SeTCDdev` --promptmode $MODE --srcpath `cat $TMP/SeTDS` --mountpoint /var/log/mount --target $T_PX --series $SERIES
elif [ -r $TMP/SeTremotesvr ]; then
slackinstall --device noremount --promptmode $MODE --srcpath `cat $TMP/SeTDS` --mountpoint /var/log/mount --target $T_PX --series $SERIES --net `cat $TMP/SeTremotesvr`
else
slackinstall --device noremount --promptmode $MODE --srcpath `cat $TMP/SeTDS` --mountpoint /var/log/mount --target $T_PX --series $SERIES
fi
# Run ldconfig on the newly installed system:
if [ -x $T_PX/sbin/ldconfig ]; then
$T_PX/sbin/ldconfig -r $T_PX
fi
if [ $MODE = terse ]; then
# Let's pause a moment and then restore the terminal settings
sleep 1
setterm -background black -foreground white -blank 0
fi
MAINSELECT="CONFIGURE"
fi
if [ "$MAINSELECT" = "CONFIGURE" ]; then
# Make bind mounts for /dev, /proc, and /sys:
mount -o bind /dev $T_PX/dev 2> /dev/null
mount -o bind /proc $T_PX/proc 2> /dev/null
mount -o bind /sys $T_PX/sys 2> /dev/null
SeTconfig
REPLACE_FSTAB=Y
if [ -r $TMP/SeTnative ]; then
if [ -r $T_PX/etc/fstab ]; then
dialog --title "REPLACE /etc/fstab?" --yesno "You already have an \
/etc/fstab on your install partition. If you were just adding software, \
you should probably keep your old /etc/fstab. If you've changed your \
partitioning scheme, you should use the new /etc/fstab. Do you want \
to replace your old /etc/fstab with the new one?" 10 58
if [ ! $? = 0 ]; then
REPLACE_FSTAB=N
fi
fi
if [ "$REPLACE_FSTAB" = "Y" ]; then
cat /dev/null > $T_PX/etc/fstab
if [ -r $TMP/SeTswap ]; then
cat $TMP/SeTswap > $T_PX/etc/fstab
fi
cat $TMP/SeTnative >> $T_PX/etc/fstab
if [ -r $TMP/SeTDOS ]; then
cat $TMP/SeTDOS >> $T_PX/etc/fstab
fi
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "#/dev/cdrom" "/mnt/cdrom" "auto" "noauto,owner,ro,comment=x-gvfs-show" "0" "0" >> $T_PX/etc/fstab
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "/dev/fd0" "/mnt/floppy" "auto" "noauto,owner" "0" "0" >> $T_PX/etc/fstab
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "devpts" "/dev/pts" "devpts" "gid=5,mode=620" "0" "0" >> $T_PX/etc/fstab
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "proc" "/proc" "proc" "defaults" "0" "0" >> $T_PX/etc/fstab
printf "%-16s %-16s %-11s %-16s %-3s %s\n" "tmpfs" "/dev/shm" "tmpfs" "nosuid,nodev,noexec" "0" "0" >> $T_PX/etc/fstab
fi
dialog --title "SETUP COMPLETE" --msgbox "System configuration \
and installation is complete. \
\n\nYou may now reboot your system." 7 55
fi
fi
if [ "$MAINSELECT" = "EXIT" ]; then
break
fi
done # end of main loop
sync
chmod 755 $T_PX
if [ -d $T_PX/tmp ]; then
chmod 1777 $T_PX/tmp
fi
if mount | grep /var/log/mntiso 1> /dev/null 2> /dev/null ; then
umount -f /var/log/mntiso
fi
if mount | grep /var/log/mount 1> /dev/null 2> /dev/null ; then
umount /var/log/mount
fi
# Anything mounted on /var/log/mount now is a fatal error:
if mount | grep /var/log/mount 1> /dev/null 2> /dev/null ; then
exit
fi
# If the mount table is corrupt, the above might not do it, so we will
# try to detect Linux and FAT32 partitions that have slipped by:
if [ -d /var/log/mount/lost+found -o -d /var/log/mount/recycled \
-o -r /var/log/mount/io.sys ]; then
exit
fi
rm -f /var/log/mount 2> /dev/null
rmdir /var/log/mount 2> /dev/null
mkdir /var/log/mount 2> /dev/null
chmod 755 /var/log/mount
# An fstab file is indicative of an OS installation, rather than
# just loading the "setup" script and selecting "EXIT"
if [ -f ${T_PX}/etc/fstab ]; then
# umount CD:
if [ -r $TMP/SeTCDdev ]; then
if mount | grep iso9660 > /dev/null 2> /dev/null ; then
umount `mount | grep iso9660 | cut -f 1 -d ' '`
fi
eject -s `cat $TMP/SeTCDdev`
# Tell the user to remove the disc, if one had previously been mounted
# (it should now be ejected):
dialog \
--clear \
--title "Slackware Linux Setup is complete" "$@" \
--msgbox "\nPlease remove the installation disc.\n" 7 40
fi
# Prompt the user to unplug the USB stick containing the Slackware
# media:
mountpoint -q /usb-stick && {
# Try to umount the USB stick, but ignore any errors (errors would typically be
# occur if the user has a shell open within the USB stick's mount point), since
# we'll be shutting down soon anyway.
sync
umount /usb-stick > /dev/null 2>&1
dialog \
--title "Unplug Slackware Installation Media USB Stick" \
--msgbox \
"\nYou may now physically unplug the Slackware Installation Media USB stick from the USB port.\n" 8 60
}
# Prompt the user to unplug the bootable USB stick containing
# A-i-O (All in One Offline) partition.
mountpoint -q /slack-all-in-one && {
# Try to umount the A-i-O partition, but ignore any errors (errors would typically be
# occur if the user has a shell open within the USB stick's mount point), since
# we'll be shutting down soon anyway.
sync
umount /slack-all-in-one > /dev/null 2>&1
# Don't suggest disconnection if it's on ARM, because the A-i-O partition
# is on the same SD card that is converted from being the Installer to the
# OS's /boot partition.
[[ ! "$( uname -m )" =~ a(rm*|arch64) ]] && {
dialog \
--title "Unplug Slackware Installation USB Stick" \
--msgbox \
"\nYou may now physically unplug the Slackware Installation USB stick from the USB port.\n" 8 60 ;}
}
# Offer to reboot or drop to shell or power off.
exec 3>&1
installerexittype=$( dialog \
--clear \
--title "Slackware Linux Setup is complete" "$@" \
--default-item Reboot "$@" \
--menu "Slackware Linux setup is complete.
\n\nYou may now reboot your machine into the Slackware OS.\n
\nIf you have some post-installation tweaks you'd like to make manually, you can open a shell.\n
\
\nIf you want to make some changes to the hardware before booting the
Slackware OS, you may wish to power off computer.\n" \
17 80 3 \
Shell "" \
Reboot "" \
"Power Off" "" \
2>&1 1>&3 )
retval=$?
exec 3>&-
fi
# Fix the date:
/sbin/fixdate
# Final cleanup
rm -f $TMP/tagfile $TMP/SeT* $TMP/tar-error $TMP/PKGTOOL_REMOVED
rm -f /var/log/mount/treecache
rmdir /var/log/mntiso 2>/dev/null
rm -rf $TMP/treecache
rm -rf $TMP/pkgcache
rmdir ${T_PX}/tmp/orbit-root 2> /dev/null
sync
# Handle installer exit types:
case "$installerexittype" in
"Reboot")
clear
printf "\n** Starting reboot **\n\n"
sleep 1.5
reboot ;;
"Power Off")
clear
printf "\n** Powering off **\n\n"
sleep 1.5
poweroff ;;
"Shell")
# Note: the shell the user receives at this point is the parent from which
# they entered this 'setup' script. This is why we don't explictly open a shell here.
clear
printf "\nYou may now reboot your system once you are ready.\n"
printf "You can issue the 'reboot' command; or if your system has\n"
printf "a keyboard attached, you can use the key combination: control+alt+delete\n\n" ;;
esac
# End of Slackware setup script