[arch-dev-public] [PATCH] Add boot probing hooks

Simo Leone simo at archlinux.org
Sun Nov 4 17:02:39 EST 2007


Initscripts now export their state to an
arbitrary boot logging/probing program.
This opens up the possibility for advanced
boot profiling, among other interesting uses.
---
 functions   |   17 +++++++++++++++++
 rc.conf     |    1 -
 rc.multi    |    6 ++++++
 rc.shutdown |    2 ++
 rc.sysinit  |   10 ++++++++++
 5 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/functions b/functions
index 8b5ecf1..ebde3ca 100644
--- a/functions
+++ b/functions
@@ -3,6 +3,19 @@
 # functions
 #
 
+# source boot monitoring functions and settings
+if [ -x "${BOOT_PROBE}" ]; then
+	source /etc/`basename ${BOOT_PROBE}`.conf &>/dev/null
+	source /etc/rc.d/`basename ${BOOT_PROBE}`-functions
+	emit_state() {
+		 ${BOOT_PROBE} $@
+	}
+else
+	emit_state() {
+		:
+	}
+fi
+
 # width:
 
 STAT_COL=$(stty size)
@@ -81,6 +94,7 @@ stat_bkgd() {
 	echo -ne "$C_OTHER$PREFIX_REG $C_MAIN$1$C_CLEAR "
 	deltext
 	echo -ne "   $C_OTHER[${C_BKGD}BKGD$C_OTHER]$C_CLEAR "
+	emit_state bkgd
 }
 
 stat_busy() {
@@ -88,6 +102,7 @@ stat_busy() {
 	echo -ne "${SAVE_POSITION}"
 	deltext
 	echo -ne "   $C_OTHER[${C_BUSY}BUSY$C_OTHER]$C_CLEAR "
+	emit_state busy
 }
 
 stat_append() {
@@ -99,11 +114,13 @@ stat_append() {
 stat_done() {
 	deltext
 	echo -e "   $C_OTHER[${C_DONE}DONE$C_OTHER]$C_CLEAR "
+	emit_state done
 }
 
 stat_fail() {
 	deltext
 	echo -e "   $C_OTHER[${C_FAIL}FAIL$C_OTHER]$C_CLEAR "
+	emit_state fail
 }
 
 stat_die() {
diff --git a/rc.conf b/rc.conf
index 43a597e..167b65f 100644
--- a/rc.conf
+++ b/rc.conf
@@ -89,5 +89,4 @@ ROUTES=(!gateway)
 #
 DAEMONS=(syslog-ng network netfs crond)
 
-
 # End of file
diff --git a/rc.multi b/rc.multi
index 8050e98..5c4a3b3 100755
--- a/rc.multi
+++ b/rc.multi
@@ -6,6 +6,8 @@
 . /etc/rc.conf
 . /etc/rc.d/functions
 
+emit_state multi_startup
+
 # Load sysctl variables if sysctl.conf is present
 [ -r /etc/sysctl.conf ] && /sbin/sysctl -q -p &>/dev/null
 
@@ -14,9 +16,11 @@ for daemon in "${DAEMONS[@]}"; do
 	if [ "$daemon" = "${daemon#!}" ]; then
 		if [ "$daemon" = "${daemon#@}" ]; then
 			/etc/rc.d/$daemon start
+			emit_state multi_progress
 		else
 			stat_bkgd "Starting ${daemon:1}"
 			(/etc/rc.d/${daemon:1} start) &>/dev/null &
+			emit_state multi_progress_bkgd
 		fi
 	fi
 done
@@ -25,4 +29,6 @@ if [ -x /etc/rc.local ]; then
 	/etc/rc.local
 fi
 
+emit_state exit
+
 # vim: set ts=2 noet:
diff --git a/rc.shutdown b/rc.shutdown
index 19cb00f..a1771a8 100755
--- a/rc.shutdown
+++ b/rc.shutdown
@@ -6,6 +6,8 @@
 . /etc/rc.conf
 . /etc/rc.d/functions
 
+emit_state shutdown
+
 # avoid staircase effect
 /bin/stty onlcr
 
diff --git a/rc.sysinit b/rc.sysinit
index f4729bf..6559f3f 100755
--- a/rc.sysinit
+++ b/rc.sysinit
@@ -6,6 +6,8 @@
 . /etc/rc.conf
 . /etc/rc.d/functions
 
+emit_state boot
+
 echo " "
 printhl "Arch Linux $C_OTHER(${C_H2}Core Dump$C_OTHER)\n"
 printhl "${C_H2}http://www.archlinux.org"
@@ -88,6 +90,9 @@ if [ -d /sys/class/net/lo ]; then
 	fi
 fi
 
+# tell probing programs to get ready
+emit_state init
+
 # If using an encrypted root fs, we should find the root dev in the initrd
 # FIXME: obsoleted by initramfs and udev
 if [ -e /initrd/dev/mapper/root ]; then
@@ -232,6 +237,8 @@ if [ -x /sbin/fsck ]; then
 	fsckret=$?
 	if [ ${fsckret} -gt 1 ]; then
 		stat_fail
+		# oh crap. tell probers not to hide anything.
+		emit_state verbose
 		if [ $((${fsckret}&2)) -eq 2 ]; then
 			echo
 			echo "********************** REBOOT REQUIRED *********************"
@@ -399,5 +406,8 @@ fi
 # Screen blanks after 15 minutes idle time
 /usr/bin/setterm -blank 15
 
+# set things up for probing in rc.multi
+emit_state multi
+
 # End of file
 # vim: set ts=2 noet:
-- 
1.5.3.4
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: not available
URL: <http://archlinux.org/pipermail/arch-dev-public/attachments/20071104/5c63500b/attachment.pgp>


More information about the arch-dev-public mailing list