From b7e9cdf51d0ee169a4861f8add751acdbee07894 Mon Sep 17 00:00:00 2001 From: Mohammad Rafiq Date: Mon, 16 Jun 2025 18:31:56 +0800 Subject: [PATCH] refactor(nixos): move btrfs config to its own module --- modules/nixos/hardware/btrfs.nix | 101 ----------------- modules/nixos/hardware/default.nix | 10 +- .../nixos/hardware/drives/btrfs/default.nix | 107 ++++++++++++++++++ 3 files changed, 108 insertions(+), 110 deletions(-) delete mode 100644 modules/nixos/hardware/btrfs.nix create mode 100644 modules/nixos/hardware/drives/btrfs/default.nix diff --git a/modules/nixos/hardware/btrfs.nix b/modules/nixos/hardware/btrfs.nix deleted file mode 100644 index f848eb1..0000000 --- a/modules/nixos/hardware/btrfs.nix +++ /dev/null @@ -1,101 +0,0 @@ -{ lib, config, ... }: -let - cfg = config.hardware.drives.btrfs; -in -{ - config = lib.mkIf cfg.enable ( - lib.mkMerge [ - { - boot.initrd.kernelModules = [ "dm-snapshot" ]; - disko.devices.disk.main = { - device = cfg.drive; - type = "disk"; - content.type = "gpt"; - content.partitions = { - boot.name = "boot"; - boot.size = "1M"; - boot.type = "EF02"; - esp.name = "ESP"; - esp.size = "500M"; - esp.type = "EF00"; - esp.content = { - type = "filesystem"; - format = "vfat"; - mountpoint = "/boot"; - }; - swap.size = "4G"; - swap.content = { - type = "swap"; - resumeDevice = true; - }; - root.name = "root"; - root.size = "100%"; - root.content = { - type = "lvm_pv"; - vg = "root_vg"; - }; - }; - }; - - disko.devices.lvm_vg.root_vg = { - type = "lvm_vg"; - lvs.root.size = "100%FREE"; - lvs.root.content.type = "btrfs"; - lvs.root.content.extraArgs = [ "-f" ]; - lvs.root.content.subvolumes = { - "/root".mountpoint = "/"; - "/persist".mountpoint = "/persist"; - "/persist".mountOptions = [ - "subvol=persist" - "noatime" - ]; - "/nix".mountpoint = "/nix"; - "/nix".mountOptions = [ - "subvol=nix" - "noatime" - ]; - }; - }; - } - (lib.mkIf cfg.ephemeralRoot { - boot.initrd.postDeviceCommands = lib.mkAfter '' - mkdir /btrfs_tmp - mount /dev/root_vg/root /btrfs_tmp - if [[ -e /btrfs_tmp/root ]]; then - mkdir -p /btrfs_tmp/old_roots - timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") - mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" - fi - - delete_subvolume_recursively() { - IFS=$'\n' - for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do - delete_subvolume_recursively "/btrfs_tmp/$i" - done - btrfs subvolume delete "$1" - } - - for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do - delete_subvolume_recursively "$i" - done - - btrfs subvolume create /btrfs_tmp/root - umount /btrfs_tmp - ''; - programs.fuse.userAllowOther = true; - fileSystems."/persist".neededForBoot = true; - #FIXME: below should be in module or something - environment.persistence."/persist" = { - hideMounts = true; - files = [ - "/etc/ssh/ssh_host_ed25519_key" - "/etc/ssh/ssh_host_ed25519_key.pub" - "/etc/ssh/ssh_host_rsa_key" - "/etc/ssh/ssh_host_rsa_key.pub" - "/etc/machine-id" - ]; - }; - }) - ] - ); -} diff --git a/modules/nixos/hardware/default.nix b/modules/nixos/hardware/default.nix index 2b828b8..782f186 100644 --- a/modules/nixos/hardware/default.nix +++ b/modules/nixos/hardware/default.nix @@ -1,27 +1,19 @@ { lib, config, - pkgs, ... }: let - inherit (lib) mkIf mkEnableOption singleton; - cfg = config.hardware; + inherit (lib) singleton; in { imports = [ - ./btrfs.nix ./nvidia.nix ./audio.nix ./networking.nix ]; options.hardware = { - drives.btrfs = { - enable = lib.mkEnableOption ""; - drive = lib.pantheon.mkStrOption; - ephemeralRoot = lib.mkEnableOption ""; - }; gpu = lib.pantheon.mkStrOption; platform = lib.pantheon.mkStrOption; }; diff --git a/modules/nixos/hardware/drives/btrfs/default.nix b/modules/nixos/hardware/drives/btrfs/default.nix new file mode 100644 index 0000000..d8a528c --- /dev/null +++ b/modules/nixos/hardware/drives/btrfs/default.nix @@ -0,0 +1,107 @@ +{ config, lib, ... }: +let + inherit (lib) mkIf mkEnableOption; + inherit (lib.pantheon) mkStrOption; + cfg = config.hardware.drives.btrfs; + ephemeralRootCfg = { + boot.initrd.postDeviceCommands = lib.mkAfter '' + mkdir /btrfs_tmp + mount /dev/root_vg/root /btrfs_tmp + if [[ -e /btrfs_tmp/root ]]; then + mkdir -p /btrfs_tmp/old_roots + timestamp=$(date --date="@$(stat -c %Y /btrfs_tmp/root)" "+%Y-%m-%-d_%H:%M:%S") + mv /btrfs_tmp/root "/btrfs_tmp/old_roots/$timestamp" + fi + + delete_subvolume_recursively() { + IFS=$'\n' + for i in $(btrfs subvolume list -o "$1" | cut -f 9- -d ' '); do + delete_subvolume_recursively "/btrfs_tmp/$i" + done + btrfs subvolume delete "$1" + } + + for i in $(find /btrfs_tmp/old_roots/ -maxdepth 1 -mtime +30); do + delete_subvolume_recursively "$i" + done + + btrfs subvolume create /btrfs_tmp/root + umount /btrfs_tmp + ''; + programs.fuse.userAllowOther = true; + fileSystems."/persist".neededForBoot = true; + #FIXME: below should be in module or something + environment.persistence."/persist" = { + hideMounts = true; + files = [ + "/etc/ssh/ssh_host_ed25519_key" + "/etc/ssh/ssh_host_ed25519_key.pub" + "/etc/ssh/ssh_host_rsa_key" + "/etc/ssh/ssh_host_rsa_key.pub" + "/etc/machine-id" + ]; + }; + }; +in +{ + options.hardware.drives.btrfs = { + enable = mkEnableOption ""; + drive = mkStrOption; + ephemeralRoot = mkEnableOption ""; + }; + config = mkIf cfg.enable ( + { + boot.initrd.kernelModules = [ "dm-snapshot" ]; + disko.devices.disk.main = { + device = cfg.drive; + type = "disk"; + content.type = "gpt"; + content.partitions = { + boot.name = "boot"; + boot.size = "1M"; + boot.type = "EF02"; + esp.name = "ESP"; + esp.size = "500M"; + esp.type = "EF00"; + esp.content = { + type = "filesystem"; + format = "vfat"; + mountpoint = "/boot"; + }; + swap.size = "4G"; + swap.content = { + type = "swap"; + resumeDevice = true; + }; + root.name = "root"; + root.size = "100%"; + root.content = { + type = "lvm_pv"; + vg = "root_vg"; + }; + }; + }; + + disko.devices.lvm_vg.root_vg = { + type = "lvm_vg"; + lvs.root.size = "100%FREE"; + lvs.root.content.type = "btrfs"; + lvs.root.content.extraArgs = [ "-f" ]; + lvs.root.content.subvolumes = { + "/root".mountpoint = "/"; + "/persist".mountpoint = "/persist"; + "/persist".mountOptions = [ + "subvol=persist" + "noatime" + ]; + "/nix".mountpoint = "/nix"; + "/nix".mountOptions = [ + "subvol=nix" + "noatime" + ]; + }; + }; + } + // ephemeralRootCfg + ); +}