Bootsplash

From SlackWiki
Revision as of 01:30, 11 May 2011 by Netrixtardis (talk | contribs) (→‎Prerequisites)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search


Prerequisites

  • kernel source
  • a bootsplash patch for your kernel version [1] bootsplash patch.
  • A bootsplash theme kde-look themes
  • Bootsplash utilites download

Setup

Start by patching and building a new kernel.

Assuming Stock kernel configuration/source. And all your downloads are in /home/username/Downloads.

  cd /usr/src/linux
       patch -p1</home/username/Downloads/bootsplash*.diff
       rm .config
       zcat /proc/config.gz > .config
       make menuconfig
  *Note: If you insist on using the generic kernel. And are currently using it.
       Check to see if the .config in your /usr/src/linux directory matches /proc/config.gz
          zdiff /proc/config.gz /usr/src/linux/.config 
       If they match, skip the "rm .config && zcat ..." part above
       You'll also want to converge your initrd.gz and bootsplash's initrd. More on that below.

Edit these 2 options:

   Device Drivers --->
            Graphics support --->
                 Logo configuration --->
                     [ ] Bootup logo
                 Bootsplash configuration --->
                     [*] Bootup splash screen
  • If you aren't using a stock kernel configuration, or on another distro check these settings whileyou are still in the kernel configuration dialog:
   Device Drivers --->
            Block devices --->
                   <*> RAM disk support
            Graphics support --->
                   <*> Support for frame buffer devices

Now to make the patched kernel and install it

  make ; cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz-bootsplash

For slamd64, thats:

  make ; cp /usr/src/linux/arch/x86_64/boot/bzImage /boot/vmlinuz-bootsplash

On to making a new bootsplash initrd. Compile and install the splash utility.

  cd /home/username/Downloads
       tar xf bootsplash-3.0.7.tar.bz2
       cd bootsplash-3.0.7/Utilities/
       make splash
       cp splash /usr/bin/ 

And use it to build your new initrd. Untar the theme file you downloaded, and check to see if it has a config directory and an image/s directory. Look in the config directory for an appropriately sized config file (usually bootsplash-1024x768.cfg). Edit this file, changing the directory it looks for images in (jpeg= option and silentjpeg= option) to point to the correct directory of the images for that theme. Example: /home/username/Downloads/bootsplashtheme/images/foo-bar.jpg Finish by making the initrd with splash:

  splash -s -f /home/username/Downloads/bootsplashtheme/config/bootsplash-1024x768.cfg >> /boot/initrd.splash 
   For generic kernel users, you'll have to converge your stock initrd.gz and the bootsplash initrds.

For example:

     mkinitrd -c -m reiserfs
     
           cp /boot/initrd.splash /boot/initrd-tree/bootsplash
     

After putting the initrd-splash into the mkinitrd's initrd-tree you'll need to run mkinitrd again.

Remember to do this every time you make a new initrd.splash. Now edit /etc/lilo.conf with your favorite editor, adding the new kernel and bootsplash options. Sample:

  boot = /dev/hda
       message = /boot/boot_message.txt
       prompt
       timeout = 300
       change-rules
        reset
       vga = 791
       image = /boot/vmlinuz
         root = /dev/hda1
         label = Linux
         read-only
       image = /boot/vmlinuz-bootsplash
         root = /dev/hda1
         label = Bootsplash
         initrd=/boot/initrd.splash
         append="splash=silent" 

Substitue "initrd=/boot/initrd.gz" if you had to run mkinitrd for a generic kernel, then run lilo to update and you're set.

 root@slackware:~# lilo
      Added Linux
      Added Bootsplash 

Now you can Reboot to test everything. If boot fails for some reason. You still have your stock kernel and entry in lilo to boot into without worries.

Progressbar - rc.progress

Theres no set way to do this, you just need init to update /proc/splash correctly. The way I do it (with help from LinuxQuestiosn forums): create a new file in /etc/rc.d/ named rc.progress

  cd /etc/rc.d/ ; touch rc.progress 

edit it, and add this script:

  
#!/bin/sh
#
#rc.progress  This file has a common subroutine used to update a
#             bootsplash progress bar.
#

# Count the number of times the progress bar is likely to gbe increased
numu=$((`cat /etc/rc.d/rc.* | grep -c "^progressup"`));
numd=$((`cat /etc/rc.d/rc.* | grep -c "^progressdown"`));

function progressup(){
 progress=$((`cat /var/run/progressbar`));
 progress=$(($progress+1));
 echo $progress > /var/run/progressbar
 echo "show $(( 65523 * $progress / $numu ))" > /proc/splash
}

function progressdown(){
 progress=$((`cat /var/run/progressbar`));
 progress=$(($progress-1));
 echo $progress > /var/run/progressbar
 echo "show $(( 65523 * $progress / $numd ))" > /proc/splash
}


Now *CAREFULLY* edit /etc/rc.d/rc.S at the top add the line (a new line by itself) . /etc/rc.d/rc.progress The . tells your system to include the functionality described in /etc/rc.d/rc.progress. Now scroll through and add "progressup" (the defined trigger in rc.progress) on a new line at the end of every subroutine where you want the progressbar to incriment up. Example section of my rc.S:

  
#!/bin/sh
#
# /etc/rc.d/rc.S:  System initialization script.
#
# Mostly written by:  Patrick J. Volkerding, <volkerdi@slackware.com>
#
. /etc/rc.d/rc.progress
PATH=/sbin:/usr/sbin:/bin:/usr/bin

# Mount /proc right away: 
  

Don't add progressup till after your partition is mounted read/write it'll be at the end of a long segment of echo .. echo.. echo like this.

   echo -n "Press ENTER to continue. "
  read junk;
fi # Done checking root filesystem
progressup
  

Do the same for /etc/rc.d/rc.6 adding progressdown instead of progressup. After you've finished that, you need to delete your temporary progressbar output cache. Since rc.local is run last during startup, it's best to accomplish this here. Edit rc.local:

  
#!/bin/sh
#
# /etc/rc.d/rc.local:  Local system initialization script.
#
# Put any local startup commands in here.  Also, if you have
# anything that needs to be run at shutdown time you can
# make an /etc/rc.d/rc.local_shutdown script and put those
# commands in there.

rm -fr /var/run/progressbar 

Progressbar - rc.bootsplash

An alternate script can also be used if you should have problems implementing the rc.progress script. In my case the prior script was not able to delete its progressbar file, and adding progressdown entries to rc.6 resulted in odd behaviors even during bootup when rc.6 should not of been a factor. Create a new file in /etc/rc.d/ named rc.bootsplash

  cd /etc/rc.d/ ; touch rc.bootsplash 

edit it, and add this script:

 
#! /bin/sh
#
# /etc/rc.d/rc.bootsplash: bootsplash functions.
# This file does nothing if run, and is called by other rc.
# files in order to make the progress bar and animations works.

function progressbar()
{
        if [ $# != 1 ]
                then
                echo "Usage: progressbar {progress}"
                exit 1
        fi
        if [ -a /proc/splash ] ; then
                echo "show $(( 65534 * $1 / 100 ))" > /proc/splash
        fi
}
#
function animate()
{
        if [ $# = 0 ]
                then
                echo "Usage: animate {hook}"
                exit 1
        fi
        splash "$*"
}


Now *CAREFULLY* edit /etc/rc.d/rc.S at the top add the line (a new line by itself) . /etc/rc.d/rc.bootsplash Now scroll through and add "progressbar X" (where X is a number representing the percent to incriment to) on a new line at the end of every subroutine where you want the progressbar to incriment up. 0 is not a valid incriment. Only 1 - 100 are valid.

Example rc.S

 
# Scan for new volume groups:
  /sbin/vgscan --mknodes --ignorelockingfailure 2> /dev/null
  if [ $? = 0 ]; then
    # Make volume groups available to the kernel.
    # This should also make logical volumes available.
    /sbin/vgchange -ay --ignorelockingfailure
  fi
fi
progressbar 5

# Open any volumes created by cryptsetup:
if [ -f /etc/crypttab -a -x /sbin/cryptsetup.static ]; then
  # First, check for device-mapper support.
  if ! grep -wq device-mapper /proc/devices ; then
    # If device-mapper exists as a module, try to load it.
    # Try to load a device-mapper kernel module:
    /sbin/modprobe -q dm-mod
  fi
  cat /etc/crypttab | grep -v "^#" | grep -v "^$" | while read line; do
    LUKS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f1 -d' ')
    DEV=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f2 -d' ')
    PASS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f3 -d' ')
    OPTS=$(echo $line | tr '\t' ' ' | tr -s ' ' | cut -f4 -d' ')
    LUKSOPTS=""
    if echo $OPTS | grep -wq ro ; then LUKSOPTS="${LUKSOPTS} --readonly" ; fi

    # NOTE: we only support LUKS formatted volumes (except for swap)!
    if /sbin/cryptsetup.static isLuks $DEV 2>/dev/null ; then
      echo "Unlocking LUKS crypt volume '${LUKS}' on device '$DEV':"
      if [ -n "${PASS}" ]; then
        if [ -f ${PASS} ]; then
          /sbin/cryptsetup.static ${LUKSOPTS} --key-file=${PASS} luksOpen $DEV $LUKS
        elif [ "${PASS}" != "none" ]; then
          echo "${PASS}" | /sbin/cryptsetup.static ${LUKSOPTS} luksOpen $DEV $LUKS
        fi
      else
        for i in seq 1 3 ; do
          /sbin/cryptsetup.static ${LUKSOPTS} luksOpen $DEV $LUKS </dev/tty0 >/dev/tty0 2>&1
          [ $? -eq 0 ] && break
        done
      fi
    elif echo $OPTS | grep -wq swap ; then
      # If any of the volumes is to be used as encrypted swap,
      # then encrypt it using a random key and run mkswap:
      echo "Creating encrypted swap on device '$DEV' mapped to '${LUKS}':"
      /sbin/cryptsetup.static --cipher=aes --key-file=/dev/urandom --key-size=256 create $LUKS $DEV
      mkswap /dev/mapper/$LUKS
    fi
  done
fi

# Enable swapping:
/sbin/swapon -a
progressbar 10

Continue adding "progressbar X" entries in both rc.S and rc.M

Do the same for rc.6 but instead incrimenting down 'X'.

Example rc.6

 
#! /bin/sh
#
# rc.6          This file is executed by init when it goes into runlevel
#               0 (halt) or runlevel 6 (reboot). It kills all processes,
#               unmounts file systems and then either halts or reboots.
#
# Version:      @(#)/etc/rc.d/rc.6      2.47 Sat Jan 13 13:37:26 PST 2001
#
# Author:       Miquel van Smoorenburg <miquels@drinkel.nl.mugnet.org>
# Modified by:  Patrick J. Volkerding, <volkerdi@slackware.com>
#
. /etc/rc.d/rc.bootsplash

# Set the path.
PATH=/sbin:/etc:/bin:/usr/bin
progressbar 100

# If there are SystemV init scripts for this runlevel, run them.
if [ -x /etc/rc.d/rc.sysvinit ]; then
  . /etc/rc.d/rc.sysvinit
fi
progressbar 90

# Set linefeed mode to avoid staircase effect.
/bin/stty onlcr

echo "Running shutdown script $0:"

# Find out how we were called.
case "$0" in
        *0)
                command="halt"
                ;;
        *6)
                command=reboot
                ;;
        *)
                echo "$0: call me as \"rc.0\" or \"rc.6\" please!"
                exit 1
                ;;
esac

# Save the system time to the hardware clock using hwclock --systohc.
if [ -x /sbin/hwclock ]; then
  # Check for a broken motherboard RTC clock (where ioports for rtc are
  # unknown) to prevent hwclock causing a hang:
  if ! grep -q -w rtc /proc/ioports ; then
    CLOCK_OPT="--directisa"
  fi
  if grep -q "^UTC" /etc/hardwareclock 2> /dev/null ; then
    echo "Saving system time to the hardware clock (UTC)."
    /sbin/hwclock $CLOCK_OPT --utc --systohc
  else
    echo "Saving system time to the hardware clock (localtime)."
    /sbin/hwclock  $CLOCK_OPT --localtime --systohc
  fi
fi
progressbar 80