Dakota TPM2 Encryption Validation#
Validate Dakota (composefs + systemd-boot) with TPM2 encryption end-to-end.
Refs: #20|Closes
Context#
Dakota uses composefs + systemd-boot (not GRUB). The fisherman pipeline already handles this combination:
isSystemdBoot = truewhenr.Bootloader == "systemd"PartitionSystemdBoot()creates 2-partition layout (2 GiB FAT32 ESP + root)- LUKS (if requested) wraps the root partition; ESP stays unencrypted
EnsureLuksArgs()injectsrd.luks.name=<UUID>=rootinto BLS loader entriesEnrollTPM2()runs after install — non-fatal if TPM2 hardware is absent- GPT auto-discovery retag correctly skips when
hasEncryptionis true
Testing Checklist#
- Install Dakota with
tpm2-luks-passphraseencryption on real hardware with TPM2 - Verify system boots and auto-unlocks via TPM2
- Verify passphrase fallback works when TPM2 is unavailable (e.g. after firmware update changes PCR 7)
- Install Dakota with
tpm2-luks-passphrasein a VM (no TPM2) — confirm non-fatal warning and passphrase-only unlock works - Verify
rd.luks.nameis correctly injected into systemd-boot BLS entries (not GRUB configs)
Dakota-Specific Recipe#
{
"disk": "/dev/nvme0n1",
"filesystem": "btrfs",
"encryption": {
"type": "tpm2-luks-passphrase",
"passphrase": "user-passphrase"
},
"image": "ghcr.io/projectbluefin/dakota-nvidia:latest",
"targetImgref": "ghcr.io/projectbluefin/dakota:latest",
"bootloader": "systemd",
"composeFsBackend": true,
"flatpakVarPath": "state/os/default/var",
"hostname": "framework-a7c3"
}
Known Issue#
systemd-cryptenroll --unlock-key-file=- fails with "Reading keyfile /var/roothome/- failed". May be a systemd version issue on the live ISO vs installed system. Non-fatal since passphrase still works.