Escape from System D, episode VIII: the Road Behind is Longer
20 August 2023, #dinit
Summary: Dinit reaches beta with 0.17 release!
Ok, well. This has certainly been a long time coming. According to my records (in the form of blog posts mainly) I first announced Dinit to the wider world in June 2017. By that time I'd been working on it for around 2 years already - as a hobby, on-and-off. Development has continued, at what sometimes feels like a glacial pace, since then: I simply don't have as much time that I'd like to be able to devote to it (nor the funds to be able to put aside bread-winning concerns in order to make that time).
That initial announcement was met with some encouragement, and some derision. I had set lofty goals, and there were plenty who were happy to fire snide remarks, criticise my level of experience (even if they knew nothing about me), attack my choice of programming language, accuse me of hubris, etc. But the encouragement was enough to offset it! I'll be ever grateful who simply said "good luck!" and told me to ignore the trolls. Some of them also offered great advice.
However, I won't talk about the history further; I've covered it in other blog posts. What's more important is what has been happening more recently.
In the previous "episode" post, I mentioned that I had used Dinit to experimentally boot both Alpine Linux and FreeBSD, and that I was finally considering Dinit to be at "alpha" stage. Earlier still, I had lamented that:
I’d love to have a distribution decide to give Dinit a try, but of course I have to face the possibility that this will never happen.
Amazingly, there are now at least two distributions which allow use of Dinit as the init system. One is Chimera, the other is Artix. These are both great distributions (but with different goals and likely appealing to different sets of users). A lot of the reviews of Artix on Distrowatch are mentioning Dinit in a really positive light, which is fantastic (Artix also allows the use of runit, OpenRC, and S6 as init system). Meanwhile, Wesley Moore has written about his experiences trying out Chimera Linux. He writes of Dinit specifically:
Nothing to really say here. It's fast and has worked fine.
While that's less glowing than some of the praise from the Artix side, it's probably more in line with my idea for how an init system should be perceived. Putting it another way, your (or your distribution's) use of some init system or another really shouldn't be the defining aspect of your experience of the system. An init-system-slash-service-manager should in general work quietly, quickly, and otherwise keep out of the way. On the other hand if you do need to deal with it - if you're on the system administration or development side of things - it should be comprehensible, reasonably simple, but functional and capable. I'd like to think that Dinit's hitting that mark, too, or somewhere near it.
Somewhere along the line, Dinit picked up a secondary maintainer - Mobin Aydinfar, who wrote a message on Github expressing how much he liked Dinit and that he would like to help in maintaining it. Though I had my doubts, I accepted his offer, and Mobin has since done some great work setting up Github-based CI for Dinit (including FreeBSD builds via CircleCI). Even more than that, he has implemented a number of minor features for Dinit. I'm a harsh critic of PRs and (when it comes to my own hobby-horse software) a perfectionist, and I'm glad that Mobin has put up with this; his contributions have been valuable.
Many others have made contributions too - too many to list here, but thanks are due especially to Daniel Kolesa (maintainer of Chimera) who has provided insights into what features were really needed for system integration, as well as making occasional code contributions. On the Artix side, konimex did the Artix integration and is "the dinit guy" for Artix.
I now have a small amount of monthly sponsorship for Dinit (via Github Sponsors). I'm presently receiving just about enough to keep this website running; the main benefit, though, is that the knowledge that people consider it worthwhile helps to motivate me to continue working on Dinit. (I also received some one-off funding from Artix, which I've put aside but may use for a conference or similar at some point).
Since the last post, there have been 8 releases, all labeled as alphas, though two of them (0.15.1 and 0.16.1) actually being bugfix-only releases. Despite the "alpha" label, Dinit has generally proved to be very stable (an ever growing testsuite helps!). As well as some bug fixes, a whole bunch of new (but generally planned) features have been added in these versions (check the release notes for versions 0.11 through 0.16.1).
More recently, I have added some additional features I think are important for system integration:
- New logging options (for process output - services are free to use syslog as always, but there is a growing trend for having processes just output their logs directly) including logging to an in-memory buffer (good for early boot services, when the filesystem might be read-only) and chaining output to another service (a "consumer") which can act as a logging agent (for example). Thanks to this you can now easily use the "logger" program (that comes with util-linux, some variants of syslog, and is often part of the base system of *BSDs) to automatically transfer process output to a syslog facility. Or, you could use a similar program to handle automatic log rotation.
- Ability to enable and disable services via dinitctl when dinit isn't actually running - this may be useful in installation environments for example. (This was always possible by manually editing service descriptions or creating appropriate entries in the boot.d directory or equivalent, but being able to do it via the same command that you use in an operation system seems like a nice-to-have).
Together with all the other work in the alpha releases up to now, including a bunch of minor features, as well as a significant number of user-experience improvements and documentation updates, I'm finally ready to announce:
Dinit 0.17 (beta) has now been released.
Dinit is now feature complete and so qualifies for beta status! Release notes and source download available via Github.
What's next? Well, I plan to take it easy for a while and focus on minor improvements as well as fixing any bugs that might crop up. At some point down the line I can then release Dinit 1.0, hopefully confident that I've achieved, more-or-less, what I initially set out to. (One blocker before 1.0 is still to polish up the FreeBSD support: I don't expect the FreeBSD project to ever pick up Dinit to replace their current init system, but I'd like for it to at least be possible!).
Beyond that: there are several ideas for features and improvements that can be made. Better support for cgroups on Linux, support for jails on FreeBSD, and internationalisation are all on the cards for versions post-1.0. It is a delicate balance, though; part of the design philosophy of Dinit has always been to keep the scope reasonably constrained, and I don't want to lose sight of that aim. Outside of Dinit itself, however, there are a number of areas in the system-management arena that I feel are still crying out for better solutions. I won't go into that any more now - if you're interested, then watch this space, I guess!