refactor(hosts/luna): use btrfs-rollback service for handling rollbacks
This commit is contained in:
parent
aa1ca78c3b
commit
6e0af2ca7a
@ -258,6 +258,7 @@
|
|||||||
};
|
};
|
||||||
modules = [
|
modules = [
|
||||||
defaults
|
defaults
|
||||||
|
./modules/btrfs-rollback.nix
|
||||||
inputs.impermanence.nixosModules.impermanence
|
inputs.impermanence.nixosModules.impermanence
|
||||||
inputs.agenix.nixosModules.default
|
inputs.agenix.nixosModules.default
|
||||||
inputs.disko.nixosModules.disko
|
inputs.disko.nixosModules.disko
|
||||||
|
@ -1,8 +1,15 @@
|
|||||||
{ modulesPath, pkgs, ... }:
|
{ modulesPath, ... }:
|
||||||
{
|
{
|
||||||
|
|
||||||
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
imports = [ (modulesPath + "/installer/scan/not-detected.nix") ];
|
||||||
|
|
||||||
|
services.btrfs-rollback = {
|
||||||
|
enable = true;
|
||||||
|
diskLabel = "NixOS-Primary";
|
||||||
|
subvolume = "root";
|
||||||
|
snapshot = "root-base";
|
||||||
|
};
|
||||||
|
|
||||||
boot = {
|
boot = {
|
||||||
tmp = {
|
tmp = {
|
||||||
useTmpfs = true;
|
useTmpfs = true;
|
||||||
@ -24,58 +31,7 @@
|
|||||||
"sd_mod"
|
"sd_mod"
|
||||||
];
|
];
|
||||||
kernelModules = [ ];
|
kernelModules = [ ];
|
||||||
systemd = {
|
systemd.enable = true;
|
||||||
enable = true;
|
|
||||||
initrdBin = [
|
|
||||||
pkgs.libuuid
|
|
||||||
pkgs.gawk
|
|
||||||
];
|
|
||||||
services.rollback = {
|
|
||||||
description = "Rollback btrfs root subvolume";
|
|
||||||
wantedBy = [ "initrd.target" ];
|
|
||||||
before = [ "sysroot.mount" ];
|
|
||||||
after = [ "initrd-root-device.target" ];
|
|
||||||
unitConfig.DefaultDependencies = "no";
|
|
||||||
serviceConfig.Type = "oneshot";
|
|
||||||
script = ''
|
|
||||||
mkdir -p /mnt
|
|
||||||
DISK_LABEL="NixOS-Primary"
|
|
||||||
FOUND_DISK=0
|
|
||||||
ATTEMPTS=50
|
|
||||||
printf "Attempting to find disk with label '%s'\n" "$DISK_LABEL"
|
|
||||||
while ((ATTEMPTS > 0)); do
|
|
||||||
if findfs LABEL="$DISK_LABEL"; then
|
|
||||||
FOUND_DISK=1
|
|
||||||
printf "Found disk!\n"
|
|
||||||
break;
|
|
||||||
fi
|
|
||||||
((ATTEMPTS--))
|
|
||||||
sleep .1
|
|
||||||
printf "Remaining disk discovery attempts: %s\n" "$ATTEMPTS"
|
|
||||||
done
|
|
||||||
if (( FOUND_DISK == 0 )); then
|
|
||||||
printf "Discovery of disk with label '%s' failed! Cannot rollback!\n" "$DISK_LABEL"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
mount -t btrfs -o subvol=/ $(findfs LABEL="$DISK_LABEL") /mnt
|
|
||||||
btrfs subvolume list -to /mnt/root \
|
|
||||||
| awk 'NR>2 { printf $4"\n" }' \
|
|
||||||
| while read subvol; do
|
|
||||||
printf "Removing Subvolume: %s\n" "$subvol";
|
|
||||||
btrfs subvolume delete "/mnt/$subvol"
|
|
||||||
done
|
|
||||||
|
|
||||||
printf "Removing /root subvolume\n"
|
|
||||||
btrfs subvolume delete /mnt/root
|
|
||||||
|
|
||||||
printf "Restoring base /root subvolume\n"
|
|
||||||
btrfs subvolume snapshot /mnt/root-base /mnt/root
|
|
||||||
|
|
||||||
umount /mnt
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user