Skip to content
Snippets Groups Projects
guix.texi 273 KiB
Newer Older
  • Learn to ignore specific revisions
  • However, when a file system's source 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}---and consequently
    @code{title} must be set to @code{'device}.  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), and @code{no-exec} (disallow program execution.)
    
    @item @code{options} (default: @code{#f})
    This is either @code{#f}, or a string denoting mount options.
    
    @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.
    
    
    @end table
    @end deftp
    
    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 @var{%devtmpfs-file-system} and @var{%immutable-store} (see
    below.)  Operating system declarations should always contain at least
    these.
    
    @end defvr
    
    @defvr {Scheme Variable} %devtmpfs-file-system
    The @code{devtmpfs} file system to be mounted on @file{/dev}.  This is a
    requirement for udev (@pxref{Base Services, @code{udev-service}}).
    @end defvr
    
    
    @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
    
    @defvr {Scheme Variable} %fuse-control-file-system
    The @code{fusectl} file system, which allows unprivileged users to mount
    and unmount user-space FUSE file systems.  This requires the
    @code{fuse.ko} kernel module to be loaded.
    @end defvr
    
    
    @node Mapped Devices
    @subsection Mapped Devices
    
    @cindex device mapping
    @cindex mapped devices
    The Linux kernel has a notion of @dfn{device mapping}: a block device,
    such as a hard disk partition, can be @dfn{mapped} into another device,
    with additional processing over the data that flows through
    it@footnote{Note that the GNU@tie{}Hurd makes no difference between the
    concept of a ``mapped device'' and that of a file system: both boil down
    to @emph{translating} input/output operations made on a file to
    operations on its backing store.  Thus, the Hurd implements mapped
    devices, like file systems, using the generic @dfn{translator} mechanism
    (@pxref{Translators,,, hurd, The GNU Hurd Reference Manual}).}.  A
    typical example is encryption device mapping: all writes to the mapped
    device are encrypted, and all reads are deciphered, transparently.
    
    Mapped devices are declared using the @code{mapped-device} form:
    
    @example
    (mapped-device
      (source "/dev/sda3")
      (target "home")
      (type luks-device-mapping))
    @end example
    
    @noindent
    @cindex disk encryption
    @cindex LUKS
    This example specifies a mapping from @file{/dev/sda3} to
    @file{/dev/mapper/home} using LUKS---the
    @url{http://code.google.com/p/cryptsetup,Linux Unified Key Setup}, a
    standard mechanism for disk encryption.  The @file{/dev/mapper/home}
    device can then be used as the @code{device} of a @code{file-system}
    declaration (@pxref{File Systems}).  The @code{mapped-device} form is
    detailed below.
    
    @deftp {Data Type} mapped-device
    Objects of this type represent device mappings that will be made when
    the system boots up.
    
    
    This string specifies the name of the block device to be mapped, such as
    @code{"/dev/sda3"}.
    
    
    This string specifies the name of the mapping to be established.  For
    example, specifying @code{"my-partition"} will lead to the creation of
    the @code{"/dev/mapper/my-partition"} device.
    
    
    This must be a @code{mapped-device-kind} object, which specifies how
    @var{source} is mapped to @var{target}.
    @end table
    @end deftp
    
    @defvr {Scheme Variable} luks-device-mapping
    This defines LUKS block device encryption using the @command{cryptsetup}
    command, from the same-named package.  This relies on the
    @code{dm-crypt} Linux kernel module.
    @end defvr
    
    
    @node User Accounts
    @subsection User Accounts
    
    User accounts and groups are entirely managed through the
    @code{operating-system} declaration.  They are specified with the
    @code{user-account} and @code{user-group} forms:
    
    @example
    (user-account
      (name "alice")
      (group "users")
    
      (supplementary-groups '("wheel"   ;allow use of sudo, etc.
                              "audio"   ;sound card
                              "video"   ;video devices such as webcams
                              "cdrom")) ;the good ol' CD-ROM
    
      (comment "Bob's sister")
      (home-directory "/home/alice"))
    @end example
    
    When booting or upon completion of @command{guix system reconfigure},
    the system ensures that only the user accounts and groups specified in
    the @code{operating-system} declaration exist, and with the specified
    properties.  Thus, account or group creations or modifications made by
    directly invoking commands such as @command{useradd} are lost upon
    reconfiguration or reboot.  This ensures that the system remains exactly
    as declared.
    
    
    @deftp {Data Type} user-account
    Objects of this type represent user accounts.  The following members may
    be specified:
    
    @table @asis
    @item @code{name}
    The name of the user account.
    
    @item @code{group}
    This is the name (a string) or identifier (a number) of the user group
    this account belongs to.
    
    @item @code{supplementary-groups} (default: @code{'()})
    Optionally, this can be defined as a list of group names that this
    account belongs to.
    
    @item @code{uid} (default: @code{#f})
    This is the user ID for this account (a number), or @code{#f}.  In the
    latter case, a number is automatically chosen by the system when the
    account is created.
    
    @item @code{comment} (default: @code{""})
    A comment about the account, such as the account's owner full name.
    
    @item @code{home-directory}
    This is the name of the home directory for the account.
    
    @item @code{shell} (default: Bash)
    This is a G-expression denoting the file name of a program to be used as
    the shell (@pxref{G-Expressions}).
    
    @item @code{system?} (default: @code{#f})
    This Boolean value indicates whether the account is a ``system''
    account.  System accounts are sometimes treated specially; for instance,
    graphical login managers do not list them.
    
    @item @code{password} (default: @code{#f})
    
    You would normally leave this field to @code{#f}, initialize user
    passwords as @code{root} with the @command{passwd} command, and then let
    
    users change it with @command{passwd}.  Passwords set with
    @command{passwd} are of course preserved across reboot and
    reconfiguration.
    
    
    If you @emph{do} want to have a preset password for an account, then
    this field must contain the encrypted password, as a string.
    
    @xref{crypt,,, libc, The GNU C Library Reference Manual}, for more information
    on password encryption, and @ref{Encryption,,, guile, GNU Guile Reference
    
    Manual}, for information on Guile's @code{crypt} procedure.
    
    @end table
    @end deftp
    
    User group declarations are even simpler:
    
    @example
    (user-group (name "students"))
    @end example
    
    @deftp {Data Type} user-group
    This type is for, well, user groups.  There are just a few fields:
    
    @table @asis
    @item @code{name}
    The group's name.
    
    @item @code{id} (default: @code{#f})
    The group identifier (a number).  If @code{#f}, a new number is
    automatically allocated when the group is created.
    
    @item @code{system?} (default: @code{#f})
    This Boolean value indicates whether the group is a ``system'' group.
    System groups have low numerical IDs.
    
    
    @item @code{password} (default: @code{#f})
    What, user groups can have a password?  Well, apparently yes.  Unless
    @code{#f}, this field specifies the group's password.
    
    @end table
    @end deftp
    
    For convenience, a variable lists all the basic user groups one may
    expect:
    
    @defvr {Scheme Variable} %base-groups
    This is the list of basic user groups that users and/or packages expect
    to be present on the system.  This includes groups such as ``root'',
    ``wheel'', and ``users'', as well as groups used to control access to
    specific devices such as ``audio'', ``disk'', and ``cdrom''.
    @end defvr
    
    @defvr {Scheme Variable} %base-user-accounts
    This is the list of basic system accounts that programs may expect to
    find on a GNU/Linux system, such as the ``nobody'' account.
    
    Note that the ``root'' account is not included here.  It is a
    special-case and is automatically added whether or not it is specified.
    @end defvr
    
    
    @node Locales
    @subsection Locales
    
    @cindex locale
    A @dfn{locale} defines cultural conventions for a particular language
    and region of the world (@pxref{Locales,,, libc, The GNU C Library
    Reference Manual}).  Each locale has a name that typically has the form
    @code{@var{language}_@var{territory}.@var{charset}}---e.g.,
    @code{fr_LU.utf8} designates the locale for the French language, with
    cultural conventions from Luxembourg, and using the UTF-8 encoding.
    
    @cindex locale definition
    Usually, you will want to specify the default locale for the machine
    using the @code{locale} field of the @code{operating-system} declaration
    (@pxref{operating-system Reference, @code{locale}}).
    
    That locale must be among the @dfn{locale definitions} that are known to
    the system---and these are specified in the @code{locale-definitions}
    slot of @code{operating-system}.  The default value includes locale
    definition for some widely used locales, but not for all the available
    locales, in order to save space.
    
    If the locale specified in the @code{locale} field is not among the
    definitions listed in @code{locale-definitions}, @command{guix system}
    raises an error.  In that case, you should add the locale definition to
    the @code{locale-definitions} field.  For instance, to add the North
    Frisian locale for Germany, the value of that field may be:
    
    @example
    (cons (locale-definition
            (name "fy_DE.utf8") (source "fy_DE"))
          %default-locale-definitions)
    @end example
    
    Likewise, to save space, one might want @code{locale-definitions} to
    list only the locales that are actually used, as in:
    
    @example
    (list (locale-definition
            (name "ja_JP.eucjp") (source "ja_JP")
            (charset "EUC-JP")))
    @end example
    
    The @code{locale-definition} form is provided by the @code{(gnu system
    locale)} module.  Details are given below.
    
    @deftp {Data Type} locale-definition
    This is the data type of a locale definition.
    
    @table @asis
    
    @item @code{name}
    The name of the locale.  @xref{Locale Names,,, libc, The GNU C Library
    Reference Manual}, for more information on locale names.
    
    @item @code{source}
    The name of the source for that locale.  This is typically the
    @code{@var{language}_@var{territory}} part of the locale name.
    
    @item @code{charset} (default: @code{"UTF-8"})
    The ``character set'' or ``code set'' for that locale,
    @uref{http://www.iana.org/assignments/character-sets, as defined by
    IANA}.
    
    @end table
    @end deftp
    
    @defvr {Scheme Variable} %default-locale-definitions
    An arbitrary list of commonly used locales, used as the default value of
    the @code{locale-definitions} field of @code{operating-system}
    declarations.
    @end defvr
    
    @node Services
    @subsection Services
    
    @cindex system services
    An important part of preparing an @code{operating-system} declaration is
    listing @dfn{system services} and their configuration (@pxref{Using the
    Configuration System}).  System services are typically daemons launched
    when the system boots, or other actions needed at that time---e.g.,
    
    configuring network access.
    
    Services are managed by GNU@tie{}dmd (@pxref{Introduction,,, dmd, GNU
    dmd Manual}).  On a running system, the @command{deco} command allows
    you to list the available services, show their status, start and stop
    them, or do other specific operations (@pxref{Jump Start,,, dmd, GNU dmd
    Manual}).  For example:
    
    @example
    # deco status dmd
    @end example
    
    The above command, run as @code{root}, lists the currently defined
    services.  The @command{deco doc} command shows a synopsis of the given
    service:
    
    @example
    # deco doc nscd
    Run libc's name service cache daemon (nscd).
    @end example
    
    The @command{start}, @command{stop}, and @command{restart} sub-commands
    have the effect you would expect.  For instance, the commands below stop
    the nscd service and restart the Xorg display server:
    
    @example
    # deco stop nscd
    Service nscd has been stopped.
    # deco restart xorg-server
    Service xorg-server has been stopped.
    Service xorg-server has been started.
    @end example
    
    The following sections document the available services, starting with
    
    the core services, that may be used in an @code{operating-system}
    declaration.
    
    @menu
    * Base Services::               Essential system services.
    * Networking Services::         Network setup, SSH daemon, etc.
    * X Window::                    Graphical display.
    
    * Desktop Services::            D-Bus and desktop services.
    
    * Database Services::           SQL databases.
    
    * Various Services::            Other services.
    
    @node Base Services
    @subsubsection Base Services
    
    The @code{(gnu services base)} module provides definitions for the basic
    services that one expects from the system.  The services exported by
    this module are listed below.
    
    @defvr {Scheme Variable} %base-services
    This variable contains a list of basic services@footnote{Technically,
    this is a list of monadic services.  @xref{The Store Monad}.} one would
    expect from the system: a login service (mingetty) on each tty, syslogd,
    libc's name service cache daemon (nscd), the udev device manager, and
    more.
    
    This is the default value of the @code{services} field of
    @code{operating-system} declarations.  Usually, when customizing a
    system, you will want to append services to @var{%base-services}, like
    this:
    
    Alex Kost's avatar
    Alex Kost committed
    (cons* (avahi-service) (lsh-service) %base-services)
    
    @end example
    @end defvr
    
    @deffn {Monadic Procedure} host-name-service @var{name}
    Return a service that sets the host name to @var{name}.
    @end deffn
    
    @deffn {Monadic Procedure} mingetty-service @var{tty} [#:motd] @
           [#:auto-login #f] [#:login-program] [#:login-pause? #f] @
           [#:allow-empty-passwords? #f]
    Return a service to run mingetty on @var{tty}.
    
    When @var{allow-empty-passwords?} is true, allow empty log-in password.  When
    @var{auto-login} is true, it must be a user name under which to log-in
    automatically.  @var{login-pause?} can be set to @code{#t} in conjunction with
    @var{auto-login}, in which case the user will have to press a key before the
    login shell is launched.
    
    When true, @var{login-program} is a gexp or a monadic gexp denoting the name
    of the log-in program (the default is the @code{login} program from the Shadow
    tool suite.)
    
    @var{motd} is a monadic value containing a text file to use as
    the ``message of the day''.
    @end deffn
    
    @cindex name service cache daemon
    @cindex nscd
    
    @deffn {Monadic Procedure} nscd-service [@var{config}] [#:glibc glibc] @
                    [#:name-services '()]
    Return a service that runs libc's name service cache daemon (nscd) with
    the given @var{config}---an @code{<nscd-configuration>} object.
    Optionally, @code{#:name-services} is a list of packages that provide
    
    name service switch (NSS) modules needed by nscd.  @xref{Name Service
    Switch}, for an example.
    
    @defvr {Scheme Variable} %nscd-default-configuration
    This is the default @code{<nscd-configuration>} value (see below) used
    by @code{nscd-service}.  This uses the caches defined by
    @var{%nscd-default-caches}; see below.
    @end defvr
    
    @deftp {Data Type} nscd-configuration
    This is the type representing the name service cache daemon (nscd)
    configuration.
    
    @table @asis
    
    @item @code{log-file} (default: @code{"/var/log/nscd.log"})
    Name of nscd's log file.  This is where debugging output goes when
    @code{debug-level} is strictly positive.
    
    @item @code{debug-level} (default: @code{0})
    Integer denoting the debugging levels.  Higher numbers mean more
    debugging output is logged.
    
    @item @code{caches} (default: @var{%nscd-default-caches})
    List of @code{<nscd-cache>} objects denoting things to be cached; see
    below.
    
    @end table
    @end deftp
    
    @deftp {Data Type} nscd-cache
    Data type representing a cache database of nscd and its parameters.
    
    @table @asis
    
    @item @code{database}
    This is a symbol representing the name of the database to be cached.
    Valid values are @code{passwd}, @code{group}, @code{hosts}, and
    @code{services}, which designate the corresponding NSS database
    (@pxref{NSS Basics,,, libc, The GNU C Library Reference Manual}).
    
    @item @code{positive-time-to-live}
    @itemx @code{negative-time-to-live} (default: @code{20})
    A number representing the number of seconds during which a positive or
    negative lookup result remains in cache.
    
    @item @code{check-files?} (default: @code{#t})
    Whether to check for updates of the files corresponding to
    @var{database}.
    
    For instance, when @var{database} is @code{hosts}, setting this flag
    instructs nscd to check for updates in @file{/etc/hosts} and to take
    them into account.
    
    @item @code{persistent?} (default: @code{#t})
    Whether the cache should be stored persistently on disk.
    
    @item @code{shared?} (default: @code{#t})
    Whether the cache should be shared among users.
    
    @item @code{max-database-size} (default: 32@tie{}MiB)
    Maximum size in bytes of the database cache.
    
    @c XXX: 'suggested-size' and 'auto-propagate?' seem to be expert
    @c settings, so leave them out.
    
    @end table
    @end deftp
    
    @defvr {Scheme Variable} %nscd-default-caches
    List of @code{<nscd-cache>} objects used by default by
    @code{nscd-configuration} (see above.)
    
    It enables persistent and aggressive caching of service and host name
    lookups.  The latter provides better host name lookup performance,
    resilience in the face of unreliable name servers, and also better
    privacy---often the result of host name lookups is in local cache, so
    external name servers do not even need to be queried.
    @end defvr
    
    
    
    @deffn {Monadic Procedure} syslog-service [#:config-file #f]
    Return a service that runs @code{syslogd}.  If configuration file name
    @var{config-file} is not specified, use some reasonable default
    
    @deffn {Monadic Procedure} guix-service [#:guix guix] @
           [#:builder-group "guixbuild"] [#:build-accounts 10] @
    
           [#:authorize-hydra-key? #t] [#:use-substitutes? #t] @
    
           [#:extra-options '()]
    Return a service that runs the build daemon from @var{guix}, and has
    @var{build-accounts} user accounts available under @var{builder-group}.
    
    When @var{authorize-hydra-key?} is true, the @code{hydra.gnu.org} public key
    provided by @var{guix} is authorized upon activation, meaning that substitutes
    from @code{hydra.gnu.org} are used by default.
    
    If @var{use-substitutes?} is false, the daemon is run with
    @option{--no-substitutes} (@pxref{Invoking guix-daemon,
    @option{--no-substitutes}}).
    
    Finally, @var{extra-options} is a list of additional command-line options
    passed to @command{guix-daemon}.
    @end deffn
    
    @deffn {Monadic Procedure} udev-service [#:udev udev]
    Run @var{udev}, which populates the @file{/dev} directory dynamically.
    @end deffn
    
    @deffn {Monadic Procedure} console-keymap-service @var{file}
    Return a service to load console keymap from @var{file} using
    @command{loadkeys} command.
    @end deffn
    
    
    @node Networking Services
    @subsubsection Networking Services
    
    Alex Kost's avatar
    Alex Kost committed
    The @code{(gnu services networking)} module provides services to configure
    
    the network interface.
    
    @cindex DHCP, networking service
    @deffn {Monadic Procedure} dhcp-client-service [#:dhcp @var{isc-dhcp}]
    Return a service that runs @var{dhcp}, a Dynamic Host Configuration
    Protocol (DHCP) client, on all the non-loopback network interfaces.
    @end deffn
    
    
    @deffn {Monadic Procedure} static-networking-service @var{interface} @var{ip} @
           [#:gateway #f] [#:name-services @code{'()}]
    Return a service that starts @var{interface} with address @var{ip}.  If
    @var{gateway} is true, it must be a string specifying the default network
    gateway.
    @end deffn
    
    @cindex wicd
    @deffn {Monadic Procedure} wicd-service [#:wicd @var{wicd}]
    Return a service that runs @url{https://launchpad.net/wicd,Wicd}, a
    network manager that aims to simplify wired and wireless networking.
    @end deffn
    
    
    @deffn {Monadic Procedure} ntp-service [#:ntp @var{ntp}] @
      [#:name-service @var{%ntp-servers}]
    Return a service that runs the daemon from @var{ntp}, the
    @uref{http://www.ntp.org, Network Time Protocol package}.  The daemon will
    keep the system clock synchronized with that of @var{servers}.
    @end deffn
    
    @defvr {Scheme Variable} %ntp-servers
    List of host names used as the default NTP servers.
    @end defvr
    
    
    @deffn {Monadic Procedure} tor-service [#:tor tor]
    Return a service to run the @uref{https://torproject.org,Tor} daemon.
    
    The daemon runs with the default settings (in particular the default exit
    policy) as the @code{tor} unprivileged user.
    @end deffn
    
    @deffn {Monadic Procedure} bitlbee-service [#:bitlbee bitlbee] @
             [#:interface "127.0.0.1"] [#:port 6667] @
             [#:extra-settings ""]
    Return a service that runs @url{http://bitlbee.org,BitlBee}, a daemon that
    acts as a gateway between IRC and chat networks.
    
    The daemon will listen to the interface corresponding to the IP address
    specified in @var{interface}, on @var{port}.  @code{127.0.0.1} means that only
    local clients can connect, whereas @code{0.0.0.0} means that connections can
    come from any networking interface.
    
    In addition, @var{extra-settings} specifies a string to append to the
    configuration file.
    @end deffn
    
    
    Furthermore, @code{(gnu services ssh)} provides the following service.
    
    @deffn {Monadic Procedure} lsh-service [#:host-key "/etc/lsh/host-key"] @
    
           [#:daemonic? #t] [#:interfaces '()] [#:port-number 22] @
    
           [#:allow-empty-passwords? #f] [#:root-login? #f] @
           [#:syslog-output? #t] [#:x11-forwarding? #t] @
           [#:tcp/ip-forwarding? #t] [#:password-authentication? #t] @
    
           [#:public-key-authentication? #t] [#:initialize? #t]
    
    Run the @command{lshd} program from @var{lsh} to listen on port @var{port-number}.
    @var{host-key} must designate a file containing the host key, and readable
    only by root.
    
    When @var{daemonic?} is true, @command{lshd} will detach from the
    controlling terminal and log its output to syslogd, unless one sets
    @var{syslog-output?} to false.  Obviously, it also makes lsh-service
    depend on existence of syslogd service.  When @var{pid-file?} is true,
    @command{lshd} writes its PID to the file called @var{pid-file}.
    
    
    When @var{initialize?} is true, automatically create the seed and host key
    upon service activation if they do not exist yet.  This may take long and
    require interaction.
    
    When @var{initialize?} is false, it is up to the user to initialize the
    randomness generator (@pxref{lsh-make-seed,,, lsh, LSH Manual}), and to create
    a key pair with the private key stored in file @var{host-key} (@pxref{lshd
    basics,,, lsh, LSH Manual}).
    
    
    When @var{interfaces} is empty, lshd listens for connections on all the
    network interfaces; otherwise, @var{interfaces} must be a list of host names
    or addresses.
    
    @var{allow-empty-passwords?} specifies whether to accept log-ins with empty
    passwords, and @var{root-login?} specifies whether to accept log-ins as
    
    The other options should be self-descriptive.
    @end deffn
    
    @defvr {Scheme Variable} %facebook-host-aliases
    This variable contains a string for use in @file{/etc/hosts}
    (@pxref{Host Names,,, libc, The GNU C Library Reference Manual}).  Each
    line contains a entry that maps a known server name of the Facebook
    on-line service---e.g., @code{www.facebook.com}---to the local
    host---@code{127.0.0.1} or its IPv6 equivalent, @code{::1}.
    
    This variable is typically used in the @code{hosts-file} field of an
    
    @code{operating-system} declaration (@pxref{operating-system Reference,
    @file{/etc/hosts}}):
    
    
    @example
    (use-modules (gnu) (guix))
    
    (operating-system
      (host-name "mymachine")
      ;; ...
      (hosts-file
        ;; Create a /etc/hosts file with aliases for "localhost"
        ;; and "mymachine", as well as for Facebook servers.
    
        (plain-file "hosts"
                    (string-append (local-host-aliases host-name)
                                   %facebook-host-aliases))))
    
    @end example
    
    This mechanism can prevent programs running locally, such as Web
    browsers, from accessing Facebook.
    @end defvr
    
    
    The @code{(gnu services avahi)} provides the following definition.
    
    @deffn {Monadic Procedure} avahi-service [#:avahi @var{avahi}] @
              [#:host-name #f] [#:publish? #t] [#:ipv4? #t] @
              [#:ipv6? #t] [#:wide-area? #f] @
              [#:domains-to-browse '()]
    Return a service that runs @command{avahi-daemon}, a system-wide
    mDNS/DNS-SD responder that allows for service discovery and
    "zero-configuration" host name lookups (see @uref{http://avahi.org/}).
    
    If @var{host-name} is different from @code{#f}, use that as the host name to
    publish for this machine; otherwise, use the machine's actual host name.
    
    When @var{publish?} is true, publishing of host names and services is allowed;
    in particular, avahi-daemon will publish the machine's host name and IP
    address via mDNS on the local network.
    
    When @var{wide-area?} is true, DNS-SD over unicast DNS is enabled.
    
    Boolean values @var{ipv4?} and @var{ipv6?} determine whether to use IPv4/IPv6
    sockets.
    @end deffn
    
    
    
    @node X Window
    @subsubsection X Window
    
    Support for the X Window graphical display system---specifically
    Xorg---is provided by the @code{(gnu services xorg)} module.  Note that
    there is no @code{xorg-service} procedure.  Instead, the X server is
    started by the @dfn{login manager}, currently SLiM.
    
    @deffn {Monadic Procedure} slim-service [#:allow-empty-passwords? #f] @
    
      [#:auto-login? #f] [#:default-user ""] [#:startx] @
      [#:theme @var{%default-slim-theme}] @
    
      [#:theme-name @var{%default-slim-theme-name}]
    
    Return a service that spawns the SLiM graphical login manager, which in
    turn starts the X display server with @var{startx}, a command as returned by
    @code{xorg-start-command}.
    
    @cindex X session
    
    SLiM automatically looks for session types described by the @file{.desktop}
    files in @file{/run/current-system/profile/share/xsessions} and allows users
    to choose a session from the log-in screen using @kbd{F1}.  Packages such as
    @var{xfce}, @var{sawfish}, and @var{ratpoison} provide @file{.desktop} files;
    adding them to the system-wide set of packages automatically makes them
    available at the log-in screen.
    
    In addition, @file{~/.xsession} files are honored.  When available,
    @file{~/.xsession} must be an executable that starts a window manager
    and/or other X clients.
    
    
    When @var{allow-empty-passwords?} is true, allow logins with an empty
    password.  When @var{auto-login?} is true, log in automatically as
    @var{default-user}.
    
    
    If @var{theme} is @code{#f}, the use the default log-in theme; otherwise
    @var{theme} must be a gexp denoting the name of a directory containing the
    theme to use.  In that case, @var{theme-name} specifies the name of the
    theme.
    
    @defvr {Scheme Variable} %default-theme
    @defvrx {Scheme Variable} %default-theme-name
    The G-Expression denoting the default SLiM theme and its name.
    @end defvr
    
    
    @deffn {Monadic Procedure} xorg-start-command [#:guile] @
    
      [#:configuration-file #f] [#:xorg-server @var{xorg-server}]
    
    Return a derivation that builds a @var{guile} script to start the X server
    
    from @var{xorg-server}.  @var{configuration-file} is the server configuration
    file or a derivation that builds it; when omitted, the result of
    @code{xorg-configuration-file} is used.
    
    Usually the X server is started by a login manager.
    @end deffn
    
    @deffn {Monadic Procedure} xorg-configuration-file @
    
      [#:drivers '()] [#:resolutions '()] [#:extra-config '()]
    
    Return a configuration file for the Xorg server containing search paths for
    all the common drivers.
    
    
    @var{drivers} must be either the empty list, in which case Xorg chooses a
    graphics driver automatically, or a list of driver names that will be tried in
    
    this order---e.g., @code{(\"modesetting\" \"vesa\")}.
    
    
    Likewise, when @var{resolutions} is the empty list, Xorg chooses an
    appropriate screen resolution; otherwise, it must be a list of
    resolutions---e.g., @code{((1024 768) (640 480))}.
    
    
    Last, @var{extra-config} is a list of strings or objects appended to the
    @code{text-file*} argument list.  It is used to pass extra text to be added
    verbatim to the configuration file.
    
    @node Desktop Services
    @subsubsection Desktop Services
    
    The @code{(gnu services desktop)} module provides services that are
    usually useful in the context of a ``desktop'' setup---that is, on a
    machine running a graphical display server, possibly with graphical user
    interfaces, etc.
    
    To simplify things, the module defines a variable containing the set of
    services that users typically expect on a machine with a graphical
    environment and networking:
    
    @defvr {Scheme Variable} %desktop-services
    This is a list of services that builds upon @var{%base-services} and
    adds or adjust services for a typical ``desktop'' setup.
    
    In particular, it adds a graphical login manager (@pxref{X Window,
    @code{slim-service}}), a network management tool (@pxref{Networking
    Services, @code{wicd-service}}), energy and color management services,
    
    an NTP client (@pxref{Networking Services}), the Avahi
    
    daemon, and has the name service switch service configured to be able to
    use @code{nss-mdns} (@pxref{Name Service Switch, mDNS}).
    @end defvr
    
    The @var{%desktop-services} variable can be used as the @code{services}
    field of an @code{operating-system} declaration (@pxref{operating-system
    Reference, @code{services}}).
    
    The actual service definitions provided by @code{(gnu services desktop)}
    are described below.
    
    
    @deffn {Monadic Procedure} dbus-service @var{services} @
                             [#:dbus @var{dbus}]
    Return a service that runs the ``system bus'', using @var{dbus}, with
    support for @var{services}.
    
    @uref{http://dbus.freedesktop.org/, D-Bus} is an inter-process communication
    facility.  Its system bus is used to allow system services to communicate
    and be notified of system-wide events.
    
    @var{services} must be a list of packages that provide an
    @file{etc/dbus-1/system.d} directory containing additional D-Bus configuration
    and policy files.  For example, to allow avahi-daemon to use the system bus,
    @var{services} must be equal to @code{(list avahi)}.
    
    @end deffn
    
    
    Andy Wingo's avatar
    Andy Wingo committed
    @deffn {Monadic Procedure} upower-service [#:upower @var{upower}] @
                             [#:watts-up-pro? #f] @
                             [#:poll-batteries? #t] @
                             [#:ignore-lid? #f] @
                             [#:use-percentage-for-policy? #f] @
                             [#:percentage-low 10] @
                             [#:percentage-critical 3] @
                             [#:percentage-action 2] @
                             [#:time-low 1200] @
                             [#:time-critical 300] @
                             [#:time-action 120] @
                             [#:critical-power-action 'hybrid-sleep]
    Return a service that runs @uref{http://upower.freedesktop.org/,
    @command{upowerd}}, a system-wide monitor for power consumption and battery
    levels, with the given configuration settings.  It implements the
    @code{org.freedesktop.UPower} D-Bus interface, and is notably used by
    GNOME.
    @end deffn
    
    
    Andy Wingo's avatar
    Andy Wingo committed
    @deffn {Monadic Procedure} colord-service [#:colord @var{colord}]
    Return a service that runs @command{colord}, a system service with a D-Bus
    interface to manage the color profiles of input and output devices such as
    screens and scanners.  It is notably used by the GNOME Color Manager graphical
    tool.  See @uref{http://www.freedesktop.org/software/colord/, the colord web
    site} for more information.
    @end deffn
    
    
    @node Database Services
    @subsubsection Database Services
    
    The @code{(gnu services databases)} module provides the following service.
    
    @deffn {Monadic Procedure} postgresql-service [#:postgresql postgresql] @
           [#:config-file] [#:data-directory ``/var/lib/postgresql/data'']
    Return a service that runs @var{postgresql}, the PostgreSQL database
    server.
    
    The PostgreSQL daemon loads its runtime configuration from
    @var{config-file} and stores the database cluster in
    @var{data-directory}.
    @end deffn
    
    
    @node Various Services
    @subsubsection Various Services
    
    The @code{(gnu services lirc)} module provides the following service.
    
    @deffn {Monadic Procedure} lirc-service [#:lirc lirc] @
           [#:device #f] [#:driver #f] [#:config-file #f] @
           [#:extra-options '()]
    Return a service that runs @url{http://www.lirc.org,LIRC}, a daemon that
    decodes infrared signals from remote controls.
    
    Optionally, @var{device}, @var{driver} and @var{config-file}
    (configuration file name) may be specified.  See @command{lircd} manual
    for details.
    
    Finally, @var{extra-options} is a list of additional command-line options
    passed to @command{lircd}.
    @end deffn
    
    
    
    @node Setuid Programs
    @subsection Setuid Programs
    
    @cindex setuid programs
    Some programs need to run with ``root'' privileges, even when they are
    launched by unprivileged users.  A notorious example is the
    @command{passwd} programs, which can users can run to change their
    password, and which requires write access to the @file{/etc/passwd} and
    @file{/etc/shadow} files---something normally restricted to root, for
    obvious security reasons.  To address that, these executables are
    @dfn{setuid-root}, meaning that they always run with root privileges
    (@pxref{How Change Persona,,, libc, The GNU C Library Reference Manual},
    for more info about the setuid mechanisms.)
    
    The store itself @emph{cannot} contain setuid programs: that would be a
    security issue since any user on the system can write derivations that
    populate the store (@pxref{The Store}).  Thus, a different mechanism is
    used: instead of changing the setuid bit directly on files that are in
    the store, we let the system administrator @emph{declare} which programs
    should be setuid root.
    
    The @code{setuid-programs} field of an @code{operating-system}
    declaration contains a list of G-expressions denoting the names of
    programs to be setuid-root (@pxref{Using the Configuration System}).
    For instance, the @command{passwd} program, which is part of the Shadow
    package, can be designated by this G-expression (@pxref{G-Expressions}):
    
    @example
    #~(string-append #$shadow "/bin/passwd")
    @end example
    
    A default set of setuid programs is defined by the
    @code{%setuid-programs} variable of the @code{(gnu system)} module.
    
    @defvr {Scheme Variable} %setuid-programs
    A list of G-expressions denoting common programs that are setuid-root.
    
    The list includes commands such as @command{passwd}, @command{ping},
    @command{su}, and @command{sudo}.
    @end defvr
    
    Under the hood, the actual setuid programs are created in the
    @file{/run/setuid-programs} directory at system activation time.  The
    files in this directory refer to the ``real'' binaries, which are in the
    store.
    
    
    @node X.509 Certificates
    @subsection X.509 Certificates
    
    @cindex HTTPS, certificates
    @cindex X.509 certificates
    @cindex TLS
    Web servers available over HTTPS (that is, HTTP over the transport-layer
    security mechanism, TLS) send client programs an @dfn{X.509 certificate}
    that the client can then use to @emph{authenticate} the server.  To do
    that, clients verify that the server's certificate is signed by a
    so-called @dfn{certificate authority} (CA).  But to verify the CA's
    signature, clients must have first acquired the CA's certificate.
    
    Web browsers such as GNU@tie{}IceCat include their own set of CA
    certificates, such that they are able to verify CA signatures
    out-of-the-box.
    
    However, most other programs that can talk HTTPS---@command{wget},
    @command{git}, @command{w3m}, etc.---need to be told where CA
    certificates can be found.
    
    @cindex @code{nss-certs}
    In GuixSD, this is done by adding a package that provides certificates
    to the @code{packages} field of the @code{operating-system} declaration
    (@pxref{operating-system Reference}).  GuixSD includes one such package,
    @code{nss-certs}, which is a set of CA certificates provided as part of
    Mozilla's Network Security Services.
    
    Note that it is @emph{not} part of @var{%base-packages}, so you need to
    explicitly add it.  The @file{/etc/ssl/certs} directory, which is where
    most applications and libraries look for certificates by default, points
    to the certificates installed globally.
    
    Unprivileged users can also install their own certificate package in
    their profile.  A number of environment variables need to be defined so
    that applications and libraries know where to find them.  Namely, the
    OpenSSL library honors the @code{SSL_CERT_DIR} and @code{SSL_CERT_FILE}
    variables.  Some applications add their own environment variables; for
    instance, the Git version control system honors the certificate bundle
    pointed to by the @code{GIT_SSL_CAINFO} environment variable.
    
    
    
    @node Name Service Switch
    @subsection Name Service Switch
    
    @cindex name service switch
    @cindex NSS
    The @code{(gnu system nss)} module provides bindings to the
    configuration file of libc's @dfn{name service switch} or @dfn{NSS}
    (@pxref{NSS Configuration File,,, libc, The GNU C Library Reference
    Manual}).  In a nutshell, the NSS is a mechanism that allows libc to be
    extended with new ``name'' lookup methods for system databases, which
    includes host names, service names, user accounts, and more (@pxref{Name
    Service Switch, System Databases and Name Service Switch,, libc, The GNU
    C Library Reference Manual}).