FINIT(8)
π¦ finit(8) β Fast init for Linux systems π¦
πΈ NAME πΈ
finit β Fast init for Linux systems π
β¨ SYNOPSIS β¨
/sbin/finit -- [debug] [quiet] [rescue | recover] [single | S]
[panic=SEC] [loglevel=<0-7>] [fsck.mode=[auto,skip,force]]
[fsck.repair=[no,yes,preen]] [finit.debug=<true,false>]
[finit.fstab=/path/to/fstab] [finit.cond=foo[,bar[,baz]]]
[finit.config=/path/to/finit.conf]
[finit.status_style=<classic,modern>]
[finit.status=<on,off>]
/sbin/telinit [-hv] [q | Q | s | S | 0-9]
π DESCRIPTION π
Okay bestie, so finit is a fast init for Linux systems. No cap. It got reverse engineered from the EeePC fastinit like 10+ years ago by Claudio Matsuoka, and the vibe was literally "gaps filled with frog DNA ..." πΈβ¨
It's main-character energy is aimed at small and embedded systems, but ngl it's fully usable on server and desktop systems too. Slay. π
π OPTIONS π
When it's not started as PID 1, finit just behaves like telinit, following classic UNIX command line syntax. The options are:
-hβ Show the built-in help text π-vβ Show the program version π
More options are implemented for SysV init support, but bestie... they're ignored. π
π¦ ARGUMENTS π¦
When it's not started as PID 1, finit (or telinit) takes these arguments:
q|Qβ Reload configuration, same asinitctl reloadπ0-9β Go to runlevel N, same asinitctl reload Nπs|Sβ Go to single user mode, runlevel 1 π±
π FEATURES π
- Runlevels, defined per service ποΈ
- One-shot tasks, services (daemons), or SysV init start/stop scripts π§
- Runparts and
/etc/rc.localsupport π - Process supervision similar to
systemd(8)π - Sourcing environment files πΏ
- Conditions for network/process/custom dependencies πΈοΈ
- Process readiness notification for synchronizing system startup as well as reconfiguration at runtime. Natively PID files are used, but systemd
sd_notify()and s6 notification is also supported. π£ - Limited support for
tmpfiles.d(5), no aging, attributes, or subvolumes ποΈ - Pre/Post script actions π¬
- Tooling to enable/disable services π οΈ
- Built-in getty π₯οΈ
- Built-in watchdog, with support for hand-over to watchdogd:
https://troglobit.com/watchdogd.htmlπ - Built-in support for Debian/BusyBox
/etc/network/interfacesπ - Cgroups v2, both configuration and monitoring in
initctl topπ - Plugin support for customization π§©
- Proper rescue mode with bundled
suloginfor protected maintenance shell π
π BOOTPARAM π
finit supports the following command line parameters to alter the behavior at boot. Notice the -- separator needed to tell the kernel which parameters should be given to PID 1. For more info on this, and on the available kernel command line options, see bootparam(7). π
debug
Enable kernel debug. Debug messages are printed to the console until Finit starts up, unless loglevel=7 (below) is used. π
fsck.mode=<auto,force,skip>
Defaults to auto, unless Finit is built with configure --enable-fastboot, in which case the default is skip. β‘
fsck.repair=<preen,yes,no>
Defaults to preen, unless Finit is built with configure --enable-fsckfix, in which case the default is yes. This configure option also sets fsck.mode=force, unless fastboot is also enabled. I.e., the configure --enable-fastboot build option overrides the fsck.mode default value. π
finit.cond=foo[,bar[,baz]]
Set the <boot/foo> condition. Optionally multiple conditions can be set using the same option, separated with a comma. Alternatively, multiple foo.cond=arg can be given. Each will result in a <boot/arg> condition being set to control the rest of the system bootstrap. ποΈ
Very useful for selecting different boot modes, e.g. manufacturing test, firmware upgrade, or rescue mode. π
Note:<boot/...>conditions cannot be cleared withinitctl! π±
finit.config=/path/to/alternative/finit.conf
Override the compile-time bootstrap config file, default:
Useful when starting up in various rescue mode, factory, or production test setups. Use the top-level configuration file directive rcsd /path/to/finit.d to override the default rcS.d directory. πΊοΈ
finit.debug
Enable Finit debug messages on system console and log. Sometimes useful when doing board bringup. Before the system log daemon has started, Finit uses the kernel ring buffer, /dev/kmsg. π
finit.fstab=/path/to/fstab.alt
Tell finit to use an alternate fstab to mount the file system from. Remember, this file must be on the root=... file system provided to Finit from the kernel. If this file is missing, finit falls back to its built-in default, which can be changed at build time using the --with-fstab=/path/to/footab configure option. It's even possible to completely disable the built-in using --without-fstab, meaning finit must be started with the finit.fstab option. π§·
Should finit discover that there is no fstab file available, including the fallback, it triggers the same failure mode as when fsck fails, starting sulogin(8), if that is available. When sulogin is missing, or when the user exits from sulogin, the system is rebooted. π
Default fstab, unless changed at build-time: /etc/fstab π
finit.status=<on,off>
Control finit boot progress, including banner. This used to be called finit.show_status, which still works but is deprecated. β οΈ
finit.status_style=<classic,modern>
Set Finit boot progress style, when enabled. π«
loglevel=<0-7>
Set the kernel's log level, which is more granular than debug. Also, when loglevel=7, Finit will not disable kernel logs to the console. This is very useful when debugging the kernel at system bring-up. Since loglevel=7 is the same as debug this means you have to use quiet for a quiet boot, until sysklogd takes over logging of kernel events. π€«
panic=SEC
By default the kernel does not reboot after a kernel panic. This setting will cause a kernel reboot after SEC seconds. π₯
quiet
Suppress kernel logging to console, except for warnings and errors. Also, see loglevel and quiet above. π€
rescue | recover
Start rescue/maintenance mode. If your system comes with the bundled sulogin program (Finit, or from util-linux/Busybox), you'll be given a root login to a maintenance shell. However, if sulogin is missing, the file /lib/finit/rescue.conf is read and the system booted in a limited fallback mode. See finit.conf(5) for more information. π¨
single | S
Single user mode, runlevel 1, in Finit. Useful to debug problems with the regular runlevel. All services and TTYs in [1] will be started, e.g., a tty [1] @console nologin configuration presents you with a root console without login. π€
Note: by definition, single user mode does not have networking enabled. This is also true for runlevel 1. π΅
π§ BOOTING π§
Before launching services, the system needs to be bootstrapped. This involves mounting all filesystems (not already mounted by an initramfs) in /etc/fstab, or any alternate fstab file provided on the Finit command line using finit.fstab, ensuring that necessary filesystems like: /dev, /proc, /sys, and /run are available and can provide the system with the services required. ποΈ
With that out of the way, a set of plugins take over:
bootmisc.soβ Cleans up stale files from previous boots and default directories are created in tmpfs filesystems π§Ήmodprobe.soβ Probes kernel modules required by the system πprocps.soβ Set kernel variables from/etc/sysctl.confet al βοΈ
When the plugins are done, finit reads /etc/finit.conf and all other enabled services in /etc/finit.d/*. First all services, run/tasks in runlevel S (bootStrap) are started. When all run/tasks have completed, Finit changes to the configured runlevel (default 2). Processes are started in parallel, in dependency order according to their conditions. π
When all services and run/tasks have been started, the console progress is disabled and all configured getty services are started. π₯οΈ
π CONDITIONS π
The condition subsystem in Finit was initially created to track PID files of daemons. If service/task B requires service A to have started, Finit waits for the PID file of service A to be created/updated before it starts service B. Conversely, if service A is stopped and its PID file removed, service B is also stopped. π
The following condition families are available today:
netβ Linux netlink events, e.g.net/route/default,net/eth0/up, andnet/et0/runningπpidβ PID files based on the service declarationname:id, gives the conditionpid/name:idπserviceβ Tracks run/task/service state transitions, including readiness. E.g.,service/foo/readycan be used as a condition for servicebar, providedfooproperly signals its readiness to Finit. πΆsysβ System conditions, e.g.sys/key/ctrlaltdelandsys/pwr/failπ²οΈusrβ User conditions, assert and deassert usinginitctl cond [set|clr] fooπ§βπ»
β SIGNALS β
PID 1 is the only process that by default blocks all signals. Finit allows for the following signals to control operation, but recommends instead using the initctl(8) tool. π‘
HUPβ Tell finit to reload its configuration file(s), same asinitctl reloadπUSR1β Restart API (initctl) socket. πUSR2β Tell finit to perform a system shutdown, same asinitctl poweroffπTERMβ LikeSIGUSR2but performs a reboot, same asinitctl rebootπINTβ Sent from kernel when Ctrl-Alt-Del is pressed (on the console), this asserts thesys/key/ctrlaltdelcondition, which can be used to start tasks or services β¨οΈPWRβ Sent from a a power daemon on changes to UPS status, Finit asserts thesys/pwr/failcondition π
π FILES π
Okay so here's where everything lives, bestie. Memorize these paths or perish π
/etc/finit.confβ the main character config file. This is the one. The big one. Your whole boot vibe lives here./etc/finit.d/*.confβ static service definitions. Like, the services that are just there, no questions asked, no symlink drama β¨/etc/finit.d/available/*.confβ the available services. Think of this like your closet: everything's in here, but nothing's actually on yet π/etc/finit.d/enabled/*.confβ symlinks fromavailable. This is the outfit you actually chose today. Whatever's symlinked here is what's enabled, periodt π/run/finit/β runtime files, and yes, that includes the condition subsystem. Everything that's alive and breathing at runtime chills here πΈ
Quick vibe check:availableis the catalog,enabledis the curation. You don't edit files inenabledβ you symlink into it fromavailable. That's the whole trick, iykyk π¦
π SEE ALSO π
Go read these next, fr fr, they're all part of the same cinematic universe:
finit.conf(5)β the config file man page. Read this one, seriously πinitctl(8)β the control interface for talking to your init at runtimetmpfiles.d(5)β the tmpfiles.d situation, for all your temp-file needs π
π AUTHORS π
Okay so storytime, and it's kind of iconic:
finitwas conceived and reverse engineered by Claudio Matsuoka π§- Since
v1.0, it's been maintained by Joachim Wiberg π - ...with contributions by many others π
The way that a whole init system got reverse engineered into existence and then handed off to a maintainer and then fed by a whole community of contributors?? That's not just a project, that's a legacy β¨
And that's the whole page, bestie! π«Ά This one's from the Linux manual, dated Jul 9, 2025, and it's page FINIT(8). Go forth and boot responsibly ππΈπ
π¦ where this page comes from
- nixos 26.05: finit 4.17
- nixpkgs unstable: finit 5.0-rc1
- ubuntu resolute: finit 4.14-1 Β· MIT
- ubuntu stonking: finit 4.14-1 Β· MIT
- π girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms