Slackware-Guides-Graphical Boot
Slackware-Guides-Graphical_Boot
Original LQ post can be found here. All credit goes to LQ member Keith Hedger. This guide was adapted for wiki format from his LQ post.
This guide will asist in helping Slackers enable the graphical boot capabilities of BusyBox. BusyBox is what Slackware uses with it's custom mkinitrd scripts to make an initrd image for booting the generic kernel and any special setups like LUKS/LVM partitions.
It is very IMPORTANT to make backups of everything involved and to know how to recover your system with a live cd or the Slackware install cd. We will be making some small but important changes to some system scripts, if you get it wrong you may find that your system is unbootable. If you do not know how to recover from an unbootable system or you do not know how to make an initrd image, you should stop now.
This guide is a summary and assumes you already know how to edit the config file for your boot loader, make an initrd image, and edit scripts.
Setup the frame buffer
We need to have an appropriate frame buffer for the size of the boot image and the amount of colors we want to use. This is done by setting the 'vga' configure option for your boot loader. An example is "vga=773" or "vga=779". If you would like to see list of detected options for your system, you can set it to "vga=ask" and reboot.
For more reading on the subject:
- usr/src/linux/Documentation/svga.txt
- man lilo.conf
Obtain splash image
You can use any image you want as long as it's the correct size and color depth of your framebuffer settings and you convert it to ppm format. This can be done using Gimp or Imagemagic.
Testing your picture
To make sure your picture matches your framebuffer settings, you can reboot your computer and test it at the command prompt.
- Switch to a virtual terminal outside of xorg. CTRL-ALT-F6
- Run /boot/initrd-tree/bin/busybox fbsplash -s /path/to/splash_image.ppm
If busybox displays an image, you are good to proceed. If not, check your framebuffer settings and the image format.
Note: If busybox isn't available at the path specified, you can run "mkinitrd -c" to create a generic initrd image and the files it was created from.
Create the wrapper scripts
We need to create three new system scripts to have the boot process give the proper feedback to busybox. Don't forget to make them executable using chmod.
/etc/rc.d/rc.S-Wrap
#!/bin/sh
#rc.S-Wrap
#This is the wrapper for rc.S
#
if [ -f /etc/output.conf ];then
. /etc/output.conf
else
#1st time so guess
OUT_S=40
OUT_M=40
fi
TOTAL=$((OUT_S+OUT_M))
MULTI=$(echo "scale=2; 100/$TOTAL" | bc -l)
COUNT=1
OUT_S_CHECK=0
#size of term
COLOUMNS=$(tput cols)
BOX=$(($(tput lines)-3))
TEXTLINE=$(($(tput lines)-2))
#log output
S_LOG="Starting rc.S\n"
STARTUP=/etc/rc.d/rc.S
#no kerenel messages
setterm -msg off -cursor off -foreground green
tput clear
/boot/initrd-tree/bin/busybox fbsplash -i /boot/GSplash/fb.config -f /boot/GSplash/fbfifo -s /boot/GSplash/startup.ppm &
"$STARTUP" &> /boot/GSplash/fifo &
while read DATA
do
OUT_S_CHECK=$((OUT_S_CHECK+1))
#count number of echos for next time round
echo "$COUNT\n" > /boot/GSplash/fbfifo
COUNT=$(echo "scale=2; $COUNT+$MULTI" | bc -l)
S_LOG=$(echo "${S_LOG}\n${DATA}")
if [ ${#DATA} -lt $COLOUMNS ];then
XPOS=$((COLOUMNS/2-${#DATA}/2))
else
XPOS=0
DATA=${DATA:0:$COLOUMNS};
fi
tput cup $BOX 0
setterm -clear rest
tput cup $TEXTLINE $XPOS
echo -en "$DATA"
done < /boot/GSplash/fifo
#number of echos has changed
if (( OUT_S != OUT_S_CHECK ));then
echo "OUT_S=$OUT_S_CHECK" > /boot/GSplash/output.conf.temp
fi
echo -e "$S_LOG" > /tmp/S_LOG
/etc/rc.d/rc.M-Wrap
#!/bin/sh
#rc.M-Wrap
#This is the wrapper for rc.M
#
if [ -f /etc/output.conf ];then
. /etc/output.conf
else
#1st time so guess
OUT_S=40
OUT_M=40
fi
TOTAL=$((OUT_S+OUT_M))
MULTI=$(echo "scale=2; 100/$TOTAL" | bc -l)
COUNT=$(echo "scale=2; ($OUT_S*$MULTI)" | bc -l)
OUT_M_CHECK=0
#size of term
COLOUMNS=$(tput cols)
BOX=$(($(tput lines)-3))
TEXTLINE=$(($(tput lines)-2))
#log output
S_LOG="Starting rc.M\n"
STARTUP=/etc/rc.d/rc.M
( "$STARTUP";echo "EOFEOF" ) &> /boot/GSplash/fifo &
while read DATA
do
S_LOG=$(echo "${S_LOG}\n${DATA}")
#we need this because rc.local don't exit ??
if [ "X$DATA" != "XEOFEOF" ];then
OUT_M_CHECK=$((OUT_M_CHECK+1))
#count number of echos for next time round
echo "$COUNT\n" > /boot/GSplash/fbfifo
COUNT=$(echo "scale=2; $COUNT+$MULTI" | bc -l)
#make it touch the end ( i'm anal that way )
if [ $(echo "scale=2; $COUNT > 100 " | bc -l) = 1 ];then
COUNT=100
fi
if (( ${#DATA} < COLOUMNS ));then
XPOS=$((COLOUMNS/2-${#DATA}/2))
else
XPOS=0
DATA=${DATA:0:$COLOUMNS}
fi
tput cup $BOX 0
setterm -clear rest
tput cup $TEXTLINE $XPOS
echo -en "$DATA"
else
break;
fi
done < /boot/GSplash/fifo
if [ -f /boot/GSplash/output.conf.temp ];then
#count changed
mv /boot/GSplash/output.conf.temp /etc/output.conf
echo "OUT_M=$OUT_M_CHECK" >> /etc/output.conf
elif (( OUT_M != OUT_M_CHECK ));then
echo "OUT_S=$OUT_S" > /etc/output.conf
echo "OUT_M=$OUT_M_CHECK" >> /etc/output.conf
fi
#log it and tdy up
echo -e "$S_LOG" >> /tmp/S_LOG
echo "exit\n" > /boot/GSplash/fbfifo
clear
setterm -default
exit 0
/etc/rc.d/rc.6-Wrap
#!/bin/sh
#rc.6-Wrap
#This is the wrapper for rc.6
#
# stop the GPM mouse server so it doesnt interfere with our pic
if [ -x /etc/rc.d/rc.gpm ]; then
/etc/rc.d/rc.gpm stop &> /dev/null
fi
if [ -f /etc/outputsd.conf ];then
. /etc/outputsd.conf
else
#1st time so guess
OUT_6=400
fi
TOTAL=$OUT_6
MULTI=$(echo "scale=2; 100/$TOTAL" | bc -l)
COUNT=100
OUT_6_CHECK=0
#size of term
COLOUMNS=$(tput cols)
BOX=$(($(tput lines)-3))
TEXTLINE=$(($(tput lines)-2))
#scurrilously robbed from rc.6 ;)
# Find out how we were called.
case "$0" in
*0-Wrap)
STARTUP=/etc/rc.d/rc.0
;;
*6-Wrap)
STARTUP=/etc/rc.d/rc.6
;;
*)
echo "$0: call me as \"rc.0\" or \"rc.6\" please!"
exit 1
;;
esac
#no kerenel messages
setterm -msg off -cursor off -foreground green
tput clear
/boot/initrd-tree/bin/busybox fbsplash -i /boot/GSplash/fbsd.config -f /boot/GSplash/fbfifo -s /boot/GSplash/shutdown.ppm &
"$STARTUP" &> /boot/GSplash/fifo &
while read DATA
do
OUT_6_CHECK=$((OUT_6_CHECK+1))
if [ "X$DATA" = "XUnmounting local file systems." ];then
#number of echos has changed
if (( OUT_6 != OUT_6_CHECK ));then
OUT_6_CHECK=$((OUT_6_CHECK+1))
echo "OUT_6=$OUT_6_CHECK" > /etc/outputsd.conf
fi
fi
#count number of echos for next time round
echo "$COUNT\n" > /boot/GSplash/fbfifo
COUNT=$(echo "scale=2; $COUNT-$MULTI" | bc -l)
if [ ${#DATA} -lt $COLOUMNS ];then
XPOS=$((COLOUMNS/2-${#DATA}/2))
else
XPOS=0
DATA=${DATA:0:$COLOUMNS};
fi
tput cup $BOX 0
setterm -clear rest
tput cup $TEXTLINE $XPOS
echo -en "$DATA"
done < /boot/GSplash/fifo
Edit /etc/inittab
We need to change /etc/inittab to use our wrapper scripts in place of rc.S and rc.M. Remember what was said about making backups?
- Change "si:S:sysinit:/etc/rc.d/rc.S" -- to --> "si:S:sysinit:/etc/rc.d/rc.S-Wrap"
- Change "rc:2345:wait:/etc/rc.d/rc.M" -- to --> "rc:2345:wait:/etc/rc.d/rc.M-Wrap"
- Change "l0:0:wait:/etc/rc.d/rc.0" -- to --> "l0:0:wait:/etc/rc.d/rc.0-Wrap"
- Change "l6:6:wait:/etc/rc.d/rc.6" -- to --> "l6:6:wait:/etc/rc.d/rc.6-Wrap"
- Make a symlink from rc.0-Wrap > rc.6-Wrap like so:
ln -sf /etc/rc.d/rc.6-Wrap /etc/rc.d/rc.0-Wrap
Copy/Create Configuration Files
We need to create the configuration file, the fifo buffer files and copy our splash screen to the location our wrapper scripts expect them to be.
- mkdir /boot/GSplash
- mkfifo /boot/GSplash/fbfifo
- mkfifo /boot/GSplash/fifo
- cp /path/to/startup_splash_image.ppm /boot/GSplash/startup.ppm
- cp /path/to/shutdown_splash_image.ppm /boot/GSplash/shutdown.ppm
You can if you want the same shutdown and startup picture just symlink them together
- vim /boot/GSplash/fb.config ( the config file to place the start up progress bar )
BAR_LEFT=312 BAR_TOP=550 BAR_WIDTH=400 BAR_HEIGHT=11 BAR_R=64 BAR_G=64 BAR_B=64
- vim /boot/GSplash/fbsd.config ( the config file to place the shut down progress bar )
BAR_LEFT=312 BAR_TOP=704 BAR_WIDTH=400 BAR_HEIGHT=11 BAR_R=64 BAR_G=64 BAR_B=64
These two config files are for illustration purposes only and you should change them to suit your own splash screens
Rerun lilo, Reboot and ( hopefully! ) you will now have a nice graphical boot!
Extra Notes
On the first boot, the progress bar will not acuratly represent the progress of the system boot. This is because the progress bar is dependent on a saved value of the total number of lines echoed to your screen during a normal text boot. When you modify the number of things that launch at start up, the scripts will update this value again.
The scripts create a log file at /tmp/S_LOG in case you want to examine the details of the boot up. If you don't want a log file, just comment out the appropriate lines in rc.S-Wrap and rc.M-Wrap.
What you can customize:
- The startup splash pic, just create a new one at /boot/GSplash/startup.ppm making sure that the size and type is set correctly.
- The shutdown splash pic, just create a new one at /boot/GSplash/shutdown.ppm making sure that the size and type is set correctly.
- The size, shape and background colour of the progress bar as defined in /boot/GSplash/fb.config
- The text colour can be changed at line 33 of /etc/rc.d/rc.S-Wrap, see the setterm man page for details.