Differences between revisions 160 and 161
Revision 160 as of 2009-09-02 11:37:58
Size: 5981
Editor: ?PetterReinholdtsen
Comment: Improve text a bit.
Revision 161 as of 2009-09-02 17:38:06
Size: 6327
Editor: ?PetterReinholdtsen
Comment: Update document
Deletions are marked like this. Additions are marked like this.
Line 31: Line 31:
=== Known issues === == Common problems with init.d script headers ==
Line 33: Line 33:
 * Some init.d scripts provide the same service, and this is not supported by insserv. The provided service should be unique for each script. Example problems caused by this:
  * It is not possible to migrate between exim and postfix without purging the other package.
  * It is not possible to migrate between inetutils-inetd and openbsd-inetd without purging the other package.
  * It is not possible to activate insserv when obsolete scripts, which are removed from their package but not properly removed from the disk, are still present in /etc/init.d/. It might also create problems with package installation.
 * Some init.d scripts have buggy headers, making them fail to install properly in the boot sequence.
Here are some problems I have seen with init.d script headers during the last three years. I provide it here for those of you wondering if your package's init.d scripts are correct.

 1. Non-unique provides header

     When two packages have scripts with the same provides header, it will only be able to install these packages if the init.d script of the other is not present in /etc/init.d/. Packages sharing a common service with other packages could use virtual facilities instead of conflicting provides, or normal dependencies if few packages are involved.

 2. Incorrect runlevel list

    If the Default-Start and Default-Stop headers do not list the runlevels where a script should be stopped or started, the the wrong set of start and stop symlinks will be created when the script is installed, and the boot and shutdown sequence will most likely be incorrect. Fixing it require both updates to the header, and code in the postinst script to add or remove symlinks that where missing.

 3. Missing dependency on $syslog when logging to syslog

     Without it, services might be started too early during boot and some syslog messages might be lost.

 4. Missing dependency on $remote_fs when needing files in /usr/.

     Scripts starting from rcS.d/ will start too early when /usr/ is on NFS, and will probably fail to work because some of its expected files and programs are missing when the script starts.

 5. Depending on incorrect or non-existing provides

     The intended relationship with another script do not take effect, making the script run too early or too late during boot and shutdown.
Line 47: Line 64:
The number of packages with init.d scripts was counted using {{{apt-file update && apt-file search etc/init.d|cut -d: -f1|sort -u|wc -l}}} in Debian/Sid. The number of packages missing LSB headers are fetched from [[http://lintian.debian.org/reports/tags.html|the lintian reports]] for the [[http://lintian.debian.org/reports/Tinit.d-script-missing-lsb-section.html|init.d-script-missing-lsb-section]] tag. The number of base and desktop packages missing headers were counted by creating chroots with debootstrap and tasksel.
Line 49: Line 65:
To enable dependency based boot, the [[http://packages.qa.debian.org/i/insserv.html|insserv]] package can be used. At [[http://user.skolelinux.no/~pere/mypapers/200706-bootseq/200706-bootseq.html|debconf7]] and [[http://www.hungry.com/~pere/mypapers/200802-bootsequence/200802-bootsequence.html|FOSDEM 2008]] ([[http://meetings-archive.debian.net/pub/debian-meetings/2008/fosdem/ogg_theora/384x288/Reordering_the_Debian_boot_sequence_for_correctness_and_speed___Petter_Reinholdtsen.ogg|video]]), Petter Reinholdtsen gave a talk about the dependency based boot system. To enable it, install the insserv package and activate it like this: The list of packages missing LSB headers can be fetched from [[http://lintian.debian.org/reports/tags.html|the lintian reports]] for the [[http://lintian.debian.org/reports/Tinit.d-script-missing-lsb-section.html|init.d-script-missing-lsb-section]] tag.

To enable dependency based boot, the [[http://packages.qa.debian.org/i/insserv.html|insserv]] package can be used. At [[http://user.skolelinux.no/~pere/mypapers/200706-bootseq/200706-bootseq.html|debconf7]] and [[http://www.hungry.com/~pere/mypapers/200802-bootsequence/200802-bootsequence.html|FOSDEM 2008]] ([[http://meetings-archive.debian.net/pub/debian-meetings/2008/fosdem/ogg_theora/384x288/Reordering_the_Debian_boot_sequence_for_correctness_and_speed___Petter_Reinholdtsen.ogg|video]]), Petter Reinholdtsen gave a talk about the dependency based boot system. To enable it in older versions of Debian, install the insserv package and activate it like this:
Line 54: Line 72:
Line 64: Line 83:
== Packages left to fix ==
Generated using {{{dd-list $(lynx -nolist -dump http://lintian.debian.org/reports/tags/init.d-script-missing-lsb-section.html | grep binary | cut -d" " -f1 | sort)}}}

{{{
Daniel Baumann <daniel@debian.org>
   ipmasq

Peter S Galbraith <psg@debian.org>
   powstatd

Rene Mayrhofer <rmayr@debian.org>
   openswan
}}}

Dependency based boot sequence

It is possible to converting Debian to order the boot sequence using the LSB headers in the init.d scripts. This will get rid of several bugs in the current boot sequence, and make it easier to keep the sequence correct.

The feature has been worked on since before 2006, and was announced on debian-devel-announce 2008-01-17. A status update message was sent 2008-03-16 and 2008-11-30.

Advantages

Did you ever need to insert a init.d scripts Y before init.d scripts Z and after init.d script X, where both Z and X is started using boot sequence number 20 (as in 20X and 20Z)? Adding your script as 20Y would not cut it, because you need Z to start before X. To do this, in Debian you currently need to talk to the maintainer of packages with scripts Z and X, asking one of them (or both) to move their script into a different number. Dependency based boot sequencing make it possible for each package maintainer to specify the dependencies of its scripts, and leave the number allocation to the dependency resolver.

Some examples of such problems are 294053, 279297 and 475626 .

Status

This page is created to keep track of the state of this feature, to make it easier to coordinate an effort to implement it in Debian. It was proposed as a release goal for Lenny. It will be the default boot ordering method for Squeeze. During Debconf in 2009, the default in Sid was changed to use dependency based boot sequencing by default.

A number of bug reports are submitted to request LSB headers in init.d scripts. It is useful to track the ones open in testing as well.

Plan of migration

This is a proposal for a plan to migrate all of Debian over to dependency based boot sequencing.

  1. Change the debconf default in insserv to enable dependency based boot sequencing when the package is installed, if it is safe to do so. Show the question again on upgrades if the conversion isn't done yet. Remove/disable the option to disable insserv after it is enabled.
  2. Change sysv-rc to depend on insserv, to pull it in on all (non-file-rc) installations.
  3. Wait 6 months, while rewriting policy text to document the new way update-rc.d is going to work
  4. Drop support for specifying sequence numbers in update-rc.d.

This will enable dependency based boot sequencing for all in Debian from Squeeze and onwards.

Common problems with init.d script headers

Here are some problems I have seen with init.d script headers during the last three years. I provide it here for those of you wondering if your package's init.d scripts are correct.

  1. Non-unique provides header
    • When two packages have scripts with the same provides header, it will only be able to install these packages if the init.d script of the other is not present in /etc/init.d/. Packages sharing a common service with other packages could use virtual facilities instead of conflicting provides, or normal dependencies if few packages are involved.
  2. Incorrect runlevel list
    • If the Default-Start and Default-Stop headers do not list the runlevels where a script should be stopped or started, the the wrong set of start and stop symlinks will be created when the script is installed, and the boot and shutdown sequence will most likely be incorrect. Fixing it require both updates to the header, and code in the postinst script to add or remove symlinks that where missing.
  3. Missing dependency on $syslog when logging to syslog
    • Without it, services might be started too early during boot and some syslog messages might be lost.
  4. Missing dependency on $remote_fs when needing files in /usr/.
    • Scripts starting from rcS.d/ will start too early when /usr/ is on NFS, and will probably fail to work because some of its expected files and programs are missing when the script starts.
  5. Depending on incorrect or non-existing provides
    • The intended relationship with another script do not take effect, making the script run too early or too late during boot and shutdown.

To see the boot and reboot sequence dependecy graph, use

aptitude install insserv graphviz
/usr/share/insserv/check-initd-order -g > boot.dot
/usr/share/insserv/check-initd-order -g -k > reboot.dot
dotty boot.dot
dotty reboot.dot

The list of packages missing LSB headers can be fetched from the lintian reports for the init.d-script-missing-lsb-section tag.

To enable dependency based boot, the insserv package can be used. At debconf7 and FOSDEM 2008 (video), Petter Reinholdtsen gave a talk about the dependency based boot system. To enable it in older versions of Debian, install the insserv package and activate it like this:

aptitude install insserv && dpkg-reconfigure insserv

Make sure to use insserv version 1.09.0-6 or higher.

To usertag related bugs, send an email to request (at) bugs.debian.org, with content like this:

user initscripts-ng-devel (at) lists.alioth.debian.org
usertag 361054 + incorrect-dependency
usertag 361358 + missing-dependency
thanks