[PATCH] Simple parallellized boot sequence (and a plea for LSB complience)

Petter Reinholdtsen pere at hungry.com
Tue Aug 23 08:24:05 UTC 2005


[Petter Reinholdtsen]
> Recently, I have been investigating how to speed up the boot process
> in Debian, and during this work, I found a simple way to change
> /etc/init.d/rc to run all init.d scripts with the same sequence
> number in parallell.

I continued on this approach a bit, using the LTSP thin client boot as
my test case, and using insserv to reorganize the symlinks in
/etc/rcS.d/ and /etc/rc2.d/ to match the dependency order I inserted
into the init.d scripts based on testing and experience.  Patch below.

The current patch take the level of concurrency as an option, and I
tested with several values (1,2,4,8).  These are the raw numbers, in
qemu seconds (which do not match wall clock seconds :).

     rcS  rc2  total    %speedup
 1  2616  204   2820        0%
 2  4752  213   4965      -76%
 4  1670  199   1869       33%
 8   877  193   1070       62%

The speedup percent is relative to the single subprocess case.

So if we can get dependency information into all the init.d scripts,
we should be able to speed up the boot process quite a bit by just
modifying the script order and running all script with the same order
value at the same time.

This is my current patch.  In addition to adding LSB headers, I change
rc and rcS to

 - write time spend in each boot script to /tmp/bootlog
 - always use a startup() function to run subscripts
 - run at most $CONCURRENCY subprocesses in parallel.

I'm working in a sarge chroot, and boot it like this, after exporting
it over NFS.

  echo "/opt/ltsp       *(ro,no_root_squash,async,insecure)" >> /etc/exports
  createdisk /tmp/hda 16 # Make dummy disk to keep qemu happy
  qemu -m 64 -kernel /opt/ltsp/i386/boot/vmlinuz-2.4.27-2-386 \
    -initrd /opt/ltsp/i386/boot/initrd.img-2.4.27-2-386 -user-net \
    -hda /tmp/hda -append "ip=dhcp root=/dev/nfs nfsroot=/opt/ltsp/i386/"

diff -u /etc/init.d/bootlogd init.d/bootlogd
--- /etc/init.d/bootlogd	2005-01-04 23:43:18.000000000 +0100
+++ init.d/bootlogd	2005-08-22 14:27:23.000000000 +0200
@@ -1,4 +1,13 @@
 #! /bin/sh
+### BEGIN INIT INFO
+# Provides:          bootlogd
+# Required-Start:    mountvirtfs
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 #
 # bootlogd	One of the first scripts to be executed. Starts or stops
 #		the bootlogd log program. If this script is called as
diff -u /etc/init.d/bootmisc.sh init.d/bootmisc.sh
--- /etc/init.d/bootmisc.sh	2004-09-10 17:00:48.000000000 +0200
+++ init.d/bootmisc.sh	2005-08-23 00:43:50.000000000 +0200
@@ -3,6 +3,16 @@
 #
 # Version:	@(#)bootmisc.sh  2.85-17  04-Jun-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          bootmisc
+# Required-Start:    $time
+# Required-Stop:     $time
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: manage network interfaces
+# Description:       manage network interfaces and configure some networking
+#                    options
+### END INIT INFO
 
 DELAYLOGIN=yes
 VERBOSE=yes
diff -u /etc/init.d/checkfs.sh init.d/checkfs.sh
--- /etc/init.d/checkfs.sh	2004-09-10 17:00:48.000000000 +0200
+++ init.d/checkfs.sh	2005-08-22 14:31:27.000000000 +0200
@@ -3,6 +3,16 @@
 #
 # Version:	@(#)checkfs  2.85-13  22-Mar-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          checkfs
+# Required-Start:    modutils
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: manage network interfaces
+# Description:       manage network interfaces and configure some networking
+#                    options
+### END INIT INFO
 
 FSCKFIX=no
 [ -f /etc/default/rcS ] && . /etc/default/rcS
diff -u /etc/init.d/checkroot.sh init.d/checkroot.sh
--- /etc/init.d/checkroot.sh	2004-09-10 17:00:48.000000000 +0200
+++ init.d/checkroot.sh	2005-08-22 14:31:55.000000000 +0200
@@ -3,6 +3,15 @@
 #
 # Version:	@(#)checkroot.sh  2.85-23  29-Jul-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          checkroot
+# Required-Start:    keymap
+# Required-Stop:     
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 SULOGIN=no
 VERBOSE=yes
diff -u /etc/init.d/console-screen.sh init.d/console-screen.sh
--- /etc/init.d/console-screen.sh	2005-02-05 10:17:28.000000000 +0100
+++ init.d/console-screen.sh	2005-08-22 14:33:01.000000000 +0200
@@ -1,4 +1,13 @@
 #!/bin/sh
+### BEGIN INIT INFO
+# Provides:          console-screen
+# Required-Start:    mountnfs
+# Required-Stop:     mountnfs
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description:       
+### END INIT INFO
 
 #
 # This is the boot script for the `console-tools' package.
diff -u /etc/init.d/devfsd init.d/devfsd
--- /etc/init.d/devfsd	2004-09-01 15:01:53.000000000 +0200
+++ init.d/devfsd	2005-08-22 14:25:27.000000000 +0200
@@ -4,6 +4,15 @@
 #			permissions are set correctly and device symlinks
 #			are available.
 #
+### BEGIN INIT INFO
+# Provides:          devfsd
+# Required-Start:    
+# Required-Stop:     
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description:       
+### END INIT INFO
 
 [ -x /sbin/devfsd ] || exit 0
 
diff -u /etc/init.d/discover init.d/discover
--- /etc/init.d/discover	2005-01-09 01:16:37.000000000 +0100
+++ init.d/discover	2005-08-22 14:36:08.000000000 +0200
@@ -1,4 +1,13 @@
 #!/bin/sh
+### BEGIN INIT INFO
+# Provides:          discover
+# Required-Start:    $local_fs mountvirtfs mountall
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 set -e
 
diff -u /etc/init.d/halt init.d/halt
--- /etc/init.d/halt	2004-09-10 17:00:48.000000000 +0200
+++ init.d/halt	2005-08-22 13:27:39.000000000 +0200
@@ -4,6 +4,16 @@
 #
 # Version:      @(#)halt  2.85-22  19-Jun-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          halt
+# Required-Start:    
+# Required-Stop:     
+# Default-Start:      0
+# Default-Stop:       
+# Short-Description: 
+# Description: 
+### END INIT INFO
+
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 
diff -u /etc/init.d/hostname.sh init.d/hostname.sh
--- /etc/init.d/hostname.sh	2004-09-10 17:00:48.000000000 +0200
+++ init.d/hostname.sh	2005-08-22 14:30:19.000000000 +0200
@@ -3,6 +3,15 @@
 #
 # Version:	@(#)hostname.sh  1.10  26-Feb-2001  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          hostname
+# Required-Start:    ifupdown
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 if [ -f /etc/hostname ]
 then
diff -u /etc/init.d/hotplug init.d/hotplug
--- /etc/init.d/hotplug	2005-03-20 02:51:45.000000000 +0100
+++ init.d/hotplug	2005-08-22 14:15:18.000000000 +0200
@@ -4,6 +4,15 @@
 #		On startup, may simulate hotplug events for devices
 #		that were present at boot time, before filesystems
 #		used by /sbin/hotplug became available.
+### BEGIN INIT INFO
+# Provides:          hotplug
+# Required-Start:    $local_fs mountvirtfs
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 
diff -u /etc/init.d/hotplug-net init.d/hotplug-net
--- /etc/init.d/hotplug-net	2005-03-20 15:09:29.000000000 +0100
+++ init.d/hotplug-net	2005-08-22 13:27:39.000000000 +0200
@@ -2,6 +2,15 @@
 #
 # nethotplug	manage Debian-specific network interfaces state files
 #
+### BEGIN INIT INFO
+# Provides:          hotplug-net
+# Required-Start:    $network hotplug
+# Required-Stop:     $network hotplug
+# Default-Start:      S 1 2 3 4 5
+# Default-Stop:       0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 case "$1" in
     start)
diff -u /etc/init.d/hwclock.sh init.d/hwclock.sh
--- /etc/init.d/hwclock.sh	2005-03-22 15:21:52.000000000 +0100
+++ init.d/hwclock.sh	2005-08-23 09:36:43.000000000 +0200
@@ -1,4 +1,14 @@
 #!/bin/sh
+exit 0
+### BEGIN INIT INFO
+# Provides:          hwclock
+# Required-Start:    console-screen
+# Required-Stop:     console-screen
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description:       
+### END INIT INFO
 # hwclock.sh	Set and adjust the CMOS clock, according to the UTC
 #		setting in /etc/default/rcS (see also rcS(5)).
 #
diff -u /etc/init.d/hwclockfirst.sh init.d/hwclockfirst.sh
--- /etc/init.d/hwclockfirst.sh	2005-03-22 15:21:52.000000000 +0100
+++ init.d/hwclockfirst.sh	2005-08-22 14:29:16.000000000 +0200
@@ -1,4 +1,13 @@
 #!/bin/bash
+### BEGIN INIT INFO
+# Provides:          hwclockfirst boot.clock
+# Required-Start:    checkroot
+# Required-Stop:     
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description:       
+### END INIT INFO
 # hwclockfirst.sh Set system clock to hardware clock, according to the UTC
 #               setting in /etc/default/rcS (see also rcS(5)).
 #
diff -u /etc/init.d/ifupdown init.d/ifupdown
--- /etc/init.d/ifupdown	2005-05-02 15:57:05.000000000 +0200
+++ init.d/ifupdown	2005-08-22 13:27:39.000000000 +0200
@@ -1,4 +1,13 @@
 #!/bin/sh -e
+### BEGIN INIT INFO
+# Provides:          ifupdown
+# Required-Start:    $network
+# Required-Stop:     $network
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 [ -x /sbin/ifup ] || exit 0
 [ -x /sbin/ifdown ] || exit 0
diff -u /etc/init.d/ifupdown-clean init.d/ifupdown-clean
--- /etc/init.d/ifupdown-clean	2005-04-04 15:33:54.000000000 +0200
+++ init.d/ifupdown-clean	2005-08-22 14:29:39.000000000 +0200
@@ -2,6 +2,15 @@
 #
 # ifupdown-clean
 #
+### BEGIN INIT INFO
+# Provides:          ifupdown-clean
+# Required-Start:    checkroot
+# Required-Stop:     
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description:       
+### END INIT INFO
 
 set -e
 
diff -u /etc/init.d/initrd-tools.sh init.d/initrd-tools.sh
--- /etc/init.d/initrd-tools.sh	2005-04-11 00:35:48.000000000 +0200
+++ init.d/initrd-tools.sh	2005-08-22 14:27:55.000000000 +0200
@@ -4,6 +4,15 @@
 #
 # Version:		$Id: initrd-tools.sh,v 1.5 2002/08/18 00:10:30 herbert Exp $
 #
+### BEGIN INIT INFO
+# Provides:          initrd-tools
+# Required-Start:    bootlogd
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 . /etc/default/initrd-tools.sh
 
diff -u /etc/init.d/keymap.sh init.d/keymap.sh
--- /etc/init.d/keymap.sh	2005-02-04 20:30:55.000000000 +0100
+++ init.d/keymap.sh	2005-08-22 14:31:52.000000000 +0200
@@ -1,4 +1,13 @@
 #!/bin/sh
+### BEGIN INIT INFO
+# Provides:          keymap kbd
+# Required-Start:    initrd-tools
+# Required-Stop:     
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 #
 # Load the keymaps *as soon as possible*
diff -u /etc/init.d/klogd init.d/klogd
--- /etc/init.d/klogd	2004-11-07 13:13:48.000000000 +0100
+++ init.d/klogd	2005-08-22 13:27:39.000000000 +0200
@@ -1,5 +1,14 @@
 #! /bin/sh
 # /etc/init.d/klogd: start the kernel log daemon.
+### BEGIN INIT INFO
+# Provides:          klogd
+# Required-Start:    $syslog
+# Required-Stop:     $syslog
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: start the kernel log daemon
+# Description: multiline_description
+### END INIT INFO
 
 PATH=/bin:/usr/bin:/sbin:/usr/sbin
 
diff -u /etc/init.d/makedev init.d/makedev
--- /etc/init.d/makedev	2004-08-18 20:43:14.000000000 +0200
+++ init.d/makedev	2005-08-22 13:27:39.000000000 +0200
@@ -1,4 +1,13 @@
 #! /bin/sh
+### BEGIN INIT INFO
+# Provides:          makedev
+# Required-Start:    $local_fs
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 N=/etc/init.d/makedev
 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
diff -u /etc/init.d/modutils init.d/modutils
--- /etc/init.d/modutils	2004-12-19 11:40:09.000000000 +0100
+++ init.d/modutils	2005-08-22 14:30:41.000000000 +0200
@@ -1,5 +1,14 @@
 #! /bin/sh
 # /etc/init.d/modutils: loads the appropriate modules in `boot'.
+### BEGIN INIT INFO
+# Provides:          modutils
+# Required-Start:    hwclockfirst
+# Required-Stop:     hwclockfirst
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      6
+# Short-Description: 
+# Description:       
+### END INIT INFO
 
 
 PATH="/sbin:/bin"
diff -u /etc/init.d/mountall.sh init.d/mountall.sh
--- /etc/init.d/mountall.sh	2004-09-10 17:00:48.000000000 +0200
+++ init.d/mountall.sh	2005-08-22 14:22:59.000000000 +0200
@@ -3,6 +3,16 @@
 #
 # Version:	@(#)mountall.sh  2.85-23  29-Jul-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          boot.localfs
+# Required-Start:    checkfs
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: manage network interfaces
+# Description:       manage network interfaces and configure some networking
+#                    options
+### END INIT INFO
 
 VERBOSE=yes
 TMPTIME=0
diff -u /etc/init.d/mountnfs.sh init.d/mountnfs.sh
--- /etc/init.d/mountnfs.sh	2004-09-10 17:02:14.000000000 +0200
+++ init.d/mountnfs.sh	2005-08-22 14:33:21.000000000 +0200
@@ -9,6 +9,16 @@
 #
 # Version:	@(#)mountnfs.sh  2.86-5  10-Sep-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          mountnfs nfs
+# Required-Start:    $network
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: manage network interfaces
+# Description:       manage network interfaces and configure some networking
+#                    options
+### END INIT INFO
 
 VERBOSE=yes
 TMPTIME=0
diff -u /etc/init.d/mountvirtfs init.d/mountvirtfs
--- /etc/init.d/mountvirtfs	2004-09-10 17:00:48.000000000 +0200
+++ init.d/mountvirtfs	2005-08-22 14:25:23.000000000 +0200
@@ -14,6 +14,16 @@
 # Version:	@(#)mountvirtfs  2.85-23  29-Jul-2004  miquels
 #
 
+### BEGIN INIT INFO
+# Provides:          mountvirtfs
+# Required-Start:    devfsd
+# Required-Stop: 
+# Default-Start:      S 1 2 3 4 5
+# Default-Stop:       0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
+
 # Script needs to be robust and continue when parts fail,
 # so we're not setting the "-e" flag.
 #set -e
diff -u /etc/init.d/networking init.d/networking
--- /etc/init.d/networking	2005-03-21 19:49:41.000000000 +0100
+++ init.d/networking	2005-08-22 14:16:04.000000000 +0200
@@ -1,6 +1,16 @@
 #!/bin/sh
 #
 # manage network interfaces and configure some networking options
+### BEGIN INIT INFO
+# Provides:          network
+# Required-Start:    mountvirtfs
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Defaulg-Stop:      6
+# Short-Description: manage network interfaces
+# Description:       manage network interfaces and configure some networking
+#                    options
+### END INIT INFO
 
 PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
 
diff -u /etc/init.d/procps.sh init.d/procps.sh
--- /etc/init.d/procps.sh	2004-04-13 07:26:28.000000000 +0200
+++ init.d/procps.sh	2005-08-22 13:27:39.000000000 +0200
@@ -3,6 +3,16 @@
 #
 # written by Elrond <Elrond at Wunder-Nett.org>
 
+### BEGIN INIT INFO
+# Provides:          procps
+# Required-Start:    mountvirtfs
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
+
 # Check for existance of the default file and exit if not there,
 # Closes #52839 for the boot-floppy people
 [ -r /etc/default/rcS ] || exit 0
diff -u /etc/init.d/rc init.d/rc
--- /etc/init.d/rc	2004-09-10 17:00:48.000000000 +0200
+++ init.d/rc	2005-08-23 10:15:51.000000000 +0200
@@ -18,10 +18,19 @@
 # Un-comment the following for debugging.
 # debug=echo
 
+CONCURRENCY=8
+
+. /etc/default/rcS
+
+runlog=/tmp/bootlog
+rcstart=`date +%s`
+
 #
 # Start script or program.
 #
 startup() {
+  service=$1
+  start=`date +%s`
   case "$1" in
 	*.sh)
 		$debug sh "$@"
@@ -30,6 +39,9 @@
 		$debug "$@"
 		;;
   esac
+  stop=`date +%s`
+  spent=`expr $stop - $start`
+  echo $stop $spent $service >> $runlog
 }
 
   # Ignore CTRL-C only in this shell, so we can interrupt subprocesses.
@@ -59,17 +71,46 @@
 	# First, run the KILL scripts.
 	if [ $previous != N ]
 	then
-		for i in /etc/rc$runlevel.d/K[0-9][0-9]*
+		# Run all scripts with the same level in parallell
+		for level in `ls /etc/rc$runlevel.d | \
+			      grep '^K[0-9][0-9]' | \
+			      cut -c2,3 | sort -u` ; do
+			pids=""
+			subs=0
+			for i in /etc/rc$runlevel.d/K$level*
 		do
 			# Check if the script is there.
 			[ ! -f $i ] && continue
 
 			# Stop the service.
-			startup $i stop
+				startup $i stop &
+				pids="$pids $!"
+				subs=`expr $subs + 1`
+
+		# Enough sub-processes running?
+				if [ "$CONCURRENCY" -le "$subs" ] ; then
+					for pid in $pids ; do
+						wait $pid
+						subs=`expr $subs - 1`
+					done
+					pids=""
+				fi
+			done
+			# Wait for all pids.  Does not matter which
+			# pid return first, as we need to wait for all
+			# of them
+			for pid in $pids ; do
+				wait $pid
+			done
 		done
 	fi
 	# Now run the START scripts for this runlevel.
-	for i in /etc/rc$runlevel.d/S*
+
+	# Run all scripts with the same level in parallell
+	for level in `ls /etc/rc$runlevel.d | grep '^S[0-9][0-9]' | \
+		      cut -c2,3 | sort -u` ; do
+		pids=""
+		for i in /etc/rc$runlevel.d/S$level*
 	do
 		[ ! -f $i ] && continue
 
@@ -91,12 +132,25 @@
 		fi
 		case "$runlevel" in
 			0|6)
-				startup $i stop
+					startup $i stop &
 				;;
 			*)
-				startup $i start
+					startup $i start &
 				;;
 		esac
+			pids="$pids $!"
+		done
+		# Wait for all pids.  Does not matter which
+		# pid return first, as we need to wait for all
+		# of them
+		for pid in $pids ; do
+			wait $pid
+		done
 	done
   fi
+
+rcstop=`date +%s`
+rcspent=`expr $rcstop - $rcstart`
+echo $rcstop $rcspent rc$RUNLEVEL >> $runlog
+
 # eof /etc/init.d/rc
diff -u /etc/init.d/rcS init.d/rcS
--- /etc/init.d/rcS	2004-09-10 17:00:48.000000000 +0200
+++ init.d/rcS	2005-08-23 10:15:49.000000000 +0200
@@ -12,6 +12,8 @@
 umask 022
 export PATH runlevel prevlevel
 
+set -x
+
 #
 #	See if system needs to be setup. This is ONLY meant to
 #	be used for the initial setup after a fresh installation!
@@ -21,39 +23,70 @@
   /sbin/unconfigured.sh
 fi
 
+CONCURRENCY=8
 #
 #	Source defaults.
 #
 . /etc/default/rcS
 export VERBOSE
 
+runlog=/tmp/bootlog
+rcstart=`date +%s`
 #
 #	Trap CTRL-C &c only in this shell so we can interrupt subprocesses.
 #
 trap ":" INT QUIT TSTP
 
 #
+# Start script or program.
+#
+startup() {
+  service=$1
+  start=`date +%s`
+  case "$1" in
+	*.sh)
+		$debug sh "$@"
+		;;
+	*)
+		$debug "$@"
+		;;
+  esac
+  stop=`date +%s`
+  spent=`expr $stop - $start`
+  echo $stop $spent $service >> $runlog
+}
+
+#
 #	Call all parts in order.
 #
-for i in /etc/rcS.d/S??*
-do
-	# Ignore dangling symlinks for now.
-	[ ! -f "$i" ] && continue
-
-	case "$i" in
-		*.sh)
-			# Source shell script for speed.
-			(
-				trap - INT QUIT TSTP
-				set start
-				. $i
-			)
-			;;
-		*)
-			# No sh extension, so fork subprocess.
-			$i start
-			;;
-	esac
+# Run all scripts with the same level in parallell
+for level in `ls /etc/rcS.d | \
+              grep '^S[0-9][0-9]' | \
+              cut -c2,3 | sort -u` ; do
+	pids=""
+	subs=0
+	for i in /etc/rcS.d/S$level*
+	do
+		# Ignore dangling symlinks for now.
+		[ ! -f "$i" ] && continue
+		startup $i start &
+		pids="$pids $!"
+		subs=`expr $subs + 1`
+
+		# Enough sub-processes running?
+		if [ "$CONCURRENCY" -le "$subs" ] ; then
+			for pid in $pids ; do
+				wait $pid
+				subs=`expr $subs - 1`
+			done
+			pids=""
+		fi
+	done
+	# Wait for all remaining pids.  Does not matter which pid
+	# return first, as we need to wait for all of them
+	for pid in $pids ; do
+		wait $pid
+	done
 done
 
 #
@@ -70,3 +103,7 @@
   /sbin/setup.sh
 fi
 
+rcstop=`date +%s`
+rcspent=`expr $rcstop - $rcstart`
+echo $rcstop $rcspent rcS >> $runlog
+
diff -u /etc/init.d/reboot init.d/reboot
--- /etc/init.d/reboot	2004-09-10 17:00:48.000000000 +0200
+++ init.d/reboot	2005-08-22 13:27:39.000000000 +0200
@@ -4,6 +4,17 @@
 #
 # Version:      @(#)reboot  2.75  22-Jun-1998  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          reboot
+# Required-Start:    
+# Required-Stop:     
+# Default-Start:     0 6
+# Default-Stop:      S 1 2 3 4 5
+# Short-Description: manage network interfaces
+# Description:       manage network interfaces and configure some networking
+#                    options
+### END INIT INFO
+
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 
diff -u /etc/init.d/rmnologin init.d/rmnologin
--- /etc/init.d/rmnologin	2004-09-10 17:00:48.000000000 +0200
+++ init.d/rmnologin	2005-08-22 13:27:39.000000000 +0200
@@ -5,6 +5,15 @@
 #
 # Version:	@(#)rmnologin  2.85-13  22-Mar-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          rmnologin
+# Required-Start:    
+# Required-Stop: 
+# Default-Start:      S 1 2 3 4 5
+# Default-Stop:       
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 DELAYLOGIN=yes
 [ -f /etc/default/rcS ] && . /etc/default/rcS
diff -u /etc/init.d/sendsigs init.d/sendsigs
--- /etc/init.d/sendsigs	2004-09-10 17:00:48.000000000 +0200
+++ init.d/sendsigs	2005-08-22 13:27:39.000000000 +0200
@@ -4,6 +4,16 @@
 #
 # Version:      @(#)sendsigs  2.85-8  05-Nov-2003  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          sendsigs
+# Required-Start:    
+# Required-Stop: 
+# Default-Start:      6
+# Default-Stop:       
+# Short-Description: 
+# Description: 
+### END INIT INFO
+
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 
diff -u /etc/init.d/single init.d/single
--- /etc/init.d/single	2004-09-10 17:00:48.000000000 +0200
+++ init.d/single	2005-08-22 13:27:39.000000000 +0200
@@ -4,6 +4,16 @@
 #
 # Version:	@(#)single  2.85-18  04-Jun-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          single
+# Required-Start:    $local_fs
+# Required-Stop:     $local_fs
+# Default-Start:     S
+# Default-Stop:      0 1 2 3 4 5 6
+# Short-Description: manage network interfaces
+# Description:       manage network interfaces and configure some networking
+#                    options
+### END INIT INFO
 
 PATH="/sbin:/bin:/usr/sbin:/usr/bin"
 
diff -u /etc/init.d/ssh init.d/ssh
--- /etc/init.d/ssh	2004-11-28 16:33:47.000000000 +0100
+++ init.d/ssh	2005-08-22 13:27:39.000000000 +0200
@@ -1,4 +1,14 @@
 #! /bin/sh
+### BEGIN INIT INFO
+# Provides:          sshd
+# Required-Start:    $network $syslog
+# Required-Stop:     $network $syslog
+# Default-Start:     1 2 3 4 5
+# Default-Stop:      S 0 6
+# Short-Description: 
+# Description:       
+### END INIT INFO
+
 set -e
 
 # /etc/init.d/ssh: start and stop the OpenBSD "secure shell(tm)" daemon
diff -u /etc/init.d/stop-bootlogd init.d/stop-bootlogd
--- /etc/init.d/stop-bootlogd	2005-01-04 23:43:18.000000000 +0100
+++ init.d/stop-bootlogd	2005-08-22 14:27:23.000000000 +0200
@@ -1,4 +1,13 @@
 #! /bin/sh
+### BEGIN INIT INFO
+# Provides:          bootlogd
+# Required-Start:    mountvirtfs
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 #
 # bootlogd	One of the first scripts to be executed. Starts or stops
 #		the bootlogd log program. If this script is called as
diff -u /etc/init.d/sysklogd init.d/sysklogd
--- /etc/init.d/sysklogd	2004-11-07 13:13:43.000000000 +0100
+++ init.d/sysklogd	2005-08-22 13:27:47.000000000 +0200
@@ -1,5 +1,14 @@
 #! /bin/sh
 # /etc/init.d/sysklogd: start the system log daemon.
+### BEGIN INIT INFO
+# Provides:          syslog sysklogd
+# Required-Start:    $network
+# Required-Stop:     $network
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: start the system log daemon
+# Description:       multiline_description
+### END INIT INFO
 
 PATH=/bin:/usr/bin:/sbin:/usr/sbin
 
diff -u /etc/init.d/udev init.d/udev
--- /etc/init.d/udev	2005-05-29 19:35:00.000000000 +0200
+++ init.d/udev	2005-08-22 14:23:54.000000000 +0200
@@ -1,4 +1,13 @@
 #!/bin/sh -e
+### BEGIN INIT INFO
+# Provides:          udev
+# Required-Start:    mountvirtfs
+# Required-Stop:     
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      6
+# Short-Description: 
+# Description:       
+### END INIT INFO
 
 PATH="/sbin:/bin"
 
diff -u /etc/init.d/udev-mtab init.d/udev-mtab
--- /etc/init.d/udev-mtab	2005-05-29 19:35:06.000000000 +0200
+++ init.d/udev-mtab	2005-08-23 00:42:43.000000000 +0200
@@ -1,5 +1,15 @@
 #!/bin/sh -e
 # add to /etc/mtab the entries for /dev and /dev/.static/dev
+### BEGIN INIT INFO
+# Provides:          udev-mtab
+# Required-Start:    $local_fs
+# Required-Stop:     $local_fs
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 1 6
+# Short-Description: manage network interfaces
+# Description:       manage network interfaces and configure some networking
+#                    options
+### END INIT INFO
 
 # if it's not, it's probably a symlink to /proc/mounts
 [ -w /etc/mtab ] || exit 0
diff -u /etc/init.d/umountfs init.d/umountfs
--- /etc/init.d/umountfs	2004-09-10 17:00:48.000000000 +0200
+++ init.d/umountfs	2005-08-22 13:27:47.000000000 +0200
@@ -4,6 +4,15 @@
 #
 # Version:      @(#)umountfs  2.85-16  03-Jun-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          umountfs
+# Required-Start:    
+# Required-Stop: 
+# Default-Start:      6
+# Default-Stop:       
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 
diff -u /etc/init.d/umountnfs.sh init.d/umountnfs.sh
--- /etc/init.d/umountnfs.sh	2004-09-10 17:00:48.000000000 +0200
+++ init.d/umountnfs.sh	2005-08-22 13:27:47.000000000 +0200
@@ -8,6 +8,15 @@
 #
 # Version:      @(#)umountnfs  2.85-23  29-Jul-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          umountnfs
+# Required-Start:    
+# Required-Stop: 
+# Default-Start:      6
+# Default-Stop:       
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 PATH=/sbin:/bin:/usr/sbin:/usr/bin
 
diff -u /etc/init.d/urandom init.d/urandom
--- /etc/init.d/urandom	2004-09-10 17:00:48.000000000 +0200
+++ init.d/urandom	2005-08-23 00:44:35.000000000 +0200
@@ -5,6 +5,15 @@
 #
 # Version:	@(#)urandom  2.85-14  31-Mar-2004  miquels at cistron.nl
 #
+### BEGIN INIT INFO
+# Provides:          urandom
+# Required-Start:    $time
+# Required-Stop: 
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
 
 [ -c /dev/urandom ] || exit 0
 
diff -u /etc/init.d/xdebconfigurator init.d/xdebconfigurator
--- /etc/init.d/xdebconfigurator	2005-08-21 23:58:29.000000000 +0200
+++ init.d/xdebconfigurator	2005-08-22 14:45:14.000000000 +0200
@@ -2,11 +2,11 @@
 # /etc/init.d/xdebconfigurator
 #
 ### BEGIN INIT INFO
-# Provides:          xdebconfigurator
-# Required-Start:    $syslog
-# Required-Stop:     $syslog
-# Should-Start:      2 3 4 5
-# Should-Stop:       0 1 6
+# provides:          xdebconfigurator
+# required-start:    $syslog
+# required-stop:     $syslog
+# Default-Start:     S 1 2 3 4 5
+# Default-Stop:      0 6
 # Short-Description: Genererate xfree86 configuration at boot time
 # Description:       Preseed X configuration and use dexconf to 
 #                    genereate a new configuration file.
diff -u /etc/init.d/xfree86-common init.d/xfree86-common
--- /etc/init.d/xfree86-common	2005-02-11 08:11:05.000000000 +0100
+++ init.d/xfree86-common	2005-08-22 13:27:47.000000000 +0200
@@ -1,4 +1,14 @@
 #!/bin/sh
+### BEGIN INIT INFO
+# Provides:          xfree86-common
+# Required-Start:    $local_fs
+# Required-Stop:     $local_fs
+# Default-Start:      S 1 2 3 4 5
+# Default-Stop:       0 6
+# Short-Description: 
+# Description: 
+### END INIT INFO
+
 
 # $Id: xfree86-common.init 2186 2005-02-11 07:11:05Z branden $
 




More information about the initscripts-ng-devel mailing list