Systemd by Example
systemd-by-example.com
systemd-by-example.com
Adding to my favorites and will be passing this on over the years - thank you for such a great resource.
Web: https://systemd.io/
Src: https://github.com/systemd/systemd
Systemd manpage index: https://www.freedesktop.org/software/systemd/man/
https://www.freedesktop.org/software/systemd/man/systemd.htm... :
man 1 systemd
man systemd
man init
...: man systemctl
man journalctl
man systemd.timer
man systemd-resolved
The Arch Linux wiki docs for systemd are succinct:
https://wiki.archlinux.org/title/systemdFedora docs > "Understanding and administering systemd" https://docs.fedoraproject.org/en-US/quick-docs/understandin...
RHEL7 System Administrator’s Guide > "Chapter 10. Managing Services with SystemD" https://access.redhat.com/documentation/en-us/red_hat_enterp...
I think systemd.directives(7) is an often overlooked manpage.
To get the big picture I read the systemd posts on https://0pointer.net/blog/archives.html But that's 10 years already! No idea what would be recommended today.
These sorta landmines when trying to just research/digest a concept can really suck. OP's tool really eloquently breaks things down to _just_ core concepts so you can quickly start to grok what I consider to be a relatively complex tool.
Overall I use the Arch wiki very often and it's because of the exact point you're making - I'm just being pedantic saying those slight distro differences can be a pain.
Lots of folks learn by example and hands-on labs. Personally, I'd much rather learn the basic ropes by jumping into a tool like OP's vs. finding/digging through all of these resources. I'll also criticize to say you likely already know much about systemd, and were able to pull/filter these resources much easier vs someone completely new to the concepts.
To illustrate further: vim is another tool that has outstanding learning resources, everything from very quick "hey get started" examples docs all the way up to adventure games. If I had to go back and relearn vim I would absolutely do it this way vs. digging on man pages like when I was a kid in the 90's. Personally, I learn by doing.
---
Overall - OP's thingy is what I would call a "rich interactive learning tool." It's anecdotal, and obvious projection - but _for me_, interactive learning tools optimize the time it takes to fully "grok" a subject from scratch vs. jumping into a bunch of docs/man pages.
~Examples as Integration Tests as executable notebooks with output and state assertions may incur less technical debt.
How to manage containers with [MicroShift] k8s/k3d with systemd might be a good example.
Systemd man pages source: https://github.com/systemd/systemd/tree/main/man
Also https://www.freedesktop.org/software/systemd/man/systemd.mou... https://github.com/systemd/systemd/blob/main/man/systemd-mou... :
man systemd.mountThe docs are not friendly enough to introduce you to new tools, and they're mostly shallow enough to not explain the technical details of how things interact or where all the defaults are stored. They exist but clearly this page exists because they need to improve.
I know, I know, pull requests welcome....
Hopefully this guide will stay up to date given the "move fast, break things, wontfix" approach the systemd authors currently have with the project.
The core dependency principles around targets, services and startup does not see a lot of change, so this concern is not really realistic. You'll see more of this around the supporting utilities (networkd, resolved, and so on).
In fairness, quite often I've found this is often a case of exposing existing brokenness rather than creating new problems, but it doesn't make it any more comfortable when it happens.
I don't understand where anyone is getting this impression from, that describes the opposite of my experience with systemd. The authors publish stability guarantees, and they have done so for several years: https://systemd.io/PORTABILITY_AND_STABILITY/
But for some reason, the authors occasionally say something that feels completely out of place for the project. They fix important stuff eventually, but sometimes it gets confusing to watch them discuss it.
The "Invalid username runs a service as root" bug is a good example of something that they didn't seem to take seriously. But it's fixed now.
Also, PulseAudio. Pulse is good. It's not that great and was deployed before it's ready on some distros. The whole Pulse/Jack split that is only just now being fixed was annoying.
Some people might still judge Poettering based on 10yo bugs in Pulse rollout?
I think the duct tape and string feeling comes from the obsession with smallness and modularity and people trying to make "Linux not be like windows".
Half the FOSS scene WANTS things to be taped together because their main thing is random tinkering.
Again, I didn't want my comment to start a heated discussion about systemd, but inevitably that happens. If I had praised it someone else would have come along to tell me how much it sucks (I don't think it sucks, personally, I just have issues with its current development process).
https://bugs.freedesktop.org/show_bug.cgi?id=76935#c10
----- Adding "hacks" but not testing to ensure said hacks don't cause issues:
Lennart Poettering 2014-02-21 13:49:25 UTC
To make this work we'd need a patch, as nobody of us tests this.
Comment 3 Michael Shigorin 2014-04-04 06:30:57 UTC
Hope all of you either test all the combinations or do not break at will those you don't have the time and inclination to test, at least in system-wide components that are not specific to systemd, while pushing the latter hard.
Comment 4 Lennart Poettering 2014-04-04 14:56:43 UTC
Well, cgroups-less kernels are explicitly not supported by systemd. However we added some hacks to allow it to boot to a certain degree even if a lot of things will not work correctly afterwards. In this mode when you boot you will actually get a warning on screen and bootup is delayed by 10s to make sure the user understands this.
Now, this mode recently broke, and it will segfault early on. I am happy to take a patch to 'fix' this again, but I will not work on this as i dont run kernels like this, and as mentioned its not really supported anyway...
Another option is to simply be honest amd stop supporting in entirely, and refuse booting completely. And I figure this is what I will eventually do if nobody cares enough to send me a patch to fix that segfault.
This is why I don't like to talk about systemd on any internet forum; it always leads to people like you ready to attack any position around the subject, and me having to defend a position I don't even hold (I don't think systemd sucks, I think its developers could do better though). I am done with this thread.
I also love how the web application works without requiring multiple JavaScript dependencies hosted on third-party servers.
¹ https://seb.jambor.dev/posts/systemd-by-example-part-1-minim...
I found the gobyexample site to be invaluable when I first encountered the language, and now I send people there BEFORE I send them to the official go docs (which is saying something - because the official docs are great!).
Here's hoping we can get well-structured documentation that scaffolds like these to replace most medium posts in the top results of most Google searches! :-)
Thank you.
1. On desktop the old init systems were quite good already, before systemd was introduced. Systemd made it better, as I've been told: I never had any beef with it (oh boy did I have beef with init systems in the old days, not only on desktop...), I did not do any benchmarks to see that it shaved off a few seconds in startup time (and helps remove lots of fragile network mgmt code).
2. On server I now use Docker. It has no init system. And when I need one I use one that fits the docker world (i.e. supervisor).
Apologies that I can't link directly to the "--init" flag but docker actually does have an init, it's just (err, was?) compiled into the binary: https://docs.docker.com/engine/reference/commandline/run/#op...
My recollection is that it either adopted, or inspired, https://github.com/Yelp/dumb-init#readme which folks used to put into their Dockerfile as the init system back in the day
Folks (ahem, I'm looking at you, eks-anywhere[0]) who bundle systemd into a docker container are gravely misguided, and the ones which do so for the ability to launch sshd alongside the actual container's main process are truly, truly lost
0: https://github.com/aws/eks-anywhere/issues/838#issuecomment-...
Good tip, I would like something that that's offered by my $distro.
The feature creep here is immense despite the claims it's modular because individual executables do fixed tasks...
Don't get me wrong I understand the power of systems but it's not written with a OG UNIX mindset in mind which is a little sad.
I really like systemd, and I really don't like supervisor. So I'd love to figure out how to make this work.
I know the easiest thing would be to ignore the user mode business and just use podman, where the work has already been done [1], but at least in the short term that doesn't help for more restricted environments like cloud kubernetes.
[1]: https://www.redhat.com/sysadmin/improved-systemd-podman
However, there are lots of applications out there (especially legacy ones, think stuff like Zoneminder) which are made up of multiple small daemon-type processes sharing state across ports and maybe even the filesystem, and have a strong reliance on system services like cron or log rotation. Yes, with effort an application like this could be be fully "ported" to a container-native setup, but the path of least resistance is often to just make the container environment present as being more like a full VM.
I prefer to just avoid any application that requires a service to in any way be configured to account for the app.
It's bad enough that Zigbee2MQTT is a separate process, but it's acceptable because it is a pure layering model and as long as you are local only and not needing passwords, there's no manual config.
Things like ZM that need an actual database are just insane. Multi-page configuration instructions for something that the(Sadly closed source) AgentDVR does with one process, no containers, no major configuration to conflict with anything else.
But modular apps exist, so we need containers to make them act like monoliths.
My interim solution is running docker containers as user, using a simple USER directive. Straightforward and still added security benefits.
This article led me to believe that I could run systemd in an unprivileged docker (not podman) container, but I did not find that to be the case. It was not happy until I added `--cap-add=SYS_ADMIN` capability, and then it started working.
but the short of it is it creates a limited remote container and pipes the CLI back and forth.