If one of the points of switching to a new init system in Debian is -to get rid of huge -init.d scripts, I doubt we need to switch away from sysvinit and -init.d scripts at all. Here is an example init.d script, ie a rewrite -of /etc/init.d/rsyslog:
- --#!/lib/init/init-d-script -### BEGIN INIT INFO -# Provides: rsyslog -# Required-Start: $remote_fs $time -# Required-Stop: umountnfs $time -# X-Stop-After: sendsigs -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: enhanced syslogd -# Description: Rsyslog is an enhanced multi-threaded syslogd. -# It is quite compatible to stock sysklogd and can be -# used as a drop-in replacement. -### END INIT INFO -DESC="enhanced syslogd" -DAEMON=/usr/sbin/rsyslogd -- -
Pretty minimalistic to me... For the record, the original sysv-rc -script was 137 lines, and the above is just 15 lines, most of the meta -info/comments.
- -How to do this, you ask? Well, one create a new script -/lib/init/init-d-script looking something like this: - -
+ +17th October 2014+@@ -225,23 +135,18 @@ and the kernel have not behaved sequentially in year.When PXE installing laptops with Debian, I often run into the +problem that the WiFi card require some firmware to work properly. +And it has been a pain to fix this using preseeding in Debian. +Normally something more is needed. But thanks to +my isenkram +package and its recent tasksel extension, it has now become easy +to do this using simple preseeding.
+ +The isenkram-cli package provide tasksel tasks which will install +firmware for the hardware found in the machine (actually, requested by +the kernel modules for the hardware). (It can also install user space +programs supporting the hardware detected, but that is not the focus +of this story.)
+ +To get this working in the default installation, two preeseding +values are needed. First, the isenkram-cli package must be installed +into the target chroot (aka the hard drive) before tasksel is executed +in the pkgsel step of the debian-installer system. This is done by +preseeding the base-installer/includes debconf value to include the +isenkram-cli package. The package name is next passed to debootstrap +for installation. With the isenkram-cli package in place, tasksel +will automatically use the isenkram tasks to detect hardware specific +packages for the machine being installed and install them, because +isenkram-cli contain tasksel tasks.
+ +Second, one need to enable the non-free APT repository, because +most firmware unfortunately is non-free. This is done by preseeding +the apt-mirror-setup step. This is unfortunate, but for a lot of +hardware it is the only option in Debian.
+ +The end result is two lines needed in your preseeding file to get +firmware installed automatically by the installer:
+ ++ ++base-installer base-installer/includes string isenkram-cli +apt-mirror-setup apt-setup/non-free boolean true +The current version of isenkram-cli in testing/jessie will install +both firmware and user space packages when using this method. It also +do not work well, so use version 0.15 or later. Installing both +firmware and user space packages might give you a bit more than you +want, so I decided to split the tasksel task in two, one for firmware +and one for user space programs. The firmware task is enabled by +default, while the one for user space programs is not. This split is +implemented in the package currently in unstable.
+ +If you decide to give this a go, please let me know (via email) how +this recipe work for you if you decide to give it a go. :)
+ +So, I bet you are wondering, how can this work. First and +foremost, it work because tasksel is modular, and driven by whatever +files it find in /usr/lib/tasksel/ and /usr/share/tasksel/. So the +isenkram-cli package place two files for tasksel to find. First there +is the task description file (/usr/share/tasksel/descs/isenkram.desc):
+ ++ ++Task: isenkram-packages +Section: hardware +Description: Hardware specific packages (autodetected by isenkram) + Based on the detected hardware various hardware specific packages are + proposed. +Test-new-install: show show +Relevance: 8 +Packages: for-current-hardware + +Task: isenkram-firmware +Section: hardware +Description: Hardware specific firmware packages (autodetected by isenkram) + Based on the detected hardware various hardware specific firmware + packages are proposed. +Test-new-install: mark show +Relevance: 8 +Packages: for-current-hardware-firmware +The key parts are Test-new-install which indicate how the task +should be handled and the Packages line referencing to a script in +/usr/lib/tasksel/packages/. The scripts use other scripts to get a +list of packages to install. The for-current-hardware-firmware script +look like this to list relevant firmware for the machine: + +
+ +#!/bin/sh - -# Define LSB log_* functions. -# Depend on lsb-base (>= 3.2-14) to ensure that this file is present -# and status_of_proc is working. -. /lib/lsb/init-functions - -# -# Function that starts the daemon/service - -# -do_start() -{ - # Return - # 0 if daemon has been started - # 1 if daemon was already running - # 2 if daemon could not be started - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \ - || return 1 - start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \ - $DAEMON_ARGS \ - || return 2 - # Add code here, if necessary, that waits for the process to be ready - # to handle requests from services started subsequently which depend - # on this one. As a last resort, sleep for some time. -} - -# -# Function that stops the daemon/service # -do_stop() -{ - # Return - # 0 if daemon has been stopped - # 1 if daemon was already stopped - # 2 if daemon could not be stopped - # other if a failure occurred - start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME - RETVAL="$?" - [ "$RETVAL" = 2 ] && return 2 - # Wait for children to finish too if this is a daemon that forks - # and if the daemon is only ever run from this initscript. - # If the above conditions are not satisfied then add some other code - # that waits for the process to drop all resources that could be - # needed by services started subsequently. A last resort is to - # sleep for some time. - start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON - [ "$?" = 2 ] && return 2 - # Many daemons don't delete their pidfiles when they exit. - rm -f $PIDFILE - return "$RETVAL" -} - -# -# Function that sends a SIGHUP to the daemon/service -# -do_reload() { - # - # If the daemon can reload its configuration without - # restarting (for example, when it is sent a SIGHUP), - # then implement that here. - # - start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME - return 0 -} - -SCRIPTNAME=$1 -scriptbasename="$(basename $1)" -echo "SN: $scriptbasename" -if [ "$scriptbasename" != "init-d-library" ] ; then - script="$1" - shift - . $script -else - exit 0 -fi - -NAME=$(basename $DAEMON) -PIDFILE=/var/run/$NAME.pid - -# Exit if the package is not installed -#[ -x "$DAEMON" ] || exit 0 - -# Read configuration variable file if it is present -[ -r /etc/default/$NAME ] && . /etc/default/$NAME - -# Load the VERBOSE setting and other rcS variables -. /lib/init/vars.sh - -case "$1" in - start) - [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME" - do_start - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; - esac - ;; - stop) - [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME" - do_stop - case "$?" in - 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;; - 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;; - esac - ;; - status) - status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $? - ;; - #reload|force-reload) - # - # If do_reload() is not implemented then leave this commented out - # and leave 'force-reload' as an alias for 'restart'. - # - #log_daemon_msg "Reloading $DESC" "$NAME" - #do_reload - #log_end_msg $? - #;; - restart|force-reload) - # - # If the "reload" option is implemented then remove the - # 'force-reload' alias - # - log_daemon_msg "Restarting $DESC" "$NAME" - do_stop - case "$?" in - 0|1) - do_start - case "$?" in - 0) log_end_msg 0 ;; - 1) log_end_msg 1 ;; # Old process is still running - *) log_end_msg 1 ;; # Failed to start - esac - ;; - *) - # Failed to stop - log_end_msg 1 - ;; - esac - ;; - *) - echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2 - exit 3 - ;; -esac - -: -- -It is based on /etc/init.d/skeleton, and could be improved quite a -lot. I did not really polish the approach, so it might not always -work out of the box, but you get the idea. I did not try very hard to -optimize it nor make it more robust either.
- -A better argument for switching init system in Debian than reducing -the size of init scripts (which is a good thing to do anyway), is to -get boot system that is able to handle the kernel events sensibly and -robustly, and do not depend on the boot to run sequentially. The boot -and the kernel have not behaved sequentially in year.
+PATH=/usr/sbin:$PATH +export PATH +isenkram-autoinstall-firmware -l +With those two pieces in place, the firmware is installed by +tasksel during the normal d-i run. :)
+ +If you want to test what tasksel will install when isenkram-cli is +installed, run DEBIAN_PRIORITY=critical tasksel --test +--new-install to get the list of packages that tasksel would +install.
+ +Debian Edu will be +pilots in testing this feature, as isenkram is used to install +firmware now.
- -1st November 2013-The SPICE protocol for -remote display access is the preferred solution with oVirt and RedHat -Enterprise Virtualization, and I was sad to discover the other day -that the browser plugin needed to use these systems seamlessly was -missing in Debian. The request -for a package was from 2012-04-10 with no progress since -2013-04-01, so I decided to wrap up a package based on the great work -from Cajus Pollmeier and put it in a collab-maint maintained git -repository to get a package I could use. I would very much like -others to help me maintain the package (or just take over, I do not -mind), but as no-one had volunteered so far, I just uploaded it to -NEW. I hope it will be available in Debian in a few days.
- -The source is now available from -http://anonscm.debian.org/gitweb/?p=collab-maint/spice-xpi.git;a=summary.
+ +4th October 2014+Today I came across an unexpected Ubuntu boot screen. Above the +bread shelf on the ICA shop at Storo in Oslo, the grub menu of Ubuntu +with Linux kernel 3.2.0-23 (ie probably version 12.04 LTS) was stuck +on a screen normally showing the bread types and prizes:
+ ++ +
If it had booted as it was supposed to, I would never had known +about this hidden Linux installation. It is interesting what +errors can reveal.