Skip to content
Snippets Groups Projects
guix.texi 1.13 MiB
Newer Older
  • Learn to ignore specific revisions
  • @cindex SSH, copy of store items
    @cindex sharing store items across machines
    @cindex transferring store items across machines
    The @command{guix copy} command copies items from the store of one
    machine to that of another machine over a secure shell (SSH)
    connection@footnote{This command is available only when Guile-SSH was
    found.  @xref{Requirements}, for details.}.  For example, the following
    command copies the @code{coreutils} package, the user's profile, and all
    their dependencies over to @var{host}, logged in as @var{user}:
    
    guix copy --to=@var{user}@@@var{host} \
              coreutils `readlink -f ~/.guix-profile`
    
    If some of the items to be copied are already present on @var{host},
    they are not actually sent.
    
    The command below retrieves @code{libreoffice} and @code{gimp} from
    @var{host}, assuming they are available there:
    
    guix copy --from=@var{host} libreoffice gimp
    
    The SSH connection is established using the Guile-SSH client, which is
    compatible with OpenSSH: it honors @file{~/.ssh/known_hosts} and
    @file{~/.ssh/config}, and uses the SSH agent for authentication.
    
    The key used to sign items that are sent must be accepted by the remote
    machine.  Likewise, the key used by the remote machine to sign items you
    are retrieving must be in @file{/etc/guix/acl} so it is accepted by your
    own daemon.  @xref{Invoking guix archive}, for more information about
    store item authentication.
    
    The general syntax is:
    
    guix copy [--to=@var{spec}|--from=@var{spec}] @var{items}@dots{}
    
    You must always specify one of the following options:
    
    @table @code
    @item --to=@var{spec}
    @itemx --from=@var{spec}
    Specify the host to send to or receive from.  @var{spec} must be an SSH
    spec such as @code{example.org}, @code{charlie@@example.org}, or
    @code{charlie@@example.org:2222}.
    @end table
    
    The @var{items} can be either package names, such as @code{gimp}, or
    store items, such as @file{/gnu/store/@dots{}-idutils-4.6}.
    
    When specifying the name of a package to send, it is first built if
    needed, unless @option{--dry-run} was specified.  Common build options
    are supported (@pxref{Common Build Options}).
    
    @node Invoking guix container
    @section Invoking @command{guix container}
    @cindex container
    @cindex @command{guix container}
    @quotation Note
    As of version @value{VERSION}, this tool is experimental.  The interface
    is subject to radical change in the future.
    @end quotation
    
    The purpose of @command{guix container} is to manipulate processes
    running within an isolated environment, commonly known as a
    ``container'', typically created by the @command{guix environment}
    (@pxref{Invoking guix environment}) and @command{guix system container}
    (@pxref{Invoking guix system}) commands.
    
    guix container @var{action} @var{options}@dots{}
    
    @var{action} specifies the operation to perform with a container, and
    @var{options} specifies the context-specific arguments for the action.
    
    The following actions are available:
    
    @table @code
    @item exec
    Execute a command within the context of a running container.
    
    guix container exec @var{pid} @var{program} @var{arguments}@dots{}
    
    @var{pid} specifies the process ID of the running container.
    @var{program} specifies an executable file name within the root file
    system of the container.  @var{arguments} are the additional options that
    will be passed to @var{program}.
    
    The following command launches an interactive login shell inside a
    
    Guix system container, started by @command{guix system container}, and whose
    
    guix container exec 9001 /run/current-system/profile/bin/bash --login
    
    Note that the @var{pid} cannot be the parent process of a container.  It
    must be PID 1 of the container or one of its child processes.
    
    @node Invoking guix weather
    @section Invoking @command{guix weather}
    
    Occasionally you're grumpy because substitutes are lacking and you end
    up building packages by yourself (@pxref{Substitutes}).  The
    @command{guix weather} command reports on substitute availability on the
    specified servers so you can have an idea of whether you'll be grumpy
    today.  It can sometimes be useful info as a user, but it is primarily
    useful to people running @command{guix publish} (@pxref{Invoking guix
    publish}).
    
    @cindex statistics, for substitutes
    @cindex availability of substitutes
    @cindex substitute availability
    @cindex weather, substitute availability
    Here's a sample run:
    
    $ guix weather --substitute-urls=https://guix.example.org
    computing 5,872 package derivations for x86_64-linux...
    looking for 6,128 store items on https://guix.example.org..
    updating list of substitutes from 'https://guix.example.org'... 100.0%
    https://guix.example.org
      43.4% substitutes available (2,658 out of 6,128)
      7,032.5 MiB of nars (compressed)
      19,824.2 MiB on disk (uncompressed)
      0.030 seconds per request (182.9 seconds in total)
      33.5 requests per second
    
      9.8% (342 out of 3,470) of the missing items are queued
      867 queued builds
          x86_64-linux: 518 (59.7%)
          i686-linux: 221 (25.5%)
          aarch64-linux: 128 (14.8%)
      build rate: 23.41 builds per hour
          x86_64-linux: 11.16 builds per hour
          i686-linux: 6.03 builds per hour
          aarch64-linux: 6.41 builds per hour
    @end example
    
    @cindex continuous integration, statistics
    As you can see, it reports the fraction of all the packages for which
    substitutes are available on the server---regardless of whether
    substitutes are enabled, and regardless of whether this server's signing
    key is authorized.  It also reports the size of the compressed archives
    (``nars'') provided by the server, the size the corresponding store
    items occupy in the store (assuming deduplication is turned off), and
    the server's throughput.  The second part gives continuous integration
    
    (CI) statistics, if the server supports it.  In addition, using the
    @option{--coverage} option, @command{guix weather} can list ``important''
    package substitutes missing on the server (see below).
    
    To achieve that, @command{guix weather} queries over HTTP(S) meta-data
    (@dfn{narinfos}) for all the relevant store items.  Like @command{guix
    challenge}, it ignores signatures on those substitutes, which is
    innocuous since the command only gathers statistics and cannot install
    those substitutes.
    
    The general syntax is:
    
    @example
    guix weather @var{options}@dots{} [@var{packages}@dots{}]
    @end example
    
    When @var{packages} is omitted, @command{guix weather} checks the availability
    of substitutes for @emph{all} the packages, or for those specified with
    @option{--manifest}; otherwise it only considers the specified packages.  It
    
    is also possible to query specific system types with @option{--system}.
    @command{guix weather} exits with a non-zero code when the fraction of
    available substitutes is below 100%.
    
    The available options are listed below.
    
    @table @code
    @item --substitute-urls=@var{urls}
    @var{urls} is the space-separated list of substitute server URLs to
    query.  When this option is omitted, the default set of substitute
    servers is queried.
    
    @item --system=@var{system}
    @itemx -s @var{system}
    Query substitutes for @var{system}---e.g., @code{aarch64-linux}.  This
    option can be repeated, in which case @command{guix weather} will query
    substitutes for several system types.
    
    @item --manifest=@var{file}
    Instead of querying substitutes for all the packages, only ask for those
    specified in @var{file}.  @var{file} must contain a @dfn{manifest}, as
    with the @code{-m} option of @command{guix package} (@pxref{Invoking
    guix package}).
    
    This option can be repeated several times, in which case the manifests
    are concatenated.
    
    
    @item --coverage[=@var{count}]
    @itemx -c [@var{count}]
    Report on substitute coverage for packages: list packages with at least
    @var{count} dependents (zero by default) for which substitutes are
    unavailable.  Dependent packages themselves are not listed: if @var{b} depends
    on @var{a} and @var{a} has no substitutes, only @var{a} is listed, even though
    @var{b} usually lacks substitutes as well.  The result looks like this:
    
    @example
    
    $ guix weather --substitute-urls=@value{SUBSTITUTE-URL} -c 10
    
    computing 8,983 package derivations for x86_64-linux...
    
    looking for 9,343 store items on @value{SUBSTITUTE-URL}...
    updating substitutes from '@value{SUBSTITUTE-URL}'... 100.0%
    @value{SUBSTITUTE-URL}
    
      64.7% substitutes available (6,047 out of 9,343)
    @dots{}
    
    2502 packages are missing from '@value{SUBSTITUTE-URL}' for 'x86_64-linux', among which:
    
        58  kcoreaddons@@5.49.0      /gnu/store/@dots{}-kcoreaddons-5.49.0
        46  qgpgme@@1.11.1           /gnu/store/@dots{}-qgpgme-1.11.1
        37  perl-http-cookiejar@@0.008  /gnu/store/@dots{}-perl-http-cookiejar-0.008
        @dots{}
    @end example
    
    What this example shows is that @code{kcoreaddons} and presumably the 58
    packages that depend on it have no substitutes at @code{ci.guix.info};
    likewise for @code{qgpgme} and the 46 packages that depend on it.
    
    If you are a Guix developer, or if you are taking care of this build farm,
    you'll probably want to have a closer look at these packages: they may simply
    fail to build.
    
    
    @item --display-missing
    Display the list of store items for which substitutes are missing.
    
    @node Invoking guix processes
    @section Invoking @command{guix processes}
    
    The @command{guix processes} command can be useful to developers and system
    administrators, especially on multi-user machines and on build farms: it lists
    the current sessions (connections to the daemon), as well as information about
    the processes involved@footnote{Remote sessions, when @command{guix-daemon} is
    started with @option{--listen} specifying a TCP endpoint, are @emph{not}
    listed.}.  Here's an example of the information it returns:
    
    $ sudo guix processes
    SessionPID: 19002
    ClientPID: 19090
    ClientCommand: guix environment --ad-hoc python
    
    SessionPID: 19402
    ClientPID: 19367
    ClientCommand: guix publish -u guix-publish -p 3000 -C 9 @dots{}
    
    SessionPID: 19444
    ClientPID: 19419
    ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{}
    LockHeld: /gnu/store/@dots{}-perl-ipc-cmd-0.96.lock
    LockHeld: /gnu/store/@dots{}-python-six-bootstrap-1.11.0.lock
    LockHeld: /gnu/store/@dots{}-libjpeg-turbo-2.0.0.lock
    ChildProcess: 20495: guix offload x86_64-linux 7200 1 28800
    ChildProcess: 27733: guix offload x86_64-linux 7200 1 28800
    ChildProcess: 27793: guix offload x86_64-linux 7200 1 28800
    @end example
    
    In this example we see that @command{guix-daemon} has three clients:
    @command{guix environment}, @command{guix publish}, and the Cuirass continuous
    integration tool; their process identifier (PID) is given by the
    @code{ClientPID} field.  The @code{SessionPID} field gives the PID of the
    @command{guix-daemon} sub-process of this particular session.
    
    The @code{LockHeld} fields show which store items are currently locked by this
    session, which corresponds to store items being built or substituted (the
    @code{LockHeld} field is not displayed when @command{guix processes} is not
    
    zimoun's avatar
    zimoun committed
    running as root).  Last, by looking at the @code{ChildProcess} field, we
    
    understand that these three builds are being offloaded (@pxref{Daemon Offload
    Setup}).
    
    The output is in Recutils format so we can use the handy @command{recsel}
    command to select sessions of interest (@pxref{Selection Expressions,,,
    recutils, GNU recutils manual}).  As an example, the command shows the command
    line and PID of the client that triggered the build of a Perl package:
    
    $ sudo guix processes | \
        recsel -p ClientPID,ClientCommand -e 'LockHeld ~ "perl"'
    ClientPID: 19419
    ClientCommand: cuirass --cache-directory /var/cache/cuirass @dots{}
    
    @node System Configuration
    
    @cindex system configuration
    
    Guix System supports a consistent whole-system configuration
    
    mechanism.  By that we mean that all aspects of the global system
    configuration---such as the available system services, timezone and
    locale settings, user accounts---are declared in a single place.  Such
    a @dfn{system configuration} can be @dfn{instantiated}---i.e., effected.
    
    One of the advantages of putting all the system configuration under the
    control of Guix is that it supports transactional system upgrades, and
    
    makes it possible to roll back to a previous system instantiation,
    
    should something go wrong with the new one (@pxref{Features}).  Another
    
    advantage is that it makes it easy to replicate the exact same configuration
    
    across different machines, or at different points in time, without
    having to resort to additional administration tools layered on top of
    
    the own tools of the system.
    
    @c Yes, we're talking of Puppet, Chef, & co. here.  ↑
    
    This section describes this mechanism.  First we focus on the system
    administrator's viewpoint---explaining how the system is configured and
    instantiated.  Then we show how this mechanism can be extended, for
    instance to support new system services.
    
    @menu
    * Using the Configuration System::  Customizing your GNU system.
    
    * operating-system Reference::  Detail of operating-system declarations.
    
    * File Systems::                Configuring file system mounts.
    
    * Mapped Devices::              Block device extra processing.
    
    * User Accounts::               Specifying user accounts.
    
    * Keyboard Layout::             How the system interprets key strokes.
    
    * Locales::                     Language and cultural convention settings.
    
    * Services::                    Specifying system services.
    
    * Setuid Programs::             Programs running with root privileges.
    
    * X.509 Certificates::          Authenticating HTTPS servers.
    
    * Name Service Switch::         Configuring libc's name service switch.
    
    * Initial RAM Disk::            Linux-Libre bootstrapping.
    
    * Bootloader Configuration::    Configuring the boot loader.
    
    * Invoking guix system::        Instantiating a system configuration.
    
    * Invoking guix deploy::        Deploying a system configuration to a remote host.
    
    * Running Guix in a VM::        How to run Guix System in a virtual machine.
    
    * Defining Services::           Adding new service definitions.
    @end menu
    
    @node Using the Configuration System
    
    @section Using the Configuration System
    
    The operating system is configured by providing an
    @code{operating-system} declaration in a file that can then be passed to
    the @command{guix system} command (@pxref{Invoking guix system}).  A
    simple setup, with the default system services, the default Linux-Libre
    kernel, initial RAM disk, and boot loader looks like this:
    
    @findex operating-system
    @lisp
    
    @include os-config-bare-bones.texi
    
    This example should be self-describing.  Some of the fields defined
    above, such as @code{host-name} and @code{bootloader}, are mandatory.
    Others, such as @code{packages} and @code{services}, can be omitted, in
    which case they get a default value.
    
    Below we discuss the effect of some of the most important fields
    (@pxref{operating-system Reference}, for details about all the available
    fields), and how to @dfn{instantiate} the operating system using
    @command{guix system}.
    
    
    
    @cindex legacy boot, on Intel machines
    @cindex BIOS boot, on Intel machines
    @cindex UEFI boot
    @cindex EFI boot
    The @code{bootloader} field describes the method that will be used to boot
    your system.  Machines based on Intel processors can boot in ``legacy'' BIOS
    mode, as in the example above.  However, more recent machines rely instead on
    the @dfn{Unified Extensible Firmware Interface} (UEFI) to boot.  In that case,
    the @code{bootloader} field should contain something along these lines:
    
    
    (bootloader-configuration
      (bootloader grub-efi-bootloader)
      (target "/boot/efi"))
    
    
    @xref{Bootloader Configuration}, for more information on the available
    configuration options.
    
    
    @unnumberedsubsec Globally-Visible Packages
    
    @vindex %base-packages
    
    The @code{packages} field lists packages that will be globally visible
    
    on the system, for all user accounts---i.e., in every user's @env{PATH}
    
    environment variable---in addition to the per-user profiles
    
    (@pxref{Invoking guix package}).  The @code{%base-packages} variable
    
    provides all the tools one would expect for basic user and administrator
    tasks---including the GNU Core Utilities, the GNU Networking Utilities,
    the GNU Zile lightweight text editor, @command{find}, @command{grep},
    
    etc.  The example above adds GNU@tie{}Screen to those,
    taken from the @code{(gnu packages screen)}
    module (@pxref{Package Modules}).  The
    
    @code{(list package output)} syntax can be used to add a specific output
    of a package:
    
    @lisp
    (use-modules (gnu packages))
    (use-modules (gnu packages dns))
    
    (operating-system
      ;; ...
      (packages (cons (list bind "utils")
                      %base-packages)))
    @end lisp
    
    @findex specification->package
    
    Referring to packages by variable name, like @code{bind} above, has
    
    the advantage of being unambiguous; it also allows typos and such to be
    diagnosed right away as ``unbound variables''.  The downside is that one
    needs to know which module defines which package, and to augment the
    @code{use-package-modules} line accordingly.  To avoid that, one can use
    the @code{specification->package} procedure of the @code{(gnu packages)}
    module, which returns the best package for a given name or name and
    version:
    
    @lisp
    (use-modules (gnu packages))
    
    (operating-system
      ;; ...
      (packages (append (map specification->package
    
                             '("tcpdump" "htop" "gnupg@@2.0"))
    
    @unnumberedsubsec System Services
    
    @cindex services
    
    @vindex %base-services
    The @code{services} field lists @dfn{system services} to be made
    available when the system starts (@pxref{Services}).
    The @code{operating-system} declaration above specifies that, in
    
    addition to the basic services, we want the OpenSSH secure shell
    
    daemon listening on port 2222 (@pxref{Networking Services,
    
    @code{openssh-service-type}}).  Under the hood,
    @code{openssh-service-type} arranges so that @command{sshd} is started with the
    
    right command-line options, possibly with supporting configuration files
    
    generated as needed (@pxref{Defining Services}).
    
    @cindex customization, of services
    @findex modify-services
    Occasionally, instead of using the base services as is, you will want to
    
    customize them.  To do this, use @code{modify-services} (@pxref{Service
    Reference, @code{modify-services}}) to modify the list.
    
    For example, suppose you want to modify @code{guix-daemon} and Mingetty
    
    (the console log-in) in the @code{%base-services} list (@pxref{Base
    
    Services, @code{%base-services}}).  To do that, you can write the
    following in your operating system declaration:
    
    (define %my-services
      ;; My very own list of services.
      (modify-services %base-services
        (guix-service-type config =>
                           (guix-configuration
                            (inherit config)
    
                            ;; Fetch substitutes from example.org.
                            (substitute-urls
                              (list "https://example.org/guix"
                                    "https://ci.guix.gnu.org"))))
    
        (mingetty-service-type config =>
                               (mingetty-configuration
    
                                (inherit config)
                                ;; Automatially log in as "guest".
                                (auto-login "guest")))))
    
    
    (operating-system
      ;; @dots{}
      (services %my-services))
    
    This changes the configuration---i.e., the service parameters---of the
    @code{guix-service-type} instance, and that of all the
    
    @code{mingetty-service-type} instances in the @code{%base-services} list.
    
    Observe how this is accomplished: first, we arrange for the original
    configuration to be bound to the identifier @code{config} in the
    @var{body}, and then we write the @var{body} so that it evaluates to the
    desired configuration.  In particular, notice how we use @code{inherit}
    to create a new configuration which has the same values as the old
    configuration, but with a few modifications.
    
    @cindex encrypted disk
    The configuration for a typical ``desktop'' usage, with an encrypted
    root partition, the X11 display
    
    server, GNOME and Xfce (users can choose which of these desktop
    environments to use at the log-in screen by pressing @kbd{F1}), network
    management, power management, and more, would look like this:
    
    A graphical system with a choice of lightweight window managers
    
    instead of full-blown desktop environments would look like this:
    
    @lisp
    @include os-config-lightweight-desktop.texi
    @end lisp
    
    
    This example refers to the @file{/boot/efi} file system by its UUID,
    
    @code{1234-ABCD}.  Replace this UUID with the right UUID on your system,
    as returned by the @command{blkid} command.
    
    
    @xref{Desktop Services}, for the exact list of services provided by
    
    @code{%desktop-services}.  @xref{X.509 Certificates}, for background
    
    information about the @code{nss-certs} package that is used here.
    
    Again, @code{%desktop-services} is just a list of service objects.  If
    
    you want to remove services from there, you can do so using the
    procedures for list filtering (@pxref{SRFI-1 Filtering and
    Partitioning,,, guile, GNU Guile Reference Manual}).  For instance, the
    following expression returns a list that contains all the services in
    
    @code{%desktop-services} minus the Avahi service:
    
    (remove (lambda (service)
              (eq? (service-kind service) avahi-service-type))
            %desktop-services)
    
    @unnumberedsubsec Instantiating the System
    
    
    Assuming the @code{operating-system} declaration
    is stored in the @file{my-system-config.scm}
    
    file, the @command{guix system reconfigure my-system-config.scm} command
    instantiates that configuration, and makes it the default GRUB boot
    
    entry (@pxref{Invoking guix system}).
    
    
    The normal way to change the system configuration is by updating this
    
    file and re-running @command{guix system reconfigure}.  One should never
    
    have to touch files in @file{/etc} or to run commands that modify the
    
    system state such as @command{useradd} or @command{grub-install}.  In
    fact, you must avoid that since that would not only void your warranty
    but also prevent you from rolling back to previous versions of your
    system, should you ever need to.
    
    @cindex roll-back, of the operating system
    Speaking of roll-back, each time you run @command{guix system
    reconfigure}, a new @dfn{generation} of the system is created---without
    modifying or deleting previous generations.  Old system generations get
    
    an entry in the bootloader boot menu, allowing you to boot them in case
    
    something went wrong with the latest generation.  Reassuring, no?  The
    @command{guix system list-generations} command lists the system
    
    generations available on disk.  It is also possible to roll back the
    system via the commands @command{guix system roll-back} and
    @command{guix system switch-generation}.
    
    
    Julien Lepiller's avatar
    Julien Lepiller committed
    Although the @command{guix system reconfigure} command will not modify
    previous generations, you must take care when the current generation is not
    
    the latest (e.g., after invoking @command{guix system roll-back}), since
    the operation might overwrite a later generation (@pxref{Invoking guix
    system}).
    
    @unnumberedsubsec The Programming Interface
    
    At the Scheme level, the bulk of an @code{operating-system} declaration
    is instantiated with the following monadic procedure (@pxref{The Store
    Monad}):
    
    @deffn {Monadic Procedure} operating-system-derivation os
    Return a derivation that builds @var{os}, an @code{operating-system}
    object (@pxref{Derivations}).
    
    The output of the derivation is a single directory that refers to all
    the packages, configuration files, and other supporting files needed to
    instantiate @var{os}.
    @end deffn
    
    This procedure is provided by the @code{(gnu system)} module.  Along
    with @code{(gnu services)} (@pxref{Services}), this module contains the
    
    guts of Guix System.  Make sure to visit it!
    
    @node operating-system Reference
    
    @section @code{operating-system} Reference
    
    
    This section summarizes all the options available in
    @code{operating-system} declarations (@pxref{Using the Configuration
    System}).
    
    @deftp {Data Type} operating-system
    This is the data type representing an operating system configuration.
    By that, we mean all the global system configuration, not per-user
    configuration (@pxref{Using the Configuration System}).
    
    @table @asis
    
    @item @code{kernel} (default: @code{linux-libre})
    
    The package object of the operating system kernel to
    use@footnote{Currently only the Linux-libre kernel is fully supported.
    Using GNU@tie{}mach with the GNU@tie{}Hurd is experimental and only
    available when building a virtual machine disk image.}.
    
    @cindex hurd
    @item @code{hurd} (default: @code{#f})
    The package object of the hurd to be started by the kernel.  When this
    field is set, produce a GNU/Hurd operating system.  In that case,
    @code{kernel} must also be set to the @code{gnumach} package---the
    microkernel the Hurd runs on.
    
    @quotation Warning
    This feature is experimental and only supported for disk images.
    @end quotation
    
    @item @code{kernel-loadable-modules} (default: '())
    A list of objects (usually packages) to collect loadable kernel modules
    from--e.g. @code{(list ddcci-driver-linux)}.
    
    
    @item @code{kernel-arguments} (default: @code{%default-kernel-arguments})
    
    List of strings or gexps representing additional arguments to pass on
    
    the command-line of the kernel---e.g., @code{("console=ttyS0")}.
    
    @item @code{bootloader}
    
    The system bootloader configuration object.  @xref{Bootloader Configuration}.
    
    @item @code{label}
    This is the label (a string) as it appears in the bootloader's menu entry.
    The default label includes the kernel name and version.
    
    
    @item @code{keyboard-layout} (default: @code{#f})
    This field specifies the keyboard layout to use in the console.  It can be
    either @code{#f}, in which case the default keyboard layout is used (usually
    US English), or a @code{<keyboard-layout>} record.
    
    This keyboard layout is in effect as soon as the kernel has booted.  For
    instance, it is the keyboard layout in effect when you type a passphrase if
    your root file system is on a @code{luks-device-mapping} mapped device
    (@pxref{Mapped Devices}).
    
    @quotation Note
    This does @emph{not} specify the keyboard layout used by the bootloader, nor
    that used by the graphical display server.  @xref{Bootloader Configuration},
    for information on how to specify the bootloader's keyboard layout.  @xref{X
    Window}, for information on how to specify the keyboard layout used by the X
    Window System.
    @end quotation
    
    
    @item @code{initrd-modules} (default: @code{%base-initrd-modules})
    
    @cindex initrd
    @cindex initial RAM disk
    
    The list of Linux kernel modules that need to be available in the
    initial RAM disk.  @xref{Initial RAM Disk}.
    
    @item @code{initrd} (default: @code{base-initrd})
    
    A procedure that returns an initial RAM disk for the Linux
    
    kernel.  This field is provided to support low-level customization and
    should rarely be needed for casual use.  @xref{Initial RAM Disk}.
    
    @item @code{firmware} (default: @code{%base-firmware})
    
    @cindex firmware
    List of firmware packages loadable by the operating system kernel.
    
    
    The default includes firmware needed for Atheros- and Broadcom-based
    WiFi devices (Linux-libre modules @code{ath9k} and @code{b43-open},
    respectively).  @xref{Hardware Considerations}, for more info on
    supported hardware.
    
    @item @code{host-name}
    The host name.
    
    @item @code{hosts-file}
    @cindex hosts file
    
    A file-like object (@pxref{G-Expressions, file-like objects}) for use as
    
    @file{/etc/hosts} (@pxref{Host Names,,, libc, The GNU C Library
    
    Reference Manual}).  The default is a file with entries for
    
    @code{localhost} and @var{host-name}.
    
    @item @code{mapped-devices} (default: @code{'()})
    A list of mapped devices.  @xref{Mapped Devices}.
    
    @item @code{file-systems}
    A list of file systems.  @xref{File Systems}.
    
    @item @code{swap-devices} (default: @code{'()})
    @cindex swap devices
    
    A list of strings identifying devices or files to be used for ``swap
    space'' (@pxref{Memory Concepts,,, libc, The GNU C Library Reference
    Manual}).  For example, @code{'("/dev/sda3")} or @code{'("/swapfile")}.
    It is possible to specify a swap file in a file system on a mapped
    device, provided that the necessary device mapping and file system are
    also specified.  @xref{Mapped Devices} and @ref{File Systems}.
    
    @item @code{users} (default: @code{%base-user-accounts})
    
    @itemx @code{groups} (default: @code{%base-groups})
    
    List of user accounts and groups.  @xref{User Accounts}.
    
    
    If the @code{users} list lacks a user account with UID@tie{}0, a
    ``root'' account with UID@tie{}0 is automatically added.
    
    
    @item @code{skeletons} (default: @code{(default-skeletons)})
    
    Tobias Geerinckx-Rice's avatar
    Tobias Geerinckx-Rice committed
    A list of target file name/file-like object tuples (@pxref{G-Expressions,
    
    file-like objects}).  These are the skeleton files that will be added to
    the home directory of newly-created user accounts.
    
    
    For instance, a valid value may look like this:
    
    
    `((".bashrc" ,(plain-file "bashrc" "echo Hello\n"))
      (".guile" ,(plain-file "guile"
                             "(use-modules (ice-9 readline))
                              (activate-readline)")))
    
    @item @code{issue} (default: @code{%default-issue})
    
    A string denoting the contents of the @file{/etc/issue} file, which is
    
    displayed when users log in on a text console.
    
    @item @code{packages} (default: @code{%base-packages})
    
    A list of packages to be installed in the global profile, which is accessible
    at @file{/run/current-system/profile}.  Each element is either a package
    variable or a package/output tuple.  Here's a simple example of both:
    
    @lisp
    
    Tobias Geerinckx-Rice's avatar
    Tobias Geerinckx-Rice committed
    (cons* git                     ; the default "out" output
           (list git "send-email") ; another output of git
           %base-packages)         ; the default set
    
    The default set includes core utilities and it is good practice to
    
    install non-core utilities in user profiles (@pxref{Invoking guix
    package}).
    
    @item @code{timezone}
    A timezone identifying string---e.g., @code{"Europe/Paris"}.
    
    
    You can run the @command{tzselect} command to find out which timezone
    string corresponds to your region.  Choosing an invalid timezone name
    causes @command{guix system} to fail.
    
    
    @item @code{locale} (default: @code{"en_US.utf8"})
    The name of the default locale (@pxref{Locale Names,,, libc, The GNU C
    Library Reference Manual}).  @xref{Locales}, for more information.
    
    
    @item @code{locale-definitions} (default: @code{%default-locale-definitions})
    
    The list of locale definitions to be compiled and that may be used at
    run time.  @xref{Locales}.
    
    @item @code{locale-libcs} (default: @code{(list @var{glibc})})
    The list of GNU@tie{}libc packages whose locale data and tools are used
    to build the locale definitions.  @xref{Locales}, for compatibility
    considerations that justify this option.
    
    
    @item @code{name-service-switch} (default: @code{%default-nss})
    
    Configuration of the libc name service switch (NSS)---a
    
    @code{<name-service-switch>} object.  @xref{Name Service Switch}, for
    details.
    
    
    @item @code{services} (default: @code{%base-services})
    
    A list of service objects denoting system services.  @xref{Services}.
    
    @cindex essential services
    @item @code{essential-services} (default: ...)
    The list of ``essential services''---i.e., things like instances of
    @code{system-service-type} and @code{host-name-service-type} (@pxref{Service
    Reference}), which are derived from the operating system definition itself.
    As a user you should @emph{never} need to touch this field.
    
    
    @item @code{pam-services} (default: @code{(base-pam-services)})
    @cindex PAM
    @cindex pluggable authentication modules
    Linux @dfn{pluggable authentication module} (PAM) services.
    @c FIXME: Add xref to PAM services section.
    
    
    @item @code{setuid-programs} (default: @code{%setuid-programs})
    
    List of string-valued G-expressions denoting setuid programs.
    @xref{Setuid Programs}.
    
    
    @item @code{sudoers-file} (default: @code{%sudoers-specification})
    
    @cindex sudoers file
    
    The contents of the @file{/etc/sudoers} file as a file-like object
    (@pxref{G-Expressions, @code{local-file} and @code{plain-file}}).
    
    
    This file specifies which users can use the @command{sudo} command, what
    they are allowed to do, and what privileges they may gain.  The default
    is that only @code{root} and members of the @code{wheel} group may use
    @code{sudo}.
    
    @end table
    
    
    @deffn {Scheme Syntax} this-operating-system
    When used in the @emph{lexical scope} of an operating system field definition,
    this identifier resolves to the operating system being defined.
    
    The example below shows how to refer to the operating system being defined in
    the definition of the @code{label} field:
    
    
    (use-modules (gnu) (guix))
    
    (operating-system
      ;; ...
      (label (package-full-name
              (operating-system-kernel this-operating-system))))
    
    
    It is an error to refer to @code{this-operating-system} outside an operating
    system definition.
    @end deffn
    
    
    @node File Systems
    
    The list of file systems to be mounted is specified in the
    
    @code{file-systems} field of the operating system declaration
    
    (@pxref{Using the Configuration System}).  Each file system is declared
    using the @code{file-system} form, like this:
    
    (file-system
      (mount-point "/home")
      (device "/dev/sda3")
      (type "ext4"))
    
    As usual, some of the fields are mandatory---those shown in the example
    above---while others can be omitted.  These are described below.
    
    @deftp {Data Type} file-system
    Objects of this type represent file systems to be mounted.  They
    contain the following members:
    
    @table @asis
    @item @code{type}
    This is a string specifying the type of the file system---e.g.,
    @code{"ext4"}.
    
    @item @code{mount-point}
    This designates the place where the file system is to be mounted.
    
    @item @code{device}
    
    This names the ``source'' of the file system.  It can be one of three
    things: a file system label, a file system UUID, or the name of a
    @file{/dev} node.  Labels and UUIDs offer a way to refer to file
    systems without having to hard-code their actual device
    name@footnote{Note that, while it is tempting to use
    @file{/dev/disk/by-uuid} and similar device names to achieve the same
    result, this is not recommended: These special device nodes are created
    by the udev daemon and may be unavailable at the time the device is
    mounted.}.
    
    @findex file-system-label
    File system labels are created using the @code{file-system-label}
    procedure, UUIDs are created using @code{uuid}, and @file{/dev} node are
    plain strings.  Here's an example of a file system referred to by its
    label, as shown by the @command{e2label} command:
    
    (file-system
      (mount-point "/home")
      (type "ext4")
      (device (file-system-label "my-home")))
    
    @findex uuid
    UUIDs are converted from their string representation (as shown by the
    
    @command{tune2fs -l} command) using the @code{uuid} form@footnote{The
    @code{uuid} form expects 16-byte UUIDs as defined in
    @uref{https://tools.ietf.org/html/rfc4122, RFC@tie{}4122}.  This is the
    form of UUID used by the ext2 family of file systems and others, but it
    is different from ``UUIDs'' found in FAT file systems, for instance.},
    like this:
    
    (file-system
      (mount-point "/home")
      (type "ext4")
      (device (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
    
    When the source of a file system is a mapped device (@pxref{Mapped
    
    Devices}), its @code{device} field @emph{must} refer to the mapped
    
    device name---e.g., @file{"/dev/mapper/root-partition"}.
    This is required so that
    
    the system knows that mounting the file system depends on having the
    corresponding device mapping established.
    
    
    @item @code{flags} (default: @code{'()})
    This is a list of symbols denoting mount flags.  Recognized flags
    
    include @code{read-only}, @code{bind-mount}, @code{no-dev} (disallow
    access to special files), @code{no-suid} (ignore setuid and setgid
    
    bits), @code{no-atime} (do not update file access times),
    @code{strict-atime} (update file access time), @code{lazy-time} (only
    update time on the in-memory version of the file inode), and
    @code{no-exec} (disallow program execution).
    @xref{Mount-Unmount-Remount,,, libc, The GNU C Library Reference
    Manual}, for more information on these flags.
    
    @item @code{options} (default: @code{#f})
    
    This is either @code{#f}, or a string denoting mount options passed to
    the file system driver.  @xref{Mount-Unmount-Remount,,, libc, The GNU C
    Library Reference Manual}, for details and run @command{man 8 mount} for
    options for various file systems.  Note that the
    @code{file-system-options->alist} and @code{alist->file-system-options}
    procedures from @code{(gnu system file-systems)} can be used to convert
    file system options given as an association list to the string
    representation, and vice-versa.
    
    @item @code{mount?} (default: @code{#t})
    This value indicates whether to automatically mount the file system when
    the system is brought up.  When set to @code{#f}, the file system gets
    an entry in @file{/etc/fstab} (read by the @command{mount} command) but
    is not automatically mounted.
    
    
    @item @code{needed-for-boot?} (default: @code{#f})
    This Boolean value indicates whether the file system is needed when
    booting.  If that is true, then the file system is mounted when the
    initial RAM disk (initrd) is loaded.  This is always the case, for
    instance, for the root file system.
    
    @item @code{check?} (default: @code{#t})
    This Boolean indicates whether the file system needs to be checked for
    errors before being mounted.
    
    @item @code{create-mount-point?} (default: @code{#f})
    When true, the mount point is created if it does not exist yet.
    
    
    @item @code{mount-may-fail?} (default: @code{#f})
    When true, this indicates that mounting this file system can fail but
    that should not be considered an error.  This is useful in unusual
    cases; an example of this is @code{efivarfs}, a file system that can
    only be mounted on EFI/UEFI systems.
    
    
    @item @code{dependencies} (default: @code{'()})
    
    This is a list of @code{<file-system>} or @code{<mapped-device>} objects
    representing file systems that must be mounted or mapped devices that
    must be opened before (and unmounted or closed after) this one.
    
    
    As an example, consider a hierarchy of mounts: @file{/sys/fs/cgroup} is
    a dependency of @file{/sys/fs/cgroup/cpu} and
    @file{/sys/fs/cgroup/memory}.
    
    
    Another example is a file system that depends on a mapped device, for
    example for an encrypted partition (@pxref{Mapped Devices}).
    
    @deffn {Scheme Procedure} file-system-label @var{str}
    This procedure returns an opaque file system label from @var{str}, a
    string:
    
    @lisp
    (file-system-label "home")
    @result{} #<file-system-label "home">
    @end lisp
    
    File system labels are used to refer to file systems by label rather
    than by device name.  See above for examples.
    @end deffn
    
    
    The @code{(gnu system file-systems)} exports the following useful
    variables.
    
    @defvr {Scheme Variable} %base-file-systems
    These are essential file systems that are required on normal systems,
    
    such as @code{%pseudo-terminal-file-system} and @code{%immutable-store} (see
    
    zimoun's avatar
    zimoun committed
    below).  Operating system declarations should always contain at least
    
    @defvr {Scheme Variable} %pseudo-terminal-file-system
    This is the file system to be mounted as @file{/dev/pts}.  It supports
    @dfn{pseudo-terminals} created @i{via} @code{openpty} and similar
    functions (@pxref{Pseudo-Terminals,,, libc, The GNU C Library Reference
    Manual}).  Pseudo-terminals are used by terminal emulators such as
    @command{xterm}.
    @end defvr
    
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @defvr {Scheme Variable} %shared-memory-file-system
    This file system is mounted as @file{/dev/shm} and is used to support
    memory sharing across processes (@pxref{Memory-mapped I/O,
    @code{shm_open},, libc, The GNU C Library Reference Manual}).
    @end defvr
    
    
    @defvr {Scheme Variable} %immutable-store
    This file system performs a read-only ``bind mount'' of
    @file{/gnu/store}, making it read-only for all the users including
    @code{root}.  This prevents against accidental modification by software
    running as @code{root} or by system administrators.
    
    The daemon itself is still able to write to the store: it remounts it
    read-write in its own ``name space.''
    @end defvr
    
    
    @defvr {Scheme Variable} %binary-format-file-system
    The @code{binfmt_misc} file system, which allows handling of arbitrary
    executable file types to be delegated to user space.  This requires the
    @code{binfmt.ko} kernel module to be loaded.
    @end defvr