synit-manual/src/operation/index.md

93 lines
4.7 KiB
Markdown
Raw Normal View History

2022-02-11 09:48:49 +00:00
# System overview
Synit uses the Linux kernel as a hardware abstraction and virtualisation layer.
All processes in the system are arranged into a [supervision
tree](../glossary.md#supervision-tree), conceptually rooted at the [system
bus](./system-bus.md) (NB. not at PID 1).
2022-02-11 12:43:39 +00:00
```ditaa system-supervision-tree
(Example)
+----------------------------------+
|Root System Bus (syndicateserver)|
+----------------+-----------------+
|
+--------+--------+---------+----------+---------------+
| | | | | |
+--+--+ +---+---+ +--+--+ +----+----+ +---+---+ +-----+-----+
|init | |console| |udevd| |Network | |Wifi | |Session bus|
+-----+ |getty | +-----+ |Interface| |Daemon | ... +-----+-----+
+-------+ |Monitor | |(wlan0)| |
|Daemon | +-------+ |
+---------+ |
|
+----------+----------------------------+
| | |
+---+---+ +--+--+ +----+---+
|Browser| |Email| . . . |X Server|
+-------+ +-----+ +--------+
```
Here's an example of `ps` output from a Synit prototype running on a mobile phone:
2022-02-11 09:48:49 +00:00
PID TTY STAT TIME COMMAND
1 ? Ssl 0:00 /sbin/synit-pid1
1034 ? Sl 0:00 /usr/bin/syndicate-server --inferior --config /etc/syndicate/boot
1045 ttyS0 Ss+ 0:00 \_ getty 0 /dev/console
1052 ? S 0:01 \_ /sbin/udevd --children-max=5
1113 ? Sl 0:11 \_ python3 /usr/lib/synit/interface-monitor
1129 ? S 0:00 \_ sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
1286 ? S 0:00 \_ wpa_supplicant -Dnl80211,wext -C/run/wpa_supplicant -i wlan0
1287 ? S 0:00 \_ udhcpc -i usb0 -fR -s /usr/lib/synit/udhcpc.script
1390 ? S 0:00 \_ ntpd -d -n -p pool.ntp.org
1431 ? S 0:01 \_ python3 /usr/lib/synit/user-settings-daemon
1497 ? Sl 0:01 \_ python3 /usr/lib/synit/wifi-daemon
1516 ? S 0:00 \_ udhcpc -i wlan0 -fR -s /usr/lib/synit/udhcpc.script
1035 ? S 0:00 s6-log t s999999 n500 /var/log/synit
## Boot process
The kernel first loads the stock PostmarketOS `initrd`, which performs a number of important
tasks and then delegates to `/sbin/init`.
### /sbin/init = synit-init.sh
- Source code: [`[synit]/packaging/packages/synit-config/files/sbin/synit-init.sh`](https://git.syndicate-lang.org/synit/synit/src/branch/main/packaging/packages/synit-config/files/sbin/synit-init.sh)
The [`synit-config` package](../install.md#build-the-packages) overrides the usual contents of
`/sbin/init`, replacing it with a short shell script, `synit-init.sh`. This script, in turn,
takes care of a few boring tasks such as mounting `/dev`, `/proc`, `/run`, etc., ensuring that
a few important directories exist, and remounting `/` as read-write before `exec`ing
`/sbin/synit-pid1`.
For the remainder of the lifetime of the system, `/sbin/synit-pid1` is the PID 1 `init`
process.
### /sbin/synit-pid1
- Source code: [`[synit]/synit-pid1/`](https://git.syndicate-lang.org/synit/synit/src/branch/main/synit-pid1)
- Packaging: [`[synit]/packaging/packages/synit-pid1/`](https://git.syndicate-lang.org/synit/synit/src/branch/main/packaging/packages/synit-pid1)
The `synit-pid1` program starts by spawning the [system bus](./system-bus.md)
(`syndicate-server` in the process tree above) and the program `/sbin/synit-log`, connecting
`stderr` of the former to `stdin` of the latter.
It then goes on to perform two tasks concurrently: the first is the Unix
[`init`](https://en.wikipedia.org/wiki/Init) role, reaping zombie processes, and the second is
to interact with the system bus as an ordinary system service.
The latter allows the system to treat `init` just like any other part of the system, accessing
its abilities to reboot or power off the system using messages and assertions in the system
dataspace as usual.
Even though `synit-pid1` is, to the kernel, a *parent* process of `syndicate-server`, it is
logically a *child* process.
### /sbin/synit-log
- Source code: [`[synit]/packaging/packages/synit-pid1/synit-log`](https://git.syndicate-lang.org/synit/synit/src/branch/main/packaging/packages/synit-pid1/synit-log)
This short shell script invokes the [S6](../glossary.md#s6) program `s6-log` to capture log
output from the system bus, directing it to files in `/var/log/synit/`.