• Chris Down's avatar
    init: allow distribution configuration of default init · ada4ab7a
    Chris Down authored
    Some init systems (eg.  systemd) have init at their own paths, for
    example, /usr/lib/systemd/systemd.  A compatibility symlink to one of the
    hardcoded init paths is provided by another package, usually named
    something like systemd-sysvcompat or similar.
    
    Currently distro maintainers who are hands-off on the bootloader are more
    or less required to include those compatibility links as part of their
    base distribution, because it's hard to migrate away from them since
    there's a risk some users will not get the message to set init= on the
    kernel command line appropriately.
    
    Moreover, for distributions where the init system is something the
    distribution itself is opinionated about (eg.  Arch, which has systemd in
    the required `base` package), we could usually reasonably configure this
    ahead of time when building the distribution kernel.  However, we
    currently simply don't have any way to configure the kernel to do this.
    Here's an example discussion where removing sysvcompat was discussed by
    distro maintainers[0].
    
    This patch adds a new Kconfig tunable, CONFIG_DEFAULT_INIT, which if set
    is tried before the hardcoded fallback list.  So the order of precedence
    is now thus:
    
    1. init= on command line (on failure: panic)
    2. CONFIG_DEFAULT_INIT (on failure: try #3)
    3. Hardcoded fallback list (on failure: panic)
    
    This new config parameter will allow distribution maintainers to move away
    from these compatibility links safely, without having to worry that their
    users might not have the right init=.
    
    There are also two other benefits of this over having the distribution
    maintain a symlink:
    
    1. One of the value propositions over simply having distributions
       maintain a /sbin/init symlink via a package is that it also frees
       distributions which have a preferred default, but not mandatory, init
       system from having their package manager fight with their users for
       control of /{s,}bin/init.  Instead, the distribution simply makes
       their preference known in CONFIG_DEFAULT_INIT, and if the user
       installs another init system and uninstalls the default one they can
       still make use of /{s,}bin/init and friends for their own uses. This
       makes more cases Just Work(tm) without the user having to perform
       extra configuration via init=.
    
    2. Since before this we don't know which path the distribution actually
       _intends_ to serve init from, we don't pr_err if it is simply
       missing, and usually will just silently put the user in a /bin/sh
       shell. Now that the distribution can make a declaration of intent, we
       can be more vocal when this init system fails to launch for any
       reason, even if it's simply because no file exists at that location,
       speeding up the palaver of init/mount dependency/etc debugging a bit.
    
    [0]: https://lists.archlinux.org/pipermail/arch-dev-public/2019-January/029435.htmlSigned-off-by: default avatarChris Down <chris@chrisdown.name>
    Signed-off-by: default avatarAndrew Morton <akpm@linux-foundation.org>
    Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    Cc: Masami Hiramatsu <mhiramat@kernel.org>
    Link: http://lkml.kernel.org/r/20200522160234.GA1487022@chrisdown.nameSigned-off-by: default avatarLinus Torvalds <torvalds@linux-foundation.org>
    ada4ab7a
Kconfig 72.6 KB