96 lines
2.4 KiB
Nix
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}" ];
|
|
};
|
|
}
|