1 # Archnosh is nosh for Archlinux
3 This repository provides the build files necessary to integrate the [nosh](https://jdebp.eu/Softwares/nosh/) system and service manager with Archlinux package management.
5 The packaging here closely follows the [Debian packaging](https://jdebp.eu/Softwares/nosh/debian-binary-packages.html) provided by the author of nosh.
10 With caution! Installing some of the nosh packages provided here can profoundly change the way your system bootstraps and runs services.
12 Furthermore, the packages have so far been tested locally on virtual machines with minimum installs of early 2017 Archlinux releases and on a personal laptop, where they *do* work for the most part but tailoring to your system will be necessary.
19 This is a [split-package](https://www.archlinux.org/pacman/PKGBUILD.5.html#_package_splitting) PKGBUILD which will generate packages covering the toolset aswell as a service bundle collection which together can provide a complete working system.
21 Use the latest available released archive, i.e. the latest tagged git commit.
26 The make dependencies are the following and require [AUR](https://wiki.archlinux.org/index.php/Aur) access to be set up:
28 * [pax](https://aur.archlinux.org/packages/pax/) (AUR)
29 * [redo-jdebp](https://aur.archlinux.org/packages/redo-jdebp/) (AUR)
30 * [libtinfo](https://aur.archlinux.org/packages/libtinfo/) (AUR)
31 * [xmlto](https://www.archlinux.org/packages/extra/x86_64/xmlto/) (Extra)
32 * [docbook-xml](https://www.archlinux.org/packages/extra/any/docbook-xml/) (Extra)
33 * [docbook-xsl](https://www.archlinux.org/packages/extra/any/docbook-xsl/) (Extra)
35 For [package building](https://wiki.archlinux.org/index.php/Arch_Build_System) in general, ensure the [base-devel](https://www.archlinux.org/groups/x86_64/base-devel/) package is installed.
38 #### Build the packages
40 Put the files in a directory and run:
44 You can then install the generated packages with:
46 # pacman -U <package-name>
51 Read the [timorous admin's installation how-to](https://jdebp.eu/Softwares/nosh/timorous-admin-installation-how-to.html).
53 The following describes the two expected common setups.
55 Both assume that you are running the default [systemd](https://wiki.archlinux.org/index.php/Systemd)-managed install.
58 #### nosh service manager only: nosh-run-via-systemd
60 It is possible to run nosh as a service manager alongside systemd.
62 The following packages are necessary:
66 * nosh-service-management
67 * nosh-terminal-management
69 * nosh-run-via-systemd
70 * nosh-run-debian-server-base or nosh-run-debian-desktop-base
72 Due to Archlinux's default preset *disable* policy (`/usr/lib/systemd/system-preset/99-default.preset`), you need to enable the following unit:
74 # systemctl enable service-manager.socket
76 Then you should enable one or both of:
78 * system-control-normal.service
79 * service-manager-svscan.path
81 `system-control-normal.service` uses nosh [targets](https://jdebp.eu/Softwares/nosh/guide/anatomy-of-system-target.html) to bring up enabled services. Simply run `system-control enable <service>` and `systemctl disable <service>` for its equivalent in order to switch management of the service over to nosh.
83 `service-manager-svscan.path` will scan and bring up any service bundle you place in the `/service` directory (which you will have to create), effectively enabling it. This is the more typical daemontools [approach](https://cr.yp.to/daemontools/faq/create.html#why).
85 It's probably simpler to stick to just one of these methods.
87 Creating preset files for these units will also ensure their enabled/disabled status in case of package upgrades.
89 Also make sure to check the presets provided by the chosen `nosh-run-debian-X-base` package, they will activate *some* services by default.
92 #### nosh system and service manager: nosh-run-system-manager
94 For a fully nosh-managed system, i.e. nosh running as the init process and service manager, install the following packages:
99 * nosh-service-management
100 * nosh-terminal-management
102 * nosh-run-system-manager
103 * nosh-run-udev or nosh-run-systemd-udev
105 * nosh-run-debian-server-base or nosh-run-debian-desktop-base
106 * nosh-run-local-syslog
109 Installing these packages will raise a lot of the following errors:
111 reset: ERROR: connect: /run/service-manager/control: No such file or directory
113 This is due to the fact that nosh isn't actually properly running yet but is not an issue. The system will work properly after a reboot (`system-control reboot`).
118 The installation above assumes udev is the device manager, which is provided by the [systemd](https://www.archlinux.org/packages/core/x86_64/systemd/) package on Archlinux.
120 The easiest method is to simply use the binaries and configuration files provided by this package to run udev. The `nosh-run-systemd-udev` package will do just that and everything should work transparently. This means all udev configuration rules already set up should work as-is.
125 Alternatively you may wish to use the [eudev](https://wiki.gentoo.org/wiki/Eudev) implementation rather than keeping the systemd package for udev functionality.
127 We will detail the installation of [eudev](https://aur.archlinux.org/packages/eudev/), [libeudev](https://aur.archlinux.org/packages/libeudev/), [eudev-systemd](https://aur.archlinux.org/packages/eudev-systemd/) and [libeudev-systemd](https://aur.archlinux.org/packages/libeudev-systemd/) (available from the AUR) which should provide a drop-in replacement for systemd/udev.
131 This conflicts with the libsystemd package, you should remove it but it will almost certainly be a dependency for other packages on your system so run:
133 # pacman -dd -S libeudev
135 The `-d` (or `--nodeps`) repeated option skips dependency checking. You will be providing replacements for these dependencies.
137 It might also fail to install due to the following pre-existing files: `/usr/include/libudev.h` and `/usr/lib/pkgconfig/libudev.pc`. Remove these manually.
139 2. Install libeudev-systemd
141 This will provide the `libsystemd.so` libraries.
145 This conflicts with the systemd package and, again, will doubtless bring up many dependency warnings so run:
147 # pacman -dd -S eudev
149 4. Install eudev-systemd
151 This will provide some shim systemd binaries and libraries.
153 The `nosh-run-udev` package will run the `udevd` binary, provided by eudev here.
155 From there you will have a working udev and some systemd shims which should allow installing most packages without too much trouble.
157 Run-packages for other device managers are provided: vdev, busybox-mdev and suckless-mdev. You will probably need to account for Archlinux's rather heavy systemd/udev integration in order to use them.
162 The `nosh-run-debian-X-base` packages have not currently been renamed but one of them must be used.
164 They provide essential presets for booting your system. The "desktop-base" extends the "server-base" presets.
166 Make sure to check, modify or add preset files where necessary in `/usr/share/system-control/presets`.
168 The `90-*-boot-essentials.preset` files, in particular, contain services for [mounting filesystems](https://jdebp.eu/Softwares/nosh/guide/fstab.html), for loading necessary kernel modules, service targets to achieve etc.
171 ##### per-user service management
173 For user-controlled services, a [per-user manager](https://jdebp.eu/Softwares/nosh/guide/per-user-manager.html) can be enabled for user *my_user* with:
175 # system-control enable user@my_user
177 This will start [per-user service management](https://jdebp.eu/Softwares/nosh/guide/per-user-system-services.html) for *my_user* on system boot.
179 User service bundles can be placed under `$HOME/.config/service-bundles/services/` and controlled with:
181 $ system-control --user <command>
186 Service bundles are available for various network managers, such as Wicd and NetworkManager.
188 A `dhcpcd@` service (the [default enabled tool](https://wiki.archlinux.org/index.php/Installation_guide#Connect_to_the_Internet) for wired devices on Archlinux) is generated for each interface and is preset enabled by `90-linux-static-networking.preset`.
190 To activate it, add the following lines in `/etc/rc.conf` or `/etc/rc.conf.local`:
192 dhclient_program=dhcpcd
193 ifconfig_<your-interface>=DHCP
195 Don't forget to run `redo all` after applying configuration changes. Check `/etc/system-control/convert/static-networking` to make sure your interface is set to `on`.
197 ##### non-root Xorg and device access
199 Since we are not using systemd's `logind`, starting X as an unpriviledged user requires adding that user to the "input" and "video" groups.
201 See [https://wiki.gentoo.org/wiki/Non_root_Xorg](https://wiki.gentoo.org/wiki/Non_root_Xorg) for further details.
203 In the same vein, other device access may no longer work for unpriviledged users. You will probably have to add users to the "audio" group to use a soundcard for instance.
205 [elogind](https://github.com/elogind/elogind) might conceivably be used to achieve systemd behaviour here.
210 Various "shim" packages exist to provide the following:
212 1. Commands from other service or system managers that will invoke the corresponding nosh management actions, e.g. nosh-debian-shims, nosh-systemd-shims, nosh-upstart-shims, etc.
214 2. Utilities which may be provided by other packages, e.g. nosh-execline-shims, nosh-ucspi-tcp-shims, nosh-kbd-shims, etc.
217 ##### virtual terminals
219 Rather than kernel virtual terminals, [user-space virtual terminals](https://jdebp.eu/Softwares/nosh/user-vt-screenshots.html) may be used by installing `nosh-run-user-vt`.
221 The `nosh-execline-shims` package is necessary if you do not have [execline](https://skarnet.org/software/execline/) available.
224 ##### troubleshooting and exceptional boot modes
226 [https://jdebp.eu/Softwares/nosh/guide/troubleshooting.html](https://jdebp.eu/Softwares/nosh/guide/troubleshooting.html)
228 The link above may come in useful.
230 In certain cases your system may need to be booted in an [exceptional mode](https://jdebp.eu/FGA/emergency-and-rescue-mode-bootstrap.html).
232 * A *rescue mode* is available for nosh by appending "s" to the kernel boot parameters.
234 * An *emergency mode* is available by appending "b" to the kernel boot parameters.
237 ## Some nosh guidelines
239 The online [nosh guide](https://jdebp.eu/Softwares/nosh/guide/), also available in the `nosh-guide` package, and command [manpages](https://jdebp.eu/Softwares/nosh/guide/commands.html) provide comprehensive documentation.
241 The nosh toolset follows general [daemontools design](https://jdebp.eu/FGA/daemontools-family.html) which includes:
243 * using the filesystem as database and API: the system can be inspected and modified using standard filesystem commands
244 * logging as an ordinary --"first-class citizen"-- service
245 * chain-loading of simple utilities to build a controlled final running state
246 * composability: utilities from other toolsets in this family can be used in conjunction with nosh
248 To these features nosh [adds](https://jdebp.eu/Softwares/nosh/guide/new-interfaces.html):
250 * explicit separation of *service* and *system* management
251 * terminal management
252 * service ordering and interdependency through "service bundles" which allows for system "targets" similar to systemd
256 For a general presentation you may read the following:
258 [https://jdebp.eu/Softwares/nosh/guide/introduction.html](https://jdebp.eu/Softwares/nosh/guide/introduction.html)
263 A standard bundle will look something like this:
265 /var/sv $ tree kamailio
268 │ ├── basic -> /etc/service-bundles/targets/basic
271 │ └── shutdown -> /etc/service-bundles/targets/shutdown
273 ├── log -> ../cyclog@kamailio
282 │ └── shutdown -> /etc/service-bundles/targets/shutdown
289 │ └── server -> /etc/service-bundles/targets/server
291 └── basic -> /etc/service-bundles/targets/basic
293 The `before` and `after` directories allow for linking to other service bundles to set *ordering constraints*.
295 The `conflicts`, `required-by`, `stopped-by`, `wanted-by` and `wants` directories allow for linking to other service bundles to set *dependency constraints*.
297 The `log` directory points to a logging service.
299 The `service` directory contains the scripts used to run the service. `service/env` can be used to store configuration information.
301 The `supervise` directory contains the control/status API files.
306 Logging is a service on par with any other. In general one logging service is associated with each daemon to capture and manage its output (log rotation, capping etc.) although fan-in from multiple services to one logging service is also possible.
308 The daemontools [assumption](https://jdebp.eu/FGA/unix-daemon-design-mistakes-to-avoid.html) is that daemons log to their standard error, *not* to syslog. Specialised logging tools can then be used to manage this output.
310 More generally, daemons are expected not to implement functions such as dropping priviledges, socket management, resource limiting, etc. which could be provided by external tools, typically the daemontools family toolsets and other service managers (see the same argument for systemd's ["new-style"](https://www.freedesktop.org/software/systemd/man/daemon.html) daemons).
312 In practice, nosh [connects](https://jdebp.eu/Softwares/nosh/guide/log-service-plumbing.html) a service's standard output and error to the service pointed to by the "log" directory of the service bundle. Below are some excerpts of the `lsof` command to illustrate:
314 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
316 # the sshd service, file descriptors 1 and 2 refer to pipe 17119
317 tcp-socke 976 root cwd DIR 254,0 4096 198091 /var/sv/sshd/service
318 tcp-socke 976 root txt REG 254,0 212968 62095 /usr/bin/tcp-socket-accept
319 tcp-socke 976 root 0r FIFO 0,10 0t0 17188 pipe
320 tcp-socke 976 root 1w FIFO 0,10 0t0 17119 pipe
321 tcp-socke 976 root 2w FIFO 0,10 0t0 17119 pipe
323 # the cyclog@sshd service, file descriptor 0 refers to pipe 17119: reading sshd's stdout and stderr
324 cyclog 963 sshd-log txt REG 254,0 212968 63713 /usr/bin/cyclog
325 cyclog 963 sshd-log 0r FIFO 0,10 0t0 17119 pipe
326 cyclog 963 sshd-log 1w FIFO 0,10 0t0 8409 pipe
327 cyclog 963 sshd-log 2w FIFO 0,10 0t0 8409 pipe
328 cyclog 963 sshd-log 6w REG 254,0 0 202749 /var/log/sv/sshd/current
330 # note that cyclog@sshd's own stdout and stderr point to pipe 8409 which is actually the system-wide logger's input
331 cyclog 163 root txt REG 254,0 130984 63711 /usr/bin/system-manager
332 cyclog 163 root 0r FIFO 0,10 0t0 8409 pipe
333 cyclog 163 root 1u CHR 5,1 0t0 6547 /dev/console (deleted)
334 cyclog 163 root 2u CHR 5,1 0t0 6547 /dev/console (deleted)
335 cyclog 163 root 5w REG 0,18 81718 8433 /run/system-manager/log/current
337 # ... just as init's own stdout and stderr also point to the system-wide cyclog
338 init 1 root txt REG 254,0 130984 63711 /usr/bin/system-manager
339 init 1 root 0r CHR 1,3 0t0 6465 /dev/null
340 init 1 root 1w FIFO 0,10 0t0 8409 pipe
341 init 1 root 2w FIFO 0,10 0t0 8409 pipe
343 The "log" directory name is a bit misleading insofar as one could chain anything to the service and create an arbitrarily long pipe chain. That being said, service `run` files already use [chain-loading mechanisms](https://jdebp.eu/Softwares/nosh/guide/chain-loading-cheatsheet.html) so it generally really is a logging service that is ultimately piped to.
348 [system-control](https://jdebp.eu/Softwares/nosh/guide/system-control.html) is the system workhorse command from a user perspective.
350 It provides high-level system-wide and per-user service management (start/stop, enable/disable etc.) aswell as system management (reboot, poweroff etc.) and various other specialised commands for e.g. converting systemd-style unit files to service bundles.
353 ### Converting systemd unit files
355 `system-control convert-systemd-units <unit-file>` supports conversion for [various types](https://jdebp.eu/Softwares/nosh/guide/converting-systemd-units.html) of systemd unit files to service bundles.
357 It also understands extended syntax to express service bundle-specific functionality in a systemd-like unit file, which can be used for easy distribution for example.
359 In other words, one can benefit from existing systemd unit files through automatic conversion in many cases.
364 This repository is publicly available at the following locations:
366 1. [https://framagit.org/taca/archnosh](https://framagit.org/taca/archnosh)
367 2. [https://repo.or.cz/archnosh.git](https://repo.or.cz/archnosh.git)
368 3. [https://github.com/tacatac/archnosh](https://github.com/tacatac/archnosh)
373 These packaging configuration files are distributed under the public domain [Unlicense](https://unlicense.org/), see the UNLICENSE file provided.
375 The nosh software, however, is distributed under BSD/BSD-compatible licensing.