# Relocating `/var/home/ironmagma` onto the HDD (sda3)## TL;DRThe nvme btrfs pool (`/`, `/home`, `/var` subvolumes sharing one ~23.5 GiBpartition) is ~92% full and caused a Discord SIGBUS crash (full disk cachewrite — see [`hdd-partition-split-for-btrfs-pool.md`](./hdd-partition-split-for-btrfs-pool.md)for that investigation). Breakdown of the ~20.9 GiB used:| Location | Size ||---|---|| `/sysroot/ostree/repo` (the OS image itself, one deployment, not staged) | 8.4G || `/var/home/ironmagma` (actual `$HOME` — lives in the "home" subvolume) | 11G || `/var` itself (logs/cache) | 169M |`/var/home/ironmagma` is the single biggest reclaimable chunk and is notpart of the OS image, so relocating it onto the HDD (`sda3`, mounted at`~/hdd`, 259G free at time of writing) fixes the actual problem directly,rather than just giving the pool more room to keep filling up(the partition-split doc's approach).**Not yet executed.** This must be run from a TTY after a full logout —Claude Code itself runs from files under `$HOME`, so it cannot perform orsupervise this live; there is no assistant available mid-procedure. Followthis doc standalone.## Why this is trickier than the existing flatpak bind mount`/var/lib/flatpak` is already bind-mounted from the HDD(`/var/home/ironmagma/hdd/flatpak`), which works because the *bind mount'ssource* is nested a level below where the HDD itself is mounted, and none ofthat nesting is itself the target of another mount.Relocating `$HOME` is different: the HDD (`sda3`) is currently mounted**inside** the very directory (`/var/home/ironmagma`) we want to replacewith a bind mount. If we tried to keep that nesting and just bind-mount somesubdirectory of the HDD back onto `/var/home/ironmagma`, the new mount wouldsit *on top of* the path leading to the HDD mount itself — Linux mountshadowing means the original `sda3` mount (and the flatpak bind nestedinside it) would become unreachable via the normal path afterward, eventhough it's technically still mounted underneath. **This is why the HDD'smount point must first move to a path that is a sibling of `/var/home/ironmagma`,not a descendant of it** (e.g. `/var/hdd` instead of`/var/home/ironmagma/hdd`).## Pre-flight checks done (safe, no changes made)- Grepped for hardcoded references to the old `/var/home/ironmagma/hdd`path across `~/Code` and `~/.config`: no scripts, systemd units, or buildconfigs depend on it. Only two trivial, non-blocking references found:- `~/.config/spectaclerc` — Spectacle's screenshot save folder- `~/.config/session/dolphin_dolphin_dolphin` — a remembered Dolphin tabBoth just need re-pointing after the move; neither blocks anything.- Current relevant `/etc/fstab` lines:```UUID=a45a95fa-805f-43f2-bc32-8da8970c1b91 /var/home/ironmagma/hdd ext4 defaults,nofail 0 2/var/home/ironmagma/hdd/flatpak /var/lib/flatpak none bind,nofail 0 0```## Plan### Phase 0 — from the normal desktop session, before logging out1. **Take a real backup of `/var/home/ironmagma`** to somewhere independentof this machine's disks (external drive, another machine, cloud). Thecopy made in Phase 2 is *not* a substitute for this — it lands on thesame physical HDD this plan is otherwise trusting; a real backup is theactual safety net if something goes wrong mid-procedure.2. Note down anything you'd hate to lose track of that isn't obviouslyunder `$HOME` in the usual places (e.g. GPG/SSH agent state, browsersession you care about) so you can sanity-check it post-move.### Phase 1 — drop to a TTYLog out of the graphical session fully (this ends the current Claude Codesession too). Switch to a TTY (Ctrl+Alt+F3) and log in as `ironmagma`.### Phase 2 — move the HDD's mount point out from under `$HOME````bashsudo mkdir -p /var/hddsudo umount /var/lib/flatpaksudo umount /var/home/ironmagma/hdd```Edit `/etc/fstab`, changing:```UUID=a45a95fa-805f-43f2-bc32-8da8970c1b91 /var/home/ironmagma/hdd ext4 defaults,nofail 0 2/var/home/ironmagma/hdd/flatpak /var/lib/flatpak none bind,nofail 0 0```to:```UUID=a45a95fa-805f-43f2-bc32-8da8970c1b91 /var/hdd ext4 defaults,nofail 0 2/var/hdd/flatpak /var/lib/flatpak none bind,nofail 0 0```Then:```bashsudo systemctl daemon-reloadsudo mount /var/hddsudo mount /var/lib/flatpakls /var/hdd # sanity check: should show the same old contents, incl. flatpak/```Home directory content is untouched by this phase — `/var/home/ironmagma`still has its old (now unused) empty `hdd/` placeholder directory in it,harmless, cleaned up later.### Phase 3 — copy `$HOME` onto the HDDNothing is mounted inside `/var/home/ironmagma` anymore at this point, sothis is a plain, non-nested copy:```bashsudo rsync -aHAX --info=progress2 /var/home/ironmagma/ /var/hdd/home-ironmagma/````-aHAX` preserves permissions, hardlinks, ACLs, and xattrs (includingSELinux labels stored as `security.selinux` xattrs — matters for `.ssh`permissions and SELinux contexts).### Phase 4 — verify before touching the original```bashsudo diff -rq /var/home/ironmagma /var/hdd/home-ironmagma```Should report no differences. Do not proceed if it does.### Phase 5 — swap```bashsudo mv /var/home/ironmagma /var/home/ironmagma.oldsudo mkdir /var/home/ironmagmasudo chown ironmagma:ironmagma /var/home/ironmagma```Add to `/etc/fstab`:```/var/hdd/home-ironmagma /var/home/ironmagma none bind 0 0```**Deliberately no `nofail` here**, unlike the hdd/flatpak lines. If the HDDfails to come up, we want boot to visibly stop and demand attention, notsilently hand you a freshly-empty `/var/home/ironmagma` that looks like yourwhole home directory vanished.```bashsudo systemctl daemon-reloadsudo mount /var/home/ironmagmals -la /var/home/ironmagma # should show all the familiar dotfiles/dirssudo restorecon -R /var/home/ironmagma # SELinux label safety net```### Phase 6 — test before rebooting```bashsudo -u ironmagma touch /var/home/ironmagma/.relocate-testls -la /var/home/ironmagma/.relocate-testrm /var/home/ironmagma/.relocate-test```### Phase 7 — reboot and verify for realReboot, log into the normal graphical session, and check:- SSH agent / keys work- `git` works in `~/Code`- Dropbox resumes syncing- 1Password unlocks- Browser profile intact- Claude Code itself starts (it lives under `$HOME` — if this doc isreadable again from inside a working Claude Code session, that's a goodsign the move succeeded)- Re-point Spectacle's save folder and check the stale Dolphin tab (seepre-flight checks above)### Phase 8 — only once fully confident (a few days of normal use)**Nothing before this step actually frees space on the nvme pool** — untilnow we've only relocated and kept a full fallback copy. This is the stepthat does it:```bashsudo rm -rf /var/home/ironmagma.old```This drops nvme pool usage from ~92% to roughly ~43%.### Optional cleanup- `/var/home/ironmagma/hdd` no longer exists as a mountpoint (it's `/var/hdd`now); if you want a convenience path at the old location, a plain symlinkworks fine since nothing is mounted there anymore:```bashln -s /var/hdd /var/home/ironmagma/hdd```## Open risks / unknowns- Whether SELinux contexts translate perfectly onto ext4 via rsync `-X` —`restorecon -R` in Phase 5 is the safety net, but not independentlyverified here.- Making the home bind mount required (no `nofail`) means a failed/missingHDD blocks login entirely rather than degrading gracefully. This is adeliberate choice (see Phase 5) but worth revisiting if the HDD turns outto be less reliable than expected.- The still-unexplained podman `system df` discrepancy (reports 2.412GB of"reclaimable" images with an empty image list, real 2.3G sitting in`~/.local/share/containers/storage/overlay`, and 9 volumes that return`Permission denied` on inspection) was not resolved — separate from thisplan, and worth checking whether those volumes belong to a still-useddistrobox/toolbox environment before ever running `podman system reset`.---*Written 2026-09-26. No steps executed yet.*