Init - Debian Wiki

Translation(s): English - Français - Italiano - Русский


BootProcess > init


Init is the first program to run after your system is booted, and continues to run as process number 1 until your system halts. Init's job is to start other programs that are essential to the operation of your system. All other processes are descended from init.

Overview

The system initialization process is handled by the init daemon. In squeeze and earlier releases, that daemon is provided by the sysvinit package, and no alternatives are supported. In wheezy, the default init daemon is still sysvinit, but a "technology preview" of systemd is available. In jessie and stretch, the default init system is systemd, but switching to sysvinit is supported.

Since jessie, only systemd is fully supported; sysvinit is mostly supported, but Debian packages are not required to provide sysvinit start scripts. In Buster, OpenRC was introduced, which provides an alternative to service handling and system runlevel mechanisms by being compatible with the sysv init program. Support for init systems other than systemd is significantly improved in Bullseye. runit is also packaged, but has not received the same level of testing and support as the others, and is not currently supported as PID 1. As of Bullseye, a collection of sysvinit start scripts that have been removed from their original packages is provided in the orphan-sysvinit-scripts package.

Determining the init system

In general, you can determine which init system is installed by checking whether the /sbin/init file is a symlink. If it's not a symlink, then sysvinit is probably in use. If it's a symlink pointing to /lib/systemd/systemd then systemd is in use. If it's a symlink pointing to /lib/sysvinit/init then sysvinit is in use.

If you suspect that the init system may have been changed without a reboot, you may also cat /proc/1/comm to see which command name was used for the init daemon during the most recent boot.

Changing the init system - at installation time

The easiest time to choose an init other than systemd is at installation time (since systemd's packages will refuse to be removed if systemd is running).

The best time to perform the switch is after the "Selecting and installing software" stage. Note that the default GNOME desktop is harder to get to work without systemd in Bullseye (because its usual display manager gdm3 declares a dependency on libpam-systemd - see 991880), so if you want a desktop environment it will be easier to deselect GNOME and select another (Xfce, KDE Plasma, LXDE, Cinnamon, MATE, and LXQt have all been tested without systemd).

Debian Bookworm and higher can install gdm3 without issues, so if you want to run GNOME just install gnome-core after switching the init. Note that it is affected by 1033897 currently.

Once that stage is complete, launch a shell, and chroot into the installed system by typing chroot /target. You then need to tell apt to install your preferred init system and, unless you are not using a desktop environment at all, libpam-elogind to provide the necessary elogind session management facilities (which are provided by libpam-systemd and systemd in a default installation). For example, for System-V-like init, type apt install sysvinit-core libpam-elogind. This will install your new init system and elogind, and remove systemd, libpam-systemd and other components that can only work with systemd. If apt is proposing to remove a very large number of packages, then you probably selected a desktop environment that depends on systemd; it will be best to stop at this point and go back to the task selector to choose another instead.

Once that is done, exit the chroot by typing exit, then switch back to the installer (if you were using a different virtual console by switching back; if you had selected the "Execute a shell" menu option, then by typing exit once more), and resume the installation by moving to the boot loader installation stage, which is typically installing GRUB. You can now complete the installation process as normal.

Changing the init system - on a running system

In Bullseye, a number of alternative init systems are supported (such as System-V-style init and OpenRC). Generally, to switch between init systems, you install the new init system and reboot. The exception is switching away from systemd - systemd's packages will refuse to be removed if systemd is running; so the process is a little more involved.

In outline, you need to download the new packages you need, switch to single-user mode, install these new packages, and then reboot. The recommended approach is as follows. First, clear out /var/cache/apt/archives by running apt clean (this makes identifying the packages to install later easier). Next, get apt to download the new packages you need, e.g.: apt --download-only install sysvinit-core libpam-elogind; libpam-elogind (and elogind which it Depends upon) provide session management facilities, which you will likely need on any system running a desktop environment. At this point, review apt's proposed actions, and if happy, let it carry on.

Now switch to single-user mode (systemctl rescue) and install the packages you downloaded using apt install /var/cache/apt/archives/*.deb Once this has completed, reboot your system.

Another alternative method tested to work is thru chroot. Simply boot with a live boot media, mount the necessary filesystems with:

mount -R /dev /mnt/target/dev
mount -R /sys /mnt/target/sys
mount -t proc proc /mnt/target/proc

This assumes the target Debian rootfs is mounted at /mnt/target.

For connecting to internet within chroot, ensure /mnt/target/etc/resolv.conf contains valid nameserver entry, or points to such a file. Keep in mind the files outside of /mnt/target (e.g. your current system's resolv.conf) will be unavailable in chroot. The simplest way would be to copy your system /etc/resolv.conf to /mnt/target/etc/resolv.conf (or /mnt/target/tmp/resolv.conf if it's a symlink). You'll need to be already connected to internet in your host system.

Finally, run

apt install sysvinit-core libpam-elogind

Sysvinit configuration

The inittab configuration tells init what to do. Especially it contains the lines:

  • id:2:initdefault:
    
    si::sysinit:/etc/init.d/rcS
    
    l2:2:wait:/etc/init.d/rc 2

Which causes the files /etc/init.d/rcS to run initialization scripts (in /etc/rcS.d/*), then scripts for requested runlevel (in /etc/rcS.[0-9]/*).

Getting help

If you encounter any issues specifically associated with using an alternative init system, there is a Debian init system diversity list that may be able to help.

See also


CategoryBootProcess