With my servers I prefer to have the root filesystem be a set of 2 SSDs in a ZFS mirror. That way you get bit rot detection, snapshots before significant changes, separate datasets, and redundancy. I follow the openzfs guide with a few tweaks to set this up. Then I create a dataset at /c
where I prefer to put all of my configuration files and then syslink to them at their original locations; however, this leads to an issue during boot for some services.
The issue is that only the root pool is mounted early on and nested datasets are only mounted as part of the local-fs.target
chain. This causes an issue if the service is loaded before this systemd
unit. In my case, I wanted my systemd-networkd
configration files to be stored in /c
but when systemd-networkd
runs, /c
isn't mounted so the syslinks are bad and won't be configured.
The solution is fairly simple, we want systemd-networkd
to run after local-fs.target
. To accomplish this, you'll want to run sudo systemctl edit systemd-networkd
which will open the override.conf
file for editing. Add the following, save, and exit.
[Unit]
After=local-fs.target
Now on your next boot, everything should work properly. This should work for most units but for generators (such as netplan.io), this won't work because they run very early in the systemd
process