WIP: beefcake root-on-ZFS SSD boot mirror (Phase 0 — do not merge until Phase 1) #685

Draft
lytedev wants to merge 1 commit from beefcake-root-on-zfs into main
Owner

Staged root-on-ZFS boot mirror for beefcake. Do not merge or deploy until Phase 1 — the config sets / = rpool/root which does not exist yet, so deploying makes beefcake unbootable (same posture as the relocation PR #619).

What

Move / off the single non-redundant rear-bay HDD onto a 2-disk ZFS mirror (rpool) across the two Samsung PM863a SSDs. /nix stays on zstorage (608G, too big for 240G SSDs). Boot redundancy via systemd-boot + an ESP mirror (extraInstallCommands rsyncs /boot onto the second SSD's ESP; skips cleanly while it's absent).

Phase 0 (this PR) — no downtime

  • hardware.nix rewritten for root-on-ZFS (staged).
  • Evals cleanly (nix eval …#nixosConfigurations.beefcake…toplevel.drvPath).
  • Full phased runbook filed at issues/open/beefcake-root-on-zfs-mirror.md (Phase 1 = migrate / onto single-disk rpool on SSD-A + boot from it; Phase 2 = zpool attach SSD-B → mirror; Phase 3 = pull old HDD).

Merge/deploy sequencing

Merge only after Phase 1 is live. Deploy beefcake over the LAN (--hostname 192.168.0.9), never the VPN.

🤖 Generated with Claude Code

Staged root-on-ZFS boot mirror for beefcake. **Do not merge or deploy until Phase 1** — the config sets `/` = `rpool/root` which does not exist yet, so deploying makes beefcake unbootable (same posture as the relocation PR #619). ## What Move `/` off the single non-redundant rear-bay HDD onto a **2-disk ZFS mirror (`rpool`)** across the two Samsung PM863a SSDs. `/nix` stays on `zstorage` (608G, too big for 240G SSDs). Boot redundancy via systemd-boot + an ESP mirror (`extraInstallCommands` rsyncs `/boot` onto the second SSD's ESP; skips cleanly while it's absent). ## Phase 0 (this PR) — no downtime - `hardware.nix` rewritten for root-on-ZFS (staged). - Evals cleanly (`nix eval …#nixosConfigurations.beefcake…toplevel.drvPath`). - Full phased runbook filed at `issues/open/beefcake-root-on-zfs-mirror.md` (Phase 1 = migrate `/` onto single-disk rpool on SSD-A + boot from it; Phase 2 = `zpool attach` SSD-B → mirror; Phase 3 = pull old HDD). ## Merge/deploy sequencing Merge only **after Phase 1 is live**. Deploy beefcake over the **LAN** (`--hostname 192.168.0.9`), never the VPN. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(beefcake): stage root-on-ZFS SSD boot mirror (Phase 0)
All checks were successful
/ check-format (push) Successful in 7s
/ build (push) Successful in 7m11s
0b62f86132
Give beefcake a redundant boot device: move / from the single rear-bay HDD
onto a 2-disk ZFS mirror (rpool) across the two Samsung PM863a SSDs. /nix
stays on zstorage (too big for 240G SSDs). Matches the host's ZFS-everywhere
posture and is already covered by the #615 smartd/ZED disk alerting.

hardware.nix rewritten for root-on-ZFS:
- / = rpool/root (zfs, legacy mountpoint)
- /boot = by-partlabel/ESP-A
- boot redundancy via systemd-boot extraInstallCommands mirroring /boot onto
  ESP-B after each install (skips cleanly while ESP-B is absent)

STAGED — do NOT deploy/merge until rpool + ESPs exist (Phase 1). Deploying
before rpool/root exists makes beefcake unbootable. Evals cleanly. Full phased
runbook in issues/open/beefcake-root-on-zfs-mirror.md.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y2MgYjnyn39wqNyb4Afph4
All checks were successful
/ check-format (push) Successful in 7s
Required
Details
/ build (push) Successful in 7m11s
Required
Details
This pull request is marked as a work in progress.
This branch is out-of-date with the base branch
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin beefcake-root-on-zfs:beefcake-root-on-zfs
git switch beefcake-root-on-zfs
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
lytedev/nix!685
No description provided.