{ lib, config, pkgs, ... }: with lib; let cfg = config.local.nspawn; in { options.local.nspawn.dmz.enable = mkEnableOption "DMZ services in a container"; # Situación con os-release # # La idea aquí es poder hacer 'btrfs subvol create /var/lib/machines/foo' y # dejar que systemd-nspawn y el activation script creen todo lo demás. Esto # no sirve bien debido a la prueba barata que hace systemd para revisar si el # árbol parece contener una imagen de sistema operativo. Esta prueba falla en # dos momentos distintos: # # 1. Inmediatamente tras crear un árbol vacío, puesto que os-release no existe. # La solución naive es 'mkdir rootfs/etc && touch rootfs/etc/os-release'. # # 2. Luego de reiniciar el contenedor una vez que NixOS ha preparado /etc, ya que # systemd espera un archivo regular y no telera el symlink a la store. # # Resulta ser que systemd revisa tanto /etc/os-release como /usr/lib/os-release. # NixOS evidentemente no usa la segunda ruta por ser FHS, así que la duct tape # final es 'mkdir rootfs/usr/lib && touch rootfs/usr/lib/os-release'. config = mkIf cfg.dmz.enable { systemd.nspawn.dmz = { execConfig.PrivateUsers = "pick"; filesConfig.BindReadOnly = let containerModule = { ... }: { config.boot.isContainer = true; }; system = pkgs.nixos [ ../dmz containerModule ]; in [ "/nix/store" "${system.toplevel}/init:/sbin/init" ]; }; }; }