diff options
Diffstat (limited to 'chapter07')
-rw-r--r-- | chapter07/chapter7.sgml | 22 | ||||
-rw-r--r-- | chapter07/checkfs.sgml | 116 | ||||
-rw-r--r-- | chapter07/createdirs.sgml | 19 | ||||
-rw-r--r-- | chapter07/fstab.sgml | 32 | ||||
-rw-r--r-- | chapter07/functions.sgml | 451 | ||||
-rw-r--r-- | chapter07/halt.sgml | 27 | ||||
-rw-r--r-- | chapter07/introduction.sgml | 13 | ||||
-rw-r--r-- | chapter07/loadkeys.sgml | 36 | ||||
-rw-r--r-- | chapter07/mountfs.sgml | 110 | ||||
-rw-r--r-- | chapter07/rc.sgml | 253 | ||||
-rw-r--r-- | chapter07/rcS.sgml | 43 | ||||
-rw-r--r-- | chapter07/reboot.sgml | 30 | ||||
-rw-r--r-- | chapter07/sendsignals.sgml | 44 | ||||
-rw-r--r-- | chapter07/setclock.sgml | 93 | ||||
-rw-r--r-- | chapter07/symperm.sgml | 49 | ||||
-rw-r--r-- | chapter07/sysklogd.sgml | 67 | ||||
-rw-r--r-- | chapter07/template.sgml | 60 |
17 files changed, 1465 insertions, 0 deletions
diff --git a/chapter07/chapter7.sgml b/chapter07/chapter7.sgml new file mode 100644 index 000000000..ab3625579 --- /dev/null +++ b/chapter07/chapter7.sgml @@ -0,0 +1,22 @@ +<chapter id="chapter07"> +<title>Creating system boot scripts</title> + +&c7-introduction; +&c7-createdirs; +&c7-rc; +&c7-rcS; +&c7-functions; +&c7-checkfs; +&c7-halt; +&c7-loadkeys; +&c7-mountfs; +&c7-reboot; +&c7-sendsignals; +&c7-setclock; +&c7-sysklogd; +&c7-template; +&c7-symperm; +&c7-fstab; + +</chapter> + diff --git a/chapter07/checkfs.sgml b/chapter07/checkfs.sgml new file mode 100644 index 000000000..2350a0056 --- /dev/null +++ b/chapter07/checkfs.sgml @@ -0,0 +1,116 @@ +<sect1 id="ch07-checkfs"> +<title>Creating the checkfs script</title> + +<para> +Create a new file <filename>/etc/init.d/checkfs</filename> containing +the following: +</para> + +<literallayout> + +<userinput>cat > checkfs << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/checkfs + +# +# Include the functions declared in the /etc/init.d/functions file +# + +source /etc/init.d/functions + +# +# Activate all the swap partitions declared in the /etc/fstab file +# + +echo -n "Activating swap..." +/sbin/swapon -a +evaluate_retval + +# +# If the /fastboot file exists we don't want to run the partition checks +# + +if [ -f /fastboot ] +then + echo "Fast boot, no file system check" +else + +# +# Mount the root partition read-only (just in case the kernel mounts it +# read-write and we don't want to run fsck on a read-write mounted +# partition). +# + + /bin/mount -n -o remount,ro / + if [ $? = 0 ] + then + +# +# If the /forcefsck file exists we want to force a partition check even +# if the partition was unmounted cleanly the last time +# + + if [ -f /forcefsck ] + then + echo -n "/forcefsck exists, forcing " + echo "file system check" + force="-f" + else + force="" + fi + +# +# Check all the file systems mentioned in /etc/fstab that have the +# fs_passno value set to 1 or 2 (the 6th field. See man fstab for more +# info) +# + + echo "Checking file systems..." + /sbin/fsck $force -a -A -C -T + +# +# If something went wrong during the checks of one of the partitions, +# fsck will exit with a return value greater than 1. If this is +# the case we start sulogin so you can repair the damage manually +# + + if [ $? -gt 1 ] + then + $FAILURE + echo + echo -n "fsck failed. Please repair your file " + echo "systems manually by running /sbin/fsck" + echo "without the -a option" + echo + echo -n "Please note that the root file system " + echo "is currently mounted in read-only mode." + echo + echo -n "I will start sulogin now. When you " + echo "logout I will reboot your system." + echo + $NORMAL + /sbin/sulogin + /sbin/reboot -f + else + print_status success + fi + + else + +# +# If the remount to read-only mode didn't work abort the fsck and print +# an error +# + + echo -n "Cannot check root file system because it " + echo "could not be mounted in read-only mode." + fi +fi + +# End /etc/init.d/checkfs +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/createdirs.sgml b/chapter07/createdirs.sgml new file mode 100644 index 000000000..0831e7874 --- /dev/null +++ b/chapter07/createdirs.sgml @@ -0,0 +1,19 @@ +<sect1 id="ch07-createdirs"> +<title>Creating directories</title> + +<para> +We need to start by creating a few extra directories that are used by +the boot scripts. Create these directories by running: +</para> + +<blockquote><literallayout> + + <userinput>cd /etc &&</userinput> + <userinput>mkdir sysconfig rc0.d rc1.d rc2.d rc3.d &&</userinput> + <userinput>mkdir rc4.d rc5.d rc6.d init.d rcS.d &&</userinput> + <userinput>cd init.d</userinput> + +</literallayout></blockquote> + +</sect1> + diff --git a/chapter07/fstab.sgml b/chapter07/fstab.sgml new file mode 100644 index 000000000..1c0be5826 --- /dev/null +++ b/chapter07/fstab.sgml @@ -0,0 +1,32 @@ +<sect1 id="ch07-fstab"> +<title>Creating the /etc/fstab file</title> + +<para> +In order for certain programs to be able to determine where certain +partitions are supposed to be mounted by default, the /etc/fstab file is +used. Create a new file <filename>/etc/fstab</filename> containing the +following: +</para> + +<literallayout> + +<userinput>cat > /etc/fstab << "EOF"</userinput> +# Begin /etc/fstab + +/dev/<LFS-partition designation> / ext2 defaults 1 1 +/dev/<swap-partition designation> swap swap defaults 0 0 +proc /proc proc defaults 0 0 + +# End /etc/fstab +<userinput>EOF</userinput> + +</literallayout> + +<para> +Replace <LFS-partition designation> and <swap-partition +designation> with the appropriate devices (/dev/hda5 and /dev/hda6 in my +case). +</para> + +</sect1> + diff --git a/chapter07/functions.sgml b/chapter07/functions.sgml new file mode 100644 index 000000000..e46522c0f --- /dev/null +++ b/chapter07/functions.sgml @@ -0,0 +1,451 @@ +<sect1 id="ch07-functions"> +<title>Creating the functions script</title> + +<para> +Create a new file <filename>/etc/init.d/functions</filename> containing +the following: +</para> + +<literallayout> + +<userinput>cat > functions << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/functions + +# +# Set a few variables that influence the text that's printed on the +# screen. The SET_COL variable starts the text in column number 70 (as +# defined by the COL variable). NORMAL prints text in normal mode. +# SUCCESS prints text in a green colour and FAILURE prints text in a red +# colour +# + +COL=70 +SET_COL="echo -en \\033[${COL}G" +NORMAL="echo -en \\033[0;39m" +SUCCESS="echo -en \\033[1;32m" +FAILURE="echo -en \\033[1;31m" + +# +# The evaluate_retval function evaluates the return value of the process +# that was run just before this function was called. If the return value +# was 0, indicating success, the print_status function is called with +# the 'success' parameter. Otherwise the print_status function is called +# with the failure parameter. +# + +evaluate_retval() +{ + if [ $? = 0 ] + then + print_status success + else + print_status failure + fi +} + +# +# The print_status prints [ OK ] or [FAILED] to the screen. OK appears +# in the colour defined by the SUCCESS variable and FAILED appears in +# the colour defined by the FAILURE variable. Both are printed starting +# in the colomn defined by the COL variable. +# + +print_status() +{ + +# +# If no parameters are given to the print_status function, print usage +# information. +# + + if [ $# = 0 ] + then + echo "Usage: print_status {success|failure}" + return 1 + fi + + case "$1" in + success) + $SET_COL + echo -n "[ " + $SUCCESS + echo -n "OK" + $NORMAL + echo " ]" + ;; + failure) + $SET_COL + echo -n "[" + $FAILURE + echo -n "FAILED" + $NORMAL + echo "]" + ;; + esac + +} + +# +# The loadproc function starts a process (often a daemon) with +# proper error checking +# + +loadproc() +{ + +# +# If no parameters are given to the print_status function, print usage +# information. + +# + + if [ $# = 0 ] + then + echo "Usage: loadproc {program}" + exit 1 + fi +# +# Find the basename of the first parameter (the daemon's name without +# the path +# that was provided so /usr/sbin/syslogd becomes plain 'syslogd' after +# basename ran) +# + + base=$(/usr/bin/basename $1) +# +# the pidlist variable will contains the output of the pidof command. +# pidof will try to find the PID's that belong to a certain string; +# $base in this case +# + + pidlist=$(/bin/pidof -o $$ -o $PPID -o %PPID -x $base) + + pid="" + + for apid in $pidlist + do + if [ -d /proc/$apid ] + then + pid="$pid $apid" + fi + done +# +# If the $pid variable contains anything (from the previous for loop) it +# means the daemon is already running +# + + if [ ! -n "$pid" ] + then +# +# Empty $pid variable means it's not running, so we run $* (all +# parameters giving to this function from the script) and then check the +# return value +# + $* + evaluate_retval + else +# +# The variable $pid was not empty, meaning it was already running. We +# print [FAILED] now +# + print_status failure + fi + +} + +# +# The killproc function kills a process with proper error checking +# + +killproc() +{ + +# +# If no parameters are given to the print_status function, print usage +# information. + +# + + if [ $# = 0 ] + then + echo "Usage: killproc {program} [signal]" + exit 1 + fi + +# +# Find the basename of the first parameter (the daemon's name without +# the path +# that was provided so /usr/sbin/syslogd becomes plain 'syslogd' after +# basename ran) +# + + base=$(/usr/bin/basename $1) + +# +# Check if we gave a signal to kill the process with (like -HUP, -TERM, +# -KILL, etc) to this function (the second parameter). If no second +# parameter was provided set the nolevel variable. Else set the +# killlevel variable to the value of $2 (the second parameter) +# + + if [ "$2" != "" ] + then + killlevel=-$2 + else + nolevel=1 + fi + +# +# the pidlist variable will contains the output of the pidof command. +# pidof will try to find the PID's that belong to a certain string; +# $base in this case + + pidlist=$(/bin/pidof -o $$ -o $PPID -o %PPID -x $base) + + pid="" + + for apid in $pidlist + do + if [ -d /proc/$apid ] + then + pid="$pid $apid" + fi + done + +# +# If $pid contains something from the previous for loop it means one or + +# more PID's were found that belongs to the processes to be killed +# + if [ -n "$pid" ] + then +# +# If no kill level was specified we'll try -TERM first and then sleep +# for 2 seconds to allow the kill to be completed +# + if [ "$nolevel" = 1 ] + then + /bin/kill -TERM $pid +/usr/bin/sleep 2 +# +# If after -TERM the PID still exists we'll try killing it with -KILL +# and wait for 2 seconds again to allow the kill to be completed +# + + if ps h $pid >/dev/null 2>&1 + then + /bin/kill -KILL $pid +/usr/bin/sleep 2 + fi + /bin/ps h $pid >/dev/null 2>&1 + if [ $? = 0 ] + then +# +# If after the -KILL it still exists it can't be killed for some reason +# and we'll print [FAILED] +# + print_status failure + else +# +# It was killed, remove possible stale PID file in /var/run and +# print [ OK ] +# + /bin/rm -f /var/run/$base.pid + print_status success + fi + else +# +# A kill level was provided. Kill with the provided kill level and wait +# for 2 seconds to allow the kill to be completed + +# + /bin/kill $killlevel $pid +/usr/bin/sleep 2 + /bin/ps h $pid >/dev/null 2>&1 + if [ $? = 0 ] + then +# +# If ps' return value is 0 it means it ran ok which indicates that the +# PID still exists. This means the process wasn't killed properly with +# the signal provided. Print [FAILED] +# + print_status failure + else +# +# If the return value was 1 or higher it means the PID didn't exist +# anymore which means it was killed successfully. Remove possible stale +# PID file and print [ OK ] +# + /bin/rm -f /var/run/$base.pid + print_status success + fi + fi + else +# +# The PID didn't exist so we can't attempt to kill it. Print [FAILED] +# + print_status failure + fi +} + +# +# The reloadproc functions sends a signal to a daemon telling it to +# reload it's configuration file. This is almost identical to the +# killproc function with the exception that it won't try to kill it with +# a -KILL signal (aka -9) +# + +reloadproc() +{ + +# +# If no parameters are given to the print_status function, print usage +# information. + +# + + if [ $# = 0 ] + then + echo "Usage: reloadproc {program} [signal]" + exit 1 + fi + +# +# Find the basename of the first parameter (the daemon's name without +# the path +# that was provided so /usr/sbin/syslogd becomes plain 'syslogd' after +# basename ran) +# + + base=$(/usr/bin/basename $1) + +# +# Check if we gave a signal to send to the process (like -HUP) +# to this function (the second parameter). If no second +# parameter was provided set the nolevel variable. Else set the +# killlevel variable to the value of $2 (the second parameter) +# + + + if [ -n "$2" ] + then + killlevel=-$2 + else + nolevel=1 + fi + +# +# the pidlist variable will contains the output of the pidof command. +# pidof will try to find the PID's that belong to a certain string; +# $base in this case + +# + + pidlist=$(/bin/pidof -o $$ -o $PPID -o %PPID -x $base) + + pid="" + + for apid in $pidlist + do + if [ -d /proc/$apid ] + then + pid="$pid $apid" + fi + done + +# +# If $pid contains something from the previous for loop it means one or +# more PID's were found that belongs to the processes to be reloaded +# + + if [ -n "$pid" ] + then + +# +# If nolevel was set we will use the default reload signal SIGHUP. +# + + if [ "$nolevel" = 1 ] + then + /bin/kill -SIGHUP $pid + evaluate_retval + else +# +# Else we will use the provided signal +# + + /bin/kill $killlevel $pid + evaluate_retval + fi + else +# +# If $pid is empty no PID's have been found that belong to the process +# and print [FAILED] +# + + print_status failure + fi +} + +# +# The statusproc function will try to find out if a process is running +# or not +# + +statusproc() +{ + +# +# If no parameters are given to the print_status function, print usage +# information. + +# + + if [ $# = 0 ] + then + echo "Usage: status {program}" + return 1 + fi + +# +# $pid will contain a list of PID's that belong to a process +# + + pid=$(/bin/pidof -o $$ -o $PPID -o %PPID -x $1) + if [ -n "$pid" ] + then +# +# If $pid contains something, the process is running, print the contents +# of the $pid variable +# + echo "$1 running with Process ID $pid" + return 0 + fi + +# +# If $pid doesn't contain it check if a PID file exists and inform the +# user about this stale file. +# + + if [ -f /var/run/$1.pid ] + then + pid=$(/usr/bin/head -1 /var/run/$1.pid) + if [ -n "$pid" ] + then + echo "$1 not running but /var/run/$1.pid exists" + return 1 + fi + else + echo "$1 is not running" + fi + +} + +# End /etc/init.d/functions +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/halt.sgml b/chapter07/halt.sgml new file mode 100644 index 000000000..f7849ad0b --- /dev/null +++ b/chapter07/halt.sgml @@ -0,0 +1,27 @@ +<sect1 id="ch07-halt"> +<title>Creating the halt script</title> + +<para> +Create a new file <filename>/etc/init.d/halt</filename> containing the +following: +</para> + +<literallayout> + +<userinput>cat > halt << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/halt + +# +# Call halt. See man halt for the meaning of the parameters +# + +/sbin/halt -d -f -i -p + +# End /etc/init.d/halt +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/introduction.sgml b/chapter07/introduction.sgml new file mode 100644 index 000000000..5f1bea0b0 --- /dev/null +++ b/chapter07/introduction.sgml @@ -0,0 +1,13 @@ +<sect1 id="ch07-introduction"> +<title>Introduction</title> + +<para> +This chapter will create the necessary scripts that are run at boottime. +These scripts perform tasks such as remounting the root file system +mounted read-only by the kernel into read-write mode, activiating the swap +partition(s), running a check on the root file system to make sure it's +intact and starting the daemons that the system uses. +</para> + +</sect1> + diff --git a/chapter07/loadkeys.sgml b/chapter07/loadkeys.sgml new file mode 100644 index 000000000..bc17fd19d --- /dev/null +++ b/chapter07/loadkeys.sgml @@ -0,0 +1,36 @@ +<sect1 id="ch07-loadkeys"> +<title>Creating the loadkeys script</title> + +<para> +You only need to create this script if you don't have a default 101 keys +US keyboard layout. Create a new file +<filename>/etc/init.d/loadkeys</filename> containing the following: +</para> + +<literallayout> + +<userinput>cat > loadkeys << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/loadkeys + +# +# Include the functions declared in the /etc/init.d/functions file +# + +source /etc/init.d/functions + +# +# Load the default keymap file +# + +echo -n "Loading keymap..." +/usr/bin/loadkeys -d >/dev/null +evaluate_retval + +# End /etc/init.d/loadkeys +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/mountfs.sgml b/chapter07/mountfs.sgml new file mode 100644 index 000000000..f0fdf7a78 --- /dev/null +++ b/chapter07/mountfs.sgml @@ -0,0 +1,110 @@ +<sect1 id="ch07-mountfs"> +<title>Creating the mountfs script</title> + +<para> +Create a new file <filename>/etc/init.d/mountfs</filename> containing +the following: +</para> + +<literallayout> + +<userinput>cat > mountfs << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/mountfs + +# +# Include the functions declared in the /etc/init.d/functions file +# + +source /etc/init.d/functions + +case "$1" in + start) + + # + # Remount the root partition in read-write mode. -n tells mount + # not to + # write to the /etc/mtab file (because it can't do this. The + # root + # partition is most likely still mounted in read-only mode + # + + echo -n "Remounting root file system in read-write mode..." + /bin/mount -n -o remount,rw / + evaluate_retval + + # + # First empty the /etc/mtab file. Then remount root partition + # in read-write + # mode again but pass -f to mount. This way mount does + # everything + # except the mount itself. This is needed for it to write to the + # mtab + # file which contains a list of currently mounted file systems. + # + + echo > /etc/mtab + /bin/mount -f -o remount,rw / + + # + # Remove the possible /fastboot and /forcefsck files. they are + # only + # supposed to be used during the next reboot's checkfs wich just + # happened. If you want to fastboot or forcefsck again you'll + # have to + # recreate the files + # + + /bin/rm -f /fastboot /forcefsck + + # + # Walk through /etc/fstab and mount all file systems that don't + # have the noauto option set in the fs_mntops field (the 4th + # field. + # See man fstab for more info) + # + + echo -n "Mounting other file systems..." + /bin/mount -a + evaluate_retval + ;; + + stop) + + # + # Deactive all the swap partitions + # + + echo -n "Deactivating swap..." + /sbin/swapoff -a + evaluate_retval + + # + # And unmount all the file systems, mounting the root file + # system + # read-only (all are unmounted but because root can't be + # unmounted + # at this point mount will automatically mount it read-only + # which + # is what supposed to happen. This way no data can be written + # anymore from disk) + # + + echo -n "Unmounting file systems..." + /bin/umount -a -r + evaluate_retval + ;; + + *) + echo "Usage: $0 {start|stop}" + exit 1 + ;; +esac + +# End /etc/init.d/mountfs +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/rc.sgml b/chapter07/rc.sgml new file mode 100644 index 000000000..3aba51da3 --- /dev/null +++ b/chapter07/rc.sgml @@ -0,0 +1,253 @@ +<sect1 id="ch07-rc"> +<title>Creating the rc script</title> + +<para> +The first main bootscript is the <filename>/etc/init.d/rc</filename> script. +Create a new file <filename>/etc/init.d/rc</filename> containing the +following: </para> + +<literallayout> + +<userinput>cat > rc << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/rc +# +# By Jason Pearce - jason.pearce@linux.org +# Modified by Gerard Beekmans - gerard@linuxfromscratch.org +# print_error_msg based on ideas by Simon Perreault - nomis80@yahoo.com + +# +# Include the functions declared in the /etc/init.d/functions file +# + +source /etc/init.d/functions + +# +# The print_error_msg function prints an error message when an unforseen +# error occured that wasn't trapped for some reason by a evaluate_retval +# call or error checking in different ways. + +print_error_msg() +{ + + echo + $FAILURE + echo -n "You should not read this error message. It means " + echo "that an unforseen error " + echo -n "took place and subscript $i exited with " + echo "a return value " + echo -n "of $error_value for an unknown reason. If you're able " + echo "to trace this error down " + echo -n "to a bug in one of the files provided by this book, " + echo "please be so kind to " + echo -n "inform us at lfs-discuss@linuxfromscratch.org" + $NORMAL + echo + echo + echo "Press a key to continue..." + read +} + +# +# If you uncomment the debug variable below none of the scripts will be +# executed, just the script name and parameters will be echo'ed to the +# screen so you can see how the scripts are called by rc. +# + +# Un-comment the following for debugging. +# debug=echo + +# +# Start script or program. +# +startup() { + +$debug $* + +} + +# +# Ignore CTRL-C only in this shell, so we can interrupt subprocesses. +# + +trap ":" INT QUIT TSTP + +# +# Now find out what the current and what the previous runlevel are. The +# $RUNLEVEL variable is set by init for all it's children. This script +# runs as a child of init. +# + +runlevel=$RUNLEVEL + +# +# Get first argument. Set new runlevel to this argument. If no runlevel +# was passed to this script we won't change runlevels. +# + +[ "$1" != "" ] && runlevel=$1 +if [ "$runlevel" = "" ] +then + echo "Usage: $0 <runlevel>" >&2 + exit 1 +fi + +# +# The same goes for $PREVLEVEL (see above for $RUNLEVEL). previous will +# be set to the previous run level. If $PREVLEVEL is not set it means +# that there is no previous runlevel and we'll set previous to N. +# + +previous=$PREVLEVEL +[ "$previous" = "" ] && previous=N + +export runlevel previous + +# +# Is there an rc directory for the new runlevel? +# + +if [ -d /etc/rc$runlevel.d ] + +then + +# +# If so, first collect all the K* scripts in the new run level. +# + + if [ $previous != N ] + then + for i in /etc/rc$runlevel.d/K* + do + [ ! -f $i ] && continue + +# +# the suffix variable will contain the script name without the leading +# Kxxx +# + + suffix=${i#/etc/rc$runlevel.d/K[0-9][0-9][0-9]} +# +# If there is a start script for this K script in the previous runlevel +# determine what it's full path is +# + previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix +# +# If there was no previous run level it could be that something was +# started in rcS.d (sysinit level) so we'll determine the path for that +# possibility as well. +# + + sysinit_start=/etc/rcS.d/S[0-9][0-9][0-9]$suffix + +# +# Stop the service if there is a start script in the previous run level +# or in the sysinit level. If previous_start or sysinit_start do not +# exist the 'continue' command is run which causes the script to abort +# this iteration of the for loop and continue with the next iteration. +# This boils down to that it won't run the commands after the next two +# lines and start over from the top of this for loop. See man bash for +# more info on this. +# + + [ ! -f $previous_start ] && + [ ! -f $sysinit_start ] && continue + +# +# If we found previous_start or sysinit_start, run the K script +# + + startup $i stop + error_value=$? +# +# If the return value of the script is not 0, something went wrong with +# error checking inside the script. the print_error_msg function will be +# called and the message plus the return value of the K script will be +# printed to the screen + +# + + if [ $error_value != 0 ] + then + print_error_msg + fi + + done + fi + +# +# Now run the START scripts for this runlevel. +# + + for i in /etc/rc$runlevel.d/S* + do + [ ! -f $i ] && continue + + if [ $previous != N ] + then +# +# Find start script in previous runlevel and stop script in this +# runlevel. +# + + suffix=${i#/etc/rc$runlevel.d/S[0-9][0-9][0-9]} + stop=/etc/rc$runlevel.d/K[0-9][0-9][0-9]$suffix + previous_start=/etc/rc$previous.d/S[0-9][0-9][0-9]$suffix +# +# If there is a start script in the previous level and no stop script in +# this level, we don't have to re-start the service; abort this +# iteration and start the next one. +# + + [ -f $previous_start ] && [ ! -f $stop ] && + continue + fi + + case "$runlevel" in + 0|6) + +# +# levels 0 and 6 are halt and reboot levels. We don't really start +# anything here so we call with the 'stop' parameter +# + + startup $i stop + error_value=$? +# +# If the return value of the script is not 0, something went wrong with +# error checking inside the script. the print_error_msg function will be +# called and the message plus the return value of the K script will be +# printed to the screen +# + + if [ $error_value != 0 ] + then + print_error_msg + fi + ;; + *) + startup $i start + error_value=$? +# +# If the return value of the script is not 0, something went wrong with +# error checking inside the script. the print_error_msg function will be +# called and the message plus the return value of the K script will be +# printed to the screen +# + + if [ $error_value != 0 ] + then + print_error_msg + fi + ;; + esac + done +fi + +# End /etc/init.d/rc +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/rcS.sgml b/chapter07/rcS.sgml new file mode 100644 index 000000000..908059d04 --- /dev/null +++ b/chapter07/rcS.sgml @@ -0,0 +1,43 @@ +<sect1 id="ch07-rcS"> +<title>Creating the rcS script</title> + +<para> +The second main bootscript is the <filename>rcS</filename> script. Create a +new file <filename>/etc/init.d/rcS</filename> containing the following: +</para> + +<literallayout> + +<userinput>cat > rcS << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/rcS + +# +# See the rc script for the extensive comments on the constructions +# used here +# + +runlevel=S +prevlevel=N +umask 022 +export runlevel prevlevel + +trap ":" INT QUIT TSTP + +# +# Collect all the S scripts in /etc/rcS.d and execute them in the same +# + +for i in /etc/rcS.d/S??* +do + [ ! -f "$i" ] && continue; + $i start +done + +# End /etc/init.d/rcS +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/reboot.sgml b/chapter07/reboot.sgml new file mode 100644 index 000000000..e57410c48 --- /dev/null +++ b/chapter07/reboot.sgml @@ -0,0 +1,30 @@ +<sect1 id="ch07-reboot"> +<title>Creating the reboot script</title> + +<para> +Create a new file <filename>/etc/init.d/reboot</filename> containing the +following: +</para> + +<literallayout> + +<userinput>cat > reboot << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/reboot + +# +# Call reboot. See man halt for the meaning of the parameters +# + + +echo "System reboot in progress..." + +/sbin/reboot -d -f -i + +# End /etc/init.d/reboot +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/sendsignals.sgml b/chapter07/sendsignals.sgml new file mode 100644 index 000000000..3aff74996 --- /dev/null +++ b/chapter07/sendsignals.sgml @@ -0,0 +1,44 @@ +<sect1 id="ch07-sendsignals"> +<title>Creating the sendsignals script</title> + +<para> +Create a new file <filename>/etc/init.d/sendsignals</filename> +containing the following: +</para> + +<literallayout> + +<userinput>cat > sendsignals << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/sendsignals + +# +# Include the functions declared in the /etc/init.d/functions file +# + +source /etc/init.d/functions + +# +# Send all the remaining processes the TERM signal +# + +echo -n "Sending all processes the TERM signal..." +/sbin/killall5 -15 +evaluate_retval + +# +# Send all the remaining process (after sending them the TERM signal +# before) the KILL signal. +# + +echo -n "Sending all processes the KILL signal..." +/sbin/killall5 -9 +evaluate_retval + +# End /etc/init.d/sendsignals +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/setclock.sgml b/chapter07/setclock.sgml new file mode 100644 index 000000000..9e5992c39 --- /dev/null +++ b/chapter07/setclock.sgml @@ -0,0 +1,93 @@ +<sect1 id="ch07-setclock"> +<title>Creating the setclock script</title> + +<para> +The following script is only for real use when your hardware clock (also +known as BIOS or CMOS clock) isn't set to GMT time. The recommended +setup is setting your hardware clock to GMT and have the time converted +to localtime using the /etc/localtime symbolic link. But if you run an +OS that doesn't understand a clock set to GMT (most notable are +Microsoft OS'es) you might want to set your clock to localtime so that +the time is properly displayed on those OS'es. This script will reset +the kernel time to the hardware clock without converting the time using +the /etc/localtime symlink. +</para> + +<para> +If you want to use this script on your system even if you have your +hardware clock set to GMT, then change the UTC variable below to the +value of <emphasis>1</emphasis>. +</para> + +<literallayout> + +<userinput>cat > setclock << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/setclock + +# +# Include the functions declared in the /etc/init.d/functions file +# and include the variables from the /etc/sysconfig/clock file +# + +source /etc/init.d/functions +source /etc/sysconfig/clock + +# +# Right now we want to set the kernel clock according to the hardware +# clock, so we use the -hctosys parameter. +# + +CLOCKPARAMS="--hctosys" + +# +# If the UTC variable is set in the /etc/sysconfig/clock file, add the +# -u parameter as well which tells hwclock that the hardware clock is +# set to UTC time instead of local time. +# + +case "$UTC" in + yes|true|1) + CLOCKPARAMS="$CLOCKPARAMS -u" + ;; +esac + +echo -n "Setting clock..." +/sbin/hwclock $CLOCKPARAMS +evaluate_retval + +# End /etc/init.d/setclock +<userinput>EOF</userinput> + +</literallayout> + +<sect2> +<title>Creating the /etc/sysconfig/clock file</title> + +<para> +Create a new file <filename>/etc/sysconfig/clock</filename> by running +the following: +</para> + +<literallayout> + +<userinput>cat > /etc/sysconfig/clock << "EOF"</userinput> +# Begin /etc/sysconfig/clock + +UTC=1 + +# End /etc/sysconfig/clock +<userinput>EOF</userinput> + +</literallayout> + +<para> +If your hardware clock (also known as BIOS or CMOS clock) is not set to +GMT time, than set the UTC variable in the /etc/sysconfig/clock file to +the value <emphasis>0</emphasis> (zero). +</para> + +</sect2> + +</sect1> + diff --git a/chapter07/symperm.sgml b/chapter07/symperm.sgml new file mode 100644 index 000000000..044f29d7a --- /dev/null +++ b/chapter07/symperm.sgml @@ -0,0 +1,49 @@ +<sect1 id="ch07-symperm"> +<title>Setting up symlinks and permissions</title> + +<para> +Give these files the proper permissions and create the necessary symlinks +by running the following commands. If you did not create the loadkeys +and setclock scripts, make sure you don't type them in the commands +below. +</para> + +<blockquote><literallayout> + + <userinput>cd /etc/init.d &&</userinput> + <userinput>chmod 754 rc rcS functions checkfs halt loadkeys mountfs + reboot &&</userinput> + <userinput>chmod 754 sendsignals setclock sysklogd template + &&</userinput> + <userinput>cd ../rc0.d &&</userinput> + <userinput>ln -s ../init.d/sysklogd K900sysklogd &&</userinput> + <userinput>ln -s ../init.d/sendsignals S800sendsignals && + </userinput> + <userinput>ln -s ../init.d/mountfs S900mountfs &&</userinput> + <userinput>ln -s ../init.d/halt S999halt &&</userinput> + <userinput>cd ../rc6.d &&</userinput> + <userinput>ln -s ../init.d/sysklogd K900sysklogd &&</userinput> + <userinput>ln -s ../init.d/sendsignals S800sendsignals && + </userinput> + <userinput>ln -s ../init.d/mountfs S900mountfs &&</userinput> + <userinput>ln -s ../init.d/reboot S999reboot &&</userinput> + <userinput>cd ../rcS.d &&</userinput> + <userinput>ln -s ../init.d/checkfs S200checkfs &&</userinput> + <userinput>ln -s ../init.d/mountfs S300mountfs &&</userinput> + <userinput>ln -s ../init.d/setclock S400setclock &&</userinput> + <userinput>ln -s ../init.d/loadkeys S500loadkeys &&</userinput> + <userinput>cd ../rc1.d &&</userinput> + <userinput>ln -s ../init.d/sysklogd K900sysklogd &&</userinput> + <userinput>cd ../rc2.d &&</userinput> + <userinput>ln -s ../init.d/sysklogd S100sysklogd &&</userinput> + <userinput>cd ../rc3.d &&</userinput> + <userinput>ln -s ../init.d/sysklogd S100sysklogd &&</userinput> + <userinput>cd ../rc4.d &&</userinput> + <userinput>ln -s ../init.d/sysklogd S100sysklogd &&</userinput> + <userinput>cd ../rc5.d &&</userinput> + <userinput>ln -s ../init.d/sysklogd S100sysklogd</userinput> + +</literallayout></blockquote> + +</sect1> + diff --git a/chapter07/sysklogd.sgml b/chapter07/sysklogd.sgml new file mode 100644 index 000000000..74e8b9d6d --- /dev/null +++ b/chapter07/sysklogd.sgml @@ -0,0 +1,67 @@ +<sect1 id="ch07-sysklogd"> +<title>Creating the sysklogd script</title> + +<para> +Create a new file <filename>/etc/init.d/sysklogd</filename> containing +the following: +</para> + +<literallayout> + +<userinput>cat > sysklogd << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/sysklogd + +# +# Include the functions declared in the /etc/init.d/functions file +# + +source /etc/init.d/functions + +case "$1" in + start) + echo -n "Starting system log daemon..." + loadproc /usr/sbin/syslogd -m 0 + + echo -n "Starting kernel log daemon..." + loadproc /usr/sbin/klogd + ;; + + stop) + echo -n "Stopping kernel log daemon..." + killproc klogd + + echo -n "Stopping system log daemon..." + killproc syslogd + ;; + + reload) + echo -n "Reloading system log daemon configuration file..." + reloadproc syslogd 1 + ;; + + restart) + $0 stop + /usr/bin/sleep 1 + $0 start + ;; + + status) + statusproc /usr/sbin/syslogd + statusproc /usr/sbin/klogd + ;; + + *) + echo "Usage: $0 {start|stop|reload|restart|status}" + exit 1 + ;; + +esac + +# End /etc/init.d/sysklogd +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + diff --git a/chapter07/template.sgml b/chapter07/template.sgml new file mode 100644 index 000000000..0c062ca30 --- /dev/null +++ b/chapter07/template.sgml @@ -0,0 +1,60 @@ +<sect1 id="ch07-template"> +<title>Creating the template script</title> + +<para> +Create a new file <filename>/etc/init.d/template</filename> containing +the following: +</para> + +<literallayout> + +<userinput>cat > template << "EOF"</userinput> +#!/bin/sh +# Begin /etc/init.d/ + +# +# Include the functions declared in the /etc/init.d/functions file +# + +source /etc/init.d/functions + +case "$1" in + start) + echo -n "Starting ..." + loadproc + ;; + + stop) + echo -n "Stopping ..." + killproc + ;; + + reload) + echo -n "Reloading ..." + reloadproc + ;; + + restart) + $0 stop + /usr/bin/sleep 1 + $0 start + ;; + + status) + statusproc + ;; + + *) + echo "Usage: $0 {start|stop|reload|restart|status}" + exit 1 + ;; + +esac + +# End /etc/init.d/ +<userinput>EOF</userinput> + +</literallayout> + +</sect1> + |