2014-08-24 19:18:18 +02:00
|
|
|
|
<section xmlns="http://docbook.org/ns/docbook"
|
|
|
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
|
|
|
xmlns:xi="http://www.w3.org/2001/XInclude"
|
|
|
|
|
version="5.0"
|
|
|
|
|
xml:id="sec-configuration-file">
|
|
|
|
|
|
|
|
|
|
<title>NixOS Configuration File</title>
|
|
|
|
|
|
|
|
|
|
<para>The NixOS configuration file generally looks like this:
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
{ config, pkgs, ... }:
|
|
|
|
|
|
|
|
|
|
{ <replaceable>option definitions</replaceable>
|
|
|
|
|
}
|
|
|
|
|
</programlisting>
|
|
|
|
|
|
|
|
|
|
The first line (<literal>{ config, pkgs, ... }:</literal>) denotes
|
|
|
|
|
that this is actually a function that takes at least the two arguments
|
|
|
|
|
<varname>config</varname> and <varname>pkgs</varname>. (These are
|
|
|
|
|
explained later.) The function returns a <emphasis>set</emphasis> of
|
|
|
|
|
option definitions (<literal>{ <replaceable>...</replaceable> }</literal>). These definitions have the
|
|
|
|
|
form <literal><replaceable>name</replaceable> =
|
|
|
|
|
<replaceable>value</replaceable></literal>, where
|
|
|
|
|
<replaceable>name</replaceable> is the name of an option and
|
|
|
|
|
<replaceable>value</replaceable> is its value. For example,
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
{ config, pkgs, ... }:
|
|
|
|
|
|
|
|
|
|
{ services.httpd.enable = true;
|
|
|
|
|
services.httpd.adminAddr = "alice@example.org";
|
|
|
|
|
services.httpd.documentRoot = "/webroot";
|
|
|
|
|
}
|
|
|
|
|
</programlisting>
|
|
|
|
|
|
|
|
|
|
defines a configuration with three option definitions that together
|
|
|
|
|
enable the Apache HTTP Server with <filename>/webroot</filename> as
|
|
|
|
|
the document root.</para>
|
|
|
|
|
|
|
|
|
|
<para>Sets can be nested, and in fact dots in option names are
|
|
|
|
|
shorthand for defining a set containing another set. For instance,
|
|
|
|
|
<option>services.httpd.enable</option> defines a set named
|
|
|
|
|
<varname>services</varname> that contains a set named
|
|
|
|
|
<varname>httpd</varname>, which in turn contains an option definition
|
|
|
|
|
named <varname>enable</varname> with value <literal>true</literal>.
|
|
|
|
|
This means that the example above can also be written as:
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
{ config, pkgs, ... }:
|
|
|
|
|
|
|
|
|
|
{ services = {
|
|
|
|
|
httpd = {
|
|
|
|
|
enable = true;
|
|
|
|
|
adminAddr = "alice@example.org";
|
|
|
|
|
documentRoot = "/webroot";
|
|
|
|
|
};
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
</programlisting>
|
|
|
|
|
|
|
|
|
|
which may be more convenient if you have lots of option definitions
|
|
|
|
|
that share the same prefix (such as
|
|
|
|
|
<literal>services.httpd</literal>).</para>
|
|
|
|
|
|
|
|
|
|
<para>NixOS checks your option definitions for correctness. For
|
|
|
|
|
instance, if you try to define an option that doesn’t exist (that is,
|
|
|
|
|
doesn’t have a corresponding <emphasis>option declaration</emphasis>),
|
|
|
|
|
<command>nixos-rebuild</command> will give an error like:
|
|
|
|
|
<screen>
|
2015-03-07 14:43:23 +01:00
|
|
|
|
The option `services.httpd.enable' defined in `/etc/nixos/configuration.nix' does not exist.
|
2014-08-24 19:18:18 +02:00
|
|
|
|
</screen>
|
|
|
|
|
Likewise, values in option definitions must have a correct type. For
|
|
|
|
|
instance, <option>services.httpd.enable</option> must be a Boolean
|
|
|
|
|
(<literal>true</literal> or <literal>false</literal>). Trying to give
|
|
|
|
|
it a value of another type, such as a string, will cause an error:
|
|
|
|
|
<screen>
|
|
|
|
|
The option value `services.httpd.enable' in `/etc/nixos/configuration.nix' is not a boolean.
|
|
|
|
|
</screen>
|
|
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
<para>Options have various types of values. The most important are:
|
|
|
|
|
|
|
|
|
|
<variablelist>
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>Strings</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>Strings are enclosed in double quotes, e.g.
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
networking.hostName = "dexter";
|
|
|
|
|
</programlisting>
|
|
|
|
|
|
|
|
|
|
Special characters can be escaped by prefixing them with a
|
|
|
|
|
backslash (e.g. <literal>\"</literal>).</para>
|
|
|
|
|
|
|
|
|
|
<para>Multi-line strings can be enclosed in <emphasis>double
|
|
|
|
|
single quotes</emphasis>, e.g.
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
networking.extraHosts =
|
|
|
|
|
''
|
|
|
|
|
127.0.0.2 other-localhost
|
|
|
|
|
10.0.0.1 server
|
|
|
|
|
'';
|
|
|
|
|
</programlisting>
|
|
|
|
|
|
|
|
|
|
The main difference is that preceding whitespace is
|
|
|
|
|
automatically stripped from each line, and that characters like
|
|
|
|
|
<literal>"</literal> and <literal>\</literal> are not special
|
|
|
|
|
(making it more convenient for including things like shell
|
|
|
|
|
code).</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>Booleans</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>These can be <literal>true</literal> or
|
|
|
|
|
<literal>false</literal>, e.g.
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
networking.firewall.enable = true;
|
|
|
|
|
networking.firewall.allowPing = false;
|
|
|
|
|
</programlisting>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>Integers</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>For example,
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
boot.kernel.sysctl."net.ipv4.tcp_keepalive_time" = 60;
|
|
|
|
|
</programlisting>
|
|
|
|
|
|
|
|
|
|
(Note that here the attribute name
|
|
|
|
|
<literal>net.ipv4.tcp_keepalive_time</literal> is enclosed in
|
|
|
|
|
quotes to prevent it from being interpreted as a set named
|
|
|
|
|
<literal>net</literal> containing a set named
|
|
|
|
|
<literal>ipv4</literal>, and so on. This is because it’s not a
|
|
|
|
|
NixOS option but the literal name of a Linux kernel
|
|
|
|
|
setting.)</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>Sets</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>Sets were introduced above. They are name/value pairs
|
|
|
|
|
enclosed in braces, as in the option definition
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
fileSystems."/boot" =
|
|
|
|
|
{ device = "/dev/sda1";
|
|
|
|
|
fsType = "ext4";
|
|
|
|
|
options = "rw,data=ordered,relatime";
|
|
|
|
|
};
|
|
|
|
|
</programlisting>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>Lists</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>The important thing to note about lists is that list
|
|
|
|
|
elements are separated by whitespace, like this:
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
boot.kernelModules = [ "fuse" "kvm-intel" "coretemp" ];
|
|
|
|
|
</programlisting>
|
|
|
|
|
|
|
|
|
|
List elements can be any other type, e.g. sets:
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
swapDevices = [ { device = "/dev/disk/by-label/swap"; } ];
|
|
|
|
|
</programlisting>
|
|
|
|
|
</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
|
|
|
|
|
<varlistentry>
|
|
|
|
|
<term>Packages</term>
|
|
|
|
|
<listitem>
|
|
|
|
|
<para>Usually, the packages you need are already part of the Nix
|
|
|
|
|
Packages collection, which is a set that can be accessed through
|
|
|
|
|
the function argument <varname>pkgs</varname>. Typical uses:
|
|
|
|
|
|
|
|
|
|
<programlisting>
|
|
|
|
|
environment.systemPackages =
|
|
|
|
|
[ pkgs.thunderbird
|
|
|
|
|
pkgs.emacs
|
|
|
|
|
];
|
|
|
|
|
|
|
|
|
|
postgresql.package = pkgs.postgresql90;
|
|
|
|
|
</programlisting>
|
|
|
|
|
|
|
|
|
|
The latter option definition changes the default PostgreSQL
|
|
|
|
|
package used by NixOS’s PostgreSQL service to 9.0. For more
|
|
|
|
|
information on packages, including how to add new ones, see
|
|
|
|
|
<xref linkend="sec-custom-packages"/>.</para>
|
|
|
|
|
</listitem>
|
|
|
|
|
</varlistentry>
|
|
|
|
|
|
|
|
|
|
</variablelist>
|
|
|
|
|
|
|
|
|
|
</para>
|
|
|
|
|
|
|
|
|
|
</section>
|