From 64260df38906e68b3d75169b8cae3b69715f5bc6 Mon Sep 17 00:00:00 2001 From: Craig Jennings Date: Sun, 12 Apr 2026 22:55:02 -0400 Subject: 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. --- installer/lib/zfs.sh | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'installer/lib') 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 -- cgit v1.2.3