File: build.md

package info (click to toggle)
finit 4.14-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 5,216 kB
  • sloc: ansic: 17,060; sh: 6,281; makefile: 532
file content (192 lines) | stat: -rw-r--r-- 6,367 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
Building Finit
==============

Finit comes with a traditional configure script to control features and
optional plugins to enable.  It depends on two external libraries:

- [libuEv][], the event loop
- [libite][] (-lite), much needed frog DNA

> [!IMPORTANT]
> Most free/open source software packages that use `configure` default
> to install to `/usr/local`.  However, some Linux distributions do no
> longer search that path for installed software, e.g. Fedora and Alpine
> Linux.  To get finit's configure script to find its dependencies you
> have to help the `pkg-config` tool a bit if you do not change the
> default prefix path:
>
>     PKG_CONFIG_LIBDIR=/usr/local/lib/pkgconfig ./configure

The configure script checks for all dependencies, including the correct
version of the above mentioned libraries.  Currently required versions:

- libite v2.2.0, or later
- libuEv v2.2.0, or later


Configure
---------

Below are a few of the main switches to configure:

* `--prefix=..`: Usually you want to set this to `/usr`, default is the GNU
  default: `/usr/local`

* `--exec-prefix=..`: This you want to set to the empty string, or `/`, to
  ensure the programs `finit` and `initctl` are installed to the proper
  locations.  Linux expects an "init" in `/sbin`, default: `--prefix`

* `--sysconfdir=..`: follows `--prefix`, you likely want it to be `/etc`

* `--localstatedir=..`: follows `--prefix`, you likely want `/var`

* `--enable-static`: Build Finit statically.  The plugins will be
  built-ins (.o files) and all external libraries, except the C library
  will be linked statically.

* `--enable-kernel-cmdline`: Enable Finit pre-4.1 parsing of init args from
  `/proc/cmdline`, this is *not recommended* since Finit may be running as the
  init for container apps that can see the host's `/proc` filesystem

* `--enable-alsa-utils-plugin`: Enable the optional `alsa-utils.so` sound plugin.

* `--enable-dbus-plugin`: Enable the optional D-Bus `dbus.so` plugin.

* `--enable-resolvconf-plugin`: Enable the `resolvconf.so` optional plugin.

* `--enable-x11-common-plugin`: Enable the optional X Window `x11-common.so` plugin.

* `--with-sulogin`: Enable bundled `sulogin` program.  Default is to use the
  system `sulogin(8)`.  The sulogin shipped with Finit *allows password-less*
  login if the `root` user is disabled or has no password at all.

For more configure flags, see <kbd>./configure --help</kbd>

> [!NOTE]
> The configure script is not available in the GIT sources.  It is
> however included in (officially supported) released tarballs.  The
> idea is that you should not need GNU autotools to build, only the
> above mentioned dependencies, a POSIX shell, a C compiler and make.
> Any contributing to Finit can generate it from `configure.ac` using
> the `autogen.sh` script.


Example
-------

First, unpack the archive:

```shell
$ tar xf finit-4.3.tar.gz
$ cd finit-4.3/
```

Then configure, build and install:

```shell
$ ./configure --prefix=/usr                 --exec-prefix=         \
              --sysconfdir=/etc             --localstatedir=/var   \
              --with-keventd                --with-watchdog
$ make
.
.
.
$ DESTDIR=/tmp/finit make install
```

In this example the [finit-4.3.tar.gz][1] archive is unpacked to the
user's home directory, configured, built and installed to a temporary
staging directory.  The environment variable `DESTDIR` controls the
destination directory when installing, very useful for building binary
standalone packages.

Finit 4.1 and later can detect if it runs on an embedded system, or a
system that use BusyBox tools instead of udev & C:o.  On such systems
`mdev` instead of `udev` is used.  However, remember to also change the
Linux config to:

    CONFIG_UEVENT_HELPER_PATH="/sbin/mdev"

> [!TIP]
> If you run into problems starting Finit, take a look at `finit.c`.
> One of the most common problems is a custom Linux kernel build that
> lack `CONFIG_DEVTMPFS`.  Another is too much cruft in the system
> `/etc/fstab`.


Running
-------

Having successfully built Finit it is now be time to take it for a test
drive.  The `make install` attempts to set up finit as the system system
init, `/sbin/init`, but this is usually a symlink pointing to the
current init.

So either change the symlink, or change your boot loader (GRUB, LOADLIN,
LILO, U-Boot/Barebox or RedBoot) configuration to append the following
to the kernel command line:

```shell
append="init=/sbin/finit"
```

Remember to also set up an initial `/etc/finit.conf` before rebooting!


Recovery
--------

To rescue a system with Finit, append the following to the kernel
command line:

```shell
append="init=/sbin/finit rescue"
```

This tells Finit to start in a very limited recovery mode, no services
are loaded, no filesystems are mounted or checked, and no networking is
enabled.  The default Finit rescue mode configuration is installed into
`/lib/finit/rescue.conf`, which can be safely removed or changed.

By default the a root shell, without login, is started.

> [!IMPORTANT]
> In rescue mode `initctl` will not work, the same goes for `reboot`,
> `shutdown`, and `poweroff` commands, provided they are the Finit
> versions of these commands.  Use the `-f` flag to force the action.


Debugging
---------

Edit, or append to, the kernel command line: remove `quiet` to enable
kernel messages and add `finit.debug` to enable Finit debug messages.

```shell
append="init=/sbin/finit -- finit.debug"
```

Notice the `--` separator.

To debug startup issues, in particular issues with getty/login, add
the following to your Finit .conf file:

    tty [12345789] notty noclear

The `notty` option ensures reusing the stdin/stdout set up by the
kernel.  Remember, this is only for debugging and would leave your
production system potentially wide open.

There is also a rescue shell available, in case Finit crashes and the
kernel usually reboots: `configure --enable-emergency-shell`.  However,
the behavior of Finit is severely limited when this is enabled, so use
it only for debugging start up issues when Finit crashes.

> [!CAUTION]
> None of these options should be enabled on production systems since
> they can potentially give a user root access.


[1]:       ftp://troglobit.com/finit/finit-4.3.tar.gz
[libuEv]:  https://github.com/troglobit/libuev
[libite]:  https://github.com/troglobit/libite