1 { config, lib, modulesPath, pkgs, ... }:
4 escapeShellArg mkForce mkIf mkMerge mkOption mkVMOverride optional;
6 cfg = config.virtualisation.qemu.isolation;
8 storeMountPath = if config.virtualisation.writableStore then
13 hostPkgs = config.virtualisation.host.pkgs;
16 hostPkgs.closureInfo { rootPaths = config.virtualisation.additionalPaths; };
20 import (modulesPath + "/../lib/make-disk-image.nix") {
21 inherit pkgs config lib;
22 additionalPaths = [ storeContents ];
25 partitionTableType = "none";
26 installBootLoader = false;
28 additionalSpace = "0M";
33 hostPkgs.runCommand "nix-store-image" { } ''
35 ${hostPkgs.gnutar}/bin/tar --create \
37 --verbatim-files-from \
38 --transform 'flags=rSh;s|/nix/store/||' \
39 --files-from ${storeContents}/store-paths \
40 | ${hostPkgs.erofs-utils}/bin/mkfs.erofs \
44 -U eb176051-bd15-49b7-9e6b-462e0b467019 \
51 "${hostPkgs.callPackage (modulesPath + "/../lib/make-squashfs.nix") {
52 storeContents = config.virtualisation.additionalPaths;
58 virtualisation.qemu.isolation.nixStoreFilesystemType = mkOption {
60 What filesystem to use for the guest's Nix store.
62 erofs is more compact than ext4, but less mature.
64 squashfs support currently requires a dubious kludge that results in these
65 VMs not being able to mount any other squashfs volumes besides the nix store.
67 type = lib.types.enum [ "ext4" "erofs" "squashfs" ];
73 boot.initrd.kernelModules =
74 optional (cfg.nixStoreFilesystemType == "erofs") "erofs";
76 nixpkgs.overlays = optional (cfg.nixStoreFilesystemType == "squashfs")
78 util-linux = prev.util-linux.overrideAttrs (old: {
79 patches = (old.patches or [ ])
80 ++ [ ./libblkid-squashfs-nix-store-kludge.patch ];
84 fileSystems = mkVMOverride {
85 "${storeMountPath}" = {
86 fsType = cfg.nixStoreFilesystemType;
93 system.build.nixStoreImage =
94 nixStoreImages."${cfg.nixStoreFilesystemType}";
98 sharedDirectories = mkForce { };
101 file = config.system.build.nixStoreImage;
111 (mkIf (cfg.nixStoreFilesystemType == "ext4") {
112 # We use this to disable fsck runs on the ext4 nix store image because stage-1
113 # fsck crashes (maybe because the device is read-only?), halting boot.
114 boot.initrd.checkJournalingFS = false;