aboutsummaryrefslogtreecommitdiff
path: root/installer/lib/zfs.sh
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2026-04-12 22:55:02 -0400
committerCraig Jennings <c@cjennings.net>2026-04-12 22:55:02 -0400
commit64260df38906e68b3d75169b8cae3b69715f5bc6 (patch)
tree33c05ad4ac015fd09296baf40a7b6369e29a53d6 /installer/lib/zfs.sh
parent77b9caac5a6bb5c338f691fdadd2f781557a9d7b (diff)
downloadarchangel-64260df38906e68b3d75169b8cae3b69715f5bc6.tar.gz
archangel-64260df38906e68b3d75169b8cae3b69715f5bc6.zip
fix: drop zroot/tmp dataset and dedup pacman snapshot hook
- /tmp on ZFS breaks systemd-tmpfiles-clean (statx ENOLINK on PrivateTmp paths). Use tmpfs via fstab instead; keep zroot/var/tmp. - zfs-pre-snapshot gains a 60s lockfile in /run so burst transactions (archsetup produced 357 snapshots in one run) collapse to one. Both fixes mirrored in installer/archangel and installer/lib/zfs.sh. Already applied and verified on velox.
Diffstat (limited to 'installer/lib/zfs.sh')
-rw-r--r--installer/lib/zfs.sh24
1 files changed, 21 insertions, 3 deletions
diff --git a/installer/lib/zfs.sh b/installer/lib/zfs.sh
index feda91d..bf8af35 100644
--- a/installer/lib/zfs.sh
+++ b/installer/lib/zfs.sh
@@ -133,10 +133,14 @@ create_zfs_datasets() {
zfs create -o mountpoint=/var/lib/pacman "$POOL_NAME/var/lib/pacman"
zfs create -o mountpoint=/var/lib/docker "$POOL_NAME/var/lib/docker"
- # Temp directories - excluded from snapshots
+ # /var/tmp - ZFS-backed, persists across reboots, excluded from snapshots
zfs create -o mountpoint=/var/tmp -o com.sun:auto-snapshot=false "$POOL_NAME/var/tmp"
- zfs create -o mountpoint=/tmp -o com.sun:auto-snapshot=false "$POOL_NAME/tmp"
- chmod 1777 /mnt/tmp /mnt/var/tmp
+ chmod 1777 /mnt/var/tmp
+
+ # /tmp - tmpfs via fstab (not ZFS: ZFS statx() returns ENOLINK on
+ # systemd PrivateTmp paths, breaking systemd-tmpfiles-clean every boot)
+ mkdir -p /mnt/tmp
+ chmod 1777 /mnt/tmp
info "Datasets created:"
zfs list -r "$POOL_NAME" -o name,mountpoint,compression
@@ -266,11 +270,25 @@ EOF
#!/bin/bash
POOL="zroot"
DATASET="$POOL/ROOT/default"
+LOCKFILE="/run/zfs-pre-snapshot.lock"
+MIN_INTERVAL=60
+
+# Dedup bursts of back-to-back pacman transactions (e.g. archsetup runs)
+# into a single snapshot. Lockfile on tmpfs — clears on reboot.
+if [ -f "$LOCKFILE" ]; then
+ last=$(stat -c %Y "$LOCKFILE" 2>/dev/null || echo 0)
+ now=$(date +%s)
+ if (( now - last < MIN_INTERVAL )); then
+ exit 0
+ fi
+fi
+
TIMESTAMP=$(date +%Y-%m-%d_%H-%M-%S)
SNAPSHOT_NAME="pre-pacman_$TIMESTAMP"
if zfs snapshot "$DATASET@$SNAPSHOT_NAME"; then
echo "Created snapshot: $DATASET@$SNAPSHOT_NAME"
+ touch "$LOCKFILE"
else
echo "Warning: Failed to create snapshot" >&2
fi