I’m happy to announce a new ZFS boot environment manager written completely from scratch in C - zectl.
In 2018 I wrote zedenv, a ZFS Boot Environment manager, I’ve taken what I learned from zedenv
and added improvements in workflow, performance and reliability.
For a summary on what a boot environment manager is, and how it can be used see my previous post.
Why the Rewrite Link to heading
I had been having misgivings about writing my original implementation in Python. At the time of writing there was no libzfs library interface for python and I wrote my own “wrapper library” - pyzfscmds - that simply called out to the zfs
binary. While the wrapper has worked, it meant a lot of extra work was done parsing string output from zfs
subcommands. Directly using the libzfs
library allows for more robust code, significantly better performance, and error handling. I was considering porting the python tool to use py-libzfs, or writing it in C when the tool bectl came out for FreeBSD. Seeing bectl
’s impressive implementation I was inspired to do the rewrite in C.
Plugins Link to heading
Part of the reasoning behind writing the original tool in Python was to facilitate a plugin interface. Having a way to extend the codebase was key so that I, and potentially others, could write plugins for additional bootloaders without requiring them to be part of the core tool. I wanted to carry over the plugin functionality to the C tool, I felt this would be possible using dynamically linked libraries, and have implemented a similar plugin interface using dlopen
. As of now a plugin exists for the systemd-boot
bootloader, and one is in the works for GRUB.
Contributing Link to heading
zectl is Open source (MIT-licensed) and looking for contributions.
If you’d like to help out with the project, please reach out to us on GitHub, via email, or on #zectl:matrix.org.
Thanks to
- Markus Kessler who has been a big help reviewing the code, helping brainstorm, and adding improvements.
- Zach Himsel for beta-testing and feedback.