mirror of
https://github.com/troglobit/finit.git
synced 2026-10-13 10:14:47 +00:00
Compare commits
1
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
44137806e4 |
@@ -1,3 +0,0 @@
|
|||||||
# These are supported funding model platforms
|
|
||||||
|
|
||||||
github: [troglobit]
|
|
||||||
@@ -1,12 +0,0 @@
|
|||||||
# Security Policy
|
|
||||||
|
|
||||||
## Supported Versions
|
|
||||||
|
|
||||||
finit is a small project, as such we have no possibility to support older versions.
|
|
||||||
The only supported version is the latest released on GitHub:
|
|
||||||
|
|
||||||
<https://github.com/troglobit/finit/releases>
|
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
|
||||||
|
|
||||||
Contact the project's main author and owner to report and discuss vulnerabilities.
|
|
||||||
@@ -9,13 +9,11 @@ GSYMS
|
|||||||
GTAGS
|
GTAGS
|
||||||
|
|
||||||
# GNU configure and build system
|
# GNU configure and build system
|
||||||
/aux
|
|
||||||
/.deps
|
/.deps
|
||||||
/autom4te.cache
|
/autom4te.cache
|
||||||
/aclocal.m4
|
/aclocal.m4
|
||||||
/ar-lib
|
/ar-lib
|
||||||
/compile
|
/compile
|
||||||
/config.cache
|
|
||||||
/config.h
|
/config.h
|
||||||
/config.mk
|
/config.mk
|
||||||
/config.guess
|
/config.guess
|
||||||
@@ -33,9 +31,6 @@ GTAGS
|
|||||||
/Makefile.in
|
/Makefile.in
|
||||||
/stamp-h1
|
/stamp-h1
|
||||||
|
|
||||||
/test-driver
|
|
||||||
/test-suite.log
|
|
||||||
|
|
||||||
# TroglOS build system
|
# TroglOS build system
|
||||||
/.config
|
/.config
|
||||||
/.stamp
|
/.stamp
|
||||||
|
|||||||
+22
-25
@@ -5,17 +5,18 @@ language: c
|
|||||||
# Use docker for quicker builds, it now allows https://docs.travis-ci.com/user/apt/
|
# Use docker for quicker builds, it now allows https://docs.travis-ci.com/user/apt/
|
||||||
sudo: false
|
sudo: false
|
||||||
|
|
||||||
|
# Use non-docker builds atm. to install libuEv and libite from source
|
||||||
|
#sudo: true
|
||||||
|
|
||||||
# Test build with both GCC and Clang (LLVM)
|
# Test build with both GCC and Clang (LLVM)
|
||||||
|
# - clang
|
||||||
compiler:
|
compiler:
|
||||||
- gcc
|
- gcc
|
||||||
- clang
|
|
||||||
|
|
||||||
# The secure: declaration is the encrypted COVERITY_SCAN_TOKEN, created
|
|
||||||
# via the "travis encrypt" command using the project repo's public key
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- PKG_CONFIG_PATH=/tmp/lib/pkgconfig
|
# The next declaration is the encrypted COVERITY_SCAN_TOKEN, created
|
||||||
- CFLAGS="-W -Wall -Wextra"
|
# via the "travis encrypt" command using the project repo's public key
|
||||||
- secure: "eOiuHs02lG2Uv146K9dMqucGTWUJFEhpz1oAtwe+kPrRXsXWc20hYMO+DSpMgD05vSvNeQA6p7h7LdRFQ+/g/Obj27TsOE+RKkUvRAtdwzxnKVyii9C/nmML8cFw7rIA0VS8O9mAkVYeyDxNDupBp3e9DPCibhKPvqCvioTnyy4="
|
- secure: "eOiuHs02lG2Uv146K9dMqucGTWUJFEhpz1oAtwe+kPrRXsXWc20hYMO+DSpMgD05vSvNeQA6p7h7LdRFQ+/g/Obj27TsOE+RKkUvRAtdwzxnKVyii9C/nmML8cFw7rIA0VS8O9mAkVYeyDxNDupBp3e9DPCibhKPvqCvioTnyy4="
|
||||||
|
|
||||||
addons:
|
addons:
|
||||||
@@ -27,36 +28,32 @@ addons:
|
|||||||
name: "troglobit/finit"
|
name: "troglobit/finit"
|
||||||
description: "finit | Fast & Extensible init for Linux"
|
description: "finit | Fast & Extensible init for Linux"
|
||||||
notification_email: troglobit@gmail.com
|
notification_email: troglobit@gmail.com
|
||||||
build_command_prepend: "./autogen.sh && ./configure --prefix= --disable-doc --disable-contrib --with-watchdog"
|
build_command_prepend: "./autogen.sh && PKG_CONFIG_PATH=/tmp/lib/pkgconfig ./configure --prefix=/tmp"
|
||||||
build_command: "make"
|
build_command: "make"
|
||||||
branch_pattern: dev
|
branch_pattern: dev
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- wget https://github.com/troglobit/libuev/releases/download/v2.3.2/libuev-2.3.2.tar.xz
|
- wget https://github.com/troglobit/libuev/releases/download/v2.2.0/libuev-2.2.0.tar.xz
|
||||||
- wget https://github.com/troglobit/libite/releases/download/v2.3.1/libite-2.3.1.tar.gz
|
- wget https://github.com/troglobit/libite/releases/download/v2.0.1/libite-2.0.1.tar.xz
|
||||||
- tar xf libuev-2.3.2.tar.xz
|
- tar xf libuev-2.2.0.tar.xz
|
||||||
- tar xf libite-2.3.1.tar.gz
|
- tar xf libite-2.0.1.tar.xz
|
||||||
- (cd libuev-2.3.2 && ./configure --prefix=/tmp && make && make install-strip)
|
- (cd libuev-2.2.0 && ./configure --prefix=/tmp && make && make install-strip)
|
||||||
- (cd libite-2.3.1 && ./configure --prefix=/tmp && make && make install-strip)
|
- (cd libite-2.0.1 && ./configure --prefix=/tmp && make && make install-strip)
|
||||||
|
|
||||||
# Custom build script for the time being, no "make test" yet
|
# Custom build script for the time being, no "make test" yet
|
||||||
script:
|
script:
|
||||||
- ./autogen.sh
|
- ./autogen.sh
|
||||||
- ./configure --prefix= --enable-static
|
- PKG_CONFIG_PATH=/tmp/lib/pkgconfig ./configure --prefix=/tmp --disable-inetd --enable-static
|
||||||
- make clean
|
- make clean
|
||||||
- make V=1 -j5
|
- make V=1 -j5
|
||||||
- ./configure --prefix= --enable-x11-common-plugin --with-watchdog
|
- PKG_CONFIG_PATH=/tmp/lib/pkgconfig ./configure --prefix=/tmp --enable-inetd-echo-plugin --enable-inetd-time-plugin --enable-x11-common-plugin --enable-inetd-chargen-plugin --enable-fallback-shell --enable-watchdog
|
||||||
- cat config.log
|
- cat config.log
|
||||||
- make clean
|
- make clean
|
||||||
- make V=1 -j5
|
- make V=1 -j5
|
||||||
- make install-strip DESTDIR=/tmp/finit
|
- make install-strip
|
||||||
- tree /tmp/finit
|
- tree /tmp
|
||||||
- ldd /tmp/finit/sbin/finit
|
- ldd /tmp/sbin/finit
|
||||||
- size /tmp/finit/sbin/finit
|
- size /tmp/sbin/finit
|
||||||
- size /tmp/finit/sbin/initctl
|
- size /tmp/sbin/initctl
|
||||||
- size /tmp/finit/sbin/reboot
|
- size /tmp/sbin/reboot
|
||||||
- LD_LIBRARY_PATH=/tmp/lib /tmp/finit/sbin/initctl -h
|
- LD_LIBRARY_PATH=/tmp/lib /tmp/sbin/initctl -h
|
||||||
- unshare -V
|
|
||||||
- nsenter -V
|
|
||||||
- chroot --version
|
|
||||||
- 'LD_LIBRARY_PATH=/tmp/lib make distcheck || (cat finit-4.0-beta1/_build/sub/test/test-suite.log; exit 1)'
|
|
||||||
|
|||||||
@@ -1,12 +1,10 @@
|
|||||||
Current Maintainer(s):
|
Current Maintainer(s):
|
||||||
* Joachim Wiberg <troglobit@gmail.com>
|
* Joachim Nilsson <troglobit@gmail.com>
|
||||||
|
|
||||||
Major Contributors:
|
Major Contributors:
|
||||||
* Tobias Waldekranz <tobias@waldekranz.com>
|
* Tobias Waldekranz <tobias@waldekranz.com>
|
||||||
* Mattias Walström <mattias.walstrom@westermo.se>
|
* Mattias Walström <mattias.walstrom@westermo.se>
|
||||||
* Jonas Johansson <jonas.johansson@westermo.se>
|
* Jonas Johansson <jonas.johansson@westermo.se>
|
||||||
* Jacques de Laval <jacques@de-laval.se>
|
|
||||||
* Magnus Malm <magnusmalm@gmail.com>
|
|
||||||
|
|
||||||
Original Author(s):
|
Original Author(s):
|
||||||
* Claudio Matsuoka <cmatsuoka@gmail.com>
|
* Claudio Matsuoka <cmatsuoka@gmail.com>
|
||||||
|
|||||||
+33
-157
@@ -4,102 +4,14 @@ Change Log
|
|||||||
All relevant changes are documented in this file.
|
All relevant changes are documented in this file.
|
||||||
|
|
||||||
|
|
||||||
[4.1][UNRELEASED]
|
[3.2][UNRELEASED] - 2018-10-xx
|
||||||
-----------------
|
------------------------------
|
||||||
|
|
||||||
Bug fix release.
|
Bug fix release.
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
* Change behavior on SIGUSR1 to be compatible with sysvinit and systemd.
|
* Add support for `--disable-docs` and `--disable-contrib` to speed up
|
||||||
Previously SIGUSR1 caused Finit to halt, like BusyBox init. This had
|
|
||||||
"interesting" side effects on Debian systems when coexisting with
|
|
||||||
sysvinit (upgrading/reinstalling causes scripts to `kill -USR1 1`)
|
|
||||||
* Change how `contrib/debian/install.sh` sets up a Grub boot entry for
|
|
||||||
finit. We now modify the $SUPPORTED_INITS variable in `10_linux`
|
|
||||||
|
|
||||||
### Fixes
|
|
||||||
* Stricter interface name validation in netlink plugin, modeled after
|
|
||||||
the kernel. Suggested by Coverity Scan
|
|
||||||
* The `contrib/*/install.sh` scripts failed to run from tarball
|
|
||||||
* Fix #170: detect loss of default route when interfaces go down. This
|
|
||||||
emulates the missing kernel netlink message to remove the condition
|
|
||||||
net/default/route to allow stopping dependent services
|
|
||||||
* Fix #171: restore automatic mount of `/dev/shm`, `/dev/pts`, `/run`
|
|
||||||
and `/tmp`, unless mounted already by `/etc/fstab`. This is what most
|
|
||||||
desktop systems expect PID 1 to do
|
|
||||||
* Fix #173: netlink plugin runs out of socket buffer space;
|
|
||||||
|
|
||||||
finit[1]: nl_callback():recv(): No buffer space available
|
|
||||||
|
|
||||||
Fixed by adding support for resync with kernel on `ENOBUFS`. See
|
|
||||||
netlink(7) for details. As a spin-off the plugin now supports any
|
|
||||||
number of interfaces and routes on a system. On resync, the following
|
|
||||||
message is now logged, as a warning:
|
|
||||||
|
|
||||||
finit[1]: nl_callback():busy system, resynchronizing with kernel.
|
|
||||||
|
|
||||||
|
|
||||||
[4.0][] - 2021-04-26
|
|
||||||
--------------------
|
|
||||||
|
|
||||||
This release became v4.0, and not v3.2, because of incompatible changes
|
|
||||||
to service conditions. There are other significant changes as well, so
|
|
||||||
make sure to read the whole change log when upgrading.
|
|
||||||
|
|
||||||
### Changes
|
|
||||||
* The stand-alone `reboot` tool has been replaced with a symlink to
|
|
||||||
`initctl`, like its siblings: halt, shutdown, poweroff, and suspend.
|
|
||||||
Calling `reboot` & C:o now defaults to the corresponding `initctl cmd`
|
|
||||||
with a fallback to sending signals as per traditional SysV init. The
|
|
||||||
`-f` (force) flag remains, where `reboot(2)` is called directly
|
|
||||||
* Introducing Finit progress 𝓜𝓸𝓭𝓮𝓻𝓷
|
|
||||||
* The `inictl cond set|clear COND` have changed completely. Constrained
|
|
||||||
to a flat `<usr/...>` namespace and automatically activated by a new
|
|
||||||
`usr.so` plugin that checks services for usr condition changes
|
|
||||||
* Removed built-in inetd super server. If you need this functionality,
|
|
||||||
use an external inetd, like xinetd, instead. A pull request for a
|
|
||||||
stand-alone inetd, like watchdogd and getty, is most welcome!
|
|
||||||
* Incompatible `configure` script changes, i.e., no guessing `--prefix`
|
|
||||||
and other paths. Also, many options have been changed, renamed, or
|
|
||||||
flipped defaults, or even dropped altogether. There are examples in
|
|
||||||
the documentation and the `contrib/` section
|
|
||||||
* Service conditions change from the non-obvious `<svc/path/to/foo>` to
|
|
||||||
`<pid/foo:id>`. Not only does this give simpler internal semantics,
|
|
||||||
it hopefully also makes it clear that one service's `pid:!foo` pidfile
|
|
||||||
is another service's `<pid/foo>` condition, issue #143
|
|
||||||
* Initial support for cgroups v2:
|
|
||||||
- services runs in a cgroup named after their respective *.conf file
|
|
||||||
- top-level groups are; init, user, and system
|
|
||||||
- all top-level groups can be configured from finit *.conf files
|
|
||||||
- each service can tweak the cgroup settings
|
|
||||||
- Use `initctl [top|ps|cgroup]` commands to inspect runtime state
|
|
||||||
- https://twitter.com/b0rk/status/1214341831049252870?s=20
|
|
||||||
* Major refactor of Finit's `main()` function to be able to start the
|
|
||||||
event loop earlier. This also facilitated factoring out functionality
|
|
||||||
previously hard-coded in Finit, e.g., starting the bundled watchdogd,
|
|
||||||
various distro packed udevd and other hotplugging tools
|
|
||||||
* A proper rescue mode has been added. It is started extremely early
|
|
||||||
and is protected with a bundled `suslogin`. Exiting rescue mode now
|
|
||||||
brings up the system as a normal boot, as one expects
|
|
||||||
* Support for `sysv` start/stop scripts as well as monitoring forking
|
|
||||||
services, stared using `sysv` or `service` stanza
|
|
||||||
* Support for custom `kill:DELAY`, default 3 sec.
|
|
||||||
* Support for custom `halt:SIGNAL`, default SIGTERM
|
|
||||||
* Support for `pre:script` and `post:script`, allows for setup and
|
|
||||||
teardown/cleanup before and after a service runs, issue #129
|
|
||||||
* Support for `env:file` in `/etc/default/foo` or `/etc/conf.d/foo`, see
|
|
||||||
the contrib section for examples that utilize this feature. Variables
|
|
||||||
expanded from env files, and the env files themselves, are tracked for
|
|
||||||
changes to see if a service .conf file is "dirty" and needs restart on
|
|
||||||
`initctl reload`
|
|
||||||
* Support for tracking custom PID files, using `pid:!/path/to/foo.pid`,
|
|
||||||
useful with new `sysv` or `service` which fork to background
|
|
||||||
* Support starting run/task/services without absolute path, trust `$PATH`
|
|
||||||
* Add support for `--disable-doc` and `--disable-contrib` to speed up
|
|
||||||
builds and work around issue with massively parallel builds
|
builds and work around issue with massively parallel builds
|
||||||
* Support for `@console` also for external getty
|
|
||||||
* Support for `notty` option to built-in getty, for board bring-up
|
|
||||||
* Support for `rescue` option to built-in getty, for rescue shells
|
|
||||||
* Add `-b`, batch mode, for non-interactive use to `initctl`
|
* Add `-b`, batch mode, for non-interactive use to `initctl`
|
||||||
* Prefer udev to handle `/dev/` if mdev is also available
|
* Prefer udev to handle `/dev/` if mdev is also available
|
||||||
* Redirect dbus daemon output to syslog
|
* Redirect dbus daemon output to syslog
|
||||||
@@ -107,7 +19,7 @@ make sure to read the whole change log when upgrading.
|
|||||||
* Finit no longer automatically reloads its `*.conf` files after running
|
* Finit no longer automatically reloads its `*.conf` files after running
|
||||||
`/etc/rc.local` or run-parts. Use `initctl reload` instead.
|
`/etc/rc.local` or run-parts. Use `initctl reload` instead.
|
||||||
* `initctl` without an argument or option now defaults to list services
|
* `initctl` without an argument or option now defaults to list services
|
||||||
* Convert built-in watchdog daemon to standalone mini watchdogd, issue #102
|
* Converted built-in watchdog daemon to standalone mini watchdogd
|
||||||
* Improved watchdog hand-over, now based on `svc_t` and not PID
|
* Improved watchdog hand-over, now based on `svc_t` and not PID
|
||||||
* Extended bootstrap, runlevel S, timeout: 10 --> 120 sec. before services
|
* Extended bootstrap, runlevel S, timeout: 10 --> 120 sec. before services
|
||||||
not allowed in the runtime runlevel are unconditionally stopped
|
not allowed in the runtime runlevel are unconditionally stopped
|
||||||
@@ -122,71 +34,37 @@ make sure to read the whole change log when upgrading.
|
|||||||
the kernel can invalidate deleted events before enqueing to userspace
|
the kernel can invalidate deleted events before enqueing to userspace
|
||||||
* Rename `hwclock.so` plugin to `rtc.so` since it now is stand-alone
|
* Rename `hwclock.so` plugin to `rtc.so` since it now is stand-alone
|
||||||
from the `hwclock` tool. Note: the kernel can also be set to load
|
from the `hwclock` tool. Note: the kernel can also be set to load
|
||||||
and store RTC to/from system clock at boot/halt as well, issue #110
|
and store RTC to/from system clock at boot/halt as well.
|
||||||
* New plugin to support cold plugging devices, auto-loading of modules
|
|
||||||
at boot. Detects required modules by reading `/sys/devices/*`
|
|
||||||
* New plugin for `/etc/modules-load.d/` by Robert Andersson, Atlas Copco
|
|
||||||
* New `name:foo` support for services, by Robert Andersson, Atlas Copco
|
|
||||||
* New `manual:yes` support for services, by Robert Andersson, Atlas Copco
|
|
||||||
* New `log:console` support for services, by Robert Andersson, Atlas Copco
|
|
||||||
* Support for `:ID` as a string, by Jonas Johansson, Westermo
|
|
||||||
* Support for auto-reload, instead of having to do `initctl reload`,
|
|
||||||
when a service configuration has changed. Disabled by default, but
|
|
||||||
can be enabled with `./configure --enable-auto-reload`
|
|
||||||
* Support for logging security related events, e.g., runlevel change,
|
|
||||||
star/stop or failure to start services, by Jonas Holmberg, Westermo
|
|
||||||
* Mount devtpts with recommended `ptxmode=0666`
|
|
||||||
* Mount /run tmpfs with nosuid,nodev,noexec for added security
|
|
||||||
* Support for `console` as alias for `@console` in tty stanzas
|
|
||||||
* Drop `--enable-rw-roots` configure option, use `rw` for your `/`
|
|
||||||
partition in `/etc/fstab` instead to trigger remount at boot
|
|
||||||
* Drop default tty speed (38400) and use 0 (kernel default) instead
|
|
||||||
* Make `:ID` optional, use NULL/zero internally this allows ...
|
|
||||||
* Handle use-cases where multiple services share the same PID filem
|
|
||||||
and thus the same condition path, e.g. different instances for
|
|
||||||
different runlevels. Allow custom condition path with `name:foo`
|
|
||||||
syntax, creates conditions w/o a path, and ...
|
|
||||||
* Always append `:ID` qualifier to conditions if set for a service
|
|
||||||
* The IPC socket has moved from `/run/finit.sock` to `/run/finit/socket`
|
|
||||||
officially only supported for use by the `initctl` tool
|
|
||||||
* The IPC socket now uses `SOCK_SEQPACKET` instead of `SOCK_STREAM`.
|
|
||||||
Recommend using watchdogd v3.4, or later, which support this
|
|
||||||
* Improved support for modern `/etc/network/interfaces`, which has
|
|
||||||
include statements. No more native `ifup` of individual interfaces,
|
|
||||||
Finit now calls `ifup -a`, or `ifdown -a`, delegating all details to
|
|
||||||
the operating system. Also, this is now done in the background, by
|
|
||||||
popular request
|
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
* Fix #96: Start udevd as a proper service
|
* Fix #96: Start udevd as a proper service
|
||||||
* Ensure we track run commands as well as task/service, once per runlevel
|
* Ensure we track run commands as well as task/service, once per runlevel
|
||||||
|
* Fix #98: FTBFS with `--disable-inetd`
|
||||||
|
* Make sure to unblock UDP inetd services when connection terminates.
|
||||||
|
Regression introduced in v3.1
|
||||||
* Ensure run/tasks also go to stopping state on exit, like services,
|
* Ensure run/tasks also go to stopping state on exit, like services,
|
||||||
otherwise it is unnecessarily hard to restart them
|
otherwise it is unnecessarily hard to restart them
|
||||||
|
* Fix #99: Do not try to `SIGKILL` inetd services, they are not backed
|
||||||
|
by a PID. This caused a use after free issue crashing finit. Found
|
||||||
|
and fixed by Tobias Waldekranz, Westermo
|
||||||
* Fix missing OS/Finit title bug, adds leading newline before banner
|
* Fix missing OS/Finit title bug, adds leading newline before banner
|
||||||
* Remove "Failed connecting to watchdog ..." error message on systems
|
* Remove "Failed connecting to watchdog ..." error message on systems
|
||||||
that do not have a watchdog
|
that do not have a watchdog
|
||||||
* Fix #100: Early condition handling may not work if `/var/run` does
|
* Fix #100: Early condition handling may not work if `/var/run` does
|
||||||
not yet exist (symlink to `/run`). Added compat layer for access
|
not yet exist (symlink to `/run`). Added compat layer for access
|
||||||
* Fix #101: Built-in inetd removed
|
* Fix #103: Register multiple getty if `@console` resolves to >1 TTY
|
||||||
* Fix #102: Start built-in watchdogd as a regular service
|
|
||||||
* Fix #103: Register multiple getty if `@console` resolves to >1 TTY,
|
|
||||||
* Fix #105: Only remove /etc/nologin when moving from runlevel 0, 1, 6
|
* Fix #105: Only remove /etc/nologin when moving from runlevel 0, 1, 6
|
||||||
|
* Fix #106: Don't mark inetd connections for deletion at .conf reload.
|
||||||
Fixed by Jonas Johansson, Westermo
|
Fixed by Jonas Johansson, Westermo
|
||||||
* Fix #109: Support for PID files in sub-directories to `/var/run`
|
* Fix #107: Stop spawned inetd conncections when stopping inetd service.
|
||||||
* Handle rename of PID files, by Robert Andersson, Atlas Copco
|
Fixed by Jonas Johansson, Westermo
|
||||||
* Fix #110: automatic modprobe of RTC devices, built-in hwclock
|
* Fix #111: Only restart inetd services when necessary. E.g., if the
|
||||||
* Fix #120: Redirect `stdin` to `/dev/null` for services by default
|
listening interface is changed. Only stop established connections
|
||||||
* Fix #122: Switch to `nanosleep()` to achieve "signal safe" sleep,
|
which are no longer allowed, i.e. do not touch already allowed
|
||||||
fixed by Jacques de Laval, Westermo
|
established connections. Fixed by Jonas Johansson, Westermo
|
||||||
* Fix #124: Lingering processes in process group when session leader
|
* Fix: update inetd service args on config change. Found and fixed by
|
||||||
exits. E.g., lingering `logit` processes when parent dies
|
Petrus Hellgren, Westermo
|
||||||
* Fix #127: Show all runparts scripts as they start, like rc.local, fixed
|
|
||||||
by Jacques de Laval, Westermo
|
|
||||||
* Fix service name matching, e.g. for condition handling, may match with
|
|
||||||
wrong service, by Jonas Holmberg, Westermo
|
|
||||||
* Run all run-parts scripts using `/bin/sh -c foo` just like the standard
|
|
||||||
run-parts tool. Found by Magnus Malm, Westermo
|
|
||||||
* Fix `initctl [start | restart]`, should behave the same for services
|
* Fix `initctl [start | restart]`, should behave the same for services
|
||||||
that have crashed. Found by Mattias Walström, Westermo
|
that have crashed. Found by Mattias Walström, Westermo
|
||||||
* Wait for bootstrap phase to complete before cleaning out any bootstrap
|
* Wait for bootstrap phase to complete before cleaning out any bootstrap
|
||||||
@@ -194,15 +72,7 @@ make sure to read the whole change log when upgrading.
|
|||||||
* Reassert condition when an unmodified run/task/service goes from
|
* Reassert condition when an unmodified run/task/service goes from
|
||||||
WAITING back to RUNNING again after a reconfiguration event.
|
WAITING back to RUNNING again after a reconfiguration event.
|
||||||
Found and fixed by Jonas Johansson, Westermo
|
Found and fixed by Jonas Johansson, Westermo
|
||||||
* Restore Ctrl-D and Ctrl-U support in built-in getty
|
|
||||||
* Remove service condition when service is deleted
|
* Remove service condition when service is deleted
|
||||||
* Fix C++ compilation issues, by Robert Andersson, Atlas Copco
|
|
||||||
* Build fixes for uClibc
|
|
||||||
* Provide service description for built-in watchdog daemon
|
|
||||||
* Fix #138: Handle `SIGPWR` like `SIGSUR2`, i.e., power off the system
|
|
||||||
* Drop the '%m' GNUism, for compat with older musl libc
|
|
||||||
* Fix #139: call `tzset()` on `initctl reload` to activate system
|
|
||||||
timezone changes (for logging)
|
|
||||||
|
|
||||||
|
|
||||||
[3.1][] - 2018-01-23
|
[3.1][] - 2018-01-23
|
||||||
@@ -277,7 +147,7 @@ This version requires at least libuEv v2.1.0 and libite v2.0.1
|
|||||||
possibility of running a second stage mount command before files in
|
possibility of running a second stage mount command before files in
|
||||||
`/run` and similar are created
|
`/run` and similar are created
|
||||||
* Skip `gdbserver` when unleashing the grim reaper at shutdown
|
* Skip `gdbserver` when unleashing the grim reaper at shutdown
|
||||||
* Distribute and install `doc/` and `contrib/` directories
|
* Distribute and install `docs/` and `contrib/` directories
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
|
|
||||||
@@ -340,7 +210,7 @@ distributions.
|
|||||||
* Ensure plugins always have a default name, file name
|
* Ensure plugins always have a default name, file name
|
||||||
* Reorganization, move all source files to a `src/` sub-directory
|
* Reorganization, move all source files to a `src/` sub-directory
|
||||||
* Add support for `initctl <list|enable|disable> <SVC>`, much needed by
|
* Add support for `initctl <list|enable|disable> <SVC>`, much needed by
|
||||||
distributions. See [doc/distro.md](doc/distro.md) for details
|
distributions. See [docs/distro.md](docs/distro.md) for details
|
||||||
* Remove `UNUSED()` macro, mentioned here because it may have been used
|
* Remove `UNUSED()` macro, mentioned here because it may have been used
|
||||||
by external plugin developers. Set `-Wno-unused-parameter` instead
|
by external plugin developers. Set `-Wno-unused-parameter` instead
|
||||||
* New table headings in `initctl`, using `top` style inverted text
|
* New table headings in `initctl`, using `top` style inverted text
|
||||||
@@ -811,14 +681,14 @@ Major bug fix release.
|
|||||||
* Makefile fixes for installation, paths encoded wrong
|
* Makefile fixes for installation, paths encoded wrong
|
||||||
* Strip binaries + .so files, support for `$(CROSS)` toolchain strip
|
* Strip binaries + .so files, support for `$(CROSS)` toolchain strip
|
||||||
* Default install is now to `/sbin/finit` and `/usr/`
|
* Default install is now to `/sbin/finit` and `/usr/`
|
||||||
* Note change in `$PLUGIN_DIR` environment variable to `$plugindir`
|
* Note change in `$PLUGIN_DIR` environemnt variable to `$plugindir`
|
||||||
|
|
||||||
|
|
||||||
[1.2][] - 2012-09-27
|
[1.2][] - 2012-09-27
|
||||||
--------------------
|
--------------------
|
||||||
|
|
||||||
### Changes
|
### Changes
|
||||||
* Update README with section on building and environment variables
|
* Update README with section on building and enviroment variables
|
||||||
|
|
||||||
### Fixes
|
### Fixes
|
||||||
* Fix installation paths encoded in finit binary
|
* Fix installation paths encoded in finit binary
|
||||||
@@ -910,8 +780,8 @@ Major bug fix release.
|
|||||||
|
|
||||||
* Initial release
|
* Initial release
|
||||||
|
|
||||||
[UNRELEASED]: https://github.com/troglobit/finit/compare/4.0...HEAD
|
[UNRELEASED]: https://github.com/troglobit/finit/compare/3.1...HEAD
|
||||||
[4.0]: https://github.com/troglobit/finit/compare/3.1...4.0
|
[3.2]: https://github.com/troglobit/finit/compare/3.1...3.2
|
||||||
[3.1]: https://github.com/troglobit/finit/compare/3.0...3.1
|
[3.1]: https://github.com/troglobit/finit/compare/3.0...3.1
|
||||||
[3.0]: https://github.com/troglobit/finit/compare/2.4...3.0
|
[3.0]: https://github.com/troglobit/finit/compare/2.4...3.0
|
||||||
[2.4]: https://github.com/troglobit/finit/compare/2.3...2.4
|
[2.4]: https://github.com/troglobit/finit/compare/2.3...2.4
|
||||||
@@ -942,3 +812,9 @@ Major bug fix release.
|
|||||||
[0.2]: https://github.com/troglobit/finit/compare/0.1...0.2
|
[0.2]: https://github.com/troglobit/finit/compare/0.1...0.2
|
||||||
[libuEv]: https://github.com/troglobit/libuev
|
[libuEv]: https://github.com/troglobit/libuev
|
||||||
[dea3ae8]: https://github.com/troglobit/finit/commit/dea3ae8
|
[dea3ae8]: https://github.com/troglobit/finit/commit/dea3ae8
|
||||||
|
|
||||||
|
<!--
|
||||||
|
-- Local Variables:
|
||||||
|
-- mode: markdown
|
||||||
|
-- End:
|
||||||
|
-->
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
Copyright (c) 2008-2010 Claudio Matsuoka <cmatsuoka@gmail.com>
|
Copyright (c) 2008-2010 Claudio Matsuoka <cmatsuoka@gmail.com>
|
||||||
Copyright (c) 2008-2021 Joachim Wiberg <troglobit@gmail.com>
|
Copyright (c) 2008-2014 Joachim Nilsson <troglobit@gmail.com>
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|||||||
+6
-8
@@ -1,13 +1,13 @@
|
|||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
SUBDIRS = plugins src test
|
SUBDIRS = plugins src
|
||||||
doc_DATA = README.md LICENSE contrib/finit.conf
|
doc_DATA = README.md LICENSE contrib/finit.conf
|
||||||
EXTRA_DIST = README.md LICENSE ChangeLog.md contrib/finit.conf
|
EXTRA_DIST = README.md LICENSE ChangeLog.md contrib/finit.conf
|
||||||
|
|
||||||
if CONTRIB
|
if CONTRIB
|
||||||
SUBDIRS += contrib
|
SUBDIRS += contrib
|
||||||
endif
|
endif
|
||||||
if DOC
|
if DOCS
|
||||||
SUBDIRS += doc
|
SUBDIRS += docs
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Compat hook
|
# Compat hook
|
||||||
@@ -16,9 +16,8 @@ install-dev:
|
|||||||
|
|
||||||
# Target to run when building a release
|
# Target to run when building a release
|
||||||
release: distcheck
|
release: distcheck
|
||||||
@for file in $(DIST_ARCHIVES); do \
|
@for file in $(DIST_ARCHIVES); do \
|
||||||
md5sum $$file > ../$$file.md5; \
|
md5sum $$file > ../$$file.md5; \
|
||||||
sha256sum $$file > ../$$file.sha256; \
|
|
||||||
done
|
done
|
||||||
@mv $(DIST_ARCHIVES) ../
|
@mv $(DIST_ARCHIVES) ../
|
||||||
@echo
|
@echo
|
||||||
@@ -26,6 +25,5 @@ release: distcheck
|
|||||||
@echo "================================================================="
|
@echo "================================================================="
|
||||||
@for file in $(DIST_ARCHIVES); do \
|
@for file in $(DIST_ARCHIVES); do \
|
||||||
printf "$$file \tDistribution tarball\n"; \
|
printf "$$file \tDistribution tarball\n"; \
|
||||||
printf "$$file.md5\t"; cat ../$$file.md5 | cut -f1 -d' '; \
|
printf "$$file.md5\t"; cat ../$$file.md5 | cut -f1 -d' '; \
|
||||||
printf "$$file.sha256\t"; cat ../$$file.sha256 | cut -f1 -d' '; \
|
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -1,58 +1,42 @@
|
|||||||
[![License Badge][]][License] [![Travis Status]][Travis] [![Coverity Status]][Coverity Scan]
|
|
||||||
<img align="right" src="img/finit3.png" alt="Finit: Fast Init">
|
<img align="right" src="img/finit3.png" alt="Finit: Fast Init">
|
||||||
|
|
||||||
* [Introduction](#introduction)
|
* [Introduction](#introduction)
|
||||||
* [Features](#features)
|
* [Features](#features)
|
||||||
* [Bootstrap](doc/bootstrap.md#bootstrap)
|
* [Bootstrap](docs/bootstrap.md#bootstrap)
|
||||||
* [Runlevels](#runlevels)
|
* [Runlevels](#runlevels)
|
||||||
* [Syntax](doc/config.md#syntax)
|
* [Syntax](docs/config.md#syntax)
|
||||||
|
* [Inetd](docs/inetd.md#inetd)
|
||||||
* [Runparts & /etc/rc.local](#runparts--etcrclocal)
|
* [Runparts & /etc/rc.local](#runparts--etcrclocal)
|
||||||
* [Hooks, Callbacks & Plugins](doc/plugins.md#hooks-callbacks--plugins)
|
* [Hooks, Callbacks & Plugins](docs/plugins.md#hooks-callbacks--plugins)
|
||||||
* [Rebooting & Halting](#rebooting--halting)
|
* [Rebooting & Halting](#rebooting--halting)
|
||||||
* [Commands & Status](#commands--status)
|
* [Commands & Status](#commands--status)
|
||||||
* [Tips & Tricks with the kernel cmdline](doc/cmdline.md)
|
* [Tips & Tricks with the kernel cmdline](docs/cmdline.md)
|
||||||
* [Building](doc/build.md#building)
|
* [Building](docs/build.md#building)
|
||||||
* [Running](doc/build.md#running)
|
* [Running](docs/build.md#running)
|
||||||
* [Recovery](doc/build.md#recovery)
|
* [Recovery](docs/build.md#recovery)
|
||||||
* [Debugging](doc/build.md#debugging)
|
* [Debugging](docs/build.md#debugging)
|
||||||
* [Requirements](#requirements)
|
* [Requirements](#requirements)
|
||||||
* [Origin & References](#origin--references)
|
* [Origin & References](#origin--references)
|
||||||
|
|
||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
------------
|
------------
|
||||||
|
[![License Badge][]][License] [![Travis Status]][Travis] [![Coverity Status]][Coverity Scan]
|
||||||
|
|
||||||
Finit is a simple alternative to [SysV init][4] and [systemd][6]. It
|
Finit is a simple alternative to [SysV init][4] and [systemd][6]. It
|
||||||
was reverse engineered from the [EeePC fastinit][] over ten years ago
|
was reverse engineered from the [EeePC fastinit][] ten years ago by
|
||||||
by [Claudio Matsuoka][] — "gaps filled with frog DNA …"
|
[Claudio Matsuoka][] — "gaps filled with frog DNA …"
|
||||||
|
|
||||||

|
|
||||||
*Figure 1: Screenshot showing Finit booting [Alpine Linux](https://www.alpinelinux.org/).*
|
|
||||||
|
|
||||||
Features include:
|
|
||||||
|
|
||||||
* Runlevels
|
|
||||||
* One-shot tasks, daemons, or SysV init scripts
|
|
||||||
* Runparts and rc.local
|
|
||||||
* Process supervision
|
|
||||||
* Sourcing environment files
|
|
||||||
* Conditions for network/process/custom dependencies
|
|
||||||
* 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 `sulogin` for protected maintenance shell
|
|
||||||
|
|
||||||
Focus is on small and embedded systems, although Finit is fully usable
|
Focus is on small and embedded systems, although Finit is fully usable
|
||||||
on server and desktop systems as well. For working examples, see the
|
on server and desktop systems as well. For working examples, see the
|
||||||
[contrib/](contrib/) section with tutorials for:
|
[contrib/](contrib/) section with tutorials for:
|
||||||
|
|
||||||
* [Void Linux](contrib/void/),
|
* [Alpine Linux](contrib/alpine/),
|
||||||
* [Alpine Linux](contrib/alpine/), and
|
* [Debian GNU/Linux](contrib/debian/), and
|
||||||
* [Debian GNU/Linux](contrib/debian/)
|
* [Void Linux](contrib/void/)
|
||||||
|
|
||||||
|

|
||||||
|
The screenshot shows [Alpine Linux](https://www.alpinelinux.org/).
|
||||||
|
|
||||||
|
|
||||||
Example
|
Example
|
||||||
@@ -75,59 +59,69 @@ runlevel 2
|
|||||||
log size=100k count=4
|
log size=100k count=4
|
||||||
|
|
||||||
# Services to be monitored and respawned as needed
|
# Services to be monitored and respawned as needed
|
||||||
service [S12345] env:-/etc/conf.d/watchdog watchdog $WATCHDOG_OPTS $WATCHDOG_DEV -- System watchdog daemon
|
service [S12345] /sbin/watchdogd -L -f -- System watchdog daemon
|
||||||
service [S12345] env:-/etc/conf.d/syslog syslogd -n $SYSLOGD_OPTS -- System log daemon
|
service [S12345] /sbin/syslogd -n -b 3 -D -- System log daemon
|
||||||
service [S12345] <pid/syslogd> env:-/etc/conf.d/klogd klogd -n $KLOGD_OPTS -- Kernel log daemon
|
service [S12345] /sbin/klogd -n -- Kernel log daemon
|
||||||
service [2345] env:-/etc/conf.d/lldpd lldpd -d $LLDPD_OPTS -- LLDP daemon (IEEE 802.1ab)
|
service [2345] /sbin/lldpd -d -c -M1 -H0 -i -- LLDP daemon (IEEE 802.1ab)
|
||||||
|
|
||||||
# The BusyBox ntpd does not use syslog when running in the foreground
|
# The BusyBox ntpd does not use syslog when running in the foreground
|
||||||
# So we use this trick to redirect stdout/stderr to a log file. The
|
# So we use this trick to redirect stdout/stderr to a log file. The
|
||||||
# log file is rotated with the above settings. The condition declares
|
# log file is rotated with the above settings. The condition declares
|
||||||
# a dependency on a system default route (gateway) to be set. A single
|
# a dependency on a system default route (gateway) to be set. A single
|
||||||
# <!> at the beginning means ntpd does not respect SIGHUP for restart.
|
# <!> at the beginning means ntpd does not respect SIGHUP for restart.
|
||||||
service [2345] log:/var/log/ntpd.log <!net/route/default> ntpd -n -l -I eth0 -- NTP daemon
|
service [2345] log:/var/log/ntpd.log <!net/route/default> /sbin/ntpd -n -l -I eth0 -- NTP daemon
|
||||||
|
|
||||||
# For multiple instances of the same service, add :ID somewhere between
|
# For multiple instances of the same service, add :ID somewhere between
|
||||||
# the service/run/task keyword and the command.
|
# the service/run/task keyword and the command.
|
||||||
service :80 [2345] merecat -n -p 80 /var/www -- Web server
|
service :1 [2345] /sbin/merecat -n -p 80 /var/www -- Web server
|
||||||
service :8080 [2345] merecat -n -p 8080 /var/www -- Old web server
|
service :2 [2345] /sbin/merecat -n -p 8080 /var/www -- Old web server
|
||||||
|
|
||||||
# Alternative method instead of below runparts, can also use /etc/rc.local
|
# Alternative method instead of below runparts, can also use /etc/rc.local
|
||||||
#sysv [S] /etc/init.d/keyboard-setup -- Setting up preliminary keymap
|
#task [S] /etc/init.d/keyboard-setup start -- Setting up preliminary keymap
|
||||||
#sysv [S] /etc/init.d/acpid -- Starting ACPI Daemon
|
#task [S] /etc/init.d/acpid start -- Starting ACPI Daemon
|
||||||
#task [S] /etc/init.d/kbd -- Preparing console
|
#task [S] /etc/init.d/kbd start -- Preparing console
|
||||||
|
|
||||||
|
# Inetd services to start on demand, with alternate ports and filtering
|
||||||
|
inetd ftp/tcp nowait [2345] /sbin/in.ftpd -- FTP daemon
|
||||||
|
inetd tftp/udp wait [2345] /sbin/in.tftpd -- TFTP daemon
|
||||||
|
inetd time/udp wait [2345] internal -- UNIX rdate service
|
||||||
|
inetd time/tcp nowait [2345] internal -- UNIX rdate service
|
||||||
|
inetd 3737/tcp nowait [2345] internal.time -- UNIX rdate service
|
||||||
|
inetd telnet/tcp nowait [2345] /sbin/telnetd -i -F -- Telnet daemon
|
||||||
|
inetd 2323/tcp nowait [2345] /sbin/telnetd -i -F -- Telnet daemon
|
||||||
|
inetd 222/tcp@eth0 nowait [2345] /sbin/dropbear -i -R -F -- SSH service
|
||||||
|
inetd ssh/tcp@*,!eth0 nowait [2345] /sbin/dropbear -i -R -F -- SSH service
|
||||||
|
|
||||||
# Run start scripts from this directory
|
# Run start scripts from this directory
|
||||||
# runparts /etc/start.d
|
# runparts /etc/start.d
|
||||||
|
|
||||||
# Virtual consoles run BusyBox getty, keep kernel default speed
|
# Virtual consoles run BusyBox getty
|
||||||
tty [12345] /sbin/getty -L 0 /dev/tty1 linux nowait noclear
|
tty [12345] /sbin/getty -L 115200 /dev/tty1 linux
|
||||||
tty [2345] /sbin/getty -L 0 /dev/tty2 linux nowait noclear
|
tty [12345] /sbin/getty -L 115200 /dev/tty2 linux
|
||||||
tty [2345] /sbin/getty -L 0 /dev/tty3 linux nowait noclear
|
tty [12345] /sbin/getty -L 115200 /dev/tty3 linux
|
||||||
|
|
||||||
# Use built-in getty for serial port and USB serial
|
# Use built-in getty for serial port and USB serial
|
||||||
#tty [12345] /dev/ttyAMA0 noclear nowait
|
tty [12345] /dev/ttyAMA0 115200 noclear nowait
|
||||||
#tty [12345] /dev/ttyUSB0 noclear
|
tty [12345] /dev/ttyUSB0 115200 noclear
|
||||||
|
|
||||||
# Just give me a shell, I need to debug this embedded system!
|
# Just give me a shell, I need to debug this embedded system!
|
||||||
#tty [12345] console noclear nologin
|
tty [12345] @console noclear nologin
|
||||||
```
|
```
|
||||||
|
|
||||||
The `service` stanza, as well as `task`, `run` and others are described
|
The `service` stanza, as well as `task`, `run`, `inetd` and others are
|
||||||
in full in [doc/config.md](doc/config.md). Here's a quick overview of
|
described in full in [docs/config.md](docs/config.md). Here's a quick
|
||||||
some of the most common components needed to start a UNIX daemon:
|
overview of some of the most common components needed to start a UNIX
|
||||||
|
daemon:
|
||||||
|
|
||||||
```
|
```
|
||||||
service [LVLS] <COND> log env:[-]/etc/default/daemon daemon ARGS -- Daemon daemon
|
service [LVLS] <COND> /path/to/daemon ARGS -- Some text
|
||||||
^ ^ ^ ^ ^ ^ ^ ^
|
^ ^ ^ ^ ^ ^
|
||||||
| | | | | | | `-- Optional description
|
| | | | | `-- Optional description
|
||||||
| | | | | | `----------- Daemon arguments
|
| | | | `---------- Daemon arguments
|
||||||
| | | | | `-------------------------- Path to daemon
|
| | | `-------------------------- Path to daemon
|
||||||
| | | | `---------------------------------------------------- Optional env. file
|
| | `--------------------------------- Optional conditions
|
||||||
| | | `-------------------------------------------------------- Redirect output to log
|
| `---------------------------------------- Optional Runlevels
|
||||||
| | `--------------------------------------------------------------- Optional conditions
|
`------------------------------------------------ Monitored application
|
||||||
| `---------------------------------------------------------------------- Optional Runlevels
|
|
||||||
`------------------------------------------------------------------------------ Monitored application
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Some components are optional: runlevel(s), condition(s) and description,
|
Some components are optional: runlevel(s), condition(s) and description,
|
||||||
@@ -136,18 +130,18 @@ advanced uses as well:
|
|||||||
|
|
||||||
service /usr/sbin/sshd -D
|
service /usr/sbin/sshd -D
|
||||||
|
|
||||||
Dependencies are handled using [conditions](doc/conditions.md). One of
|
Dependencies are handled using [conditions](docs/conditions.md). One of
|
||||||
the most common conditions is to wait for basic networking to become
|
the most common conditions is to wait for basic networking to become
|
||||||
available:
|
available:
|
||||||
|
|
||||||
service <net/route/default> nginx -- High performace HTTP server
|
service <net/route/default> /usr/sbin/nginx -- High performace HTTP server
|
||||||
|
|
||||||
Here is another example where we instruct Finit to not start BusyBox
|
Here is another example where we instruct Finit to not start BusyBox
|
||||||
`ntpd` until `syslogd` has started properly. Finit waits for `syslogd`
|
`ntpd` until `syslogd` has started properly. Finit waits for `syslogd`
|
||||||
to create its PID file, by default `/var/run/syslogd.pid`.
|
to create its PID file, by default `/var/run/syslogd.pid`.
|
||||||
|
|
||||||
service [2345] log <!pid/syslogd> ntpd -n -N -p pool.ntp.org
|
service [2345] log <svc/sbin/syslogd> /usr/sbin/ntpd -n -N -p pool.ntp.org
|
||||||
service [S12345] syslogd -n -- Syslog daemon
|
service [S12345] /sbin/syslogd -n -- Syslog daemon
|
||||||
|
|
||||||
Notice the `log` keyword, BusyBox `ntpd` uses `stderr` for logging when
|
Notice the `log` keyword, BusyBox `ntpd` uses `stderr` for logging when
|
||||||
run in the foreground. With `log` Finit redirects `stdout` + `stderr`
|
run in the foreground. With `log` Finit redirects `stdout` + `stderr`
|
||||||
@@ -156,7 +150,7 @@ to the system log daemon using the command line `logger(1)` tool.
|
|||||||
A service, or task, can have multiple dependencies listed. Here we wait
|
A service, or task, can have multiple dependencies listed. Here we wait
|
||||||
for *both* `syslogd` to have started and basic networking to be up:
|
for *both* `syslogd` to have started and basic networking to be up:
|
||||||
|
|
||||||
service [2345] log <pid/syslogd,net/route/default> ntpd -n -N -p pool.ntp.org
|
service [2345] log <svc/sbin/syslogd,net/route/default> /usr/sbin/ntpd -n -N -p pool.ntp.org
|
||||||
|
|
||||||
If either condition fails, e.g. loss of networking, `ntpd` is stopped
|
If either condition fails, e.g. loss of networking, `ntpd` is stopped
|
||||||
and as soon as it comes back up again `ntpd` is restarted automatically.
|
and as soon as it comes back up again `ntpd` is restarted automatically.
|
||||||
@@ -175,6 +169,26 @@ Features
|
|||||||
Start, monitor and restart services should they fail.
|
Start, monitor and restart services should they fail.
|
||||||
|
|
||||||
|
|
||||||
|
**Inetd**
|
||||||
|
|
||||||
|
Finit comes with a built-in [inetd server](docs/inetd.md). No need to
|
||||||
|
maintain a separate config file for services that you want to start on
|
||||||
|
demand.
|
||||||
|
|
||||||
|
All inetd services started can be filtered per port and inbound
|
||||||
|
interface, reducing the need for a full blown firewall.
|
||||||
|
|
||||||
|
Built-in optional inetd services:
|
||||||
|
|
||||||
|
- echo [RFC862][]
|
||||||
|
- chargen [RFC864][]
|
||||||
|
- daytime [RFC867][]
|
||||||
|
- discard [RFC863][]
|
||||||
|
- time (rdate) [RFC868][]
|
||||||
|
|
||||||
|
For more information, see [docs/inetd.md](docs/inetd.md).
|
||||||
|
|
||||||
|
|
||||||
**Getty**
|
**Getty**
|
||||||
|
|
||||||
Finit supports external getty but also comes with a limited built-in
|
Finit supports external getty but also comes with a limited built-in
|
||||||
@@ -183,9 +197,9 @@ waits for user input before handing over to `/bin/login`, which is
|
|||||||
responsible for handling the actual authentication.
|
responsible for handling the actual authentication.
|
||||||
|
|
||||||
```conf
|
```conf
|
||||||
tty [12345] /dev/tty1 nowait linux
|
tty [12345] /dev/tty1 38400 nowait linux
|
||||||
tty [12345] /dev/ttyAMA0 noclear vt100
|
tty [12345] /dev/ttyAMA0 115200 noclear vt100
|
||||||
tty [12345] /sbin/getty -L /dev/ttyAMA0 vt100
|
tty [12345] /sbin/getty -L 115200 /dev/ttyAMA0 vt100
|
||||||
```
|
```
|
||||||
|
|
||||||
Users of embedded systems may want to enable automatic serial console
|
Users of embedded systems may want to enable automatic serial console
|
||||||
@@ -194,19 +208,19 @@ system uses `ttyS0`, `ttyAMA0`, `ttyMXC0`, or anything else. Finit
|
|||||||
figures it out by querying sysfs: `/sys/class/tty/console/active`.
|
figures it out by querying sysfs: `/sys/class/tty/console/active`.
|
||||||
|
|
||||||
```conf
|
```conf
|
||||||
tty [12345] @console linux noclear
|
tty [12345] @console 115200 linux noclear
|
||||||
```
|
```
|
||||||
|
|
||||||
Notice the optional `noclear`, `nowait`, and `nologin` flags. The
|
Notice the optional `noclear`, `nowait`, and `nologin` flags. The
|
||||||
latter is for skipping the login process entirely. For more information,
|
latter is for skipping the login process entirely. For more information,
|
||||||
see [doc/config.md](doc/config.md#syntax).
|
see [docs/config.md](docs/config.md#syntax).
|
||||||
|
|
||||||
|
|
||||||
**Runlevels**
|
**Runlevels**
|
||||||
|
|
||||||
Support for SysV init-style [runlevels][5] is available, in the same
|
Support for SysV init-style [runlevels][5] is available, in the same
|
||||||
minimal style as everything else in Finit. The `[2345]` syntax can be
|
minimal style as everything else in Finit. The `[2345]` syntax can be
|
||||||
applied to service, task, run, and TTY stanzas.
|
applied to service, task, run, inetd, and TTY stanzas.
|
||||||
|
|
||||||
Reserved runlevels are 0 and 6, halt and reboot, respectively just like
|
Reserved runlevels are 0 and 6, halt and reboot, respectively just like
|
||||||
SysV init. Runlevel 1 can be configured freely, but is recommended to
|
SysV init. Runlevel 1 can be configured freely, but is recommended to
|
||||||
@@ -236,69 +250,34 @@ Capabilities:
|
|||||||
Hook into the boot at predefined points to extend Finit
|
Hook into the boot at predefined points to extend Finit
|
||||||
- **I/O**
|
- **I/O**
|
||||||
Listen to external events and control Finit behavior/services
|
Listen to external events and control Finit behavior/services
|
||||||
|
- **Inetd**
|
||||||
|
Extend Finit with internal inetd services, for an example, see
|
||||||
|
`plugins/time.c`
|
||||||
|
|
||||||
Extensions and functionality not purely related to what an `/sbin/init`
|
Extensions and functionality not purely related to what an `/sbin/init`
|
||||||
needs to start a system are available as a set of plugins that either
|
needs to start a system are available as a set of plugins that either
|
||||||
hook into the boot process or respond to various I/O.
|
hook into the boot process or respond to various I/O.
|
||||||
|
|
||||||
For more information, see [doc/plugins.md](doc/plugins.md).
|
For more information, see [docs/plugins.md](docs/plugins.md).
|
||||||
|
|
||||||
|
|
||||||
**Automatic Reload**
|
**Progress**
|
||||||
|
|
||||||
By default, Finit monitors `/etc/finit.d/` and `/etc/finit.d/enabled/`
|
Finit prior to v3.0 showed the progress at boot: plugins and modules
|
||||||
registering any changes to `.conf` files. To activate a change the user
|
being loaded, run/tasks/services being started, etc. By default Finit
|
||||||
must call `initctl reload`, which reloads all modified files, stops any
|
is now silent, but progress can still be enabled at build-time using:
|
||||||
removed services, starts new ones, and restarts any modified ones. If the
|
|
||||||
command line arguments of a service have changed, the process will be
|
|
||||||
terminated and then started again with the updated arguments. If the arguments
|
|
||||||
have not been modified and the process supports SIGHUP, the process will
|
|
||||||
receive a SIGHUP rather than being terminated and started.
|
|
||||||
|
|
||||||
For some use-cases the extra step of calling `initctl reload` creates an
|
configure --enable-progress
|
||||||
unnecessary overhead, which can be removed at build-time using:
|
|
||||||
|
|
||||||
configure --enable-auto-reload
|
or at boot from the kernel cmdline using the boot parameter `splash`:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
append="init=/sbin/finit splash"
|
||||||
|
```
|
||||||
|
|
||||||
**Cgroups**
|
For a really nice boot, add `quiet` as well. This silences the output
|
||||||
|
from the kernel, leaving only warnings and errors. For other kernel
|
||||||
Finit supports cgroups v2 and comes with the following default groups
|
command line parameters, see [docs/build.md](docs/build.md#recovery).
|
||||||
in which services and user sessions are placed in:
|
|
||||||
|
|
||||||
/sys/fs/cgroup
|
|
||||||
|-- init/ # cpu.weight:100
|
|
||||||
|-- system/ # cpu.weight:9800
|
|
||||||
`-- user/ # cpu.weight:100
|
|
||||||
|
|
||||||
Finit itself and its helper scripts and services are placed in the
|
|
||||||
top-level leaf-node group `init/`, which also is _reserved_.
|
|
||||||
|
|
||||||
All run/task/service/sysv processes are placed in their own sub-group
|
|
||||||
in `system/`. The name of each sub-group is taken from the respective
|
|
||||||
`.conf` file from `/etc/finit.d`.
|
|
||||||
|
|
||||||
All getty/tty processes are placed in their own sub-group in `user/`.
|
|
||||||
The name of each sub-group is taken from the username.
|
|
||||||
|
|
||||||
A fourth group also exists, the `root` group. It is also _reserved_ and
|
|
||||||
primarily intended for RT tasks. If you have RT tasks they need to be
|
|
||||||
declared as such in their service stanza like this:
|
|
||||||
|
|
||||||
service [...] <...> cgroup.root /path/to/foo args -- description
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
cgroup.root
|
|
||||||
service [...] <...> /path/to/foo args -- description
|
|
||||||
service [...] <...> /path/to/bar args -- description
|
|
||||||
|
|
||||||
See [doc/config.md](doc/config.md#cgroups) for more information, e.g.,
|
|
||||||
how to configure per-group limits.
|
|
||||||
|
|
||||||
The `initctl` tool has three commands to help debug and optimize the
|
|
||||||
setup and monitoring of cgroups. See the `ps`, `top`, and `cgroup`
|
|
||||||
commands for details.
|
|
||||||
|
|
||||||
|
|
||||||
Runparts & /etc/rc.local
|
Runparts & /etc/rc.local
|
||||||
@@ -320,8 +299,8 @@ Right after the runlevel change when all services have started properly,
|
|||||||
No configuration stanza in `/etc/finit.conf` is required for `rc.local`.
|
No configuration stanza in `/etc/finit.conf` is required for `rc.local`.
|
||||||
If it exists and is an executable shell script Finit calls it at the very
|
If it exists and is an executable shell script Finit calls it at the very
|
||||||
end of the boot, before calling the `HOOK_SYSTEM_UP`. See more on hooks
|
end of the boot, before calling the `HOOK_SYSTEM_UP`. See more on hooks
|
||||||
in [doc/plugins.md](doc/plugins.md#hooks), and about the system bootstrap
|
in [docs/plugins.md](docs/plugins.md#hooks), and about the system bootstrap
|
||||||
in [doc/bootstrap.md](doc/bootstrap.md).
|
in [docs/bootstrap.md](docs/bootstrap.md).
|
||||||
|
|
||||||
|
|
||||||
Runlevels
|
Runlevels
|
||||||
@@ -342,10 +321,10 @@ To specify an allowed set of runlevels for a `service`, `run` command,
|
|||||||
`task`, or `tty`, add `[NNN]` to your `/etc/finit.conf`, like this:
|
`task`, or `tty`, add `[NNN]` to your `/etc/finit.conf`, like this:
|
||||||
|
|
||||||
```
|
```
|
||||||
service [S12345] syslogd -n -x -- System log daemon
|
service [S12345] /sbin/syslogd -n -x -- System log daemon
|
||||||
run [S] /etc/init.d/acpid start -- Starting ACPI Daemon
|
run [S] /etc/init.d/acpid start -- Starting ACPI Daemon
|
||||||
task [S] /etc/init.d/kbd start -- Preparing console
|
task [S] /etc/init.d/kbd start -- Preparing console
|
||||||
service [S12345] <pid/syslogd> klogd -n -x -- Kernel log daemon
|
service [S12345] /sbin/klogd -n -x -- Kernel log daemon
|
||||||
|
|
||||||
tty [12345] /dev/tty1
|
tty [12345] /dev/tty1
|
||||||
tty [2] /dev/tty2
|
tty [2] /dev/tty2
|
||||||
@@ -392,34 +371,50 @@ Rebooting & Halting
|
|||||||
|
|
||||||
Traditionally, rebooting and halting a UNIX system is done by changing
|
Traditionally, rebooting and halting a UNIX system is done by changing
|
||||||
its runlevel. Finit comes with its own tooling providing: `shutdown`,
|
its runlevel. Finit comes with its own tooling providing: `shutdown`,
|
||||||
`reboot`, `poweroff`, and `suspend`, but also the `initctl` tool,
|
`reboot`, `poweroff`, and `suspend`, but also the traditional `init` and
|
||||||
detailed in the next section.
|
`telinit`, as well as a more modern `initctl` tool, detailed in the next
|
||||||
|
section.
|
||||||
|
|
||||||
For compatibility reasons Finit listens to the same set of signals as
|
For compatibility reasons Finit listens to the same set of signals as
|
||||||
BusyBox init. This is not 100% compatible with SysV init, but clearly
|
BusyBox init. This is not 100% compatible with SysV init, but clearly
|
||||||
the more common combination for Finit. For more details, see
|
the more common combination for Finit. For more details, see
|
||||||
[doc/signals.md](doc/signals.md).
|
[docs/signals.md](docs/signals.md).
|
||||||
|
|
||||||
|
Finit also listens to the classic SysV init FIFO, used by `telinit`.
|
||||||
|
Support for this is implemented by the `initctl.so` plugin. Hence,
|
||||||
|
`telinit q` will work as the UNIX beards intended.
|
||||||
|
|
||||||
|
```shell
|
||||||
|
~ # telinit -h
|
||||||
|
Usage: telinit [OPTIONS] [q | Q | 0-9]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-h, --help This help text
|
||||||
|
-V, --version Show Finit version
|
||||||
|
|
||||||
|
Commands:
|
||||||
|
0 Power-off the system, same as initctl poweroff
|
||||||
|
6 Reboot the system, same as initctl reboot
|
||||||
|
2, 3, 4, 5 Change runlevel. Starts services in new runlevel, stops any
|
||||||
|
services in prev. runlevel that are not allowed in new.
|
||||||
|
q, Q Reload *.conf in /etc/finit.d/, same as initctl reload or
|
||||||
|
sending SIGHUP to PID 1
|
||||||
|
1, s, S Enter system rescue mode, runlevel 1
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
Commands & Status
|
Commands & Status
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
Finit also implements a modern API to query status, and start/stop
|
Finit also implements a more modern API to query status, and start/stop
|
||||||
services, called `initctl`. Unlike `telinit` the `initctl` tool does
|
services, called `initctl`. Unlike `telinit` the `initctl` tool does
|
||||||
not return until the given command has fully completed.
|
not return until the given command has fully completed.
|
||||||
|
|
||||||
```
|
```shell
|
||||||
alpine:~# initctl help
|
~ $ initctl -h
|
||||||
Usage: initctl [OPTIONS] [COMMAND]
|
Usage: initctl [OPTIONS] [COMMAND]
|
||||||
|
|
||||||
Options:
|
Options:
|
||||||
-b, --batch Batch mode, no screen size probing
|
|
||||||
-c, --create Create missing paths (and files) as needed
|
|
||||||
-f, --force Ignore missing files and arguments, never prompt
|
|
||||||
-1, --once Only one lap in commands like 'top'
|
|
||||||
-p, --plain Use plain table headings, no ctrl chars
|
|
||||||
-q, --quiet Silent, only return status of command
|
|
||||||
-t, --no-heading Skip table headings
|
|
||||||
-v, --verbose Verbose output
|
-v, --verbose Verbose output
|
||||||
-h, --help This help text
|
-h, --help This help text
|
||||||
|
|
||||||
@@ -428,112 +423,53 @@ Commands:
|
|||||||
help This help text
|
help This help text
|
||||||
version Show Finit version
|
version Show Finit version
|
||||||
|
|
||||||
ls | list List all .conf in /etc/finit.d
|
list List all .conf in /etc/finit.d/
|
||||||
create <CONF> Create .conf in /etc/finit.d/available
|
enable <CONF> Enable .conf in /etc/finit.d/available/
|
||||||
delete <CONF> Delete .conf in /etc/finit.d/available
|
disable <CONF> Disable .conf in /etc/finit.d/[enabled/]
|
||||||
show <CONF> Show .conf in /etc/finit.d/available
|
touch <CONF> Mark .conf in /etc/finit.d/ for reload
|
||||||
edit <CONF> Edit .conf in /etc/finit.d/available
|
reload Reload *.conf in /etc/finit.d/ (activates changes)
|
||||||
touch <CONF> Change .conf in /etc/finit.d/available
|
|
||||||
enable <CONF> Enable .conf in /etc/finit.d/available
|
|
||||||
disable <CONF> Disable .conf in /etc/finit.d/enabled
|
|
||||||
reload Reload *.conf in /etc/finit.d (activate changes)
|
|
||||||
|
|
||||||
cond set <COND> Set (assert) user-defined condition +usr/COND
|
cond set <COND> Set (assert) condition => +COND
|
||||||
cond clear <COND> Clear (deassert) user-defined condition -usr/COND
|
cond clear <COND> Clear (deassert) condition => -COND
|
||||||
cond status Show condition status, default cond command
|
cond show Show condition status
|
||||||
cond dump Dump all conditions and their status
|
cond dump Dump all conditions and their status
|
||||||
|
|
||||||
log [NAME] Show ten last Finit, or NAME, messages from syslog
|
log [NAME] Show ten last Finit, or NAME, messages from syslog
|
||||||
start <NAME>[:ID] Start service by name, with optional ID
|
start <JOB|NAME>[:ID] Start service by job# or name, with optional ID
|
||||||
stop <NAME>[:ID] Stop/Pause a running service by name
|
stop <JOB|NAME>[:ID] Stop/Pause a running service by job# or name
|
||||||
reload <NAME>[:ID] Reload service by name (SIGHUP or restart)
|
restart <JOB|NAME>[:ID] Restart (stop/start) service by job# or name
|
||||||
restart <NAME>[:ID] Restart (stop/start) service by name
|
status <JOB|NAME>[:ID] Show service status, by job# or name
|
||||||
status <NAME>[:ID] Show service status, by name
|
status | show Show status of services, default command
|
||||||
status Show status of services, default command
|
|
||||||
|
|
||||||
cgroup List cgroup config overview
|
|
||||||
ps List processes based on cgroups
|
|
||||||
top Show top-like listing based on cgroups
|
|
||||||
|
|
||||||
runlevel [0-9] Show or set runlevel: 0 halt, 6 reboot
|
runlevel [0-9] Show or set runlevel: 0 halt, 6 reboot
|
||||||
reboot Reboot system
|
reboot Reboot system
|
||||||
halt Halt system
|
halt Halt system
|
||||||
poweroff Halt and power off system
|
poweroff Halt and power off system
|
||||||
suspend Suspend system
|
|
||||||
|
utmp show Raw dump of UTMP/WTMP db
|
||||||
```
|
```
|
||||||
|
|
||||||
For services *not* supporting `SIGHUP` the `<!>` notation in the .conf
|
For services *not* supporting `SIGHUP` the `<!>` notation in the .conf
|
||||||
file must be used to tell Finit to stop and start it on `reload` and
|
file must be used to tell Finit to stop and start it on `reload` and
|
||||||
`runlevel` changes. If `<>` holds more [conditions](doc/conditions.md),
|
`runlevel` changes. If `<>` holds more [conditions](docs/conditions.md),
|
||||||
these will also affect how a service is maintained.
|
these will also affect how a service is maintained.
|
||||||
|
|
||||||
> **Note:** even though it is possible to start services not belonging in
|
**Note:** even though it is possible to start services not belonging in
|
||||||
> the current runlevel these services will not be respawned automatically
|
the current runlevel these services will not be respawned automatically
|
||||||
> by Finit if they exit (crash). Hence, if the runlevel is 2, the below
|
by Finit if they exit (crash). Hence, if the runlevel is 2, the below
|
||||||
> Dropbear SSH service will not be restarted if it is killed or exits.
|
Dropbear SSH service will not be restarted if it is killed or exits.
|
||||||
|
|
||||||
The `status` command is the default, it displays a quick overview of all
|
```shell
|
||||||
monitored run/task/services. Here we call `initctl -p`, suitable for
|
~ $ initctl status -v
|
||||||
scripting and documentation:
|
1 running 476 [S12345] /sbin/watchdog -T 16 -t 2 -F /dev/watchdog
|
||||||
|
2 running 477 [S12345] /sbin/syslogd -n -b 3 -D
|
||||||
```
|
3 running 478 [S12345] /sbin/klogd -n
|
||||||
alpine:~# initctl -p
|
4:1 inetd 0 [2345] internal time allow *:37,!eth0
|
||||||
PID IDENT STATUS RUNLEVELS DESCRIPTION
|
4:2 inetd 0 [2345] internal time allow eth0:3737
|
||||||
======================================================================
|
5:1 inetd 0 [2345] /sbin/telnetd allow *:23 deny eth0,eth1
|
||||||
1506 acpid running [--2345----] ACPI daemon
|
5:2 inetd 0 [2345] /sbin/telnetd allow eth0:2323,eth2:2323,eth1:2323
|
||||||
1509 crond running [--2345----] Cron daemon
|
6:1 inetd 0 [345] /sbin/dropbear allow eth0:222
|
||||||
1489 dropbear running [--2345----] Dropbear SSH daemon
|
6:2 inetd 0 [345] /sbin/dropbear allow *:22 deny eth0
|
||||||
1511 klogd running [S12345----] Kernel log daemon
|
|
||||||
1512 ntpd running [--2345----] NTP daemon
|
|
||||||
1473 syslogd running [S12345----] Syslog daemon
|
|
||||||
|
|
||||||
alpine:~# initctl -pv
|
|
||||||
PID IDENT STATUS RUNLEVELS COMMAND
|
|
||||||
======================================================================
|
|
||||||
1506 acpid running [--2345----] acpid -f
|
|
||||||
1509 crond running [--2345----] crond -f -S $CRON_OPTS
|
|
||||||
1489 dropbear running [--2345----] dropbear -R -F $DROPBEAR_OPTS
|
|
||||||
1511 klogd running [S12345----] klogd -n $KLOGD_OPTS
|
|
||||||
1512 ntpd running [--2345----] ntpd -n $NTPD_OPTS
|
|
||||||
1473 syslogd running [S12345----] syslogd -n
|
|
||||||
```
|
|
||||||
|
|
||||||
The environment variables to each of the services above are read from,
|
|
||||||
in the case of Alpine Linux, `/etc/conf.d/`. Other distributions may
|
|
||||||
have other directories, e.g., Debian use `/etc/default/`.
|
|
||||||
|
|
||||||
The `status` command takes an optional `NAME:ID` argument. Here we
|
|
||||||
check the status of `dropbear`, which only has one instance in this
|
|
||||||
system:
|
|
||||||
|
|
||||||
```
|
|
||||||
alpine:~# initctl -p status dropbear
|
|
||||||
Status : running
|
|
||||||
Identity : dropbear
|
|
||||||
Description : Dropbear SSH daemon
|
|
||||||
Origin : /etc/finit.d/enabled/dropbear.conf
|
|
||||||
Environment : -/etc/conf.d/dropbear
|
|
||||||
Condition(s):
|
|
||||||
Command : dropbear -R -F $DROPBEAR_OPTS
|
|
||||||
PID file : !/run/dropbear.pid
|
|
||||||
PID : 1485
|
|
||||||
User : root
|
|
||||||
Group : root
|
|
||||||
Uptime : 2 hour 46 min 56 sec
|
|
||||||
Runlevels : [--2345----]
|
|
||||||
Memory : 1.2M
|
|
||||||
CGroup : /system/dropbear cpu 0 [100, max] mem [--.--, max]
|
|
||||||
|- 1485 dropbear -R -F
|
|
||||||
|- 2634 dropbear -R -F
|
|
||||||
|- 2635 ash
|
|
||||||
`- 2652 initctl -p status dropbear
|
|
||||||
|
|
||||||
Apr 8 12:19:49 alpine authpriv.info dropbear[1485]: Not backgrounding
|
|
||||||
Apr 8 12:37:45 alpine authpriv.info dropbear[2300]: Child connection from 192.168.121.1:47834
|
|
||||||
Apr 8 12:37:46 alpine authpriv.notice dropbear[2300]: Password auth succeeded for 'root' from 192.168.121.1:47834
|
|
||||||
Apr 8 12:37:46 alpine authpriv.info dropbear[2300]: Exit (root) from <192.168.121.1:47834>: Disconnect received
|
|
||||||
Apr 8 15:02:11 alpine authpriv.info dropbear[2634]: Child connection from 192.168.121.1:48576
|
|
||||||
Apr 8 15:02:12 alpine authpriv.notice dropbear[2634]: Password auth succeeded for 'root' from 192.168.121.1:48576
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -554,7 +490,7 @@ done slightly differently and on systems with udev you might want to add
|
|||||||
the following one-shot task early in your `/etc/finit.conf`:
|
the following one-shot task early in your `/etc/finit.conf`:
|
||||||
|
|
||||||
```conf
|
```conf
|
||||||
run [S] udevadm settle --timeout=120 -- Waiting for udev
|
run [S] /sbin/udevadm settle --timeout=120 -- Waiting for udev
|
||||||
```
|
```
|
||||||
|
|
||||||
Finit has a built-in Getty for TTYs, but requires a working `/bin/login`
|
Finit has a built-in Getty for TTYs, but requires a working `/bin/login`
|
||||||
@@ -563,6 +499,9 @@ or `/bin/sh`, if no TTYs are configured in `/etc/finit.conf`.
|
|||||||
For a fully operational system `/var`, `/run` and `/tmp` must be set up
|
For a fully operational system `/var`, `/run` and `/tmp` must be set up
|
||||||
properly in `/etc/fstab` -- which is iterated over at boot.
|
properly in `/etc/fstab` -- which is iterated over at boot.
|
||||||
|
|
||||||
|
The built-in Inetd requires `/etc/services` and `/etc/protocols` to work
|
||||||
|
with port names rather than numbers.
|
||||||
|
|
||||||
|
|
||||||
Origin & References
|
Origin & References
|
||||||
-------------------
|
-------------------
|
||||||
@@ -571,7 +510,7 @@ This project is based on the [original finit][] by [Claudio Matsuoka][]
|
|||||||
which was reverse engineered from syscalls of the [EeePC fastinit][] —
|
which was reverse engineered from syscalls of the [EeePC fastinit][] —
|
||||||
"gaps filled with frog DNA …"
|
"gaps filled with frog DNA …"
|
||||||
|
|
||||||
Finit is developed and maintained by [Joachim Wiberg][] at [GitHub][].
|
Finit is developed and maintained by [Joachim Nilsson][] at [GitHub][].
|
||||||
Please file bug reports, clone it, or send pull requests for bug fixes
|
Please file bug reports, clone it, or send pull requests for bug fixes
|
||||||
and proposed extensions.
|
and proposed extensions.
|
||||||
|
|
||||||
@@ -594,13 +533,13 @@ and proposed extensions.
|
|||||||
[openrc]: http://www.gentoo.org/proj/en/base/openrc/
|
[openrc]: http://www.gentoo.org/proj/en/base/openrc/
|
||||||
[run-parts(8)]: http://manpages.debian.org/cgi-bin/man.cgi?query=run-parts
|
[run-parts(8)]: http://manpages.debian.org/cgi-bin/man.cgi?query=run-parts
|
||||||
[original finit]: http://helllabs.org/finit/
|
[original finit]: http://helllabs.org/finit/
|
||||||
[EeePC fastinit]: https://web.archive.org/web/20071208212450/http://wiki.eeeuser.com/boot_process:the_boot_process
|
[EeePC fastinit]: http://wiki.eeeuser.com/boot_process:the_boot_process
|
||||||
[Claudio Matsuoka]: https://github.com/cmatsuoka
|
[Claudio Matsuoka]: https://github.com/cmatsuoka
|
||||||
[Joachim Wiberg]: http://troglobit.com
|
[Joachim Nilsson]: http://troglobit.com
|
||||||
[GitHub]: https://github.com/troglobit/finit
|
[GitHub]: https://github.com/troglobit/finit
|
||||||
[License]: https://en.wikipedia.org/wiki/MIT_License
|
[License]: https://en.wikipedia.org/wiki/MIT_License
|
||||||
[License Badge]: https://img.shields.io/badge/License-MIT-teal.svg
|
[License Badge]: https://img.shields.io/badge/License-MIT-yellow.svg
|
||||||
[Travis]: https://travis-ci.org/troglobit/finit
|
[Travis]: https://travis-ci.org/troglobit/finit
|
||||||
[Travis Status]: https://travis-ci.org/troglobit/finit.svg?branch=master
|
[Travis Status]: https://travis-ci.org/troglobit/finit.png?branch=master
|
||||||
[Coverity Scan]: https://scan.coverity.com/projects/3545
|
[Coverity Scan]: https://scan.coverity.com/projects/3545
|
||||||
[Coverity Status]: https://scan.coverity.com/projects/3545/badge.svg
|
[Coverity Status]: https://scan.coverity.com/projects/3545/badge.svg
|
||||||
|
|||||||
+104
-67
@@ -1,6 +1,5 @@
|
|||||||
AC_INIT(Finit, 4.1-rc1, https://github.com/troglobit/finit/issues, finit, https://troglobit.com/finit.html)
|
AC_INIT(Finit, 3.2-rc1, https://github.com/troglobit/finit/issues, finit, http://troglobit.com/finit.html)
|
||||||
AC_CONFIG_AUX_DIR(aux)
|
AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz subdir-objects])
|
||||||
AM_INIT_AUTOMAKE([1.11 foreign dist-xz subdir-objects])
|
|
||||||
AM_SILENT_RULES([yes])
|
AM_SILENT_RULES([yes])
|
||||||
|
|
||||||
AC_CONFIG_SRCDIR([src/finit.c])
|
AC_CONFIG_SRCDIR([src/finit.c])
|
||||||
@@ -8,19 +7,20 @@ AC_CONFIG_HEADER([config.h])
|
|||||||
AC_CONFIG_FILES([Makefile
|
AC_CONFIG_FILES([Makefile
|
||||||
contrib/Makefile
|
contrib/Makefile
|
||||||
contrib/alpine/Makefile contrib/alpine/finit.d/Makefile contrib/alpine/finit.d/available/Makefile
|
contrib/alpine/Makefile contrib/alpine/finit.d/Makefile contrib/alpine/finit.d/available/Makefile
|
||||||
contrib/debian/Makefile contrib/debian/finit.d/Makefile contrib/debian/finit.d/available/Makefile
|
contrib/debian/Makefile contrib/debian/finit.d/Makefile contrib/debian/finit.d/available/Makefile contrib/debian/grub.d/Makefile
|
||||||
contrib/void/Makefile contrib/void/finit.d/Makefile contrib/void/finit.d/available/Makefile
|
contrib/void/Makefile contrib/void/finit.d/Makefile contrib/void/finit.d/available/Makefile
|
||||||
doc/Makefile
|
docs/Makefile
|
||||||
plugins/Makefile
|
plugins/Makefile
|
||||||
src/Makefile
|
src/Makefile])
|
||||||
test/test.env
|
|
||||||
test/Makefile])
|
|
||||||
|
|
||||||
# Older versions of autoconf (<2.58) do not have AC_CONFIG_MACRO_DIR()
|
# Older versions of autoconf (<2.58) do not have AC_CONFIG_MACRO_DIR()
|
||||||
#m4_include([m4/plugin.m4])
|
#m4_include([m4/plugin.m4])
|
||||||
#m4_include([m4/expand.m4])
|
#m4_include([m4/expand.m4])
|
||||||
AC_CONFIG_MACRO_DIR([m4])
|
AC_CONFIG_MACRO_DIR([m4])
|
||||||
|
|
||||||
|
# Change default prefix, we're PID 1 after all ...
|
||||||
|
AC_PREFIX_DEFAULT([])
|
||||||
|
|
||||||
# Handle building plugins either as dynamically loadable, or built-in
|
# Handle building plugins either as dynamically loadable, or built-in
|
||||||
LT_INIT([shared disable-static dlopen aix-soname=both disable-fast-install])
|
LT_INIT([shared disable-static dlopen aix-soname=both disable-fast-install])
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ AC_PROG_MKDIR_P
|
|||||||
|
|
||||||
# Configuration.
|
# Configuration.
|
||||||
AC_HEADER_STDC
|
AC_HEADER_STDC
|
||||||
AC_CHECK_HEADERS([fstaby.h termios.h sys/ioctl.h])
|
AC_CHECK_HEADERS([fstaby.h termios.h])
|
||||||
AC_CHECK_FUNCS([strstr getopt getfsenty])
|
AC_CHECK_FUNCS([strstr getopt getfsenty])
|
||||||
|
|
||||||
# Check for uint[8,16,32]_t
|
# Check for uint[8,16,32]_t
|
||||||
@@ -40,29 +40,47 @@ AC_TYPE_UINT8_T
|
|||||||
AC_TYPE_UINT16_T
|
AC_TYPE_UINT16_T
|
||||||
AC_TYPE_UINT32_T
|
AC_TYPE_UINT32_T
|
||||||
|
|
||||||
# Check for pkg-config first, warn if it's not installed
|
|
||||||
PKG_PROG_PKG_CONFIG
|
|
||||||
|
|
||||||
# Check for required libraries
|
# Check for required libraries
|
||||||
PKG_CHECK_MODULES([uev], [libuev >= 2.2.0])
|
PKG_CHECK_MODULES([uev], [libuev >= 2.2.0])
|
||||||
PKG_CHECK_MODULES([lite], [libite >= 2.2.0])
|
PKG_CHECK_MODULES([lite], [libite >= 2.0.1])
|
||||||
|
|
||||||
# Check for configured Finit features
|
# Check for configured Finit features
|
||||||
AC_ARG_ENABLE(auto_reload,
|
AC_ARG_ENABLE(emergency_shell,
|
||||||
AS_HELP_STRING([--enable-auto-reload], [Automatic reload on any .conf change]),,[
|
AS_HELP_STRING([--enable-emergency-shell], [Experimental emergency fallback at boot.
|
||||||
enable_auto_reload=no])
|
Use only for debugging very early boot problems with Finit]),,[
|
||||||
|
enable_emergency_shell=no])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(fallback_shell,
|
||||||
|
AS_HELP_STRING([--enable-fallback-shell], [Start a shell if no TTYs can start]),,[
|
||||||
|
enable_fallback_shell=no])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(rw-rootfs,
|
||||||
|
AS_HELP_STRING([--enable-rw-rootfs], [Remount / R/W at boot, usually not for embedded]),,[
|
||||||
|
enable_rw_rootfs=no])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(progress,
|
||||||
|
AS_HELP_STRING([--enable-progress], [Pre Finit v3 bootup progress and heading]),,[
|
||||||
|
enable_progress=no])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(watchdog,
|
||||||
|
AS_HELP_STRING([--enable-watchdog], [Enable built-in watchdog, uses /dev/watchdog]),,[
|
||||||
|
enable_watchdog=no])
|
||||||
|
|
||||||
AC_ARG_ENABLE(redirect,
|
AC_ARG_ENABLE(redirect,
|
||||||
AS_HELP_STRING([--disable-redirect], [Disable redirection of service output to /dev/null]),,[
|
AS_HELP_STRING([--enable-redirect], [Redirect service output to /dev/null, default: no]),,[
|
||||||
enable_redirect=yes])
|
enable_redirect_output=no])
|
||||||
|
|
||||||
|
AC_ARG_ENABLE(inetd,
|
||||||
|
AS_HELP_STRING([--disable-inetd], [Disable built-in inetd super server, default enabled]),,[
|
||||||
|
enable_inetd=yes])
|
||||||
|
|
||||||
AC_ARG_ENABLE(logrotate,
|
AC_ARG_ENABLE(logrotate,
|
||||||
AS_HELP_STRING([--disable-logrotate], [Disable built-in rotation of /var/log/wtmp, default enabled]),,[
|
AS_HELP_STRING([--disable-logrotate], [Disable built-in rotation of /var/log/wtmp, default enabled]),,[
|
||||||
enable_logrotate=yes])
|
enable_logrotate=yes])
|
||||||
|
|
||||||
AC_ARG_ENABLE(doc,
|
AC_ARG_ENABLE(docs,
|
||||||
AS_HELP_STRING([--disable-doc], [Disable build and install of doc/ section]),,[
|
AS_HELP_STRING([--disable-docs], [Disable build and install of docs section]),,[
|
||||||
enable_doc=yes])
|
enable_docs=yes])
|
||||||
|
|
||||||
AC_ARG_ENABLE(contrib,
|
AC_ARG_ENABLE(contrib,
|
||||||
AS_HELP_STRING([--disable-contrib], [Disable build and install of contrib section]),,[
|
AS_HELP_STRING([--disable-contrib], [Disable build and install of contrib section]),,[
|
||||||
@@ -72,78 +90,103 @@ AC_ARG_ENABLE(contrib,
|
|||||||
enable_all_plugins=auto
|
enable_all_plugins=auto
|
||||||
AC_PLUGIN([alsa-utils], [no], [Save and restore ALSA sound settings using alsactl])
|
AC_PLUGIN([alsa-utils], [no], [Save and restore ALSA sound settings using alsactl])
|
||||||
AC_PLUGIN([dbus], [no], [Setup and start system message bus, D-Bus])
|
AC_PLUGIN([dbus], [no], [Setup and start system message bus, D-Bus])
|
||||||
|
AC_PLUGIN([inetd-echo], [no], [Inetd plugin: echo server, RFC862])
|
||||||
|
AC_PLUGIN([inetd-chargen], [no], [Inetd plugin: character generator, RFC864])
|
||||||
|
AC_PLUGIN([inetd-daytime], [no], [Inetd plugin: daytime server, RFC867])
|
||||||
|
AC_PLUGIN([inetd-discard], [no], [Inetd plugin: discard server, RFC863])
|
||||||
|
AC_PLUGIN([inetd-time], [no], [Inetd plugin: time (rdate) server, RFC868])
|
||||||
AC_PLUGIN([modules-load], [no], [Scans /etc/modules-load.d for modules to load])
|
AC_PLUGIN([modules-load], [no], [Scans /etc/modules-load.d for modules to load])
|
||||||
AC_PLUGIN([resolvconf], [no], [Setup necessary files for resolvconf])
|
AC_PLUGIN([resolvconf], [no], [Setup necessary files for resolvconf])
|
||||||
AC_PLUGIN([x11-common], [no], [Console setup (for X)])
|
AC_PLUGIN([x11-common], [no], [Console setup (for X)])
|
||||||
AC_PLUGIN([netlink], [yes], [Basic netlink plugin for IFUP/IFDN and GW events. Can be replaced with externally built plugin that links with libnl or similar.])
|
AC_PLUGIN([netlink], [yes], [Basic netlink plugin for IFUP/IFDN and GW events. Can be replaced with externally built plugin that links with libnl or similar.])
|
||||||
AC_PLUGIN([hotplug], [yes], [Setup and start udev or mdev hotplug daemon])
|
|
||||||
|
|
||||||
# Check for extra arguments or packages
|
# Check for extra arguments or packages
|
||||||
AC_ARG_WITH(heading,
|
AC_ARG_WITH(heading,
|
||||||
AS_HELP_STRING([--with-heading=GREET], [Display GREET instead of Finit version at boot]),
|
AS_HELP_STRING([--with-heading=GREET], [Display GREET instead of Finit version at boot]),
|
||||||
[heading=$withval], [heading=yes])
|
[heading=$withval], [heading="$PACKAGE_NAME v$PACKAGE_VERSION"])
|
||||||
|
|
||||||
|
AC_ARG_WITH(fifo,
|
||||||
|
AS_HELP_STRING([--with-fifo=FIFO], [FIFO for init/telinit clients, default /var/run/initctl]),
|
||||||
|
[fifo=$withval], [fifo=$localstatedir/run/initctl])
|
||||||
|
|
||||||
AC_ARG_WITH(config,
|
AC_ARG_WITH(config,
|
||||||
AS_HELP_STRING([--with-config=CONFIG], [Finit bootstrap config file, default /etc/finit.conf]),
|
AS_HELP_STRING([--with-config=CONFIG], [Finit bootstrap config file, default /etc/finit.conf]),
|
||||||
[conf=$withval], [conf=yes])
|
[conf=$withval], [conf=$sysconfdir/finit.conf])
|
||||||
|
|
||||||
AC_ARG_WITH(rcsd,
|
AC_ARG_WITH(rcsd,
|
||||||
AS_HELP_STRING([--with-rcsd=DIR], [Finit rcS.d/ directory, default /etc/finit.d]),
|
AS_HELP_STRING([--with-rcsd=DIR], [Finit rcS.d/ directory, default /etc/finit.d]),
|
||||||
[rcsd=$withval], [rcsd=yes])
|
[rcsd=$withval], [rcsd=$sysconfdir/finit.d])
|
||||||
|
|
||||||
AC_ARG_WITH(rc-local,
|
AC_ARG_WITH(rc-local,
|
||||||
AS_HELP_STRING([--with-rc-local=FILE], [SysV init /etc/rc.local file, default /etc/rc.local]),
|
AS_HELP_STRING([--with-rc-local=FILE], [SysV init /etc/rc.local file, default /etc/rc.local]),
|
||||||
[rclocal=$withval], [rclocal=yes])
|
[rclocal=$withval], [rclocal=$sysconfdir/rc.local])
|
||||||
|
|
||||||
AC_ARG_WITH(sysconfig,
|
AC_ARG_WITH(console,
|
||||||
AS_HELP_STRING([--with-sysconfig=DIR], [System environment directory, sourced by .conf files, default /etc/default & /etc/conf.d]),
|
AS_HELP_STRING([--with-console=DEV], [Console to use, default: /dev/console]),
|
||||||
[sysconfig=$withval], [sysconfig=default])
|
[console=$withval], [console=/dev/console])
|
||||||
|
|
||||||
AC_ARG_WITH(hostname,
|
AC_ARG_WITH(hostname,
|
||||||
AS_HELP_STRING([--with-hostname=NAME], [If /etc/hostname is missing, default: noname]),
|
AS_HELP_STRING([--with-hostname=NAME], [If /etc/hostname is missing, default: noname]),
|
||||||
[hostname=$withval], [hostname=yes])
|
[hostname=$withval], [hostname=noname])
|
||||||
|
|
||||||
AC_ARG_WITH(runlevel,
|
AC_ARG_WITH(runlevel,
|
||||||
AS_HELP_STRING([--with-runlevel=N], [Runlevel to switch to after bootstrap, default: 2]),
|
AS_HELP_STRING([--with-runlevel=N], [Runlevel to switch to after bootstrap, default: 2]),
|
||||||
[runlevel=$withval], [runlevel=yes])
|
[runlevel=$withval], [runlevel=2])
|
||||||
|
|
||||||
AC_ARG_WITH(random-seed,
|
AC_ARG_WITH(random-seed,
|
||||||
AS_HELP_STRING([--with-random-seed=FILE], [Save a random seed for /dev/urandom across reboots, default /var/lib/misc/random-seed]),
|
AS_HELP_STRING([--with-random-seed=FILE], [Save a random seed for /dev/urandom across reboots, default /var/lib/misc/random-seed]),
|
||||||
[random_seed=$withval], [random_seed=yes])
|
[random_seed=$withval], [random_seed=/var/lib/misc/random-seed])
|
||||||
|
|
||||||
AC_ARG_WITH(watchdog,
|
|
||||||
AS_HELP_STRING([--with-watchdog=[DEV]], [Enable built-in watchdog, default: /dev/watchdog]),
|
|
||||||
[watchdog=$withval], [with_watchdog=no watchdog=])
|
|
||||||
|
|
||||||
### Enable features ###########################################################################
|
### Enable features ###########################################################################
|
||||||
|
|
||||||
# Create config.h from selected features and fallback defaults
|
# Create config.h from selected features and fallback defautls
|
||||||
AS_IF([test "x$enable_auto_reload" = "xyes"], [
|
AS_IF([test "x$enable_emergency_shell" = "xyes"], [
|
||||||
AC_DEFINE(AUTO_RELOAD, 1, [Finit automatically does `initctl reload` on any .conf change])])
|
AC_DEFINE(EMERGENCY_SHELL, 1, [Fork off init and let PID 1 wait and start /bin/sh if init crashes.])])
|
||||||
|
|
||||||
|
AS_IF([test "x$enable_fallback_shell" = "xyes"], [
|
||||||
|
AC_DEFINE(FALLBACK_SHELL, 1, [Start /bin/sh on console if no TTYs.])])
|
||||||
|
|
||||||
|
AS_IF([test "x$enable_rw_rootfs" = "xyes"], [
|
||||||
|
AC_DEFINE(REMOUNT_ROOTFS, 1, [Remount / as rw at boot])])
|
||||||
|
|
||||||
|
AS_IF([test "x$enable_progress" = "xyes"], [
|
||||||
|
AC_DEFINE(SILENT_MODE, 0, [Pre Finit v3 bootup messages and heading])
|
||||||
|
], [
|
||||||
|
AC_DEFINE(SILENT_MODE, 1, [Completely silent until login prompt])])
|
||||||
|
|
||||||
|
AS_IF([test "x$enable_watchdog" = "xyes"], [
|
||||||
|
AC_DEFINE(BUILTIN_WATCHDOG, 1, [Enable built-in watchdog, kicks on /dev/watchdog])])
|
||||||
|
|
||||||
AS_IF([test "x$enable_redirect" = "xyes"], [
|
AS_IF([test "x$enable_redirect" = "xyes"], [
|
||||||
AC_DEFINE(REDIRECT_OUTPUT, 1, [Enable redirection of service output to /dev/null])])
|
AC_DEFINE(REDIRECT_OUTPUT, 1, [Enable redirection of service output to /dev/null])])
|
||||||
|
|
||||||
### Disable features ###########################################################################
|
### Disable features ###########################################################################
|
||||||
|
AS_IF([test "x$enable_inetd" != "xno"], [
|
||||||
|
enable_inetd="yes"
|
||||||
|
AC_DEFINE(INETD_ENABLED, 1, [Enable built-in inetd])])
|
||||||
|
|
||||||
AS_IF([test "x$enable_logrotate" != "xno"], [
|
AS_IF([test "x$enable_logrotate" != "xno"], [
|
||||||
AC_DEFINE(LOGROTATE_ENABLED, 1, [Enable built-in rotation of /var/log/wtmp et al.])])
|
AC_DEFINE(LOGROTATE_ENABLED, 1, [Enable built-in rotation of /var/log/wtmp et al.])])
|
||||||
|
|
||||||
AM_CONDITIONAL(LOGROTATE, [test "x$enable_logrotate" = "xyes"])
|
|
||||||
|
|
||||||
### With features ##############################################################################
|
### With features ##############################################################################
|
||||||
|
AS_IF([test "x$with_fifo" != "xno"], [
|
||||||
|
AS_IF([test "x$fifo" = "xyes"], [
|
||||||
|
fifo='$localstatedir/run/initctl'])])
|
||||||
|
AC_EXPAND_DIR(fifo_path, "$fifo")
|
||||||
|
AC_DEFINE_UNQUOTED(FINIT_FIFO, "$fifo_path", [FIFO for old style init/telinit client programs])
|
||||||
|
|
||||||
AS_IF([test "x$with_config" != "xno"], [
|
AS_IF([test "x$with_config" != "xno"], [
|
||||||
AS_IF([test "x$conf" = "xyes"], [
|
AS_IF([test "x$config" = "xyes"], [
|
||||||
conf=$sysconfdir/finit.conf])])
|
conf=$sysconfdir/finit.conf])])
|
||||||
AC_EXPAND_DIR(conf_path, "$conf")
|
AC_EXPAND_DIR(conf_path, "$conf")
|
||||||
AC_DEFINE_UNQUOTED(FINIT_CONF, "$conf_path", [Main Finit configuration file, default /etc/finit.conf])
|
AC_DEFINE_UNQUOTED(FINIT_CONF, "$conf_path", [Main Finit configuration file, default /etc/finit.conf])
|
||||||
AC_SUBST(FINIT_CONF, "$conf_path")
|
|
||||||
|
|
||||||
AS_IF([test "x$with_rcsd" != "xno"], [
|
AS_IF([test "x$with_rcsd" != "xno"], [
|
||||||
AS_IF([test "x$rcsd" = "xyes"], [
|
AS_IF([test "x$rcsd" = "xyes"], [
|
||||||
rcsd=$sysconfdir/finit.d])])
|
rcsd=$sysconfdir/finit.d])])
|
||||||
AC_EXPAND_DIR(rcsd_path, "$rcsd")
|
AC_EXPAND_DIR(rcsd_path, "$rcsd")
|
||||||
AC_DEFINE_UNQUOTED(FINIT_RCSD, "$rcsd_path", [Finit rcS.d/, default /etc/finit.d])
|
AC_DEFINE_UNQUOTED(FINIT_RCSD, "$rcsd_path", [Finit rcS.d/, default /etc/finit.d])
|
||||||
AC_SUBST(FINIT_RCSD, "$rcsd_path")
|
|
||||||
|
|
||||||
AS_IF([test "x$with_rc_local" != "xno"], [
|
AS_IF([test "x$with_rc_local" != "xno"], [
|
||||||
AS_IF([test "x$rclocal" = "xyes"], [
|
AS_IF([test "x$rclocal" = "xyes"], [
|
||||||
@@ -151,17 +194,16 @@ AS_IF([test "x$with_rc_local" != "xno"], [
|
|||||||
AC_EXPAND_DIR(rclocal_path, "$rclocal")
|
AC_EXPAND_DIR(rclocal_path, "$rclocal")
|
||||||
AC_DEFINE_UNQUOTED(FINIT_RC_LOCAL, "$rclocal_path", [Compat SysV /etc/rc.local file to run last at boot.])
|
AC_DEFINE_UNQUOTED(FINIT_RC_LOCAL, "$rclocal_path", [Compat SysV /etc/rc.local file to run last at boot.])
|
||||||
|
|
||||||
AS_IF([test "x$with_sysconfig" != "xno"], [
|
|
||||||
AS_IF([test "x$sysconfig" != "xdefault"], [
|
|
||||||
AC_EXPAND_DIR(sysconfig_path, "$sysconfig")
|
|
||||||
AC_DEFINE_UNQUOTED(FINIT_SYSCONFIG, "$sysconfig_path",
|
|
||||||
[System environment, default /etc/default & /etc/conf.d])])])
|
|
||||||
|
|
||||||
AS_IF([test "x$with_heading" != "xno"], [
|
AS_IF([test "x$with_heading" != "xno"], [
|
||||||
AS_IF([test "x$heading" = "xyes"], [
|
AS_IF([test "x$heading" = "xyes"], [
|
||||||
heading="$PACKAGE_NAME v$PACKAGE_VERSION"])])
|
heading="$PACKAGE_NAME v$PACKAGE_VERSION"])])
|
||||||
AC_DEFINE_UNQUOTED(INIT_HEADING, "$heading", [Displayed by Finit at boot])
|
AC_DEFINE_UNQUOTED(INIT_HEADING, "$heading", [Displayed by Finit at boot])
|
||||||
|
|
||||||
|
AS_IF([test "x$with_console" != "xno"], [
|
||||||
|
AS_IF([test "x$console" = "xyes"], [
|
||||||
|
console=/dev/console])])
|
||||||
|
AC_DEFINE_UNQUOTED(CONSOLE, "$console", [Default console to use])
|
||||||
|
|
||||||
AS_IF([test "x$with_hostname" != "xno"], [
|
AS_IF([test "x$with_hostname" != "xno"], [
|
||||||
AS_IF([test "x$hostname" = "xyes"], [
|
AS_IF([test "x$hostname" = "xyes"], [
|
||||||
hostname=noname])])
|
hostname=noname])])
|
||||||
@@ -169,8 +211,7 @@ AC_DEFINE_UNQUOTED(DEFHOST, "$hostname", [For /etc/hostname])
|
|||||||
|
|
||||||
AS_IF([test "x$with_runlevel" != "xno"], [
|
AS_IF([test "x$with_runlevel" != "xno"], [
|
||||||
AS_IF([test "x$runlevel" = "xyes"], [
|
AS_IF([test "x$runlevel" = "xyes"], [
|
||||||
runlevel=2
|
AC_DEFINE_UNQUOTED(RUNLEVEL, 2, [Default runlevel to start after S])])
|
||||||
AC_DEFINE_UNQUOTED(RUNLEVEL, $runlevel, [Default runlevel to start after S])])
|
|
||||||
AC_DEFINE_UNQUOTED(RUNLEVEL, $runlevel, [Runlevel to start after S])])
|
AC_DEFINE_UNQUOTED(RUNLEVEL, $runlevel, [Runlevel to start after S])])
|
||||||
|
|
||||||
AS_IF([test "x$with_random_seed" != "xno"], [
|
AS_IF([test "x$with_random_seed" != "xno"], [
|
||||||
@@ -179,17 +220,11 @@ AS_IF([test "x$with_random_seed" != "xno"], [
|
|||||||
AC_EXPAND_DIR(random_path, "$random_seed")
|
AC_EXPAND_DIR(random_path, "$random_seed")
|
||||||
AC_DEFINE_UNQUOTED(RANDOMSEED, "$random_path", [Improve random at boot by seeding it with sth from before.])])
|
AC_DEFINE_UNQUOTED(RANDOMSEED, "$random_path", [Improve random at boot by seeding it with sth from before.])])
|
||||||
|
|
||||||
AS_IF([test "x$with_watchdog" != "xno"], [
|
|
||||||
AS_IF([test "x$watchdog" = "xyes"], [
|
|
||||||
watchdog=/dev/watchdog])
|
|
||||||
with_watchdog=yes
|
|
||||||
AC_DEFINE_UNQUOTED(WDT_DEVNODE, "$watchdog", [Built-in watchdog device node])], [
|
|
||||||
watchdog=])
|
|
||||||
|
|
||||||
# Control build with automake flags
|
# Control build with automake flags
|
||||||
AM_CONDITIONAL(STATIC, [test "x$enable_static" = "xyes"])
|
AM_CONDITIONAL(STATIC, [test "x$enable_static" = "xyes"])
|
||||||
AM_CONDITIONAL(WATCHDOGD, [test "x$with_watchdog" != "xno"])
|
AM_CONDITIONAL(INETD, [test "x$enable_inetd" = "xyes"])
|
||||||
AM_CONDITIONAL(DOC, [test "x$enable_doc" = "xyes"])
|
AM_CONDITIONAL(WATCHDOGD, [test "x$enable_watchdog" = "xyes"])
|
||||||
|
AM_CONDITIONAL(DOCS, [test "x$enable_docs" = "xyes"])
|
||||||
AM_CONDITIONAL(CONTRIB, [test "x$enable_contrib" = "xyes"])
|
AM_CONDITIONAL(CONTRIB, [test "x$enable_contrib" = "xyes"])
|
||||||
|
|
||||||
# Override default libdir, used for plugins and rescue.conf
|
# Override default libdir, used for plugins and rescue.conf
|
||||||
@@ -204,8 +239,6 @@ AC_DEFINE_UNQUOTED(PLUGIN_PATH, "$plugin_path", [Finit plugin path])
|
|||||||
|
|
||||||
AC_EXPAND_DIR(rescue_conf, "$libdir/finit/rescue.conf")
|
AC_EXPAND_DIR(rescue_conf, "$libdir/finit/rescue.conf")
|
||||||
AC_DEFINE_UNQUOTED(RESCUE_CONF, "$rescue_conf", [Finit rescue mode .conf])
|
AC_DEFINE_UNQUOTED(RESCUE_CONF, "$rescue_conf", [Finit rescue mode .conf])
|
||||||
AC_EXPAND_DIR(sample_conf, "$libdir/finit/sample.conf")
|
|
||||||
AC_DEFINE_UNQUOTED(SAMPLE_CONF, "$sample_conf", [Finit sameple.conf for initctl create])
|
|
||||||
|
|
||||||
# Generate all files
|
# Generate all files
|
||||||
AC_OUTPUT
|
AC_OUTPUT
|
||||||
@@ -215,14 +248,13 @@ cat <<EOF
|
|||||||
------------------ Summary ------------------
|
------------------ Summary ------------------
|
||||||
$PACKAGE_NAME version $PACKAGE_VERSION
|
$PACKAGE_NAME version $PACKAGE_VERSION
|
||||||
Prefix................: $prefix
|
Prefix................: $prefix
|
||||||
Exec prefix...........: $eprefix
|
|
||||||
Sysconfdir............: `eval echo $sysconfdir`
|
Sysconfdir............: `eval echo $sysconfdir`
|
||||||
Localstatedir.........: `eval echo $localstatedir`
|
Localstatedir.........: `eval echo $localstatedir`
|
||||||
|
FIFO path.............: $fifo_path
|
||||||
Finit config file.....: $conf_path
|
Finit config file.....: $conf_path
|
||||||
Finit config.d path...: $rcsd_path
|
Finit config.d path...: $rcsd_path
|
||||||
Finit plugin path.....: $plugin_path
|
Finit plugin path.....: $plugin_path
|
||||||
Compat rc.local path..: $rclocal_path
|
Compat rc.local path..: $rclocal_path
|
||||||
System environment....: ${sysconfig_path:-${sysconfig}}
|
|
||||||
Random seed path......: $random_path
|
Random seed path......: $random_path
|
||||||
C Compiler............: $CC $CFLAGS $CPPFLAGS $LDFLAGS $LIBS
|
C Compiler............: $CC $CFLAGS $CPPFLAGS $LDFLAGS $LIBS
|
||||||
Linker................: $LD $LLDP_LDFLAGS $LLDP_BIN_LDFLAGS $LDFLAGS $LIBS
|
Linker................: $LD $LLDP_LDFLAGS $LLDP_BIN_LDFLAGS $LDFLAGS $LIBS
|
||||||
@@ -232,11 +264,16 @@ Behavior:
|
|||||||
Plugins...............: $plugins
|
Plugins...............: $plugins
|
||||||
|
|
||||||
Optional features:
|
Optional features:
|
||||||
Install doc/..........: $enable_doc
|
Install docs/.........: $enable_docs
|
||||||
Install contrib/......: $enable_contrib
|
Install contrib/......: $enable_contrib
|
||||||
Built-in watchdogd....: $with_watchdog $watchdog
|
Built-in inetd........: $enable_inetd
|
||||||
|
Built-in watchdogd....: $enable_watchdog
|
||||||
Built-in logrotate....: $enable_logrotate
|
Built-in logrotate....: $enable_logrotate
|
||||||
Redirect output.......: $enable_redirect
|
Emergency shell.......: $enable_emergency_shell
|
||||||
|
Fallback shell........: $enable_fallback_shell
|
||||||
|
Remount / RW at boot..: $enable_rw_rootfs
|
||||||
|
Traditional progress..: $enable_progress
|
||||||
|
Default console dev...: $console
|
||||||
Default hostname......: $hostname
|
Default hostname......: $hostname
|
||||||
Default runlevel......: $runlevel
|
Default runlevel......: $runlevel
|
||||||
|
|
||||||
|
|||||||
@@ -14,11 +14,12 @@ fi
|
|||||||
# The plugins are optional, but you may need D-Bus and X11 if you want
|
# The plugins are optional, but you may need D-Bus and X11 if you want
|
||||||
# to run X-Window, the other configure flags are however required.
|
# to run X-Window, the other configure flags are however required.
|
||||||
PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig ./configure \
|
PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig ./configure \
|
||||||
--prefix=/usr --exec-prefix= \
|
--enable-rw-rootfs --enable-progress \
|
||||||
--sysconfdir=/etc --localstatedir=/var \
|
--enable-dbus-plugin --enable-x11-common-plugin \
|
||||||
--enable-dbus-plugin --enable-x11-common-plugin \
|
--enable-alsa-utils-plugin --enable-inetd-echo-plugin \
|
||||||
--enable-alsa-utils-plugin --with-watchdog \
|
--enable-inetd-chargen-plugin --enable-inetd-daytime-plugin \
|
||||||
--with-heading="Alpine Linux 3.13"
|
--enable-inetd-discard-plugin --enable-inetd-time-plugin \
|
||||||
|
--with-heading="Alpine Linux 3.6" --with-hostname=alpine
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "*** Building ..."
|
echo "*** Building ..."
|
||||||
|
|||||||
@@ -1,23 +1,27 @@
|
|||||||
SUBDIRS = available
|
SUBDIRS = available
|
||||||
docsdir := @docdir@/contrib/alpine/finit.d
|
docsdir := @docdir@/contrib/alpine/finit.d
|
||||||
d_LINKS = acpid.conf crond.conf dropbear.conf getty.conf \
|
d_LINKS = dropbear.conf getty.conf keymap.conf modules.conf klogd.conf \
|
||||||
keymap.conf modules.conf ntpd.conf \
|
syslogd.conf
|
||||||
klogd.conf syslogd.conf
|
|
||||||
|
|
||||||
install-exec-hook:
|
install-exec-hook:
|
||||||
@$(MKDIR_P) $(DESTDIR)$(docsdir)/available
|
@$(MKDIR_P) $(DESTDIR)$(docsdir)/available
|
||||||
@$(MKDIR_P) $(DESTDIR)$(docsdir)/enabled
|
|
||||||
@for file in $(d_LINKS); do \
|
@for file in $(d_LINKS); do \
|
||||||
lnk=$(DESTDIR)$(docsdir)/enabled/$$file; \
|
lnk=$(DESTDIR)$(docsdir)/$$file; \
|
||||||
src=available/$$file; \
|
src=available/$$file; \
|
||||||
rm -f $$lnk; \
|
if [ -L $$lnk ]; then \
|
||||||
$(LN_S) ../$$src $$lnk; \
|
echo "Skipping $$lnk exists."; \
|
||||||
|
else \
|
||||||
|
$(LN_S) $$src $$lnk; \
|
||||||
|
fi; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
uninstall-hook:
|
uninstall-hook:
|
||||||
@for file in $(d_LINKS); do \
|
@for file in $(d_LINKS); do \
|
||||||
lnk=$(DESTDIR)$(docsdir)/enabled/$$file; \
|
lnk=$(DESTDIR)$(docsdir)/$$file; \
|
||||||
src=available/$$file; \
|
src=available/$$file; \
|
||||||
$(RM) -f $$lnk; \
|
if [ "`readlink $$lnk`" != "$$src" ]; then \
|
||||||
|
continue; \
|
||||||
|
fi; \
|
||||||
|
$(RM) $$lnk; \
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
docsdir := @docdir@/contrib/alpine/finit.d/available
|
docsdir := @docdir@/contrib/alpine/finit.d/available
|
||||||
docs_DATA = acpid.conf crond.conf dropbear.conf getty.conf keymap.conf \
|
docs_DATA = acpid.conf crond.conf dropbear.conf getty.conf keymap.conf \
|
||||||
lxdm.conf modules.conf ntpd.conf syslog.conf watchdog.conf
|
lxdm.conf modules.conf ntpd.conf klogd.conf syslogd.conf
|
||||||
EXTRA_DIST = $(docs_DATA)
|
EXTRA_DIST = $(docs_DATA)
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
# Handle PWR button to shutdown/reboot -- useful in Qemu (virt-manager)
|
# Handle PWR button to shutdown/reboot -- useful in Qemu (virt-manager)
|
||||||
# Depends on syslogd having started. Redirect any output to log.
|
# Depends on syslogd having started. Redirect any output to log.
|
||||||
service [2345] <pid/syslogd> log acpid -f -- ACPI daemon
|
service [2345] log <svc/sbin/syslogd> /sbin/acpid -f -- ACPI daemon
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
service [2345] <pid/syslogd> env:-/etc/conf.d/crond crond -f -S $CRON_OPTS -- Cron daemon
|
service [2345] <svc/sbin/syslogd> /usr/sbin/crond -f -S -c /etc/crontabs -- Cron daemon
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
# Start SSH daemon as soon as basic networking comes up
|
# Start SSH daemon as soon as basic networking comes up
|
||||||
service [2345] env:-/etc/conf.d/dropbear dropbear -R -F $DROPBEAR_OPTS -- Dropbear SSH daemon
|
service [2345] <net/lo/up> /usr/sbin/dropbear -R -F -p 22 -- Dropbear SSH daemon
|
||||||
|
|||||||
@@ -1,5 +1,4 @@
|
|||||||
# Consoles to start getty on when system is up
|
# Consoles to start getty on when system is up
|
||||||
tty [12345] /dev/ttyS0 noclear
|
tty /dev/tty1 noclear nowait
|
||||||
tty [12345] /dev/tty1 noclear nowait
|
tty /dev/tty2 noclear nowait
|
||||||
tty [2345] /dev/tty2 noclear nowait
|
tty /dev/tty3 noclear nowait
|
||||||
tty [2345] /dev/tty3 noclear nowait
|
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
# Oneshot task to run once at bootstrap
|
# Oneshot task to run once at bootstrap
|
||||||
task [S] env:/etc/conf.d/loadkmap zcat $KEYMAP | loadkmap -- Loading keymap
|
task [S] zcat /etc/keymap/se.bmap.gz | loadkmap -- Loading keymap
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Start klogd as soon as possible, should always run
|
||||||
|
service [S12345] /sbin/klogd -n -- Kernel log daemon
|
||||||
@@ -1 +1 @@
|
|||||||
service [2345] lxdm -- Lightweight Login Manager
|
service [2345] /usr/sbin/lxdm -- Lightweight Login Manager
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
## Linux kernel modules to load
|
## Linux kernel modules to load
|
||||||
#module fbcon
|
#module fbcon
|
||||||
#module button
|
module button
|
||||||
#module evdev
|
module evdev
|
||||||
#module mousedev
|
module mousedev
|
||||||
#module 8139cp
|
module 8139cp
|
||||||
module softdog
|
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
# Busybox ntpd has no option to use syslog when running in foreground
|
# Silly Busybox ntpd has no option to use syslog when running in foreground
|
||||||
service [2345] <pid/syslogd> env:-/etc/conf.d/ntpd log ntpd -n $NTPD_OPTS -- NTP daemon
|
service [2345] log <svc/sbin/syslogd> /usr/sbin/ntpd -n -N -p pool.ntp.org -- NTP daemon
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
# Start syslogd as soon as possible, should always run
|
|
||||||
# Start klogd as soon as possible, but after syslogd
|
|
||||||
service [S12345] env:-/etc/conf.d/syslog syslogd -n $SYSLOGD_OPTS -- Syslog daemon
|
|
||||||
service [S12345] <pid/syslogd> env:-/etc/conf.d/klogd klogd -n $KLOGD_OPTS -- Kernel log daemon
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Start syslogd as soon as possible, should always run
|
||||||
|
service [S12345] /sbin/syslogd -n -- Syslog daemon
|
||||||
@@ -1 +0,0 @@
|
|||||||
service [S123456789] env:-/etc/conf.d/watchdog watchdog $WATCHDOG_OPTS $WATCHDOG_DEV -- System watchdog
|
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
available/dropbear.conf
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
available/getty.conf
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
available/keymap.conf
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
available/klogd.conf
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
available/modules.conf
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
available/syslogd.conf
|
||||||
@@ -10,7 +10,7 @@ fi
|
|||||||
# Adjust base directory
|
# Adjust base directory
|
||||||
if [ -e alpine-release ]; then
|
if [ -e alpine-release ]; then
|
||||||
cd ../..
|
cd ../..
|
||||||
elif [ ! -e configure.ac ]; then
|
elif [ ! -e autogen.sh ]; then
|
||||||
echo "*** Please run this script from the Finit base directory."
|
echo "*** Please run this script from the Finit base directory."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -29,7 +29,7 @@ if [ "x$yorn" = "xy" -o "x$yorn" = "xY" ]; then
|
|||||||
echo
|
echo
|
||||||
echo "*** Installing Finit files ..."
|
echo "*** Installing Finit files ..."
|
||||||
make install
|
make install
|
||||||
cd /usr/share/doc/finit/contrib/alpine
|
cd `dirname $0`
|
||||||
for file in finit.conf rc.local; do
|
for file in finit.conf rc.local; do
|
||||||
install -vbD $file /etc/$file
|
install -vbD $file /etc/$file
|
||||||
done
|
done
|
||||||
@@ -41,11 +41,6 @@ if [ "x$yorn" = "xy" -o "x$yorn" = "xY" ]; then
|
|||||||
cd /sbin
|
cd /sbin
|
||||||
rm init
|
rm init
|
||||||
ln -s finit init
|
ln -s finit init
|
||||||
|
|
||||||
rm halt shutdown suspend
|
|
||||||
ln -s reboot halt
|
|
||||||
ln -s reboot shutdown
|
|
||||||
ln -s reboot suspend
|
|
||||||
fi
|
fi
|
||||||
echo "*** Done"
|
echo "*** Done"
|
||||||
echo
|
echo
|
||||||
|
|||||||
@@ -1,39 +0,0 @@
|
|||||||
#!/bin/sh
|
|
||||||
|
|
||||||
if [ "x`id -u`" != "x0" ]; then
|
|
||||||
echo
|
|
||||||
echo "*** This script must run as root"
|
|
||||||
echo
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
read -p "Do you really want to uninstall Finit (y/N)? " yorn
|
|
||||||
|
|
||||||
if [ "x$yorn" = "xy" -o "x$yorn" = "xY" ]; then
|
|
||||||
echo
|
|
||||||
echo "*** Removing all Finit files ..."
|
|
||||||
rm -rf /usr/share/doc/finit
|
|
||||||
rm -rf /etc/finit.conf
|
|
||||||
rm -rf /etc/finit.d
|
|
||||||
rm -rf /lib/finit
|
|
||||||
if [ -e /etc/rc.local ]; then
|
|
||||||
echo "*** Skipping /etc/rc.local, not sure if we installed it ..."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "*** Restoring BusyBox as /sbin/init ..."
|
|
||||||
cd /sbin
|
|
||||||
rm init
|
|
||||||
ln -s /bin/busybox init
|
|
||||||
|
|
||||||
rm halt shutdown reboot suspend
|
|
||||||
ln -s /bin/busybox halt
|
|
||||||
ln -s /bin/busybox shutdown
|
|
||||||
ln -s /bin/busybox reboot
|
|
||||||
ln -s /bin/busybox suspend
|
|
||||||
echo "*** Done"
|
|
||||||
echo
|
|
||||||
else
|
|
||||||
echo
|
|
||||||
echo "*** Aborting uninstall."
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
SUBDIRS = finit.d
|
SUBDIRS = finit.d grub.d
|
||||||
docsdir := @docdir@/contrib/debian
|
docsdir := @docdir@/contrib/debian
|
||||||
docs_DATA = README.md finit.conf os-release build.sh install.sh
|
docs_DATA = README.md finit.conf os-release build.sh install.sh
|
||||||
EXTRA_DIST = $(docs_DATA)
|
EXTRA_DIST = $(docs_DATA)
|
||||||
|
|||||||
@@ -20,41 +20,29 @@ tools pre-systemd work as intended.
|
|||||||
|
|
||||||
root@debian:~# apt install initscripts console-setup
|
root@debian:~# apt install initscripts console-setup
|
||||||
|
|
||||||
> **Note:** as of Debian 11 (Bullseye), libuev and libite are part of
|
|
||||||
> the main section of Debian. So just install the -dev packages :)
|
|
||||||
|
|
||||||
The following script can then be used to configure, build, install and
|
The following script can then be used to configure, build, install and
|
||||||
set up your system to run Finit:
|
set up your system to run Finit:
|
||||||
|
|
||||||
user@debian:~/finit$ contrib/debian/build.sh
|
user@debian:~/finit$ contrib/debian/build.sh
|
||||||
|
|
||||||
However, since `/sbin/init` already exists on your system, the script
|
However, since `/sbin/init` already exists on your system, the script
|
||||||
creates another entry in your GRUB config by updating `$SUPPORTED_INITS`
|
creates another entry in your GRUB config, in `/etc/grub.d/40_custom`,
|
||||||
in `/etc/grub.d/10_inux` and run `update-grub`. On reboot you will find
|
where `init=/sbin/finit` is added to your kernel line. It is of course
|
||||||
a (finit) entry in the "Advanced options for Debian GNU/Linux" section.
|
also possible to change the default init to Finit, if you do you can
|
||||||
It is of course also possible to change the default init to Finit:
|
remove the custom Grub entry:
|
||||||
|
|
||||||
user@debian:~/finit# cd /sbin
|
user@debian:~/finit# cd /sbin
|
||||||
user@debian:/sbin# sudo mv init oldinit
|
user@debian:/sbin# sudo rm init
|
||||||
user@debian:/sbin# sudo ln -s finit init
|
user@debian:/sbin# sudo ln -s finit init
|
||||||
|
|
||||||
Before rebooting, check the default [/etc/finit.conf](finit.conf) and
|
Before rebooting, check the default [/etc/finit.conf](finit.conf) and
|
||||||
`/etc/finit.d/*.conf` files. The build + install script above provides
|
`/etc/finit.d/*.conf` files. The build + install script above provides
|
||||||
a few sample `.conf` files. See `initctl ls` after boot for a list of
|
a few sample `.conf` files. See `initctl list` after boot for a list of
|
||||||
enabled and available services, you can then use `enable` and `disable`
|
enabled and available services.
|
||||||
comands to `initctl`, followed by `reload` to activate your changes.
|
|
||||||
|
|
||||||
You can also use a standard [/etc/rc.local](rc.local) for one-shot tasks
|
You can also use a standard [/etc/rc.local](rc.local) for one-shot tasks
|
||||||
and initialization like keyboard language etc.
|
and initialization like keyboard language etc.
|
||||||
|
|
||||||
If you want to use the X Window system, `sudo apt install elogind`
|
|
||||||
(Bullseye and later). Followed by `initctl reload` (enabled by default)
|
|
||||||
and logout/login again. The elogind daemon ensures a regular non-root
|
|
||||||
user can start and interact with an X session, otherwise keyboard and
|
|
||||||
mouse won't work. When you're happy, you can enable the lightdm.conf,
|
|
||||||
change the default runlevel to 3, and presto! you have a desktop again.
|
|
||||||
|
|
||||||
|
|
||||||
Have fun!
|
Have fun!
|
||||||
/Joachim ツ
|
/Joachim ツ
|
||||||
|
|
||||||
|
|||||||
@@ -21,13 +21,14 @@ echo
|
|||||||
|
|
||||||
# The plugins are optional, but you may need D-Bus and X11 if you want
|
# The plugins are optional, but you may need D-Bus and X11 if you want
|
||||||
# to run X-Window, the other configure flags are however required.
|
# to run X-Window, the other configure flags are however required.
|
||||||
./configure \
|
./configure \
|
||||||
--prefix=/usr --exec-prefix= \
|
--enable-rw-rootfs --enable-progress \
|
||||||
--sysconfdir=/etc --localstatedir=/var \
|
--enable-dbus-plugin --enable-x11-common-plugin \
|
||||||
--enable-dbus-plugin --enable-x11-common-plugin \
|
--enable-alsa-utils-plugin --enable-inetd-echo-plugin \
|
||||||
--enable-alsa-utils-plugin \
|
--enable-inetd-chargen-plugin --enable-inetd-daytime-plugin \
|
||||||
--with-random-seed=/var/lib/urandom/random-seed \
|
--enable-inetd-discard-plugin --enable-inetd-time-plugin \
|
||||||
--with-heading="Debian GNU/Linux"
|
--with-random-seed=/var/lib/urandom/random-seed \
|
||||||
|
--with-heading="Debian GNU/Linux" --with-hostname="stretch"
|
||||||
|
|
||||||
if [ $? -ne 0 ]; then
|
if [ $? -ne 0 ]; then
|
||||||
echo
|
echo
|
||||||
|
|||||||
@@ -1,24 +1,27 @@
|
|||||||
SUBDIRS = available
|
SUBDIRS = available
|
||||||
docsdir := @docdir@/contrib/debian/finit.d
|
docsdir := @docdir@/contrib/debian/finit.d
|
||||||
d_LINKS = acpid.conf apparmor.conf avahi-demon.conf \
|
d_LINKS = console-setup.conf getty.conf keyboard-setup.conf \
|
||||||
bluetooth.conf console-setup.conf elogind.conf \
|
modules.conf rsyslogd.conf sshd.conf
|
||||||
getty.conf keyboard-setup.conf modules.conf \
|
|
||||||
rsyslogd.conf sshd.conf
|
|
||||||
|
|
||||||
install-exec-hook:
|
install-exec-hook:
|
||||||
@$(MKDIR_P) $(DESTDIR)$(docsdir)/available
|
@$(MKDIR_P) $(DESTDIR)$(docsdir)/available
|
||||||
@$(MKDIR_P) $(DESTDIR)$(docsdir)/enabled
|
|
||||||
@for file in $(d_LINKS); do \
|
@for file in $(d_LINKS); do \
|
||||||
lnk=$(DESTDIR)$(docsdir)/enabled/$$file; \
|
lnk=$(DESTDIR)$(docsdir)/$$file; \
|
||||||
src=available/$$file; \
|
src=available/$$file; \
|
||||||
rm -f $$lnk; \
|
if [ -L $$lnk ]; then \
|
||||||
$(LN_S) ../$$src $$lnk; \
|
echo "Skipping $$lnk exists."; \
|
||||||
|
else \
|
||||||
|
$(LN_S) $$src $$lnk; \
|
||||||
|
fi; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
uninstall-hook:
|
uninstall-hook:
|
||||||
@for file in $(d_LINKS); do \
|
@for file in $(d_LINKS); do \
|
||||||
lnk=$(DESTDIR)$(docsdir)/enabled/$$file; \
|
lnk=$(DESTDIR)$(docsdir)/$$file; \
|
||||||
src=available/$$file; \
|
src=available/$$file; \
|
||||||
$(RM) -f $$lnk; \
|
if [ "`readlink $$lnk`" != "$$src" ]; then \
|
||||||
|
continue; \
|
||||||
|
fi; \
|
||||||
|
$(RM) $$lnk; \
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
docsdir := @docdir@/contrib/debian/finit.d/available
|
docsdir := @docdir@/contrib/debian/finit.d/available
|
||||||
docs_DATA = acpid.conf apparmor.conf avahi-daemon.conf bluetooth.conf \
|
docs_DATA = acpid.conf console-setup.conf getty.conf \
|
||||||
console-setup.conf elogind.conf getty.conf \
|
keyboard-setup.conf lightdm.conf modules.conf \
|
||||||
keyboard-setup.conf lightdm.conf modules.conf sntpd.conf \
|
ntpclient.conf rsyslogd.conf sshd.conf xdm.conf
|
||||||
rsyslogd.conf sshd.conf syslogd.conf xdm.conf
|
|
||||||
EXTRA_DIST = $(docs_DATA)
|
EXTRA_DIST = $(docs_DATA)
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
# Handle PWR button to shutdown/reboot -- useful in Qemu (virt-manager)
|
# Handle PWR button to shutdown/reboot -- useful in Qemu (virt-manager)
|
||||||
# Depends on a syslog daemon having started. Redirect any output to log.
|
# Depends on rsyslogd having started. Redirect any output to log.
|
||||||
service [2345] <pid/syslogd> env:-/etc/default/acpid log acpid -f $OPTIONS -- ACPI daemon
|
service [2345] <svc/usr/sbin/rsyslogd> log /usr/sbin/acpid -f -- ACPI daemon
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
task [2345] <sys/pwr/ac,pid/syslogd> halt:usr1 env:-/etc/default/anacron anacron -d -q $ANACRON_ARGS -- Anacron jobs
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
sysv [S] /etc/init.d/apparmor -- AppArmor initialization
|
|
||||||
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
service [2345] env:-/etc/default/avahi-daemon avahi-daemon -s $AVAHI_DAEMON_OPTS -- Avahi mDNS/DNS-SD Stack
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# To ignore errors like "org.freedesktop.hostname1", update the env file with
|
|
||||||
# "--noplugin=hostname", i.e. append to BLUETOOTHD_OPTS
|
|
||||||
service [2345] log:null env:-/etc/default/bluetooth /usr/libexec/bluetooth/bluetoothd -n $BLUETOOTHD_OPTS -- Bluetooth service
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
service [2345] <sys/pwr/ac,pid/syslogd> env:-/etc/default/cron cron -f $EXTRA_OPTS -- Background job processing daemon
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
# On some systems, bootstrap can be really quick and cause elogind
|
|
||||||
# to not start before a user has managed to log in. To prevent
|
|
||||||
# this, add <pid/elogind> as condition to your TTYs in getty.conf
|
|
||||||
service [2345] <pid/syslogd> /lib/elogind/elogind -- Login manager
|
|
||||||
@@ -1,7 +1,4 @@
|
|||||||
# Consoles to start getty on when system is up
|
# Consoles to start getty on when system is up
|
||||||
tty [12345] /dev/tty1 linux noclear nowait
|
tty [12345] /dev/tty1 115200 vt100 noclear nowait
|
||||||
tty [2345] /dev/tty2 linux nowait
|
tty [2345] /dev/tty2 38400 linux noclear nowait
|
||||||
tty [2345] /dev/tty3 linux nowait
|
tty [2345] /dev/tty3 38400 linux noclear nowait
|
||||||
tty [2345] /dev/tty4 linux nowait
|
|
||||||
tty [2345] /dev/tty5 linux nowait
|
|
||||||
tty [2345] /dev/tty6 linux nowait
|
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
service [3] lightdm -- Light Display Manager
|
service [3] /usr/sbin/lightdm -- Light Display Manager
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
## Linux kernel modules to load
|
## Linux kernel modules to load
|
||||||
#module fbcon
|
#module fbcon
|
||||||
#module button
|
module button
|
||||||
#module evdev
|
module evdev
|
||||||
#module loop
|
module loop
|
||||||
#module psmouse
|
module psmouse
|
||||||
#module mousedev
|
module mousedev
|
||||||
#module 8139cp
|
module 8139cp
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Simple NTP client (SNTP)
|
||||||
|
service [2345] <net/route/default> /usr/sbin/ntpclient -n -L pool.ntp.org -- SNTP client
|
||||||
@@ -1,3 +1,2 @@
|
|||||||
# Start rsyslogd as soon as possible, should always run
|
# Start rsyslogd as soon as possible, should always run
|
||||||
# Provides pid/syslogd condition
|
service [S12345] /usr/sbin/rsyslogd -n -- Reliable and extended syslog daemon
|
||||||
service [S12345] name:syslogd env:-/etc/default/rsyslog rsyslogd -n $RSYSLOGD_OPTIONS -- Reliable syslog daemon
|
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
# Simple NTP client (SNTP)
|
|
||||||
service [2345] <net/route/default> env:-/etc/default/sntpd sntpd -n $SNTPD_OPTIONS -- SNTP client
|
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
# Start SSH daemon as soon as basic networking comes up
|
# Start SSH daemon as soon as basic networking comes up
|
||||||
service [2345] <net/lo/up> env:-/etc/default/ssh /usr/sbin/sshd -D $SSHD_OPTS -- OpenSSH daemon
|
service [2345] <net/lo/up> /usr/sbin/sshd -D -- OpenSSH daemon
|
||||||
|
|||||||
@@ -1,2 +0,0 @@
|
|||||||
# Start sysklogd as soon as possible, should always run if enabled
|
|
||||||
service [S123456789] env:-/etc/default/syslogd syslogd -F $SYSLOGD_OPTIONS -- System logging daemon
|
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
# Here we use XDM since it has few dependencies (relatively speaking).
|
# Here we use XDM since it has few dependencies (relatively speaking).
|
||||||
# It is also an example of a service without a -- description.
|
# It is also an example of a service without a -- description.
|
||||||
# service [3] lxdm -- Lightweight Login Manager
|
# service [3] /usr/sbin/lxdm -- Lightweight Login Manager
|
||||||
service [3] xdm -nodaemon -- X Display Manager
|
service [3] /usr/bin/xdm -nodaemon
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
available/console-setup.conf
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
available/getty.conf
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
available/keyboard-setup.conf
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
available/modules.conf
|
||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
available/rsyslogd.conf
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
available/sshd.conf
|
||||||
Executable
+14
@@ -0,0 +1,14 @@
|
|||||||
|
#!/bin/sh
|
||||||
|
exec tail -n +3 $0
|
||||||
|
# This file provides an easy way to add custom menu entries. Simply type the
|
||||||
|
# menu entries you want to add after this comment. Be careful not to change
|
||||||
|
# the 'exec tail' line above.
|
||||||
|
|
||||||
|
menuentry '$MENU with Finit' --class $TYPE --class gnu-linux --class gnu --class os --user {
|
||||||
|
insmod gzio
|
||||||
|
insmod part_msdos
|
||||||
|
insmod ext2
|
||||||
|
search --no-floppy --fs-uuid --set=root $BOOT
|
||||||
|
linux /vmlinuz root=UUID=$ROOT ro quiet init=/sbin/finit
|
||||||
|
initrd /initrd.img
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
docsdir := @docdir@/contrib/debian/grub.d
|
||||||
|
docs_DATA = 40_custom
|
||||||
|
EXTRA_DIST = $(docs_DATA)
|
||||||
+10
-18
@@ -11,7 +11,7 @@ fi
|
|||||||
grep -q Debian os-release 2>/dev/null
|
grep -q Debian os-release 2>/dev/null
|
||||||
if [ $? -eq 0 ]; then
|
if [ $? -eq 0 ]; then
|
||||||
cd ../..
|
cd ../..
|
||||||
elif [ ! -e configure.ac ]; then
|
elif [ ! -e autogen.sh ]; then
|
||||||
echo "*** Please run this script from the Finit base directory."
|
echo "*** Please run this script from the Finit base directory."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -23,7 +23,7 @@ echo "/sbin/finit - PID 1"
|
|||||||
echo "/lib/finit/plugins/* - All enabled Finit plugins"
|
echo "/lib/finit/plugins/* - All enabled Finit plugins"
|
||||||
echo "/etc/finit.conf - Finit configuration file"
|
echo "/etc/finit.conf - Finit configuration file"
|
||||||
echo "/etc/finit.d/ - Finit services"
|
echo "/etc/finit.d/ - Finit services"
|
||||||
echo "/etc/grub.d/10_linux - Add Finit to Grub's SUPPORTED_INITS"
|
echo "/etc/grub.d/40_custom - Add menu entry to the Grub boot loader"
|
||||||
echo
|
echo
|
||||||
read -p "Do you want to continue (y/N)? " yorn
|
read -p "Do you want to continue (y/N)? " yorn
|
||||||
echo
|
echo
|
||||||
@@ -31,25 +31,17 @@ echo
|
|||||||
if [ "x$yorn" = "xy" -o "x$yorn" = "xY" ]; then
|
if [ "x$yorn" = "xy" -o "x$yorn" = "xY" ]; then
|
||||||
echo "Installing Finit files ..."
|
echo "Installing Finit files ..."
|
||||||
make install
|
make install
|
||||||
cd /usr/share/doc/finit/contrib/debian
|
cd `dirname $0`
|
||||||
for file in finit.conf; do
|
install -vbD finit.conf /etc/finit.conf
|
||||||
install -vbD $file /etc/$file
|
|
||||||
done
|
|
||||||
cp -va finit.d /etc/
|
cp -va finit.d /etc/
|
||||||
|
|
||||||
echo "*** Setting up a GRUB boot entry ..."
|
echo "*** Setting up a GRUB boot entry ..."
|
||||||
fn=/etc/grub.d/10_linux
|
MENU=`grep gnu-linux /boot/grub/grub.cfg |head -1 |sed "s/menuentry '\([^']*\).*/\1/"`
|
||||||
if [ -e $fn ]; then
|
TYPE=`grep gnu-linux /boot/grub/grub.cfg |head -1 |sed "s/.*' --class \([a-z]*\).*/\1/"`
|
||||||
if `grep SUPPORTED_INITS $fn |head -1 |grep -q finit`; then
|
BOOT=`grep set=root /boot/grub/grub.cfg |head -1 |sed 's/.* \([a-f0-9]*-[a-f0-9]*-[a-f0-9]*-[a-f0-9]*-[a-f0-9]*\).*/\1/'`
|
||||||
echo "Already installed, done."
|
ROOT=`grep root=UUID /boot/grub/grub.cfg |head -1 |sed 's/.*UUID=\([a-f0-9]*-[a-f0-9]*-[a-f0-9]*-[a-f0-9]*-[a-f0-9]*\).*/\1/'`
|
||||||
else
|
cat grub.d/40_custom | sed "s,\$BOOT,$BOOT,;s,\$ROOT,$ROOT,;s,\$TYPE,$TYPE,;s,\$MENU,$MENU," >/etc/grub.d/40_custom
|
||||||
echo "Adding Finit to list of SUPPORTED_INITS ..."
|
update-grub
|
||||||
sed -i 's/SUPPORTED_INITS="[^"]*/& finit:\/sbin\/finit/' $fn
|
|
||||||
update-grub
|
|
||||||
fi
|
|
||||||
else
|
|
||||||
echo "Cannot find $fn, you'll have to set up your bootloader on your own."
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "*** Done"
|
echo "*** Done"
|
||||||
|
|||||||
+17
-34
@@ -2,24 +2,15 @@
|
|||||||
#
|
#
|
||||||
host testbed
|
host testbed
|
||||||
|
|
||||||
|
# Devices to fsck at boot
|
||||||
|
check /dev/vda1
|
||||||
|
|
||||||
# Linux kernel modules to load
|
# Linux kernel modules to load
|
||||||
module button
|
module button
|
||||||
module evdev
|
module evdev
|
||||||
module loop
|
module loop
|
||||||
module psmouse
|
module psmouse
|
||||||
|
|
||||||
# Top-level cgroups and their default settings. All groups mandatory
|
|
||||||
# but more can be added, max 8 groups in total currently. The cgroup
|
|
||||||
# 'root' is also available, reserved for RT processes. Settings are
|
|
||||||
# as-is, only one shorthand 'mem.' exists, other than that it's the
|
|
||||||
# cgroup v2 controller default names.
|
|
||||||
cgroup init cpu.weight:100
|
|
||||||
cgroup user cpu.weight:100
|
|
||||||
cgroup system cpu.weight:9700 cpu.max:50000
|
|
||||||
|
|
||||||
# Example extra cgroup
|
|
||||||
cgroup maint cpu.weight:100
|
|
||||||
|
|
||||||
# Runlevel to start after bootstrap, runlevel 'S'
|
# Runlevel to start after bootstrap, runlevel 'S'
|
||||||
runlevel 2
|
runlevel 2
|
||||||
|
|
||||||
@@ -28,7 +19,7 @@ network service networking start
|
|||||||
|
|
||||||
# Max file size for each log file: 100 kiB, rotate max 4 copies:
|
# Max file size for each log file: 100 kiB, rotate max 4 copies:
|
||||||
# log => log.1 => log.2.gz => log.3.gz => log.4.gz
|
# log => log.1 => log.2.gz => log.3.gz => log.4.gz
|
||||||
log size:100k count:4
|
log size=100k count=4
|
||||||
|
|
||||||
# Virtual consoles to start getty on
|
# Virtual consoles to start getty on
|
||||||
tty /dev/tty1
|
tty /dev/tty1
|
||||||
@@ -42,36 +33,28 @@ tty /dev/tty3
|
|||||||
#run [2] /etc/init.d/networking start -- Start networking
|
#run [2] /etc/init.d/networking start -- Start networking
|
||||||
|
|
||||||
# Services to be monitored and respawned as needed
|
# Services to be monitored and respawned as needed
|
||||||
|
service [2345] /sbin/klogd -n -- Kernel logging server
|
||||||
# klgod and syslogd are placed in the maint cgroup
|
service [2345] /sbin/syslogd -n -- Syslog server
|
||||||
cgroup.maint
|
service [3] /usr/sbin/gdm -- GNOME Display Manager
|
||||||
service [2345] <pid/syslogd> klogd -n -- Kernel logging server
|
|
||||||
service [2345] syslogd -n -- Syslog server
|
|
||||||
|
|
||||||
# gdm in the system cgroup (default when read from it's own .conf file)
|
|
||||||
cgroup.system
|
|
||||||
service [3] cgroup:cpu.weight:250,mem.max:10M gdm -- GNOME Display Manager
|
|
||||||
|
|
||||||
# Start SSH daemon with opts from /etc/default/ssh (if available), move
|
|
||||||
# to user cgroup with cpu.weight:250. Default for services is system
|
|
||||||
# group. Default weight in user group is 100 (above). Max length of
|
|
||||||
# cgroup argument is (currently) 63 chars.
|
|
||||||
#
|
|
||||||
# Notice alternative syntax where current cgroup is only set for this
|
|
||||||
# particular service.
|
|
||||||
service [2345] cgroup.user:cpu.weight:250,mem.max:10M env:-/etc/default/ssh /usr/sbin/sshd -D $SSHD_OPTS -- OpenSSH daemon
|
|
||||||
|
|
||||||
# The BusyBox ntpd does not use syslog when running in the foreground
|
# The BusyBox ntpd does not use syslog when running in the foreground
|
||||||
# So we use this trick to redirect stdout/stderr to a log file. The
|
# So we use this trick to redirect stdout/stderr to a log file. The
|
||||||
# log file is rotated with the above settings. The condition declares
|
# log file is rotated with the above settings. The condition declares
|
||||||
# a dependency on a system default route (gateway) to be set. A single
|
# a dependency on a system default route (gateway) to be set. A single
|
||||||
# <!> at the beginning means ntpd does not respect SIGHUP for restart.
|
# <!> at the beginning means ntpd does not respect SIGHUP for restart.
|
||||||
service [2345] <!net/route/default> log:/var/log/ntpd.log ntpd -n -l -I eth0 -- NTP daemon
|
service [2345] log:/var/log/ntpd.log <!net/route/default> /sbin/ntpd -n -l -I eth0 -- NTP daemon
|
||||||
|
|
||||||
# Run start scripts from this directory
|
# Run start scripts from this directory
|
||||||
# runparts /etc/start.d
|
# runparts /etc/start.d
|
||||||
|
|
||||||
|
# Inetd services
|
||||||
|
inetd time/udp wait [2345] internal -- UNIX rdate service
|
||||||
|
inetd time/tcp nowait [2345] internal -- UNIX rdate service
|
||||||
|
inetd ssh@eth0:222/tcp nowait [2345] /usr/sbin/sshd -i -- SSH service
|
||||||
|
inetd ssh/tcp nowait [2345] /usr/sbin/sshd -i -- SSH service
|
||||||
|
|
||||||
# For multiple instances of the same service, add :ID somewhere between
|
# For multiple instances of the same service, add :ID somewhere between
|
||||||
# the service/run/task keyword and the command.
|
# the service/run/task keyword and the command.
|
||||||
service :80 [2345] /sbin/httpd -f -h /http -p 80 -- Web server
|
service :1 [2345] /sbin/httpd -f -h /http -p 80 -- Web server
|
||||||
service :8080 [2345] /sbin/httpd -f -h /http -p 8080 -- Old web server
|
service :2 [2345] /sbin/httpd -f -h /http -p 8080 -- Old web server
|
||||||
|
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
# This is a basic /etc/fstab that mounts up all of the virtual filesystems
|
|
||||||
# that older versions of Finit used to mount internally. It can serve as a
|
|
||||||
# starting point for systems running Busybox's mount implementation. Make
|
|
||||||
# sure that CONFIG_FEATURE_MOUNT_HELPERS enabled; as this is required
|
|
||||||
# create the /dev/{pts,shm} directories.
|
|
||||||
|
|
||||||
devtmpfs /dev devtmpfs defaults 0 0
|
|
||||||
mkdir#-p /dev/pts helper none 0 0
|
|
||||||
devpts /dev/pts devpts mode=620,ptmxmode=0666 0 0
|
|
||||||
mkdir#-p /dev/shm helper none 0 0
|
|
||||||
tmpfs /dev/shm tmpfs mode=0777 0 0
|
|
||||||
proc /proc proc defaults 0 0
|
|
||||||
tmpfs /tmp tmpfs mode=1777,nosuid,nodev 0 0
|
|
||||||
tmpfs /run tmpfs mode=0755,nosuid,nodev 0 0
|
|
||||||
sysfs /sys sysfs defaults 0 0
|
|
||||||
@@ -14,11 +14,12 @@ fi
|
|||||||
# The plugins are optional, but you may need D-Bus and X11 if you want
|
# The plugins are optional, but you may need D-Bus and X11 if you want
|
||||||
# to run X-Window, the other configure flags are however required.
|
# to run X-Window, the other configure flags are however required.
|
||||||
PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig ./configure \
|
PKG_CONFIG_LIBDIR=/usr/lib/pkgconfig:/usr/local/lib/pkgconfig ./configure \
|
||||||
--prefix=/usr --exec-prefix= \
|
--enable-rw-rootfs --enable-progress \
|
||||||
--sysconfdir=/etc --localstatedir=/var \
|
--enable-dbus-plugin --enable-x11-common-plugin \
|
||||||
--enable-dbus-plugin --enable-x11-common-plugin \
|
--enable-alsa-utils-plugin --enable-inetd-echo-plugin \
|
||||||
--enable-alsa-utils-plugin --with-watchdog \
|
--enable-inetd-chargen-plugin --enable-inetd-daytime-plugin \
|
||||||
--with-heading="Void Linux"
|
--enable-inetd-discard-plugin --enable-inetd-time-plugin \
|
||||||
|
--with-heading="Void Linux" --with-hostname=void
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "*** Building ..."
|
echo "*** Building ..."
|
||||||
|
|||||||
@@ -4,18 +4,23 @@ d_LINKS = acpid.conf dhcpcd.conf getty.conf sshd.conf uuidd.conf
|
|||||||
|
|
||||||
install-exec-hook:
|
install-exec-hook:
|
||||||
@$(MKDIR_P) $(DESTDIR)$(docsdir)/available
|
@$(MKDIR_P) $(DESTDIR)$(docsdir)/available
|
||||||
@$(MKDIR_P) $(DESTDIR)$(docsdir)/enabled
|
|
||||||
@for file in $(d_LINKS); do \
|
@for file in $(d_LINKS); do \
|
||||||
lnk=$(DESTDIR)$(docsdir)/enabled/$$file; \
|
lnk=$(DESTDIR)$(docsdir)/$$file; \
|
||||||
src=available/$$file; \
|
src=available/$$file; \
|
||||||
rm -f $$lnk; \
|
if [ -L $$lnk ]; then \
|
||||||
$(LN_S) ../$$src $$lnk; \
|
echo "Skipping $$lnk exists."; \
|
||||||
|
else \
|
||||||
|
$(LN_S) $$src $$lnk; \
|
||||||
|
fi; \
|
||||||
done
|
done
|
||||||
|
|
||||||
|
|
||||||
uninstall-hook:
|
uninstall-hook:
|
||||||
@for file in $(d_LINKS); do \
|
@for file in $(d_LINKS); do \
|
||||||
lnk=$(DESTDIR)$(docsdir)/enabled/$$file; \
|
lnk=$(DESTDIR)$(docsdir)/$$file; \
|
||||||
src=available/$$file; \
|
src=available/$$file; \
|
||||||
$(RM) -f $$lnk; \
|
if [ "`readlink $$lnk`" != "$$src" ]; then \
|
||||||
|
continue; \
|
||||||
|
fi; \
|
||||||
|
$(RM) $$lnk; \
|
||||||
done
|
done
|
||||||
|
|||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
available/acpid.conf
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
docsdir := @docdir@/contrib/void/finit.d/available
|
docsdir := @docdir@/contrib/void/finit.d/available
|
||||||
docs_DATA = acpid.conf crond.conf dhcpcd.conf dmeventd.conf getty.conf \
|
docs_DATA = acpid.conf crond.conf dhcpcd.conf dmeventd.conf getty.conf \
|
||||||
keymap.conf lxdm.conf modules.conf ntpd.conf \
|
keymap.conf klogd.conf lxdm.conf modules.conf ntpd.conf \
|
||||||
sshd.conf syslog.conf uuidd.conf
|
sshd.conf syslogd.conf uuidd.conf
|
||||||
EXTRA_DIST = $(docs_DATA)
|
EXTRA_DIST = $(docs_DATA)
|
||||||
|
|||||||
@@ -1,3 +1,3 @@
|
|||||||
# Handle PWR button to shutdown/reboot -- useful in Qemu (virt-manager)
|
# Handle PWR button to shutdown/reboot -- useful in Qemu (virt-manager)
|
||||||
# Depends on syslogd having started. Redirect any output to log.
|
# Depends on syslogd having started. Redirect any output to log.
|
||||||
service [2345] acpid -f -- ACPI daemon
|
service [2345] /sbin/acpid -f -- ACPI daemon
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
service [2345] <pid/syslogd> crond -f -S -c /etc/crontabs -- Cron daemon
|
service [2345] <svc/sbin/syslogd> /usr/sbin/crond -f -S -c /etc/crontabs -- Cron daemon
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
service [2345] dhcpcd -B -M -- DHCP client
|
service [2345] /usr/sbin/dhcpcd -B -M -- DHCP client
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
service [S12345] dmeventd -f -- Device mapper event daemon
|
service [S12345] /sbin/dmeventd -f -- Device mapper event daemon
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Consoles to start Finit built-in getty on when system is up
|
# Consoles to start Finit built-in getty on when system is up
|
||||||
tty [12345] /dev/tty1 noclear nowait
|
tty /dev/tty1 noclear nowait
|
||||||
tty [2345] /dev/tty2 noclear nowait
|
tty /dev/tty2 noclear nowait
|
||||||
tty [2345] /dev/tty3 noclear nowait
|
tty /dev/tty3 noclear nowait
|
||||||
|
|||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Start klogd as soon as possible, should always run
|
||||||
|
service [S12345] /sbin/klogd -n -- Kernel log daemon
|
||||||
@@ -1 +1 @@
|
|||||||
service [2345] lxdm -- Lightweight Login Manager
|
service [2345] /usr/sbin/lxdm -- Lightweight Login Manager
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
## Linux kernel modules to load
|
## Linux kernel modules to load
|
||||||
#module fbcon
|
#module fbcon
|
||||||
#module button
|
module button
|
||||||
#module evdev
|
module evdev
|
||||||
#module mousedev
|
module mousedev
|
||||||
#module 8139cp
|
module 8139cp
|
||||||
module softdog
|
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
# Silly Busybox ntpd has no option to use syslog when running in foreground
|
# Silly Busybox ntpd has no option to use syslog when running in foreground
|
||||||
service [2345] <pid/syslogd> log ntpd -n -N -p pool.ntp.org -- NTP daemon
|
service [2345] log <svc/sbin/syslogd> /usr/sbin/ntpd -n -N -p pool.ntp.org -- NTP daemon
|
||||||
|
|||||||
@@ -1,2 +1,2 @@
|
|||||||
# Start SSH daemon as soon as basic networking comes up
|
# Start SSH daemon as soon as basic networking comes up
|
||||||
service [2345] /usr/sbin/sshd -D -- OpenSSH daemon
|
service [2345] <net/lo/up> /usr/sbin/sshd -D -- OpenSSH daemon
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
# Start syslogd as soon as possible, should always run
|
|
||||||
# Start klogd as soon as possible, but after syslogd
|
|
||||||
service [S12345] syslogd -n -- Syslog daemon
|
|
||||||
service [S12345] <pid/syslogd> klogd -n -- Kernel log daemon
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
# Start syslogd as soon as possible, should always run
|
||||||
|
service [S12345] /sbin/syslogd -n -- Syslog daemon
|
||||||
@@ -1 +1 @@
|
|||||||
service @uuidd:uuidd [2345] uuidd -F -- UUID generation daemon
|
service @uuidd:uuidd [2345] /sbin/uuidd -F -- UUID generation daemon
|
||||||
|
|||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
available/dhcpcd.conf
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
available/getty.conf
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
available/sshd.conf
|
||||||
Symlink
+1
@@ -0,0 +1 @@
|
|||||||
|
available/uuidd.conf
|
||||||
@@ -10,7 +10,7 @@ fi
|
|||||||
# Adjust base directory
|
# Adjust base directory
|
||||||
if [ -e xbps ]; then
|
if [ -e xbps ]; then
|
||||||
cd ../..
|
cd ../..
|
||||||
elif [ ! -e configure.ac ]; then
|
elif [ ! -e autogen.sh ]; then
|
||||||
echo "*** Please run this script from the Finit base directory."
|
echo "*** Please run this script from the Finit base directory."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
@@ -30,7 +30,7 @@ if [ "x$yorn" = "xy" -o "x$yorn" = "xY" ]; then
|
|||||||
echo
|
echo
|
||||||
echo "*** Installing Finit files ..."
|
echo "*** Installing Finit files ..."
|
||||||
make install
|
make install
|
||||||
cd /usr/share/doc/finit/contrib/void
|
cd `dirname $0`
|
||||||
for file in finit.conf rc.local; do
|
for file in finit.conf rc.local; do
|
||||||
install -vbD $file /etc/$file
|
install -vbD $file /etc/$file
|
||||||
done
|
done
|
||||||
|
|||||||
@@ -1,4 +0,0 @@
|
|||||||
docsdir := @docdir@/doc
|
|
||||||
docs_DATA = config.md conditions.md distro.md plugins.md \
|
|
||||||
service.md signals.md svc-machine.png cmdline.md
|
|
||||||
EXTRA_DIST = $(docs_DATA)
|
|
||||||
-50
@@ -1,50 +0,0 @@
|
|||||||
Goals of Finit
|
|
||||||
==============
|
|
||||||
|
|
||||||
Initially Finit aimed to be more than a processes monitor, acting as a
|
|
||||||
replacement for cron/at and inetd as well. Over time, however, the true
|
|
||||||
value in the project turned out to be:
|
|
||||||
|
|
||||||
> A simple SysV init and systemd replacement, primarily for embedded
|
|
||||||
> systems, container, and dedicated server applications.
|
|
||||||
|
|
||||||
|
|
||||||
Misc TODOs
|
|
||||||
----------
|
|
||||||
|
|
||||||
Some of these are also registered in the issue tracker on GitHub.
|
|
||||||
|
|
||||||
* Refactor the .conf parser, parse user input in a separate process
|
|
||||||
* Move process monitor to separate process (same as parser?)
|
|
||||||
* Add new (complimentary) .svc file format to slowly migrate away
|
|
||||||
from the very terse one-liner format currently used
|
|
||||||
* Allow running as non-pid1 => read .conf and RCSD form cmdline
|
|
||||||
* Add `finit.conf` support for UPS notification (SIGPWR) to start a task
|
|
||||||
using, e.g. <sys/power/{ok,fail,low}> conditions. More info in sig.c
|
|
||||||
* Add `finit.conf` support for ctrl-alt-delete (SIGINT) and kbrequest,
|
|
||||||
i.e. KeyboardSignal, (SIGWINCH) behavior. Using conditions to a task,
|
|
||||||
e.g, <sys/key/ctrlaltdel> and <sys/key/signal> like SIGPWR handling.
|
|
||||||
* Write man pages for finit and `finit.conf`, steal from the excellent
|
|
||||||
`pimd` man pages ...
|
|
||||||
|
|
||||||
|
|
||||||
Initctl
|
|
||||||
-------
|
|
||||||
|
|
||||||
* Add support for timed shutdown in Finit, including cancelled shutdown:
|
|
||||||
|
|
||||||
shutdown -h 03:35 "foobar was here"
|
|
||||||
|
|
||||||
* Add support for JSON output, or similar, from `initctl show`, e.g.
|
|
||||||
`initctl show --json`
|
|
||||||
* Add support for `-s` to redirect all output to syslog, for scripting
|
|
||||||
|
|
||||||
|
|
||||||
Init
|
|
||||||
----
|
|
||||||
|
|
||||||
Finit in itself is not SysV Init compatible, it doesn't use `/etc/rc.d`
|
|
||||||
and `/etc/init.d` scripts to boot the system. However, a plausible way
|
|
||||||
to achieve compatibility would be to add a plugin to finit which reads
|
|
||||||
`/etc/inittab` to be able to start standard Linux systems.
|
|
||||||
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
Tips & Tricks with the kernel cmdline
|
|
||||||
=====================================
|
|
||||||
|
|
||||||
This document summarizes the different boot parameters that can be
|
|
||||||
passed on the Linux kernel command line. Not limited to Finit.
|
|
||||||
|
|
||||||
The `bool` setting is one of `on, off, true false, 1, 0`.
|
|
||||||
|
|
||||||
|
|
||||||
* `debug`: Enable kernel debug. Debug messages are printed to the
|
|
||||||
console until Finit starts up.
|
|
||||||
|
|
||||||
* `finit.debug[=bool]`: Enable finit debug. This is operated
|
|
||||||
independently of the kernel debug setting. New as of Finit v4.
|
|
||||||
|
|
||||||
* `finit.show_status[=bool]`: Control finit boot progress, including
|
|
||||||
banner.
|
|
||||||
|
|
||||||
* `finit.status_style=<classic,modern>`: Set Finit boot progress style,
|
|
||||||
when enabled.
|
|
||||||
|
|
||||||
* `init=/bin/sh`: Bypass system default init and tell kernel to start a
|
|
||||||
shell. Note, this shell is very limited and does not support
|
|
||||||
signals and has no job control. Recommend using, and modifying,
|
|
||||||
`rescue` mode instead.
|
|
||||||
|
|
||||||
* `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.
|
|
||||||
|
|
||||||
* `rescue`: Start rescue/maintenance mode. If your system comes with
|
|
||||||
the bundled `sulogin` program (Finit, or from util-linux/Busybox),
|
|
||||||
you will 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 [config.md][]
|
|
||||||
for more information.
|
|
||||||
|
|
||||||
* `single`, or `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, so a `tty [1] @console nologin` configuration
|
|
||||||
presents you with a root console without login.
|
|
||||||
|
|
||||||
For more on kernel boot paramaters, see the man page [bootparam(7)][].
|
|
||||||
|
|
||||||
[config.md][]: config.md#rescue-mode
|
|
||||||
[bootparam(7)]: https://www.man7.org/linux/man-pages/man7/bootparam.7.html
|
|
||||||
@@ -1,226 +0,0 @@
|
|||||||
Finit Conditions
|
|
||||||
================
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
* [Introduction](#introduction)
|
|
||||||
* [Triggering](#triggering)
|
|
||||||
* [Built-in Conditions](#built-in--conditions)
|
|
||||||
* [Debugging](#debugging)
|
|
||||||
* [Internals](#internals)
|
|
||||||
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
------------
|
|
||||||
|
|
||||||
Conditions are a new addition to Finit, introduced in v3, with the
|
|
||||||
intention of providing a mechanism for common synchronization problems.
|
|
||||||
For example:
|
|
||||||
|
|
||||||
- *"wait for service A to start before starting service B"*, or
|
|
||||||
- *"wait for basic network access to be available"*
|
|
||||||
|
|
||||||
Conditions are similar in syntax to declaring runlevels per service.
|
|
||||||
They are specified within angle brackets `<>` and can be applied to any
|
|
||||||
of the `service`, `task`, or `run` stanza. Multiple conditions may be
|
|
||||||
specified separated by comma. Multiple conditions are logically AND'ed
|
|
||||||
during evaluation, i.e. all conditions must be satisfied in order for a
|
|
||||||
service to run.
|
|
||||||
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
service [2345] <pid/setupd,pid/zebra> /sbin/netd -- Network monitor
|
|
||||||
|
|
||||||
In this example the Network monitor daemon `netd` is not started until
|
|
||||||
both the `pid/setupd` *and* `pid/zebra` conditions are satisfied. A
|
|
||||||
`pid/` condition is satisfied by the corresponding service's PID file
|
|
||||||
being created.
|
|
||||||
|
|
||||||
**NOTE:** Conditions also stop services when a condition is no longer
|
|
||||||
asserted. I.e., if the Zebra process above stops or restarts, netd
|
|
||||||
will also stop or restart.
|
|
||||||
|
|
||||||
|
|
||||||
Triggering
|
|
||||||
----------
|
|
||||||
|
|
||||||
Conditions are mainly triggered (asserted) by built-in plugins, e.g.,
|
|
||||||
`netlink.so` and `pidfile.so`, see below for built-in conditions. Finit
|
|
||||||
also supports user-defined conditions, sometimes referred to as static
|
|
||||||
or one-shot conditions. They live in the `<usr/...` namespace and are
|
|
||||||
constrained to a flat hierarchy without any sub-directories, unlike the
|
|
||||||
pidfile plugin, for instance.
|
|
||||||
|
|
||||||
User-defined conditions are controlled using the `initctl cond set` and
|
|
||||||
`initctl cond clear` commands:
|
|
||||||
|
|
||||||
initctl cond set foo
|
|
||||||
initctl cond clear foo
|
|
||||||
|
|
||||||
The purpose of user-defined conditions is to be able to start or stop
|
|
||||||
services, or run/task jobs, on external site-dependent stimuli.
|
|
||||||
Example:
|
|
||||||
|
|
||||||
service [2345] <usr/foo> alarm --arg foo -- Foo alarm
|
|
||||||
|
|
||||||
For convenience, prefixing with `usr/` is allowed, but any other slashes
|
|
||||||
or period characters are disallowed. E.g., to trigger the `Foo alarm`,
|
|
||||||
the same as above, can also be achieved like this:
|
|
||||||
|
|
||||||
initctl cond set usr/foo
|
|
||||||
initctl cond clear usr/foo
|
|
||||||
|
|
||||||
Conditions retain their current state until the next reconfiguration or
|
|
||||||
runlevel change. At that point all set conditions transition into the
|
|
||||||
`flux` state, meaning the condition's state is unknown. (For more info
|
|
||||||
on this, see [Internals](#internals).) Thus, after a reconfiguration it
|
|
||||||
is up to the "owner" of the condition to convey the new (or possibly
|
|
||||||
unchanged) state of it.
|
|
||||||
|
|
||||||
> **Note:** For `pid/` conditions it is expected that services "touch"
|
|
||||||
> or recreate their PID file on `SIGHUP`.
|
|
||||||
|
|
||||||
Static (one-shot) conditions, like `usr/`, never enter the `flux` state.
|
|
||||||
|
|
||||||
|
|
||||||
Built-in Conditions
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Finit comes with a `pidfile` and `netlink` plugin. When enabled, the
|
|
||||||
`pidfile` plugin watches `/var/run/` (recursively) for PID files created
|
|
||||||
by the monitored services, and sets a corresponding condition in the
|
|
||||||
`pid/` namespace. Similarily, the `netlink` plugin provides basic
|
|
||||||
conditions for when an interface is brought up/down and when a default
|
|
||||||
route (gateway) is set, in the `net/` namespace.
|
|
||||||
|
|
||||||
With the example listed above, finit does not start the `/sbin/netd`
|
|
||||||
daemon until `setupd` and `zebra` has started *and* created their PID
|
|
||||||
files. Which they do when they have completed their initial set up and
|
|
||||||
are ready to receive signals.
|
|
||||||
|
|
||||||
Finit expects monitored services to touch their PID files, i.e. update
|
|
||||||
the mtime, when they reload their configuration files after a `SIGHUP`.
|
|
||||||
Some services do not support `SIGHUP` and are instead restarted, which
|
|
||||||
is a crude but effective way to have the PID file touched (re-created).
|
|
||||||
|
|
||||||
Built-in conditions:
|
|
||||||
|
|
||||||
- `pid/<SERVICE>`
|
|
||||||
- `net/route/default`
|
|
||||||
- `net/<IFNAME>/exist`
|
|
||||||
- `net/<IFNAME>/up`
|
|
||||||
- `net/<IFNAME>/running`
|
|
||||||
|
|
||||||
**Note:** `up` means administratively up, the interface flag `IFF_UP`.
|
|
||||||
`running` is the `IFF_RUNNING` flag, meaning operatively up. The
|
|
||||||
difference is that `running` tells if the NIC has link.
|
|
||||||
|
|
||||||
|
|
||||||
Composition
|
|
||||||
-----------
|
|
||||||
|
|
||||||
The `pid/` conditions are generated by the Finit `pidfile.so` plugin and
|
|
||||||
composed from a service's `name:` and `:id`. By default the basename of
|
|
||||||
the daemon and the empty string.
|
|
||||||
|
|
||||||
| **service** | **condition** |
|
|
||||||
|----------------------------------------------------|------------------|
|
|
||||||
| /sbin/foo | pid/foo |
|
|
||||||
| /sbin/bar -p /run/baz.pid | pid/bar |
|
|
||||||
| name:lxc :foo lxc-start -n foo -p /run/lxc/foo.pid | pid/lxc:foo |
|
|
||||||
| /usr/bin/dbus-daemon | pid/dbus-daemon |
|
|
||||||
| :222 dropbear -p 222 | pid/dropbear:222 |
|
|
||||||
|
|
||||||
The condition is asserted when `pidfile.so` receives an inotify event
|
|
||||||
for a file matching `/run/*.pid`, `/run/**/*.pid`, or `/run/**/pid`,
|
|
||||||
which contains the PID of the service Finit has started.
|
|
||||||
|
|
||||||
When Finit configuration files are changed and the `initctl reload`
|
|
||||||
command is called, it is expected of services to touch their PID files
|
|
||||||
for Finit to reassert their conditions.
|
|
||||||
|
|
||||||
Daemons that don't create PID files, or fail to touch them on reload,
|
|
||||||
can be worked around by using the `pid:/path/to/file.pid` syntax in
|
|
||||||
the service stanza for the daemon. It is far from optimal since any
|
|
||||||
synchronization of depending services may fail due to the daemon not
|
|
||||||
having reinitialized/created their IPC sockets, or similar.
|
|
||||||
|
|
||||||
> **Note:** in versions of Finit prior to v4, the PID conditions were
|
|
||||||
> called 'svc' conditions, and they were far more complex.
|
|
||||||
|
|
||||||
|
|
||||||
Debugging
|
|
||||||
---------
|
|
||||||
|
|
||||||
If a service is not being started as it should, the problem might be
|
|
||||||
that one of its conditions is not in the expected state. Use the
|
|
||||||
command `initctl status` to inspect service status. Services in the
|
|
||||||
`ready` state are pending a condition.
|
|
||||||
|
|
||||||
In that situation, running `initctl cond show` reveals which of the
|
|
||||||
conditions that are not satisfied. Listed as `off` below.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
```shell
|
|
||||||
~ # initctl cond show
|
|
||||||
PID IDENT STATUS CONDITION (+ ON, ~ FLUX, - OFF)
|
|
||||||
=======================================================================
|
|
||||||
1419 /sbin/netd on <+pid/setupd,+pid/zebra>
|
|
||||||
0 /sbin/udhcpc off <-net/vlan1/exist>
|
|
||||||
```
|
|
||||||
|
|
||||||
Here we can see that `netd` is allowed to run since both its conditions
|
|
||||||
are in the `on` state, as indicated by the `+`-prefix. `udhcpc` however
|
|
||||||
is not allowed to run since `net/vlan1/exist` condition is not satsifed.
|
|
||||||
As indicated by the `-`-prefix.
|
|
||||||
|
|
||||||
To fake interface `vlan1` suddenly appearing, and test what happens to
|
|
||||||
`udhcpc` we can enable debug mode and assert the condition, like this:
|
|
||||||
|
|
||||||
```shell
|
|
||||||
~ # initctl debug
|
|
||||||
~ # mkdir -p /var/run/finit/cond/net/vlan1
|
|
||||||
~ # cp /var/run/finit/cond /var/run/finit/cond/net/vlan1/exist
|
|
||||||
```
|
|
||||||
|
|
||||||
Then watch the console for the debug messages and then check the output
|
|
||||||
from `initctl cond show` again. The client will likely have failed to
|
|
||||||
start, but at least the condition is now satisfied.
|
|
||||||
|
|
||||||
There is also the `initctl cond dump` command, which dumps all known
|
|
||||||
conditions, their current status, and their origin.
|
|
||||||
|
|
||||||
|
|
||||||
Internals
|
|
||||||
---------
|
|
||||||
|
|
||||||
As shown previously, conditions are implemented as simple files in the
|
|
||||||
file system, in the `/var/run/finit/cond/` sub-directory. The files
|
|
||||||
are created, updated, and removed by condition plugins. To debug them,
|
|
||||||
see the previous section.
|
|
||||||
|
|
||||||
A condition is always in one of three states:
|
|
||||||
|
|
||||||
* ` on` (+): The condition is asserted.
|
|
||||||
* ` off` (-): The condition is deasserted.
|
|
||||||
* `flux` (~): The conditions state is unknown.
|
|
||||||
|
|
||||||
All conditions that have not explicitly been set are interpreted as
|
|
||||||
being in the `off` state.
|
|
||||||
|
|
||||||
When a reconfiguration is requested, Finit transitions all conditions to
|
|
||||||
the `flux` state. As a result, services that depend on a condition are
|
|
||||||
sent `SIGSTOP`. Once the new state of the condition is asserted, the
|
|
||||||
service receives `SIGCONT`. If the condition is no longer satisfied the
|
|
||||||
service will then be stopped, otherwise no further action is taken.
|
|
||||||
|
|
||||||
This STOP/CONT handling minimizes the number of unnecessary service
|
|
||||||
restarts that would otherwise occur because a depending service was sent
|
|
||||||
`SIGHUP` for example.
|
|
||||||
|
|
||||||
Therefore, any plugin that supplies Finit with conditions must ensure
|
|
||||||
that their state is updated after each reconfiguration. This can be
|
|
||||||
done by binding to the `HOOK_SVC_RECONF` hook. For an example of how
|
|
||||||
to do this, see `plugins/pidfile.c`.
|
|
||||||
-706
@@ -1,706 +0,0 @@
|
|||||||
Configuration
|
|
||||||
=============
|
|
||||||
|
|
||||||
* [Introduction](#introduction)
|
|
||||||
* [Service Environment](#service-environment)
|
|
||||||
* [Service Wrapper Scripts](#service-wrapper-scripts)
|
|
||||||
* [Cgroups](#cgroups)
|
|
||||||
* [Configuration File Syntax](#configuration-file-syntax)
|
|
||||||
* [Hostname](#hostname)
|
|
||||||
* [Kernel Modules](#kernel-modules)
|
|
||||||
* [Networking](#networking)
|
|
||||||
* [Resource Limits](#resource-limits)
|
|
||||||
* [Runlevels](#runlevels)
|
|
||||||
* [One-shot Commands (sequence)](#one-shot-commands--sequence-)
|
|
||||||
* [One-shot Commands (parallel)](#one-shot-commands--parallel-)
|
|
||||||
* [SysV Init Scripts](#sysv-init-scripts)
|
|
||||||
* [Services](#services)
|
|
||||||
* [Run-parts Scripts](#run-parts-scripts)
|
|
||||||
* [Including Finit Configs](#including-finit-configs)
|
|
||||||
* [General Logging](#general-logging)
|
|
||||||
* [TTYs and Consoles](#ttys-and-consoles)
|
|
||||||
* [Non-privileged Services](#non-privileged-services)
|
|
||||||
* [Redirecting Output](#redirecting-output)
|
|
||||||
* [Rescue Mode](#rescue-mode)
|
|
||||||
* [Limitations](#limitations)
|
|
||||||
* [/etc/finit.conf](#etcfinitconf)
|
|
||||||
* [/etc/finit.d](#etcfinitd)
|
|
||||||
* [Watchdog](#watchdog)
|
|
||||||
|
|
||||||
|
|
||||||
Introduction
|
|
||||||
------------
|
|
||||||
|
|
||||||
Finit can be configured using only the original `/etc/finit.conf` file
|
|
||||||
or in combination with `/etc/finit.d/*.conf`. Useful for package-based
|
|
||||||
Linux distributions -- each package can provide its own "script" file.
|
|
||||||
|
|
||||||
- `/etc/finit.conf`: main configuration file
|
|
||||||
- `/etc/finit.d/*.conf`: snippets, usually one service per file
|
|
||||||
|
|
||||||
Not all configuration directives are available in `/etc/finit.d/*.conf`
|
|
||||||
and some directives are only available at [bootstrap][], runlevel `S`,
|
|
||||||
see the section [Limitations](#limitations) below for details.
|
|
||||||
|
|
||||||
To add a new service, simply drop a `.conf` file in `/etc/finit.d` and
|
|
||||||
run `initctl reload`. (It is also possible to `SIGHUP` to PID 1, or
|
|
||||||
call `finit q`, but that has been deprecated with the `initctl` tool).
|
|
||||||
Finit monitors all known active `.conf` files, so if you want to force
|
|
||||||
a restart of any service you can simply touch its corresponding `.conf`
|
|
||||||
file in `/etc/finit.d` and call `initctl reload`. Finit handle any
|
|
||||||
and all conditions and dependencies between services automatically.
|
|
||||||
|
|
||||||
It is also possible to drop `.conf` files in `/etc/finit.d/available/`
|
|
||||||
and use `initctl enable` to enable a service `.conf` file. This may be
|
|
||||||
useful in particular to Linux distributions that may want to install all
|
|
||||||
files for a package and let the user decide when to enable a service.
|
|
||||||
|
|
||||||
On `initctl reload` the following is checked for all services:
|
|
||||||
|
|
||||||
- If a service's `.conf` file has been removed, or its conditions are no
|
|
||||||
longer satisifed, the service is stopped.
|
|
||||||
- If the file is modified, or a service it depends on has been reloaded,
|
|
||||||
the service is reloaded (stopped and started).
|
|
||||||
- If a new service is added it is automatically started — respecting
|
|
||||||
runlevels and return values from any callbacks.
|
|
||||||
|
|
||||||
For more info on the different states of a service, see the separate
|
|
||||||
document [Finit Services](service.md).
|
|
||||||
|
|
||||||
> When running <kbd>make install</kbd> no default `/etc/finit.conf` is
|
|
||||||
> installed since system requirements differ too much. There are some
|
|
||||||
> examples in the `contrib/` directory, which can be used as a base.
|
|
||||||
|
|
||||||
|
|
||||||
Service Environment
|
|
||||||
-------------------
|
|
||||||
|
|
||||||
Finit supports sourcing environment variables from `/etc/default/*`, or
|
|
||||||
similar `--with-sysconfig=DIR`. This is a common pattern from SysV init
|
|
||||||
scripts, where the start-stop script is a generic script for the given
|
|
||||||
service, `foo`, and the options for the service are sourced from the
|
|
||||||
file `/etc/default/foo`. Like this:
|
|
||||||
|
|
||||||
* `/etc/default/foo`:
|
|
||||||
|
|
||||||
FOO_OPTIONS=--extra-arg="bar" -s -x
|
|
||||||
|
|
||||||
* `/etc/finit.conf`:
|
|
||||||
|
|
||||||
service [2345] env:-/etc/default/foo foo -n $FOO_OPTIONS -- Example foo daemon
|
|
||||||
|
|
||||||
Here the service `foo` is started with `-n`, to make sure it runs in the
|
|
||||||
foreground, and the with the options found in the environment file. With
|
|
||||||
the `ps` command we can see that the process is started with:
|
|
||||||
|
|
||||||
foo -n --extra-arg=bar -s -x
|
|
||||||
|
|
||||||
> **Note:** the leading `-` determines if Finit should treat a missing
|
|
||||||
> environment file as blocking the start of the service or not. When
|
|
||||||
> `-` is used, a missing environment file does *not* block the start.
|
|
||||||
|
|
||||||
|
|
||||||
Service Wrapper Scripts
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
If your service requires to run additional commands, executed before the
|
|
||||||
service is actually started, like the systemd `ExecStartPre`, you can
|
|
||||||
use a wrapper shell script to start your service.
|
|
||||||
|
|
||||||
The Finit service `.conf` file can be put into `/etc/finit.d/available`,
|
|
||||||
so you can control the service using `initctl`. Then use the path to
|
|
||||||
the wrapper script in the Finit `.conf` service stanza. The following
|
|
||||||
example employs a wrapper script in `/etc/start.d`.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
* `/etc/finit.d/available/program.conf`:
|
|
||||||
|
|
||||||
service [235] <!> /etc/start.d/program -- Example Program
|
|
||||||
|
|
||||||
* `/etc/start.d/program:`
|
|
||||||
|
|
||||||
#!/bin/sh
|
|
||||||
# Prepare the command line options
|
|
||||||
OPTIONS="-u $(cat /etc/username)"
|
|
||||||
|
|
||||||
# Execute the program
|
|
||||||
exec /usr/bin/program $OPTIONS
|
|
||||||
|
|
||||||
> **Note:** the example sets `<!>` to denote that it doesn't support
|
|
||||||
> `SIGHUP`. That way Finit will stop/start the service
|
|
||||||
> instead of sending SIGHUP at restart/reload events.
|
|
||||||
|
|
||||||
|
|
||||||
Cgroups
|
|
||||||
-------
|
|
||||||
|
|
||||||
There are three major cgroup configuration directives:
|
|
||||||
|
|
||||||
1. Global top-level group: init, system, user, or a custom group
|
|
||||||
2. Selecting a top-level group for a set of run/task/services
|
|
||||||
3. Per run/task/service limits
|
|
||||||
|
|
||||||
Top-level group configuration.
|
|
||||||
|
|
||||||
# Top-level cgroups and their default settings. All groups mandatory
|
|
||||||
# but more can be added, max 8 groups in total currently. The cgroup
|
|
||||||
# 'root' is also available, reserved for RT processes. Settings are
|
|
||||||
# as-is, only one shorthand 'mem.' exists, other than that it's the
|
|
||||||
# cgroup v2 controller default names.
|
|
||||||
cgroup init cpu.weight:100
|
|
||||||
cgroup user cpu.weight:100
|
|
||||||
cgroup system cpu.weight:9800
|
|
||||||
|
|
||||||
Adding an extra cgroup `maint/` will require you to adjust the weight of
|
|
||||||
the above three. We leave `init/` and `user /` as-is reducing weight of
|
|
||||||
`system/` to 9700.
|
|
||||||
|
|
||||||
cgroup system cpu.weight:9700
|
|
||||||
|
|
||||||
# Example extra cgroup 'maint'
|
|
||||||
cgroup maint cpu.weight:100
|
|
||||||
|
|
||||||
By default, the `system/` cgroup is selected for almost everything. The
|
|
||||||
`init/` cgroup is reserved for PID 1 itself and its closest relatives.
|
|
||||||
The `user/` cgroup is for local TTY logins spawned by getty.
|
|
||||||
|
|
||||||
To select a different top-level cgroup, e.g. `maint/`, one can either
|
|
||||||
define it for a group of run/task/service directives in a `.conf` or per
|
|
||||||
each stanza:
|
|
||||||
|
|
||||||
cgroup.maint
|
|
||||||
service [...] <...> /path/to/foo args -- description
|
|
||||||
service [...] <...> /path/to/bar args -- description
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
service [...] <...> cgroup.maint /path/to/foo args -- description
|
|
||||||
|
|
||||||
The latter form also allows per-stanza limits on the form:
|
|
||||||
|
|
||||||
service [...] <...> cgroup.maint:cpu.max:10000,mem.max:655360 /path/to/foo args -- description
|
|
||||||
|
|
||||||
Notice the comma separation and the `mem.` exception to the rule: every
|
|
||||||
cgroup setting maps directly to cgroup v2 syntax. I.e., `cpu.max` maps
|
|
||||||
to the file `/sys/fs/cgroup/maint/foo/cpu.max`. There is not filtering,
|
|
||||||
except for expanding the shorthand `mem.` to `memory.`, if the file is
|
|
||||||
not available, either the cgroup controller is not available in your
|
|
||||||
Linux kernel, or the name is misspelled.
|
|
||||||
|
|
||||||
> Linux cgroups and details surrounding values are not explained in the
|
|
||||||
> Finit documentation. The Linux admin-guide cover this well:
|
|
||||||
> <https://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html>
|
|
||||||
|
|
||||||
|
|
||||||
Configuration File Syntax
|
|
||||||
-------------------------
|
|
||||||
|
|
||||||
### Hostname
|
|
||||||
|
|
||||||
**Syntax:** `host <NAME>`, or `hostname <NAME>`
|
|
||||||
|
|
||||||
Set system hostname to NAME, unless `/etc/hostname` exists in which case
|
|
||||||
the contents of that file is used.
|
|
||||||
|
|
||||||
Deprecated. We recommend using `/etc/hostname` instead.
|
|
||||||
|
|
||||||
> **Note:** only read and executed in runlevel S ([bootstrap][]).
|
|
||||||
|
|
||||||
|
|
||||||
### Kernel Modules
|
|
||||||
|
|
||||||
**Syntax:** `module <MODULE> [ARGS]`
|
|
||||||
|
|
||||||
Load a kernel module, with optional arguments. Similar to `insmod`
|
|
||||||
command line tool.
|
|
||||||
|
|
||||||
Deprecated, there is both a `modules-load.so` and a `modprobe.so` plugin
|
|
||||||
that can handle module loading better. The former supports loading from
|
|
||||||
`/etc/modules-load.d/`, the latter uses kernel modinfo to automatically
|
|
||||||
load (or coldplug) every required module. For hotplug we recommend the
|
|
||||||
BusyBox mdev tool, add to `/etc/mdev.conf`:
|
|
||||||
|
|
||||||
$MODALIAS=.* root:root 0660 @modprobe -b "$MODALIAS"
|
|
||||||
|
|
||||||
> **Note:** only read and executed in runlevel S ([bootstrap][]).
|
|
||||||
|
|
||||||
|
|
||||||
### Networking
|
|
||||||
|
|
||||||
**Syntax:** `network <PATH>`
|
|
||||||
|
|
||||||
Script or program to bring up networking, with optional arguments.
|
|
||||||
|
|
||||||
Deprecated. We recommend using dedicated task/run stanzas per runlevel,
|
|
||||||
or `/etc/network/interfaces` if you have a system with `ifupdown`, like
|
|
||||||
Debian, Ubuntu, Linux Mint, or an embedded BusyBox system.
|
|
||||||
|
|
||||||
> **Note:** only read and executed in runlevel S ([bootstrap][]).
|
|
||||||
|
|
||||||
|
|
||||||
### Resource Limits
|
|
||||||
|
|
||||||
**Syntax:** `rlimit [hard|soft] RESOURCE <LIMIT|unlimited>`
|
|
||||||
|
|
||||||
Set the hard or soft limit for a resource, or both if that argument is
|
|
||||||
omitted. `RESOURCE` is the lower-case `RLIMIT_` string constants from
|
|
||||||
`setrlimit(2)`, without prefix. E.g. to set `RLIMIT_CPU`, use `cpu`.
|
|
||||||
|
|
||||||
LIMIT is an integer that depends on the resource being modified, see
|
|
||||||
the man page, or the kernel `/proc/PID/limits` file, for details.
|
|
||||||
Finit versions before v3.1 used `infinity` for `unlimited`, which is
|
|
||||||
still supported, albeit deprecated.
|
|
||||||
|
|
||||||
# No process is allowed more than 8MB of address space
|
|
||||||
rlimit hard as 8388608
|
|
||||||
|
|
||||||
# Core dumps may be arbitrarily large
|
|
||||||
rlimit soft core infinity
|
|
||||||
|
|
||||||
# CPU limit for all services, soft & hard = 10 sec
|
|
||||||
rlimit cpu 10
|
|
||||||
|
|
||||||
`rlimit` can be set globally, in `/etc/finit.conf`, or locally per
|
|
||||||
each `/etc/finit.d/*.conf` read. I.e., a set of task/run/service
|
|
||||||
stanzas can share the same rlimits if they are in the same .conf.
|
|
||||||
|
|
||||||
|
|
||||||
### Runlevels
|
|
||||||
|
|
||||||
**Syntax:** `runlevel <N>`
|
|
||||||
|
|
||||||
The system runlevel to go to after [bootstrap][] (S) has completed. `N`
|
|
||||||
is the runlevel number 0-9, where 6 is reserved for reboot and 0 for
|
|
||||||
halt.
|
|
||||||
|
|
||||||
Default: 2
|
|
||||||
|
|
||||||
> **Note:** only read and executed in runlevel S ([bootstrap][]).
|
|
||||||
|
|
||||||
|
|
||||||
### One-shot Commands (sequence)
|
|
||||||
|
|
||||||
**Syntax:** `run [LVLS] <COND> /path/to/cmd ARGS -- Optional description`
|
|
||||||
|
|
||||||
One-shot command to run in sequence when entering a runlevel, with
|
|
||||||
optional arguments and description.
|
|
||||||
|
|
||||||
`run` commands are guaranteed to be completed before running the next
|
|
||||||
command. Highly useful if true serialization is needed.
|
|
||||||
|
|
||||||
> `<COND>` is described in the [Services](#services) section.
|
|
||||||
|
|
||||||
|
|
||||||
### One-shot Commands (parallel)
|
|
||||||
|
|
||||||
**Syntax:** `task [LVLS] <COND> /path/to/cmd ARGS -- Optional description`
|
|
||||||
|
|
||||||
One-shot like 'run', but starts in parallel with the next command.
|
|
||||||
|
|
||||||
Both `run` and `task` commands are run in a shell, so pipes and
|
|
||||||
redirects can be freely used:
|
|
||||||
|
|
||||||
task [s] echo "foo" | cat >/tmp/bar
|
|
||||||
|
|
||||||
> `<COND>` is described in the [Services](#services) section.
|
|
||||||
|
|
||||||
|
|
||||||
### SysV Init Scripts
|
|
||||||
|
|
||||||
**Syntax:** `sysv [LVLS] <COND> /path/to/init-script -- Optional description`
|
|
||||||
|
|
||||||
Similar to `task` is the `sysv` stanza, which can be used to call SysV
|
|
||||||
style scripts. The primary intention for this command is to be able to
|
|
||||||
re-use much of existing setup and init scripts in Linux distributions.
|
|
||||||
|
|
||||||
When entering an allowed runlevel, Finit calls `init-script start`, when
|
|
||||||
entering a disallowed runlevel, Finit calls `init-script stop`, and if
|
|
||||||
the Finit .conf, where `sysv` stanza is declared, is modified, Finit
|
|
||||||
calls `init-script restart` on `initctl reload`. Similar to how
|
|
||||||
`service` stanzas work.
|
|
||||||
|
|
||||||
Forking services started with `sysv` scripts can be monitored by Finit
|
|
||||||
by declaring the PID file to look for: `pid:!/path/to/pidfile.pid`.
|
|
||||||
|
|
||||||
> `<COND>` is described in the [Services](#services) section.
|
|
||||||
|
|
||||||
|
|
||||||
### Services
|
|
||||||
|
|
||||||
**Syntax:** `service [LVLS] <COND> /path/to/daemon ARGS -- Optional description`
|
|
||||||
|
|
||||||
Service, or daemon, to be monitored and automatically restarted if it
|
|
||||||
exits prematurely. Finit tries to restart services that die 10 times
|
|
||||||
before giving up, then you have to `initctl restart NAME` it manually.
|
|
||||||
|
|
||||||
For daemons that support it, we recommend appending `--foreground`,
|
|
||||||
`--no-background`, `-n`, `-F`, or similar command line argument to
|
|
||||||
prevent them from forking off a sub-process in the background. This is
|
|
||||||
the most reliable way to monitor a service.
|
|
||||||
|
|
||||||
However, not all daemons support running in the foreground, or they may
|
|
||||||
start logging to the foreground as well, these are called forking
|
|
||||||
services and are supported using the same syntax as forking `sysv`
|
|
||||||
services, using the `pid:!/path/to/pidfile.pid` syntax.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
In the case of `ospfd` (below), we omit the `-d` flag (daemonize) to
|
|
||||||
prevent it from forking to the background:
|
|
||||||
|
|
||||||
service [2345] <pid/zebra> /sbin/ospfd -- OSPF daemon
|
|
||||||
|
|
||||||
`[2345]` denote the runlevels `ospfd` is allowed to run in, they are
|
|
||||||
optional and default to level 2-5 if omitted.
|
|
||||||
|
|
||||||
`<...>` is the condition for starting `ospfd`. In this example Finit
|
|
||||||
waits for another service, `zebra`, to have created its PID file in
|
|
||||||
`/var/run/quagga/zebra.pid` before starting `ospfd`. Finit watches
|
|
||||||
*all* files in `/var/run`, for each file named `*.pid`, or `*/pid`,
|
|
||||||
Finit opens it and find the matching `NAME:ID` using the PID.
|
|
||||||
|
|
||||||
Some services do not maintain a PID file and rather than patching each
|
|
||||||
application Finit provides a workaround. A `pid` keyword can be set
|
|
||||||
to have Finit automatically create (when starting) and later remove
|
|
||||||
(when stopping) the PID file. The file is created in the `/var/run`
|
|
||||||
directory using the `basename(1)` of the service. The default can be
|
|
||||||
modified with an optional `pid:`-argument:
|
|
||||||
|
|
||||||
pid[:[/path/to/]filename[.pid]]
|
|
||||||
|
|
||||||
For example, by adding `pid:/run/foo.pid` to the service `/sbin/bar`,
|
|
||||||
that PID file will, not only be created and removed automatically, but
|
|
||||||
also be used by the Finit condition subsystem. So a service/run/task
|
|
||||||
can depend on `<pid/bar>`.
|
|
||||||
|
|
||||||
> For a detailed description of conditions, and how to debug them,
|
|
||||||
> see the [Finit Conditions](conditions.md) document.
|
|
||||||
|
|
||||||
If a service should not be automatically started, it can be configured
|
|
||||||
as manual with the optional `manual` argument. The service can then be
|
|
||||||
started at any time by running `initctl start <service>`.
|
|
||||||
|
|
||||||
manual:yes
|
|
||||||
|
|
||||||
The name of a service, shown by the `initctl` tool, defaults to the
|
|
||||||
basename of the service executable. It can be changed with the
|
|
||||||
optional `name` argument:
|
|
||||||
|
|
||||||
name:<service-name>
|
|
||||||
|
|
||||||
When stopping a service (run/task/sysv/service), either manually or
|
|
||||||
when moving to another runlevel, Finit starts by sending `SIGTERM`, to
|
|
||||||
allow the process to shut down gracefully. If the process has not
|
|
||||||
been collected within 3 seconds, Finit sends `SIGKILL`. To halt the
|
|
||||||
process using a different signal, use the option `halt:SIGNAL`, e.g.,
|
|
||||||
`halt:SIGPWR`. To change the delay between your halt signal and KILL,
|
|
||||||
use the option `kill:SEC`, e.g., `kill:10` to wait 10 seconds before
|
|
||||||
sending `SIGKILL`.
|
|
||||||
|
|
||||||
Services support `pre:script` and `post:script` actions as well. These
|
|
||||||
run as the same `@USER:GROUP` as the service itself, with any `env:file`
|
|
||||||
sourced. The scripts must use an absolute path, but are executed from
|
|
||||||
the `$HOME` of the given user. The scripts are not called with any
|
|
||||||
argument (currently), but both get the `SERVICE_IDENT=foo` environment
|
|
||||||
variable set. Here `foo` denotes the identity of the service, which if
|
|
||||||
there are multiple services named `foo`, may be `foo:1`, or any unique
|
|
||||||
identifier specified in the .conf file. The `post:script` is called
|
|
||||||
with an additional set of environment variables:
|
|
||||||
|
|
||||||
- `EXIT_CODE=[exited,signal]`: set to one of `exited` or `signal`
|
|
||||||
- `EXIT_STATUS=[num,SIGNAME]`: set to one of exit status code from
|
|
||||||
the program, if it exited normally, or the signal name (`HUP`,
|
|
||||||
`TERM`, etc.) if it exited due to signal
|
|
||||||
|
|
||||||
The scripts have a default execution time of 3 seconds before they are
|
|
||||||
SIGKILLed, this can be adjusted using the above `kill:SEC` syntax.
|
|
||||||
|
|
||||||
> **Note:** the `pre:script` _must_ be idempotent, because a service
|
|
||||||
> can transition between READY and HALTED states any number
|
|
||||||
> of times before going to RUNNING.
|
|
||||||
|
|
||||||
|
|
||||||
### Run-parts Scripts
|
|
||||||
|
|
||||||
**Syntax:** `runparts <DIR>`
|
|
||||||
|
|
||||||
Call [run-parts(8)][] on `DIR` to run start scripts. All executable
|
|
||||||
files, or scripts, in the directory are called, in alphabetic order.
|
|
||||||
The scripts in this directory are executed at the very end of runlevel
|
|
||||||
`S`, [bootstrap][].
|
|
||||||
|
|
||||||
It can be beneficial to use `S01name`, `S02othername`, etc. if there
|
|
||||||
is a dependency order between the scripts. Symlinks to existing
|
|
||||||
daemons can talso be used, but make sure they daemonize by default.
|
|
||||||
|
|
||||||
Similar to the `/etc/rc.local` shell script, make sure that all your
|
|
||||||
services and programs either terminate or start in the background or
|
|
||||||
you will block Finit.
|
|
||||||
|
|
||||||
> **Note:** only read and executed in runlevel S ([bootstrap][]).
|
|
||||||
|
|
||||||
[run-parts(8)]: http://manpages.debian.org/cgi-bin/man.cgi?query=run-parts
|
|
||||||
|
|
||||||
|
|
||||||
### Including Finit Configs
|
|
||||||
|
|
||||||
**Syntax:** `include <CONF>`
|
|
||||||
|
|
||||||
Include another configuration file. Absolute path required.
|
|
||||||
|
|
||||||
|
|
||||||
### General Logging
|
|
||||||
|
|
||||||
**Syntax:** `log size:200k count:5`
|
|
||||||
|
|
||||||
Log rotation for run/task/services using the `log` sub-option with
|
|
||||||
redirection to a log file. Global setting, applies to all services.
|
|
||||||
|
|
||||||
The size can be given as bytes, without a specifier, or in `k`, `M`,
|
|
||||||
or `G`, e.g. `size:10M`, or `size:3G`. A value of `size:0` disables
|
|
||||||
log rotation. The default is `200k`.
|
|
||||||
|
|
||||||
The count value is recommended to be between 1-5, with a default 5.
|
|
||||||
Setting count to 0 means the logfile will be truncated when the MAX
|
|
||||||
size limit is reached.
|
|
||||||
|
|
||||||
### TTYs and Consoles
|
|
||||||
|
|
||||||
**Syntax:** `tty [LVLS] <COND> DEV [BAUD] [noclear] [nowait] [nologin] [TERM]`
|
|
||||||
`tty [LVLS] <COND> CMD <ARGS> [noclear] [nowait]`
|
|
||||||
`tty [LVLS] <COND> [notty] [rescue]`
|
|
||||||
|
|
||||||
The first variant of this option uses the built-in getty on the given
|
|
||||||
TTY device DEV, in the given runlevels. The DEV may be the special
|
|
||||||
keyword `@console`, or `console`, useful on embedded systems.
|
|
||||||
|
|
||||||
The default baud rate is 0, i.e., keep kernel default.
|
|
||||||
|
|
||||||
> The `tty` stanza inherits runlevel, condition (and other feature)
|
|
||||||
> parsing from the `service` stanza. So TTYs can run in one or many
|
|
||||||
> runlevels and depend on any condition supported by Finit. This is
|
|
||||||
> useful e.g. to depend on `<pid/elogind>` before starting a TTY.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
tty [12345] /dev/ttyAMA0 115200 noclear vt220
|
|
||||||
|
|
||||||
The second `tty` syntax variant is for using an external getty, like
|
|
||||||
agetty or the BusyBox getty.
|
|
||||||
|
|
||||||
The third variant is for board bringup and the `rescue` boot mode. No
|
|
||||||
device node is required in this variant, the same output that the kernel
|
|
||||||
uses is reused for stdio. If the `rescue` option is omitted, a shell is
|
|
||||||
started (`nologin`, `noclear`, and `nowait` are implied), if the rescue
|
|
||||||
option is set the bundled `/libexec/finit/sulogin` is started to present
|
|
||||||
a bare-bones root login prompt. If the root (uid:0, gid:0) user does
|
|
||||||
not have a password set, no rescue is possible. For more information,
|
|
||||||
see the [Rescue Mode](#rescue-mode) section.
|
|
||||||
|
|
||||||
By default, the first two syntax variants *clear* the TTY and *wait* for
|
|
||||||
the user to press enter before starting getty.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
tty [12345] /sbin/getty -L 115200 /dev/ttyAMA0 vt100
|
|
||||||
tty [12345] /sbin/agetty -L ttyAMA0 115200 vt100 nowait
|
|
||||||
|
|
||||||
The `noclear` option disables clearing the TTY after each session.
|
|
||||||
Clearing the TTY when a user logs out is usually preferable.
|
|
||||||
|
|
||||||
The `nowait` option disables the `press Enter to activate console`
|
|
||||||
message before actually starting the getty program. On small and
|
|
||||||
embedded systems running multiple unused getty wastes both memory
|
|
||||||
and CPU cycles, so `wait` is the preferred default.
|
|
||||||
|
|
||||||
The `nologin` option disables getty and `/bin/login`, and gives the
|
|
||||||
user a root (login) shell on the given TTY `<DEV>` immediately.
|
|
||||||
Needless to say, this is a rather insecure option, but can be very
|
|
||||||
useful for developer builds, during board bringup, or similar.
|
|
||||||
|
|
||||||
Notice the ordering, the `TERM` option to the built-in getty must be
|
|
||||||
the last argument.
|
|
||||||
|
|
||||||
Embedded systems may want to enable automatic `DEV` by supplying the
|
|
||||||
special `@console` device. This works regardless weather the system
|
|
||||||
uses `ttyS0`, `ttyAMA0`, `ttyMXC0`, or anything else. Finit figures
|
|
||||||
it out by querying sysfs: `/sys/class/tty/console/active`. The speed
|
|
||||||
can be omitted to keep the kernel default.
|
|
||||||
|
|
||||||
> Most systems get by fine by just using `console`, which will evaluate
|
|
||||||
> to `/dev/console`. If you have to use `@console` to get any output,
|
|
||||||
> you may have some issue with your kernel config.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
tty [12345] @console noclear vt220
|
|
||||||
|
|
||||||
On really bare bones systems, or for board bringup, Finit can give you a
|
|
||||||
shell prompt as soon as [bootstrap][] is done, without opening any
|
|
||||||
device node:
|
|
||||||
|
|
||||||
tty [12345789] notty
|
|
||||||
|
|
||||||
This should of course not be enabled on production systems. Because it
|
|
||||||
may give a user root access without having to log in. However, for
|
|
||||||
board bringup and system debugging it can come in handy.
|
|
||||||
|
|
||||||
One can also use the `service` stanza to start a stand-alone shell:
|
|
||||||
|
|
||||||
service [12345] /bin/sh -l
|
|
||||||
|
|
||||||
|
|
||||||
### Non-privileged Services
|
|
||||||
|
|
||||||
Every `run`, `task`, or `service` can also list the privileges the
|
|
||||||
`/path/to/cmd` should be executed with. Simply prefix the path with
|
|
||||||
`[@USR[:GRP]]` like this:
|
|
||||||
|
|
||||||
run [2345] @joe:users logger "Hello world"
|
|
||||||
|
|
||||||
For multiple instances of the same command, e.g. a DHCP client or
|
|
||||||
multiple web servers, add `:ID` somewhere between the `run`, `task`,
|
|
||||||
`service` keyword and the command, like this:
|
|
||||||
|
|
||||||
service :80 [2345] httpd -f -h /http -p 80 -- Web server
|
|
||||||
service :8080[2345] httpd -f -h /http -p 8080 -- Old web server
|
|
||||||
|
|
||||||
Without the `:ID` to the service the latter will overwrite the former
|
|
||||||
and only the old web server would be started and supervised.
|
|
||||||
|
|
||||||
|
|
||||||
### Redirecting Output
|
|
||||||
|
|
||||||
The `run`, `task`, and `service` stanzas also allow the keyword `log` to
|
|
||||||
redirect `stderr` and `stdout` of the application to a file or syslog
|
|
||||||
using the native `logit` tool. This is useful for programs that do not
|
|
||||||
support syslog on their own, which is sometimes the case when running
|
|
||||||
in the foreground.
|
|
||||||
|
|
||||||
The full syntax is:
|
|
||||||
|
|
||||||
log:/path/to/file
|
|
||||||
log:prio:facility.level,tag:ident
|
|
||||||
log:console
|
|
||||||
log:null
|
|
||||||
log
|
|
||||||
|
|
||||||
Default `prio` is `daemon.info` and default `tag` is the basename of the
|
|
||||||
service or run/task command.
|
|
||||||
|
|
||||||
Log rotation is controlled using the global `log` setting.
|
|
||||||
|
|
||||||
**Example:**
|
|
||||||
|
|
||||||
service log:prio:user.warn,tag:ntpd /sbin/ntpd pool.ntp.org -- NTP daemon
|
|
||||||
|
|
||||||
|
|
||||||
Rescue Mode
|
|
||||||
-----------
|
|
||||||
|
|
||||||
Finit supports a rescue mode which is activated by the `rescue` option
|
|
||||||
on the kernel command line. See [cmdline docs](cmdline.md) for how to
|
|
||||||
activate it.
|
|
||||||
|
|
||||||
The rescue mode comes in two flavors; *traditional* and *fallback*.
|
|
||||||
|
|
||||||
|
|
||||||
### Traditional
|
|
||||||
|
|
||||||
This is what most users expect. A very early maintenance login prompt,
|
|
||||||
served by the bundled `/libexec/finit/sulogin` program, or the standard
|
|
||||||
`sulogin` from util-linux or BusyBox is searched for in the UNIX default
|
|
||||||
`$PATH`. If a successful login is made, or the user exits (Ctrl-D), the
|
|
||||||
rescue mode is ended and the system boots up normally.
|
|
||||||
|
|
||||||
> **Note:** if the user (UID 0 and GID 0) does not have a password, or
|
|
||||||
> __the account is locked__, the user is presented with a password-less
|
|
||||||
> `"Press enter to enter maintenance mode."`, prompt which opens up a
|
|
||||||
> root shell.
|
|
||||||
|
|
||||||
|
|
||||||
### Fallback
|
|
||||||
|
|
||||||
If no `sulogin` program is found, Finit tries to bring up as much of its
|
|
||||||
own functionality as possible, yet limiting many aspects, meaning; no
|
|
||||||
network, no `fsck` of file systems in `/etc/fstab`, no `/etc/rc.local`,
|
|
||||||
no `runparts`, and most plugins are skipped (except those that provide
|
|
||||||
functionality for the condition subsystem).
|
|
||||||
|
|
||||||
Instead of reading `/etc/finit.conf` et al, system configuration is read
|
|
||||||
from `/lib/finit/rescue.conf`, which can be freely modified by the
|
|
||||||
system administrator.
|
|
||||||
|
|
||||||
The bundled default `rescue.conf` contains nothing more than:
|
|
||||||
|
|
||||||
runlevel 1
|
|
||||||
tty [12345] rescue
|
|
||||||
|
|
||||||
The `tty` has the `rescue` option set, which works similar to the board
|
|
||||||
bring-up tty option `notty`. The major difference being that `sulogin`
|
|
||||||
is started to query for root/admin password. If `sulogin` is not found,
|
|
||||||
`rescue` behaves like `notty` and gives a plain root shell prompt.
|
|
||||||
|
|
||||||
If Finit cannot find `/lib/finit/rescue.conf` it defaults to:
|
|
||||||
|
|
||||||
tty [12345] rescue
|
|
||||||
|
|
||||||
There is no way to exit the *fallback* rescue mode.
|
|
||||||
|
|
||||||
|
|
||||||
Limitations
|
|
||||||
-----------
|
|
||||||
|
|
||||||
As of Finit v4 there are no limitations to where `.conf` settings can be
|
|
||||||
placed. Except for the system/global `rlimit`, which can only be set
|
|
||||||
from `/etc/finit.conf`, since it is the first `.conf` file Finit reads.
|
|
||||||
|
|
||||||
Originally, `/etc/finit.conf` was the only way to set up a Finit system.
|
|
||||||
Today it is mainly used for bootstrap settings like system hostname,
|
|
||||||
early module loading for watchdogd, network bringup and system shutdown.
|
|
||||||
These can now also be set in any `.conf` file in `/etc/finit.d`.
|
|
||||||
|
|
||||||
There is, however, nothing preventing you from having all configuration
|
|
||||||
settings in `/etc/finit.conf`.
|
|
||||||
|
|
||||||
> **Note:** The `/etc/finit.d` directory was previously the default
|
|
||||||
> Finit [runparts](#run-parts-scripts) directory. Finit no
|
|
||||||
> longer has a default `runparts`, make sure to update your
|
|
||||||
> setup, or the finit configuration, accordingly.
|
|
||||||
|
|
||||||
|
|
||||||
Watchdog
|
|
||||||
--------
|
|
||||||
|
|
||||||
When built `--with-watchdog` a separate service is built and installed
|
|
||||||
in `/libexec/finit/watchdogd`. If this exists at runtime, and the WDT
|
|
||||||
device node exists, Finit will start it and treat it as the elected
|
|
||||||
watchdog service to delegate its reboot to. See [bootstrap][] for
|
|
||||||
details. This delegation is to ensure that the system is rebooted by a
|
|
||||||
hardware watchdog timer -- on many embedded systems this is crucial to
|
|
||||||
ensure all circuits on the board are properly reset for the next boot,
|
|
||||||
in effect ensuring the system works the same after both a power-on and
|
|
||||||
reboot event.
|
|
||||||
|
|
||||||
The delegation is performed at the very last steps of system shutdown,
|
|
||||||
if reboot has been selected and an elected watchdog is known, first a
|
|
||||||
`SIGPWR` is sent to advise watchdogd of the pending reboot. Then, when
|
|
||||||
the necessary steps of preparing the system for shutdown (umount etc.)
|
|
||||||
are completed, Finit sends `SIGTERM` to watchdogd and puts itself in a
|
|
||||||
10 sec timeout loop waiting for the WDT to reset the board. If a reset
|
|
||||||
is not done before the timeout, Finit falls back to`reboot(RB_AUTOBOOT)`
|
|
||||||
which tells the kernel to do the reboot.
|
|
||||||
|
|
||||||
An external watchdog service can also be used. The more advanced cousin
|
|
||||||
[watchdogd](https://github.com/troglobit/watchdogd/) is the recommended
|
|
||||||
option here. It can register itself with Finit using the same IPC as
|
|
||||||
`initctl`. If the bundled watchdogd is running a hand-over takes place,
|
|
||||||
so it's safe to have both services installed on a system. For the
|
|
||||||
hand-over to work it requires that the WDT driver supports the safe exit
|
|
||||||
functionality where `"V"` is written to the device before closing the
|
|
||||||
device descriptor. If the kernel driver has been built without this,
|
|
||||||
the only option is to remove `/libexec/finit/watchdogd` or build without
|
|
||||||
it at configure time.
|
|
||||||
|
|
||||||
[bootstrap]: bootstrap.md
|
|
||||||
@@ -1,63 +0,0 @@
|
|||||||
Finit Signals
|
|
||||||
=============
|
|
||||||
|
|
||||||
Finit is often used on embedded and small Linux systems with BusyBox.
|
|
||||||
Though Finit comes with its own tools for (poweroff, halt, reboot), for
|
|
||||||
compatibility with the existing BusyBox toolset the following signals
|
|
||||||
have been adopted:
|
|
||||||
|
|
||||||
`SIGHUP`
|
|
||||||
--------
|
|
||||||
|
|
||||||
Same effect as `finit q`, `init q`, or `initctl reload`, reloads all
|
|
||||||
*.conf files in `/etc/finit.d/`
|
|
||||||
|
|
||||||
This also restarts the API (initctl) socket, like SysV init and systemd
|
|
||||||
does on USR1 with their FIFO/D-Bus.
|
|
||||||
|
|
||||||
|
|
||||||
`SIGUSR1`
|
|
||||||
---------
|
|
||||||
|
|
||||||
Since Finit 4.1 this signal causes Finit to restart its API (initctl)
|
|
||||||
socket, like SysV init and systemd does on USR1 with their FIFO/D-Bus.
|
|
||||||
|
|
||||||
Finit <= 4.0 performed a system halt (like USR2 without power-off), but
|
|
||||||
this caused compatibility problems with systemd and sysvinit on desktop
|
|
||||||
systems. Hence, since Finit 4.1 it is no longer possible to halt a
|
|
||||||
system with a signal.
|
|
||||||
|
|
||||||
|
|
||||||
`SIGUSR2`
|
|
||||||
---------
|
|
||||||
|
|
||||||
Calls shutdown hooks, including `HOOK_SHUTDOWN`, stopping all running
|
|
||||||
processes, and unmounts all file systems. Then tells kernel to power
|
|
||||||
off the system, if ACPI or similar exists to actually do this. If the
|
|
||||||
kernel fails power-off, Finit falls back to halt.
|
|
||||||
|
|
||||||
SysV init N/A, systemd dumps its internal state to log.
|
|
||||||
|
|
||||||
`SIGTERM`
|
|
||||||
---------
|
|
||||||
|
|
||||||
Like `SIGUSR2`, but tell kernel to reboot the system when done.
|
|
||||||
|
|
||||||
SysV init N/A, systemd rexecutes itself.
|
|
||||||
|
|
||||||
`SIGINT`
|
|
||||||
--------
|
|
||||||
|
|
||||||
Sent from kernel when the CTRL-ALT-DEL key combo is pressed. SysV init
|
|
||||||
and systemd default to reboot with `shutdown -r`.
|
|
||||||
|
|
||||||
Finit currently forwards this to `SIGTERM`.
|
|
||||||
|
|
||||||
`SIGPWR`
|
|
||||||
--------
|
|
||||||
|
|
||||||
Sent from a power daemon, like `powstatd(8)`, on changes to the
|
|
||||||
UPS status. Traditionally SysV init read /etc/powerstatus and
|
|
||||||
acted on "OK", "FAIL", or "LOW" and then removed the file.
|
|
||||||
Finit currently forwards this to `SIGUSR2`.
|
|
||||||
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 138 KiB |
@@ -1,5 +1,4 @@
|
|||||||
Contributor Code of Conduct
|
# Contributor Code of Conduct
|
||||||
===========================
|
|
||||||
|
|
||||||
As contributors and maintainers of this project, and in the interest of
|
As contributors and maintainers of this project, and in the interest of
|
||||||
fostering an open and welcoming community, we pledge to respect all
|
fostering an open and welcoming community, we pledge to respect all
|
||||||
@@ -66,6 +66,9 @@ how `git commit -s` is used to automatically add a `Signed-off-by`:
|
|||||||
Signed-off-by: Jane Doe <jane.doe@example.com>
|
Signed-off-by: Jane Doe <jane.doe@example.com>
|
||||||
|
|
||||||
|
|
||||||
|
Another good *counter* example [is this][rambling] ...
|
||||||
|
|
||||||
|
|
||||||
Code of Conduct
|
Code of Conduct
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
@@ -76,4 +79,11 @@ Bill & Ted; [be excellent to each other][conduct].
|
|||||||
[github]: https://github.com/troglobit/finit/
|
[github]: https://github.com/troglobit/finit/
|
||||||
[KNF]: https://en.wikipedia.org/wiki/Kernel_Normal_Form
|
[KNF]: https://en.wikipedia.org/wiki/Kernel_Normal_Form
|
||||||
[gitbook]: https://git-scm.com/book/ch5-2.html
|
[gitbook]: https://git-scm.com/book/ch5-2.html
|
||||||
[conduct]: CODE-OF-CONDUCT.md
|
[rambling]: http://stopwritingramblingcommitmessages.com/
|
||||||
|
[conduct]: https://github.com/troglobit/finit/blob/master/CODE-OF-CONDUCT.md
|
||||||
|
|
||||||
|
<!--
|
||||||
|
-- Local Variables:
|
||||||
|
-- mode: markdown
|
||||||
|
-- End:
|
||||||
|
-->
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
docsdir := @docdir@/docs
|
||||||
|
docs_DATA = config.md conditions.md distro.md inetd.md plugins.md \
|
||||||
|
service.md signals.md svc-machine.png cmdline.md
|
||||||
|
EXTRA_DIST = $(docs_DATA)
|
||||||
+116
@@ -0,0 +1,116 @@
|
|||||||
|
Goals of Finit
|
||||||
|
==============
|
||||||
|
|
||||||
|
The intent of finit is to monitor not just processes, but to supervise
|
||||||
|
an entire system and the behavior of certain processes that declare
|
||||||
|
themselves to be finit compliant. Similar to launchd, the goal of
|
||||||
|
finit is to be a replacement for:
|
||||||
|
|
||||||
|
* init
|
||||||
|
* inetd
|
||||||
|
* crond
|
||||||
|
* watchdogd
|
||||||
|
|
||||||
|
A small and simple replacement, primarily for embedded systems, with a
|
||||||
|
low dependency on external packages. A compliant software is one that
|
||||||
|
can run as a damon in the foreground. If it can also touch its PID file
|
||||||
|
after a reconfiguration (`initctl reload`), the Finit dependency system
|
||||||
|
can also be used.
|
||||||
|
|
||||||
|
|
||||||
|
Near Future
|
||||||
|
-----------
|
||||||
|
|
||||||
|
* Merge UDP redirect service uredir as an UDP inetd variant
|
||||||
|
* Add `finit.conf` support for UPS notification (SIGPWR) to start a task
|
||||||
|
using, e.g. <sys/power/{ok,fail,low}> conditions. More info in sig.c
|
||||||
|
* Add `finit.conf` support for ctrl-alt-delete (SIGINT) and kbrequest,
|
||||||
|
i.e. KeyboardSignal, (SIGWINCH) behavior. Using conditions to a task,
|
||||||
|
e.g, <sys/key/ctrlaltdel> and <sys/key/signal> like SIGPWR handling.
|
||||||
|
* Cron/At support, see below
|
||||||
|
* Write man pages for finit and `finit.conf`, steal from the excellent
|
||||||
|
`pimd` man pages ...
|
||||||
|
|
||||||
|
|
||||||
|
General
|
||||||
|
-------
|
||||||
|
|
||||||
|
* Add support for timed shutdown in Finit, including cancelled shutdown,
|
||||||
|
possibly using an at-job, see [crond section](#Crond) below
|
||||||
|
* Add support for JSON output, or similar, from `initctl show`, e.g.
|
||||||
|
`initctl show --json`
|
||||||
|
* [Solaris SMF][] (Service Management Facility) has some interesting
|
||||||
|
features that may be well worth looking into adopting:
|
||||||
|
|
||||||
|
svcs enable -rt svc:/network/ssh:default
|
||||||
|
|
||||||
|
That is: (r)esolve dependencies and only enable ssh (t)emporary
|
||||||
|
in the default runlevel when networking is available.
|
||||||
|
* `initctl add /sbin/service -n -- Service description`, for details
|
||||||
|
see above [Solaris SMF][] featuer, issue #55 and issue #69,
|
||||||
|
https://github.com/troglobit/finit/issues/69#issuecomment-287907610
|
||||||
|
* Changing the name of a pidfile, `pid:[/path/]file.pid`, after a
|
||||||
|
service has been started is not supported atm. The previous name will
|
||||||
|
not be (never) removed and the new name will not be created until the
|
||||||
|
process has been stopped and started again.
|
||||||
|
* PID files created in subdirectories to `/run` is not supported right
|
||||||
|
now inotify listeners should be automatically created (and removed)
|
||||||
|
when a subdirectory is added (or removed).
|
||||||
|
|
||||||
|
[Solaris SMF]: http://www.oracle.com/technetwork/articles/servers-storage-admin/intro-smf-basics-s11-1729181.html
|
||||||
|
|
||||||
|
|
||||||
|
Init
|
||||||
|
----
|
||||||
|
|
||||||
|
Finit in itself is not SysV Init compatible, it doesn't use `/etc/rc.d`
|
||||||
|
and `/etc/inet.d` scripts to boot the system. However, a plausible way
|
||||||
|
to achieve compatibility would be to add a plugin to finit which reads
|
||||||
|
`/etc/inittab` to be able to start standard Linux systems.
|
||||||
|
|
||||||
|
|
||||||
|
Inetd
|
||||||
|
-----
|
||||||
|
|
||||||
|
* Add support for throttling connections.
|
||||||
|
* Optimize interface filtering by using socket filter. The functions
|
||||||
|
`inet_*_peek()` and `inetd_is_allowed()` used for interace filtering
|
||||||
|
should be possible to rewrite as socket filters.
|
||||||
|
* Optimize HTTP/HTTPS inetd connections by adding basic support for the
|
||||||
|
`inetd` variant `redir http/tcp@eth0 nowait [2345] 127.0.0.1:8080`,
|
||||||
|
which would reduce the overhead of spawn the web server on each HTTP
|
||||||
|
connection, yet still provide a means of filtering access per iface.
|
||||||
|
|
||||||
|
|
||||||
|
Crond
|
||||||
|
-----
|
||||||
|
|
||||||
|
Requirements are quite rudimentary, basic cron functionality, mainly
|
||||||
|
system-level timed periodic tasks:
|
||||||
|
|
||||||
|
* Periodically run a task, in a matching runlevel
|
||||||
|
* Optionally run as non-root (`crontab -e` as operator)
|
||||||
|
|
||||||
|
Proposed syntax:
|
||||||
|
|
||||||
|
# Crontab
|
||||||
|
cron @SPEC [LVLS] /path/to/cmd [ARGS] -- Optional descr
|
||||||
|
|
||||||
|
# One-shot 'at' command
|
||||||
|
at @YY-mm-ddTHH:MM [LVLS] /path/to/cmd [ARGS] -- Optional descr
|
||||||
|
|
||||||
|
Notice the ISO date in the `at` notation. The `cron @SPEC` could use
|
||||||
|
are mo loose notation, e.g. `@hourly`, `@midnight`, `@daily`, `@weekly`,
|
||||||
|
`@reboot`, etc. The runlevels is extra filtering sugar. E.g., if cron
|
||||||
|
service is only allowed in runlevels two or three it will not start if
|
||||||
|
system currently is in runlevel four.
|
||||||
|
|
||||||
|
To run a command as another user the `.conf` file must have a that
|
||||||
|
owner. E.g., `/etc/finit.d/extra.conf` may be owned by operator and
|
||||||
|
only hold `cron ...` lines.
|
||||||
|
|
||||||
|
What would be extremely useful is if `initctl`, or a homegrown `at`,
|
||||||
|
could support the basic functionality of the `at` command directly from
|
||||||
|
the shell -- that way setting up one-time jobs would not entail
|
||||||
|
re-reading `/etc/finit.conf`
|
||||||
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user