simplify vmstate directory
This commit is contained in:
@@ -7,19 +7,6 @@ let
|
|||||||
config.clanCore.state
|
config.clanCore.state
|
||||||
);
|
);
|
||||||
|
|
||||||
# Ensure sane mount order by topo-sorting
|
|
||||||
sortedStateFolders =
|
|
||||||
let
|
|
||||||
sorted = lib.toposort lib.hasPrefix stateFolders;
|
|
||||||
in
|
|
||||||
sorted.result or (
|
|
||||||
throw ''
|
|
||||||
The state folders have a cyclic dependency.
|
|
||||||
This is not allowed.
|
|
||||||
The cyclic dependencies are:
|
|
||||||
- ${lib.concatStringsSep "\n - " sorted.loops}
|
|
||||||
''
|
|
||||||
);
|
|
||||||
|
|
||||||
vmModule = {
|
vmModule = {
|
||||||
imports = [
|
imports = [
|
||||||
@@ -43,42 +30,6 @@ let
|
|||||||
boot.kernelPackages = pkgs.linuxPackages_latest;
|
boot.kernelPackages = pkgs.linuxPackages_latest;
|
||||||
|
|
||||||
boot.initrd.systemd.storePaths = [ pkgs.util-linux pkgs.e2fsprogs ];
|
boot.initrd.systemd.storePaths = [ pkgs.util-linux pkgs.e2fsprogs ];
|
||||||
# Ensures, that all state paths will be persisted across reboots
|
|
||||||
# - Mounts the state.qcow2 disk to /vmstate.
|
|
||||||
# - Binds directories from /vmstate/{some-path} to /{some-path}.
|
|
||||||
boot.initrd.systemd.services.rw-etc-pre = {
|
|
||||||
unitConfig = {
|
|
||||||
DefaultDependencies = false;
|
|
||||||
RequiresMountsFor = "/sysroot /dev";
|
|
||||||
};
|
|
||||||
wantedBy = [ "initrd.target" ];
|
|
||||||
requiredBy = [ "rw-etc.service" ];
|
|
||||||
before = [ "rw-etc.service" ];
|
|
||||||
serviceConfig = {
|
|
||||||
Type = "oneshot";
|
|
||||||
};
|
|
||||||
script = ''
|
|
||||||
set -x
|
|
||||||
mkdir -p -m 0755 \
|
|
||||||
/sysroot/vmstate \
|
|
||||||
/sysroot/.rw-etc \
|
|
||||||
/sysroot/var/lib/nixos
|
|
||||||
|
|
||||||
${pkgs.util-linux}/bin/blkid /dev/vdb || ${pkgs.e2fsprogs}/bin/mkfs.ext4 /dev/vdb
|
|
||||||
sync
|
|
||||||
mount /dev/vdb /sysroot/vmstate
|
|
||||||
|
|
||||||
mkdir -p -m 0755 /sysroot/vmstate/{.rw-etc,var/lib/nixos}
|
|
||||||
mount --bind /sysroot/vmstate/.rw-etc /sysroot/.rw-etc
|
|
||||||
mount --bind /sysroot/vmstate/var/lib/nixos /sysroot/var/lib/nixos
|
|
||||||
|
|
||||||
for folder in "${lib.concatStringsSep ''" "'' sortedStateFolders}"; do
|
|
||||||
mkdir -p -m 0755 "/sysroot/vmstate/$folder" "/sysroot/$folder"
|
|
||||||
mount --bind "/sysroot/vmstate/$folder" "/sysroot/$folder"
|
|
||||||
done
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
boot.initrd.systemd.emergencyAccess = true;
|
boot.initrd.systemd.emergencyAccess = true;
|
||||||
|
|
||||||
boot.initrd.kernelModules = [ "virtiofs" ];
|
boot.initrd.kernelModules = [ "virtiofs" ];
|
||||||
@@ -89,13 +40,24 @@ let
|
|||||||
fsType = lib.mkForce "virtiofs";
|
fsType = lib.mkForce "virtiofs";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
"/vmstate" = {
|
||||||
|
device = "/dev/vdb";
|
||||||
|
options = ["x-systemd.makefs"];
|
||||||
|
options = [ "x-systemd.makefs" ];
|
||||||
|
};
|
||||||
|
|
||||||
${config.clanCore.secretsUploadDirectory} = lib.mkForce {
|
${config.clanCore.secretsUploadDirectory} = lib.mkForce {
|
||||||
device = "secrets";
|
device = "secrets";
|
||||||
fsType = "9p";
|
fsType = "9p";
|
||||||
neededForBoot = true;
|
neededForBoot = true;
|
||||||
options = [ "trans=virtio" "version=9p2000.L" "cache=loose" ];
|
options = [ "trans=virtio" "version=9p2000.L" "cache=loose" ];
|
||||||
};
|
};
|
||||||
};
|
} // lib.listToAttrs (map (folder:
|
||||||
|
lib.nameValuePair folder {
|
||||||
|
device = "/vmstate${folder}";
|
||||||
|
fsType = "none";
|
||||||
|
options = ["bind"];
|
||||||
|
}) stateFolders);
|
||||||
};
|
};
|
||||||
|
|
||||||
# We cannot simply merge the VM config into the current system config, because
|
# We cannot simply merge the VM config into the current system config, because
|
||||||
|
|||||||
Reference in New Issue
Block a user