Skip to content
Snippets Groups Projects
guix.texi 185 KiB
Newer Older
  • Learn to ignore specific revisions
  • 
    @noindent
    For information on porting to other architectures or kernels,
    @xref{Porting}.
    
    
    * System Installation::         Installing the whole operating system.
    
    * System Configuration::        Configuring a GNU system.
    
    * Installing Debugging Files::  Feeding the debugger.
    
    * Security Updates::            Deploying security fixes quickly.
    
    * Package Modules::             Packages from the programmer's viewpoint.
    
    * Packaging Guidelines::        Growing the distribution.
    
    * Bootstrapping::               GNU/Linux built from scratch.
    
    * Porting::                     Targeting another platform or kernel.
    
    @end menu
    
    Building this distribution is a cooperative effort, and you are invited
    to join!  @ref{Contributing}, for information about how you can help.
    
    
    @node System Installation
    @section System Installation
    
    This section explains how to install the complete GNU operating system
    on a machine.  The Guix package manager can also be installed on top of
    
    a running GNU/Linux system, @pxref{Installation}.
    
    
    @ifinfo
    @c This paragraph is for people reading this from tty2 of the
    @c installation image.
    You're reading this documentation with an Info reader.  For details on
    how to use it, hit the @key{RET} key (``return'' or ``enter'') on the
    
    link that follows: @pxref{Help,,, info, Info: An Introduction}.  Hit
    
    @kbd{l} afterwards to come back here.
    @end ifinfo
    
    
    @subsection Limitations
    
    As of version @value{VERSION}, GNU@tie{}Guix and the GNU system
    distribution are alpha software.  It may contain bugs and lack important
    features.  Thus, if you are looking for a stable production system that
    respects your freedom as a computer user, a good solution at this point
    is to consider @url{http://www.gnu.org/distros/free-distros.html, one of
    more established GNU/Linux distributions}.  We hope you can soon switch
    to the GNU system without fear, of course.  In the meantime, you can
    also keep using your distribution and try out the package manager on top
    of it (@pxref{Installation}).
    
    Before you proceed with the installation, be aware of the following
    noteworthy limitations applicable to version @value{VERSION}:
    
    @itemize
    @item
    The installation process does not include a graphical user interface and
    requires familiarity with GNU/Linux (see the following subsections to
    get a feel of what that means.)
    
    @item
    The system does not yet provide graphical desktop environments such as
    GNOME and KDE.
    
    @item
    
    Support for the Logical Volume Manager (LVM) is missing.
    
    
    @item
    Few system services are currently supported out-of-the-box
    (@pxref{Services}).
    
    @item
    On the order of 1,000 packages are available, which means that you may
    occasionally find that a useful package is missing.
    @end itemize
    
    You've been warned.  But more than a disclaimer, this is an invitation
    to report issues (and success stories!), and join us in improving it.
    @xref{Contributing}, for more info.
    
    
    @subsection USB Stick Installation
    
    An installation image for USB sticks can be downloaded from
    @url{ftp://alpha.gnu.org/gnu/guix/gnu-usb-install-@value{VERSION}.@var{system}.xz},
    where @var{system} is one of:
    
    @table @code
    @item x86_64-linux
    for a GNU/Linux system on Intel/AMD-compatible 64-bit CPUs;
    
    @item i686-linux
    for a 32-bit GNU/Linux system on Intel-compatible CPUs.
    @end table
    
    This image contains a single partition with the tools necessary for an
    installation.  It is meant to be copied @emph{as is} to a large-enough
    USB stick.
    
    To copy the image to a USB stick, follow these steps:
    
    @enumerate
    @item
    Decompress the image using the @command{xz} command:
    
    @example
    xz -d gnu-usb-install-@value{VERSION}.@var{system}.xz
    @end example
    
    @item
    Insert a USB stick of 1@tie{}GiB or more in your machine, and determine
    its device name.  Assuming that USB stick is known as @file{/dev/sdX},
    copy the image with:
    
    @example
    
    dd if=gnu-usb-install-@value{VERSION}.x86_64 of=/dev/sdX
    
    @end example
    
    Access to @file{/dev/sdX} usually requires root privileges.
    @end enumerate
    
    Once this is done, you should be able to reboot the system and boot from
    the USB stick.  The latter usually requires you to get in the BIOS' boot
    menu, where you can choose to boot from the USB stick.
    
    @subsection Preparing for Installation
    
    Once you have successfully booted the image on the USB stick, you should
    end up with a root prompt.  Several console TTYs are configured and can
    be used to run commands as root.  TTY2 shows this documentation,
    browsable using the Info reader commands (@pxref{Help,,, info, Info: An
    Introduction}).
    
    To install the system, you would:
    
    @enumerate
    
    @item
    Configure the network, by running @command{dhclient eth0} (to get an
    automatically assigned IP address from the wired network interface
    controller), or using the @command{ifconfig} command.
    
    The system automatically loads drivers for your network interface
    controllers.
    
    Setting up network access is almost always a requirement because the
    image does not contain all the software and tools that may be needed.
    
    @item
    Unless this has already been done, you must partition and format the
    target partitions.
    
    
    Preferably, assign partitions a label so that you can easily and
    reliably refer to them in @code{file-system} declarations (@pxref{File
    Systems}).  This is typically done using the @code{-L} option of
    @command{mkfs.ext4} and related commands.
    
    
    The installation image includes Parted (@pxref{Overview,,, parted, GNU
    Parted User Manual}), @command{fdisk}, and e2fsprogs, the suite of tools
    to manipulate ext2/ext3/ext4 file systems.
    
    
    @item
    Once that is done, mount the target root partition under @file{/mnt}.
    
    @item
    Lastly, run @code{deco start cow-store /mnt}.
    
    This will make @file{/gnu/store} copy-on-write, such that packages added
    to it during the installation phase will be written to the target disk
    rather than kept in memory.
    
    
    @end enumerate
    
    
    @subsection Proceeding with the Installation
    
    With the target partitions ready, you now have to edit a file and
    provide the declaration of the operating system to be installed.  To
    that end, the installation system comes with two text editors: GNU nano
    (@pxref{Top,,, nano, GNU nano Manual}), and GNU Zile, an Emacs clone.
    It is better to store that file on the target root file system, say, as
    @file{/mnt/etc/config.scm}.
    
    A minimal operating system configuration, with just the bare minimum and
    
    only a root account would look like this (on the installation system,
    this example is available as @file{/etc/configuration-template.scm}):
    
    @end example
    
    @noindent
    For more information on @code{operating-system} declarations,
    
    @pxref{Using the Configuration System}.
    
    
    Once that is done, the new system must be initialized (remember that the
    target root file system is mounted under @file{/mnt}):
    
    @example
    guix system init /mnt/etc/config.scm /mnt
    @end example
    
    @noindent
    This will copy all the necessary files, and install GRUB on
    @file{/dev/sdX}, unless you pass the @option{--no-grub} option.  For
    
    more information, @pxref{Invoking guix system}.  This command may trigger
    
    downloads or builds of missing packages, which can take some time.
    
    Once that command has completed---and hopefully succeeded!---you can
    
    run @command{reboot} and boot into the new system.  Cross fingers, and
    
    join us on @code{#guix} on the Freenode IRC network or on
    @file{guix-devel@@gnu.org} to share your experience---good or not so
    good.
    
    @subsection Building the Installation Image
    
    The installation image described above was built using the @command{guix
    system} command, specifically:
    
    @example
    guix system disk-image --image-size=800MiB gnu/system/install.scm
    @end example
    
    @xref{Invoking guix system}, for more information.  See
    @file{gnu/system/install.scm} in the source tree for more information
    about the installation image.
    
    
    @node System Configuration
    @section System Configuration
    
    @cindex system configuration
    The GNU 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
    one 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 system's own tools.
    @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.
    * Services::                    Specifying system services.
    
    * Setuid Programs::             Programs running with root privileges.
    
    * Initial RAM Disk::            Linux-Libre bootstrapping.
    
    * Invoking guix system::        Instantiating a system configuration.
    * Defining Services::           Adding new service definitions.
    @end menu
    
    @node Using the Configuration System
    @subsection 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
    (use-modules (gnu)   ; for 'user-account', '%base-services', etc.
                 (gnu packages emacs)  ; for 'emacs'
                 (gnu services ssh))   ; for 'lsh-service'
    
    (operating-system
      (host-name "komputilo")
      (timezone "Europe/Paris")
      (locale "fr_FR.UTF-8")
      (bootloader (grub-configuration
                    (device "/dev/sda")))
    
                            (device "/dev/sda1") ; or partition label
                            (mount-point "/")
    
      (users (list (user-account
                    (name "alice")
                    (password "")
    
    Mark H Weaver's avatar
    Mark H Weaver committed
                    (uid 1000) (group 100)
    
                    (comment "Bob's sister")
                    (home-directory "/home/alice"))))
      (packages (cons emacs %base-packages))
      (services (cons (lsh-service #:port 2222 #:allow-root-login? #t)
                      %base-services)))
    @end lisp
    
    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.
    
    @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 @code{PATH} environment variable---in
    addition to the per-user profiles (@pxref{Invoking guix package}).  The
    @var{%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
    Emacs to those, taken from the @code{(gnu packages emacs)} module
    (@pxref{Package Modules}).
    
    @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 @command{lshd} secure shell
    daemon listening on port 2222, and allowing remote @code{root} logins
    (@pxref{Invoking lshd,,, lsh, GNU lsh Manual}).  Under the hood,
    @code{lsh-service} arranges so that @code{lshd} is started with the
    right command-line options, possibly with supporting configuration files
    
    generated as needed (@pxref{Defining Services}).  @xref{operating-system
    Reference}, for details about the available @code{operating-system}
    fields.
    
    Assuming the above snippet 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's configuration is by updating this file and re-running the
    @command{guix system} command.
    
    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
    
    @node operating-system Reference
    @subsection @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: @var{linux-libre})
    The package object of the operating system to use@footnote{Currently
    only the Linux-libre kernel is supported.  In the future, it will be
    possible to use the GNU@tie{}Hurd.}.
    
    @item @code{bootloader}
    The system bootloader configuration object.
    @c FIXME: Add xref to bootloader section.
    
    @item @code{initrd} (default: @code{base-initrd})
    A two-argument monadic procedure that returns an initial RAM disk for
    the Linux kernel.  @xref{Initial RAM Disk}.
    
    @item @code{host-name}
    The host name.
    
    @item @code{hosts-file}
    @cindex hosts file
    A zero-argument monadic procedure that returns a text file for use as
    @file{/etc/hosts} (@pxref{Host Names,,, libc, The GNU C Library
    Reference Manual}).  The default is to produce 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 to be used for ``swap space''
    (@pxref{Memory Concepts,,, libc, The GNU C Library Reference Manual}).
    For example, @code{'("/dev/sda3")}.
    
    @item @code{users} (default: @code{'()})
    @itemx @code{groups} (default: @var{%base-groups})
    List of user accounts and groups.  @xref{User Accounts}.
    
    @item @code{skeletons} (default: @code{(default-skeletons)})
    A monadic list of pairs of target file name and files.  These are the
    files that will be used as skeletons as new accounts are created.
    
    For instance, a valid value may look like this:
    
    @example
    (mlet %store-monad ((bashrc (text-file "bashrc" "\
         export PATH=$HOME/.guix-profile/bin")))
      (return `((".bashrc" ,bashrc))))
    @end example
    
    @item @code{issue} (default: @var{%default-issue})
    A string denoting the contents of the @file{/etc/issue} file, which is
    what displayed when users log in on a text console.
    
    @item @code{packages} (default: @var{%base-packages})
    The set of packages installed in the global profile, which is accessible
    at @file{/run/current-system/profile}.
    
    The default set includes core utilities, but 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"}.
    
    @item @code{locale} (default: @code{"en_US.UTF-8"})
    The name of the default locale (@pxref{Locales,,, libc, The GNU C
    Library Reference Manual}).
    
    @item @code{services} (default: @var{%base-services})
    A list of monadic values denoting system services.  @xref{Services}.
    
    @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: @var{%setuid-programs})
    List of string-valued G-expressions denoting setuid programs.
    @xref{Setuid Programs}.
    
    @item @code{sudoers} (default: @var{%sudoers-specification})
    @cindex sudoers
    The contents of the @file{/etc/sudoers} file as a string.
    
    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
    @end deftp
    
    
    @node File Systems
    @subsection File Systems
    
    The list of file systems to be mounted is specified in the
    @code{file-systems} field of the operating system's 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.  By default it is the name
    of a node under @file{/dev}, but its meaning depends on the @code{title}
    field described below.
    
    @item @code{title} (default: @code{'device})
    This is a symbol that specifies how the @code{device} field is to be
    interpreted.
    
    When it is the symbol @code{device}, then the @code{device} field is
    interpreted as a file name; when it is @code{label}, then @code{device}
    is interpreted as a partition label name; when it is @code{uuid},
    @code{device} is interpreted as a partition unique identifier (UUID).
    
    The @code{label} and @code{uuid} options offer a way to refer to disk
    partitions without having to hard-code their actual device name.
    
    @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} (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} %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.
    
    @table @code
    @item source
    This string specifies the name of the block device to be mapped, such as
    @code{"/dev/sda3"}.
    
    @item target
    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.
    
    @item type
    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 are specified with the @code{user-account} form:
    
    @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
    
    @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})
    Unless @code{#f}, this is the password to be used for the account.
    
    @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
    
    @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.  They are managed by GNU@tie{}dmd
    (@pxref{Introduction,,, dmd, GNU dmd Manual}).
    
    The following sections document the available services, starting with
    the core services.
    
    @menu
    * Base Services::               Essential system services.
    * Networking Services::         Network setup, SSH daemon, etc.
    * X Window::                    Graphical display.
    @end menu
    
    @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:
    
    @example
    (cons* (avahi-service) (lshd-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
    
    @deffn {Monadic Procedure} nscd-service [#:glibc glibc]
    Return a service that runs libc's name service cache daemon (nscd).
    @end deffn
    
    @deffn {Monadic Procedure} syslog-service
    Return a service that runs @code{syslogd} with reasonable default
    settings.
    @end deffn
    
    @deffn {Monadic Procedure} guix-service [#:guix guix] @
           [#:builder-group "guixbuild"] [#:build-accounts 10] @
           [#:authorize-hydra-key? #f] [#: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
    
    @node Networking Services
    @subsubsection Networking Services
    
    The @code{(gnu system 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
    
    @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 system ssh)} provides the following service.
    
    @deffn {Monadic Procedure} lsh-service [#:host-key "/etc/lsh/host-key"] @
           [#: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? #f]
    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{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{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 accepts log-ins with empty
    passwords, and @var{root-login?} specifies whether to accepts log-ins as
    root.
    
    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.
        (text-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
    
    
    @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]
    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}.
    
    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}.
    @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