mirror of
https://github.com/NixOS/nixpkgs.git
synced 2025-11-10 17:54:53 +01:00
adds `nixConf` (to generate `nix.conf` files) as a file format to `lib.formats`, and uses it for serializing `nix.settings`. this makes it easier to 'manually' serialize `nix.settings`, which is relevant in e.g. safely handling sensitive values such as that of `nix.settings.access-tokens`. Signed-off-by: cinereal <cinereal@riseup.net>
378 lines
12 KiB
Nix
378 lines
12 KiB
Nix
/*
|
|
Manages /etc/nix/nix.conf.
|
|
|
|
See also
|
|
- ./nix-channel.nix
|
|
- ./nix-flakes.nix
|
|
- ./nix-remote-build.nix
|
|
- nixos/modules/services/system/nix-daemon.nix
|
|
*/
|
|
{
|
|
config,
|
|
lib,
|
|
pkgs,
|
|
...
|
|
}:
|
|
|
|
let
|
|
inherit (lib)
|
|
literalExpression
|
|
mapAttrsToList
|
|
mkAfter
|
|
mkIf
|
|
mkOption
|
|
mkRenamedOptionModuleWith
|
|
optionals
|
|
systems
|
|
types
|
|
;
|
|
|
|
cfg = config.nix;
|
|
|
|
nixPackage = cfg.package.out;
|
|
|
|
defaultSystemFeatures = [
|
|
"nixos-test"
|
|
"benchmark"
|
|
"big-parallel"
|
|
"kvm"
|
|
]
|
|
++ optionals (pkgs.stdenv.hostPlatform ? gcc.arch) (
|
|
# a builder can run code for `gcc.arch` and inferior architectures
|
|
[ "gccarch-${pkgs.stdenv.hostPlatform.gcc.arch}" ]
|
|
++ map (x: "gccarch-${x}") (
|
|
systems.architectures.inferiors.${pkgs.stdenv.hostPlatform.gcc.arch} or [ ]
|
|
)
|
|
);
|
|
|
|
legacyConfMappings = {
|
|
useSandbox = "sandbox";
|
|
buildCores = "cores";
|
|
maxJobs = "max-jobs";
|
|
sandboxPaths = "extra-sandbox-paths";
|
|
binaryCaches = "substituters";
|
|
trustedBinaryCaches = "trusted-substituters";
|
|
binaryCachePublicKeys = "trusted-public-keys";
|
|
autoOptimiseStore = "auto-optimise-store";
|
|
requireSignedBinaryCaches = "require-sigs";
|
|
trustedUsers = "trusted-users";
|
|
allowedUsers = "allowed-users";
|
|
systemFeatures = "system-features";
|
|
};
|
|
|
|
semanticConfType =
|
|
with types;
|
|
let
|
|
confAtom =
|
|
nullOr (oneOf [
|
|
bool
|
|
int
|
|
float
|
|
str
|
|
path
|
|
package
|
|
])
|
|
// {
|
|
description = "Nix config atom (null, bool, int, float, str, path or package)";
|
|
};
|
|
in
|
|
attrsOf (either confAtom (listOf confAtom));
|
|
|
|
nixConf =
|
|
(pkgs.formats.nixConf {
|
|
inherit (cfg)
|
|
package
|
|
checkAllErrors
|
|
checkConfig
|
|
extraOptions
|
|
;
|
|
inherit (nixPackage) version;
|
|
}).generate
|
|
"nix.conf"
|
|
cfg.settings;
|
|
|
|
in
|
|
{
|
|
imports = [
|
|
(mkRenamedOptionModuleWith {
|
|
sinceRelease = 2003;
|
|
from = [
|
|
"nix"
|
|
"useChroot"
|
|
];
|
|
to = [
|
|
"nix"
|
|
"useSandbox"
|
|
];
|
|
})
|
|
(mkRenamedOptionModuleWith {
|
|
sinceRelease = 2003;
|
|
from = [
|
|
"nix"
|
|
"chrootDirs"
|
|
];
|
|
to = [
|
|
"nix"
|
|
"sandboxPaths"
|
|
];
|
|
})
|
|
]
|
|
++ mapAttrsToList (
|
|
oldConf: newConf:
|
|
mkRenamedOptionModuleWith {
|
|
sinceRelease = 2205;
|
|
from = [
|
|
"nix"
|
|
oldConf
|
|
];
|
|
to = [
|
|
"nix"
|
|
"settings"
|
|
newConf
|
|
];
|
|
}
|
|
) legacyConfMappings;
|
|
|
|
options = {
|
|
nix = {
|
|
checkConfig = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = ''
|
|
If enabled, checks that Nix can parse the generated nix.conf.
|
|
'';
|
|
};
|
|
|
|
checkAllErrors = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = ''
|
|
If enabled, checks the nix.conf parsing for any kind of error. When disabled, checks only for unknown settings.
|
|
'';
|
|
};
|
|
|
|
extraOptions = mkOption {
|
|
type = types.lines;
|
|
default = "";
|
|
example = ''
|
|
keep-outputs = true
|
|
keep-derivations = true
|
|
'';
|
|
description = "Additional text appended to {file}`nix.conf`.";
|
|
};
|
|
|
|
settings = mkOption {
|
|
type = types.submodule {
|
|
freeformType = semanticConfType;
|
|
|
|
options = {
|
|
max-jobs = mkOption {
|
|
type = types.either types.int (types.enum [ "auto" ]);
|
|
default = "auto";
|
|
example = 64;
|
|
description = ''
|
|
This option defines the maximum number of jobs that Nix will try to
|
|
build in parallel. The default is auto, which means it will use all
|
|
available logical cores. It is recommend to set it to the total
|
|
number of logical cores in your system (e.g., 16 for two CPUs with 4
|
|
cores each and hyper-threading).
|
|
'';
|
|
};
|
|
|
|
auto-optimise-store = mkOption {
|
|
type = types.bool;
|
|
default = false;
|
|
example = true;
|
|
description = ''
|
|
If set to true, Nix automatically detects files in the store that have
|
|
identical contents, and replaces them with hard links to a single copy.
|
|
This saves disk space. If set to false (the default), you can still run
|
|
nix-store --optimise to get rid of duplicate files.
|
|
'';
|
|
};
|
|
|
|
cores = mkOption {
|
|
type = types.int;
|
|
default = 0;
|
|
example = 64;
|
|
description = ''
|
|
This option defines the maximum number of concurrent tasks during
|
|
one build. It affects, e.g., -j option for make.
|
|
The special value 0 means that the builder should use all
|
|
available CPU cores in the system. Some builds may become
|
|
non-deterministic with this option; use with care! Packages will
|
|
only be affected if enableParallelBuilding is set for them.
|
|
'';
|
|
};
|
|
|
|
sandbox = mkOption {
|
|
type = types.either types.bool (types.enum [ "relaxed" ]);
|
|
default = true;
|
|
description = ''
|
|
If set, Nix will perform builds in a sandboxed environment that it
|
|
will set up automatically for each build. This prevents impurities
|
|
in builds by disallowing access to dependencies outside of the Nix
|
|
store by using network and mount namespaces in a chroot environment.
|
|
|
|
This is enabled by default even though it has a possible performance
|
|
impact due to the initial setup time of a sandbox for each build. It
|
|
doesn't affect derivation hashes, so changing this option will not
|
|
trigger a rebuild of packages.
|
|
|
|
When set to "relaxed", this option permits derivations that set
|
|
`__noChroot = true;` to run outside of the sandboxed environment.
|
|
Exercise caution when using this mode of operation! It is intended to
|
|
be a quick hack when building with packages that are not easily setup
|
|
to be built reproducibly.
|
|
'';
|
|
};
|
|
|
|
extra-sandbox-paths = mkOption {
|
|
type = types.listOf types.str;
|
|
default = [ ];
|
|
example = [
|
|
"/dev"
|
|
"/proc"
|
|
];
|
|
description = ''
|
|
Directories from the host filesystem to be included
|
|
in the sandbox.
|
|
'';
|
|
};
|
|
|
|
substituters = mkOption {
|
|
type = types.listOf types.str;
|
|
description = ''
|
|
List of binary cache URLs used to obtain pre-built binaries
|
|
of Nix packages.
|
|
|
|
By default https://cache.nixos.org/ is added.
|
|
'';
|
|
};
|
|
|
|
trusted-substituters = mkOption {
|
|
type = types.listOf types.str;
|
|
default = [ ];
|
|
example = [ "https://hydra.nixos.org/" ];
|
|
description = ''
|
|
List of binary cache URLs that non-root users can use (in
|
|
addition to those specified using
|
|
{option}`nix.settings.substituters`) by passing
|
|
`--option binary-caches` to Nix commands.
|
|
'';
|
|
};
|
|
|
|
require-sigs = mkOption {
|
|
type = types.bool;
|
|
default = true;
|
|
description = ''
|
|
If enabled (the default), Nix will only download binaries from binary caches if
|
|
they are cryptographically signed with any of the keys listed in
|
|
{option}`nix.settings.trusted-public-keys`. If disabled, signatures are neither
|
|
required nor checked, so it's strongly recommended that you use only
|
|
trustworthy caches and https to prevent man-in-the-middle attacks.
|
|
'';
|
|
};
|
|
|
|
trusted-public-keys = mkOption {
|
|
type = types.listOf types.str;
|
|
example = [ "hydra.nixos.org-1:CNHJZBh9K4tP3EKF6FkkgeVYsS3ohTl+oS0Qa8bezVs=" ];
|
|
description = ''
|
|
List of public keys used to sign binary caches. If
|
|
{option}`nix.settings.trusted-public-keys` is enabled,
|
|
then Nix will use a binary from a binary cache if and only
|
|
if it is signed by *any* of the keys
|
|
listed here. By default, only the key for
|
|
`cache.nixos.org` is included.
|
|
'';
|
|
};
|
|
|
|
trusted-users = mkOption {
|
|
type = types.listOf types.str;
|
|
example = [
|
|
"root"
|
|
"alice"
|
|
"@wheel"
|
|
];
|
|
description = ''
|
|
A list of names of users that have additional rights when
|
|
connecting to the Nix daemon, such as the ability to specify
|
|
additional binary caches, or to import unsigned NARs. You
|
|
can also specify groups by prefixing them with
|
|
`@`; for instance,
|
|
`@wheel` means all users in the wheel
|
|
group.
|
|
'';
|
|
};
|
|
|
|
system-features = mkOption {
|
|
type = types.listOf types.str;
|
|
# We expose system-featuers here and in config below.
|
|
# This allows users to access the default value via `options.nix.settings.system-features`
|
|
default = defaultSystemFeatures;
|
|
defaultText = literalExpression ''[ "nixos-test" "benchmark" "big-parallel" "kvm" "gccarch-<arch>" ]'';
|
|
description = ''
|
|
The set of features supported by the machine. Derivations
|
|
can express dependencies on system features through the
|
|
`requiredSystemFeatures` attribute.
|
|
'';
|
|
};
|
|
|
|
allowed-users = mkOption {
|
|
type = types.listOf types.str;
|
|
default = [ "*" ];
|
|
example = [
|
|
"@wheel"
|
|
"@builders"
|
|
"alice"
|
|
"bob"
|
|
];
|
|
description = ''
|
|
A list of names of users (separated by whitespace) that are
|
|
allowed to connect to the Nix daemon. As with
|
|
{option}`nix.settings.trusted-users`, you can specify groups by
|
|
prefixing them with `@`. Also, you can
|
|
allow all users by specifying `*`. The
|
|
default is `*`. Note that trusted users are
|
|
always allowed to connect.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
default = { };
|
|
example = literalExpression ''
|
|
{
|
|
use-sandbox = true;
|
|
show-trace = true;
|
|
|
|
sandbox-paths = [ "/bin/sh=''${pkgs.busybox-sandbox-shell.out}/bin/busybox" ];
|
|
}
|
|
'';
|
|
description = ''
|
|
Configuration for Nix, see
|
|
<https://nixos.org/manual/nix/stable/command-ref/conf-file.html> or
|
|
{manpage}`nix.conf(5)` for available options.
|
|
The value declared here will be translated directly to the key-value pairs Nix expects.
|
|
|
|
You can use {command}`nix-instantiate --eval --strict '<nixpkgs/nixos>' -A config.nix.settings`
|
|
to view the current value. By default it is empty.
|
|
|
|
Nix configurations defined under {option}`nix.*` will be translated and applied to this
|
|
option. In addition, configuration specified in {option}`nix.extraOptions` will be appended
|
|
verbatim to the resulting config file.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
|
|
config = mkIf cfg.enable {
|
|
environment.etc."nix/nix.conf".source = nixConf;
|
|
nix.settings = {
|
|
trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
|
|
trusted-users = [ "root" ];
|
|
substituters = mkAfter [ "https://cache.nixos.org/" ];
|
|
system-features = defaultSystemFeatures;
|
|
};
|
|
};
|
|
}
|