Files
nix-stuff/prophecy/btrfs.nix
Shelvacu 91a27769ba stuff
2025-05-23 17:56:46 -07:00

96 lines
2.4 KiB
Nix

{ pkgs, ... }:
let
btrfs-progs = pkgs.btrfs-progs;
btrfs = "${btrfs-progs}/bin/btrfs";
btrfsDevice = "/dev/mapper/prophecy-root-decrypted";
btrfsOpts = "compress=zstd:2,datacow,datasum,discard=async,ssd_spread,noatime,fatal_errors=panic";
in
{
fileSystems."/" = {
device = btrfsDevice;
fsType = "btrfs";
options = [ "subvol=root,${btrfsOpts}" ];
};
boot.initrd.systemd.services."vacu-impermanence-setup" = {
enable = true;
wantedBy = [ "initrd-root-device.target" ];
before = [
"sysroot.mount"
"create-needed-for-boot-dirs.service"
];
serviceConfig.Type = "oneshot";
script = ''
set -euo pipefail
btrfs_tmp="$(mktemp -d)"
mount ${btrfsDevice} "$btrfs_tmp"
(
cd "$btrfs_tmp"
if [[ -e root ]]; then
mkdir -p old_roots
timestamp=$(date --date="@$(stat -c %Y root)" "+%Y-%m-%-d_%H:%M:%S")
mv root "old_roots/$timestamp"
fi
btrfs subvolume create ./root
btrfs subvolume delete ./big-tmp
btrfs subvolume create ./big-tmp
)
umount "$btrfs_tmp"
rmdir "$btrfs_tmp"
'';
};
vacu.packages = [
btrfs-progs
(pkgs.writeScriptBin "delete_old_root" ''
set -euo pipefail
timestamp="$1"
shift
if [[ -z "$timestamp" ]]; then
echo "missing arg" >&2
exit 1
fi
mntpoint="$(mktemp -d)"
mount -t btrfs ${btrfsDevice} "$mntpoint"
full_path="$mntpoint/old_roots/$timestamp"
if ! [[ -d "$full_path" ]]; then
echo "couldnt find subvol old_roots/$timestamp" >&2
exit 1
fi
${btrfs} subvolume delete -R "$full_path"
'')
];
# back me up, scotty
fileSystems."/persistent" = {
device = btrfsDevice;
neededForBoot = true;
fsType = "btrfs";
options = [ "subvol=persistent,${btrfsOpts}" ];
};
# keep me around, but no need to back me up
fileSystems."/persistent-cache" = {
device = btrfsDevice;
neededForBoot = true;
fsType = "btrfs";
options = [ "subvol=persistent-cache,${btrfsOpts}" ];
};
# deleted and re-created on every boot, for stuff too big to go in a tmpfs
fileSystems."/tmp" = {
device = btrfsDevice;
fsType = "btrfs";
options = [ "subvol=big-tmp,${btrfsOpts}" ];
};
fileSystems."/nix" = {
device = btrfsDevice;
fsType = "btrfs";
options = [ "subvol=nix,${btrfsOpts}" ];
};
}