50 lines
1.6 KiB
Markdown
50 lines
1.6 KiB
Markdown
|
---
|
||
|
title: "NixOS: Stuck Boot (bad systemd unit)"
|
||
|
date: 2024-01-07
|
||
|
layout: Post
|
||
|
---
|
||
|
|
||
|
One of my systems at home runs NixOS and receives some (encrypted) backups via
|
||
|
`zfs send`/`zfs recv` shenanigans. I don't want to actually decrypt these at
|
||
|
boot, but I forgot to set `boot.zfs.requestEncryptionCredentials` appropriate,
|
||
|
so I got dropped into a systemd recovery prompt.
|
||
|
|
||
|
---
|
||
|
|
||
|
To fix this enough that the system would boot, I manually made sure that I had
|
||
|
imported and loaded the necessary keys for the ZFS pool in question (named
|
||
|
"tank") manually:
|
||
|
|
||
|
```
|
||
|
zpool import tank
|
||
|
zfs load-key tank/enc
|
||
|
```
|
||
|
|
||
|
Because zfs-import-tank is configured as `Type=oneshot` and
|
||
|
`RemainAfterExit=true`, the unit only needs to be marked as successful once,
|
||
|
then we can reload back to the "broken" config, but the fact that the unit ran
|
||
|
will be remembered.
|
||
|
|
||
|
As such, to make the system finish booting enough that I could reliably switch
|
||
|
to a new system with a fixed config, I copied the systemd unit to /tmp, and
|
||
|
sneakily edited it to replace the `ExecStart` with
|
||
|
`/nix/var/nix/profiles/system/sw/bin/true`, then bind-mounted the unit over the
|
||
|
one in /etc:
|
||
|
|
||
|
```
|
||
|
cat /etc/systemd/system/zfs-import-tank.service > /tmp/zfs-import-tank.service
|
||
|
vim /tmp/zfs-import-tank.service
|
||
|
mount --bind /tmp/zfs-import-tank.service /etc/systemd/system/zfs-import-tank.service
|
||
|
|
||
|
# Start our hacked-up zfs-import-tank service
|
||
|
systemctl daemon-reload
|
||
|
systemctl start zfs-import-tank
|
||
|
|
||
|
# Revert the system to its prior state for cleanliness
|
||
|
umount /etc/systemd/system/zfs-import-tank.service
|
||
|
systemctl daemon-reload
|
||
|
|
||
|
# Finish booting
|
||
|
systemctl default
|
||
|
```
|