{ ... }: { # Don't make the nix store read-only, as this would prevent the overlay FS # from being able to mount it. boot.readOnlyNixStore = false; # The nix-daemon.socket has an unnecessary dependency over the /nix/store # mount point. But that mount point won't be provided until the network is # ready. However, the network-address-eno1.service, has a dependency over # sockets.target, causing a cycle. # One solution is to make the nix-daemon.socket depend only on the socket # patch (which is already covered by ConditionPathIsReadWrite = # /nix/var/nix/daemon-socket), instead on the /nix/store. # # Using systemd.sockets.nix-daemon.unitConfig.RequiresMountsFor = # "/nix/var/nix/daemon-socket" doesn't work, as the the mount options get # added by systemd when the override config is merged with the one that Nix # provides: # # owl2% sudo systemctl show nix-daemon.socket | grep RequiresMountsFor # RequiresMountsFor=/nix/store /nix/var/nix/daemon-socket/socket /nix/var/nix/daemon-socket # # To fix this, the Nix package is patched to only depend on /nix/var instead. # See ../../pkgs/overlay.nix for details. # Mount the hut nix store via NFS in read-only mode. fileSystems."/mnt/hut-nix-store" = { device = "hut:/nix/store"; fsType = "nfs"; options = [ "ro" ]; }; # A workdir is also needed, so setup a permanent dir using tmpfiles. systemd.tmpfiles.rules = [ "d /mnt/nix-work 0700 root root -" ]; # Mount an overlay in /nix/store using as lower layer the NFS store and upper # layer the disk nix store. The destination is still the nix store in # /nix/store (confusing). We need rw access, as the daemon need to write the # lock files to build derivations locally. Use a systemd mount unit directly # so we can specify the LazyUmount option and we avoid having it mounted # in the stage1 before systemd. systemd.mounts = [ { what = "overlay"; type = "overlay"; where = "/nix/store"; # We need the local-fs.target to be ready, so the network interfaces can # be configured to the network.target is reached. So make this a netdev # mount. options = "_netdev,lowerdir=/mnt/hut-nix-store,upperdir=/nix/store,workdir=/mnt/nix-work"; description = "Overlay /nix/store mount"; mountConfig = { LazyUnmount = true; }; # Run the unit after remote-fs-pre.target but before the remote-fs.target after = [ "remote-fs-pre.target"]; before = [ "umount.target" "remote-fs.target" ]; # Install by using wantedBy over remote-fs.target wantedBy = [ "remote-fs.target" ]; unitConfig = { # We need to wait for the NFS mount RequiresMountsFor = "/nix/store /mnt/hut-nix-store"; }; } ]; }