Skip to content
Snippets Groups Projects
guix.texi 423 KiB
Newer Older
  • Learn to ignore specific revisions
  • Andreas Enge's avatar
    Andreas Enge committed
    directly to the @command{dot} command of Graphviz.  The general
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    syntax is:
    
    @example
    guix graph @var{options} @var{package}@dots{}
    @end example
    
    For example, the following command generates a PDF file representing the
    package DAG for the GNU@tie{}Core Utilities, showing its build-time
    dependencies:
    
    @example
    guix graph coreutils | dot -Tpdf > dag.pdf
    @end example
    
    The output looks like this:
    
    @image{images/coreutils-graph,2in,,Dependency graph of the GNU Coreutils}
    
    Nice little graph, no?
    
    
    Andreas Enge's avatar
    Andreas Enge committed
    But there is more than one graph!  The one above is concise: it is the
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    graph of package objects, omitting implicit inputs such as GCC, libc,
    
    Andreas Enge's avatar
    Andreas Enge committed
    grep, etc.  It is often useful to have such a concise graph, but
    sometimes one may want to see more details.  @command{guix graph} supports
    several types of graphs, allowing you to choose the level of detail:
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    @table @code
    @item package
    
    Andreas Enge's avatar
    Andreas Enge committed
    This is the default type used in the example above.  It shows the DAG of
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    package objects, excluding implicit dependencies.  It is concise, but
    filters out many details.
    
    @item bag-emerged
    This is the package DAG, @emph{including} implicit inputs.
    
    For instance, the following command:
    
    @example
    guix graph --type=bag-emerged coreutils | dot -Tpdf > dag.pdf
    @end example
    
    ... yields this bigger graph:
    
    @image{images/coreutils-bag-graph,,5in,Detailed dependency graph of the GNU Coreutils}
    
    At the bottom of the graph, we see all the implicit inputs of
    @var{gnu-build-system} (@pxref{Build Systems, @code{gnu-build-system}}).
    
    
    Andreas Enge's avatar
    Andreas Enge committed
    Now, note that the dependencies of these implicit inputs---that is, the
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @dfn{bootstrap dependencies} (@pxref{Bootstrapping})---are not shown
    here, for conciseness.
    
    @item bag
    Similar to @code{bag-emerged}, but this time including all the bootstrap
    dependencies.
    
    
    @item bag-with-origins
    Similar to @code{bag}, but also showing origins and their dependencies.
    
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @item derivations
    This is the most detailed representation: It shows the DAG of
    derivations (@pxref{Derivations}) and plain store items.  Compared to
    the above representation, many additional nodes are visible, including
    
    Andreas Enge's avatar
    Andreas Enge committed
    build scripts, patches, Guile modules, etc.
    
    Andreas Enge's avatar
    Andreas Enge committed
    All the types above correspond to @emph{build-time dependencies}.  The
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    following graph type represents the @emph{run-time dependencies}:
    
    @table @code
    @item references
    This is the graph of @dfn{references} of a package output, as returned
    by @command{guix gc --references} (@pxref{Invoking guix gc}).
    
    If the given package output is not available in the store, @command{guix
    graph} attempts to obtain dependency information from substitutes.
    @end table
    
    The available options are the following:
    
    @table @option
    @item --type=@var{type}
    @itemx -t @var{type}
    Produce a graph output of @var{type}, where @var{type} must be one of
    the values listed above.
    
    @item --list-types
    List the supported graph types.
    
    
    @item --expression=@var{expr}
    @itemx -e @var{expr}
    Consider the package @var{expr} evaluates to.
    
    This is useful to precisely refer to a package, as in this example:
    
    @example
    guix graph -e '(@@@@ (gnu packages commencement) gnu-make-final)'
    @end example
    
    @node Invoking guix environment
    @section Invoking @command{guix environment}
    
    
    @cindex reproducible build environments
    
    @cindex development environments
    
    The purpose of @command{guix environment} is to assist hackers in
    creating reproducible development environments without polluting their
    package profile.  The @command{guix environment} tool takes one or more
    
    Andreas Enge's avatar
    Andreas Enge committed
    packages, builds all of their inputs, and creates a shell
    
    environment to use them.
    
    The general syntax is:
    
    @example
    guix environment @var{options} @var{package}@dots{}
    @end example
    
    
    The following example spawns a new shell set up for the development of
    GNU@tie{}Guile:
    
    
    @example
    guix environment guile
    @end example
    
    
    Andreas Enge's avatar
    Andreas Enge committed
    If the needed dependencies are not built yet, @command{guix environment}
    automatically builds them.  The environment of the new shell is an augmented
    
    version of the environment that @command{guix environment} was run in.
    It contains the necessary search paths for building the given package
    added to the existing environment variables.  To create a ``pure''
    
    Andreas Enge's avatar
    Andreas Enge committed
    environment, in which the original environment variables have been unset,
    
    use the @code{--pure} option@footnote{Users sometimes wrongfully augment
    environment variables such as @code{PATH} in their @file{~/.bashrc}
    file.  As a consequence, when @code{guix environment} launches it, Bash
    may read @file{~/.bashrc}, thereby introducing ``impurities'' in these
    environment variables.  It is an error to define such environment
    variables in @file{.bashrc}; instead, they should be defined in
    @file{.bash_profile}, which is sourced only by log-in shells.
    @xref{Bash Startup Files,,, bash, The GNU Bash Reference Manual}, for
    details on Bash start-up files.}.
    
    @vindex GUIX_ENVIRONMENT
    @command{guix environment} defines the @code{GUIX_ENVIRONMENT}
    
    Andreas Enge's avatar
    Andreas Enge committed
    variable in the shell it spawns.  This allows users to, say, define a
    
    specific prompt for development environments in their @file{.bashrc}
    (@pxref{Bash Startup Files,,, bash, The GNU Bash Reference Manual}):
    
    @example
    if [ -n "$GUIX_ENVIRONMENT" ]
    then
        export PS1="\u@@\h \w [dev]\$ "
    fi
    @end example
    
    
    Additionally, more than one package may be specified, in which case the
    union of the inputs for the given packages are used.  For example, the
    command below spawns a shell where all of the dependencies of both Guile
    and Emacs are available:
    
    @example
    guix environment guile emacs
    @end example
    
    
    Sometimes an interactive shell session is not desired.  An arbitrary
    command may be invoked by placing the @code{--} token to separate the
    command from the rest of the arguments:
    
    guix environment guile -- make -j4
    
    In other situations, it is more convenient to specify the list of
    packages needed in the environment.  For example, the following command
    runs @command{python} from an environment containing Python@tie{}2.7 and
    NumPy:
    
    @example
    
    guix environment --ad-hoc python2-numpy python-2.7 -- python
    
    Furthermore, one might want the dependencies of a package and also some
    additional packages that are not build-time or runtime dependencies, but
    are useful when developing nonetheless.  Because of this, the
    @code{--ad-hoc} flag is positional.  Packages appearing before
    @code{--ad-hoc} are interpreted as packages whose dependencies will be
    added to the environment.  Packages appearing after are interpreted as
    packages that will be added to the environment directly.  For example,
    the following command creates a Guix development environment that
    additionally includes Git and strace:
    
    @example
    guix environment guix --ad-hoc git strace
    @end example
    
    
    Sometimes it is desirable to isolate the environment as much as
    possible, for maximal purity and reproducibility.  In particular, when
    using Guix on a host distro that is not GuixSD, it is desirable to
    prevent access to @file{/usr/bin} and other system-wide resources from
    the development environment.  For example, the following command spawns
    a Guile REPL in a ``container'' where only the store and the current
    working directory are mounted:
    
    @example
    guix environment --ad-hoc --container guile -- guile
    @end example
    
    
    The @code{--container} option requires Linux-libre 3.19 or newer.
    
    The available options are summarized below.
    
    
    @table @code
    @item --expression=@var{expr}
    @itemx -e @var{expr}
    
    Create an environment for the package or list of packages that
    @var{expr} evaluates to.
    
    For example, running:
    
    @example
    guix environment -e '(@@ (gnu packages maths) petsc-openmpi)'
    @end example
    
    starts a shell with the environment for this specific variant of the
    PETSc package.
    
    
    Alex Kost's avatar
    Alex Kost committed
    guix environment --ad-hoc -e '(@@ (gnu) %base-packages)'
    
    @end example
    
    starts a shell with all the GuixSD base packages available.
    
    
    The above commands only the use default output of the given packages.
    To select other outputs, two element tuples can be specified:
    
    @example
    guix environment --ad-hoc -e '(list (@ (gnu packages bash) bash) "include")'
    @end example
    
    
    @item --load=@var{file}
    @itemx -l @var{file}
    
    Create an environment for the package or list of packages that the code
    within @var{file} evaluates to.
    
    As an example, @var{file} might contain a definition like this
    (@pxref{Defining Packages}):
    
    @example
    @verbatiminclude environment-gdb.scm
    @end example
    
    
    @item --ad-hoc
    Include all specified packages in the resulting environment, as if an
    @i{ad hoc} package were defined with them as inputs.  This option is
    useful for quickly creating an environment without having to write a
    package expression to contain the desired inputs.
    
    For instance, the command:
    
    @example
    
    guix environment --ad-hoc guile guile-sdl -- guile
    
    @end example
    
    runs @command{guile} in an environment where Guile and Guile-SDL are
    available.
    
    
    Note that this example implicitly asks for the default output of
    
    Andreas Enge's avatar
    Andreas Enge committed
    @code{guile} and @code{guile-sdl}, but it is possible to ask for a
    
    specific output---e.g., @code{glib:bin} asks for the @code{bin} output
    of @code{glib} (@pxref{Packages with Multiple Outputs}).
    
    
    This option may be composed with the default behavior of @command{guix
    environment}.  Packages appearing before @code{--ad-hoc} are interpreted
    as packages whose dependencies will be added to the environment, the
    default behavior.  Packages appearing after are interpreted as packages
    that will be added to the environment directly.
    
    
    @item --pure
    Unset existing environment variables when building the new environment.
    This has the effect of creating an environment in which search paths
    only contain package inputs.
    
    @item --search-paths
    Display the environment variable definitions that make up the
    environment.
    
    
    @item --system=@var{system}
    @itemx -s @var{system}
    Attempt to build for @var{system}---e.g., @code{i686-linux}.
    
    
    @item --container
    @itemx -C
    @cindex container
    Run @var{command} within an isolated container.  The current working
    
    directory outside the container is mapped inside the
    
    container.  Additionally, the spawned process runs as the current user
    outside the container, but has root privileges in the context of the
    container.
    
    @item --network
    @itemx -N
    For containers, share the network namespace with the host system.
    Containers created without this flag only have access to the loopback
    device.
    
    @item --expose=@var{source}[=@var{target}]
    For containers, expose the file system @var{source} from the host system
    as the read-only file system @var{target} within the container.  If
    @var{target} is not specified, @var{source} is used as the target mount
    point in the container.
    
    The example below spawns a Guile REPL in a container in which the user's
    home directory is accessible read-only via the @file{/exchange}
    directory:
    
    @example
    guix environment --container --expose=$HOME=/exchange guile -- guile
    @end example
    
    
    Alex Kost's avatar
    Alex Kost committed
    @item --share=@var{source}[=@var{target}]
    
    For containers, share the file system @var{source} from the host system
    as the writable file system @var{target} within the container.  If
    @var{target} is not specified, @var{source} is used as the target mount
    point in the container.
    
    The example below spawns a Guile REPL in a container in which the user's
    home directory is accessible for both reading and writing via the
    @file{/exchange} directory:
    
    @example
    guix environment --container --share=$HOME=/exchange guile -- guile
    @end example
    
    @end table
    
    It also supports all of the common build options that @command{guix
    
    build} supports (@pxref{Common Build Options}).
    
    @node Invoking guix publish
    @section Invoking @command{guix publish}
    
    The purpose of @command{guix publish} is to enable users to easily share
    
    Andreas Enge's avatar
    Andreas Enge committed
    their store with others, who can then use it as a substitute server
    
    (@pxref{Substitutes}).
    
    When @command{guix publish} runs, it spawns an HTTP server which allows
    anyone with network access to obtain substitutes from it.  This means
    that any machine running Guix can also act as if it were a build farm,
    since the HTTP interface is compatible with Hydra, the software behind
    the @code{hydra.gnu.org} build farm.
    
    
    For security, each substitute is signed, allowing recipients to check
    their authenticity and integrity (@pxref{Substitutes}).  Because
    
    Andreas Enge's avatar
    Andreas Enge committed
    @command{guix publish} uses the signing key of the system, which is only
    
    readable by the system administrator, it must be started as root; the
    @code{--user} option makes it drop root privileges early on.
    
    The signing key pair must be generated before @command{guix publish} is
    launched, using @command{guix archive --generate-key} (@pxref{Invoking
    guix archive}).
    
    
    The general syntax is:
    
    @example
    guix publish @var{options}@dots{}
    @end example
    
    Running @command{guix publish} without any additional arguments will
    spawn an HTTP server on port 8080:
    
    @example
    guix publish
    @end example
    
    Once a publishing server has been authorized (@pxref{Invoking guix
    archive}), the daemon may download substitutes from it:
    
    @example
    guix-daemon --substitute-urls=http://example.org:8080
    @end example
    
    The following options are available:
    
    @table @code
    @item --port=@var{port}
    @itemx -p @var{port}
    Listen for HTTP requests on @var{port}.
    
    
    @item --listen=@var{host}
    Listen on the network interface for @var{host}.  The default is to
    accept connections from any interface.
    
    
    @item --user=@var{user}
    @itemx -u @var{user}
    Change privileges to @var{user} as soon as possible---i.e., once the
    server socket is open and the signing key has been read.
    
    
    @item --repl[=@var{port}]
    @itemx -r [@var{port}]
    Spawn a Guile REPL server (@pxref{REPL Servers,,, guile, GNU Guile
    
    Reference Manual}) on @var{port} (37146 by default).  This is used
    primarily for debugging a running @command{guix publish} server.
    
    Enabling @command{guix publish} on a GuixSD system is a one-liner: just
    add a call to @code{guix-publish-service} in the @code{services} field
    of the @code{operating-system} declaration (@pxref{guix-publish-service,
    @code{guix-publish-service}}).
    
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    @node Invoking guix challenge
    @section Invoking @command{guix challenge}
    
    @cindex reproducible builds
    @cindex verifiable builds
    
    Do the binaries provided by this server really correspond to the source
    
    Andreas Enge's avatar
    Andreas Enge committed
    code it claims to build?  Is a package build process deterministic?
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    These are the questions the @command{guix challenge} command attempts to
    answer.
    
    The former is obviously an important question: Before using a substitute
    
    Andreas Enge's avatar
    Andreas Enge committed
    server (@pxref{Substitutes}), one had better @emph{verify} that it
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    provides the right binaries, and thus @emph{challenge} it.  The latter
    is what enables the former: If package builds are deterministic, then
    independent builds of the package should yield the exact same result,
    bit for bit; if a server provides a binary different from the one
    obtained locally, it may be either corrupt or malicious.
    
    We know that the hash that shows up in @file{/gnu/store} file names is
    the hash of all the inputs of the process that built the file or
    directory---compilers, libraries, build scripts,
    etc. (@pxref{Introduction}).  Assuming deterministic build processes,
    one store file name should map to exactly one build output.
    @command{guix challenge} checks whether there is, indeed, a single
    mapping by comparing the build outputs of several independent builds of
    any given store item.
    
    
    Andreas Enge's avatar
    Andreas Enge committed
    The command output looks like this:
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    
    @smallexample
    $ guix challenge --substitute-urls="http://hydra.gnu.org http://guix.example.org"
    updating list of substitutes from 'http://hydra.gnu.org'... 100.0%
    updating list of substitutes from 'http://guix.example.org'... 100.0%
    /gnu/store/@dots{}-openssl-1.0.2d contents differ:
      local hash: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
      http://hydra.gnu.org/nar/@dots{}-openssl-1.0.2d: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
      http://guix.example.org/nar/@dots{}-openssl-1.0.2d: 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim
    /gnu/store/@dots{}-git-2.5.0 contents differ:
      local hash: 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha
      http://hydra.gnu.org/nar/@dots{}-git-2.5.0: 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f
      http://guix.example.org/nar/@dots{}-git-2.5.0: 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73
    /gnu/store/@dots{}-pius-2.1.1 contents differ:
      local hash: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
      http://hydra.gnu.org/nar/@dots{}-pius-2.1.1: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
      http://guix.example.org/nar/@dots{}-pius-2.1.1: 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs
    @end smallexample
    
    @noindent
    In this example, @command{guix challenge} first scans the store to
    determine the set of locally-built derivations---as opposed to store
    items that were downloaded from a substitute server---and then queries
    all the substitute servers.  It then reports those store items for which
    the servers obtained a result different from the local build.
    
    @cindex non-determinism, in package builds
    As an example, @code{guix.example.org} always gets a different answer.
    Conversely, @code{hydra.gnu.org} agrees with local builds, except in the
    case of Git.  This might indicate that the build process of Git is
    non-deterministic, meaning that its output varies as a function of
    various things that Guix does not fully control, in spite of building
    packages in isolated environments (@pxref{Features}).  Most common
    sources of non-determinism include the addition of timestamps in build
    results, the inclusion of random numbers, and directory listings sorted
    by inode number.  See @uref{http://reproducible.debian.net/howto/}, for
    more information.
    
    
    Andreas Enge's avatar
    Andreas Enge committed
    To find out what is wrong with this Git binary, we can do something along
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    these lines (@pxref{Invoking guix archive}):
    
    @example
    $ wget -q -O - http://hydra.gnu.org/nar/@dots{}-git-2.5.0 \
       | guix archive -x /tmp/git
    
    $ diff -ur --no-dereference /gnu/store/@dots{}-git.2.5.0 /tmp/git
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @end example
    
    This command shows the difference between the files resulting from the
    local build, and the files resulting from the build on
    @code{hydra.gnu.org} (@pxref{Overview, Comparing and Merging Files,,
    diffutils, Comparing and Merging Files}).  The @command{diff} command
    works great for text files.  When binary files differ, a better option
    is @uref{http://diffoscope.org/, Diffoscope}, a tool that helps
    visualize differences for all kinds of files.
    
    
    Andreas Enge's avatar
    Andreas Enge committed
    Once you have done that work, you can tell whether the differences are due
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    to a non-deterministic build process or to a malicious server.  We try
    hard to remove sources of non-determinism in packages to make it easier
    
    Andreas Enge's avatar
    Andreas Enge committed
    to verify substitutes, but of course, this is a process that
    involves not just Guix, but a large part of the free software community.
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    In the meantime, @command{guix challenge} is one tool to help address
    the problem.
    
    If you are writing packages for Guix, you are encouraged to check
    whether @code{hydra.gnu.org} and other substitute servers obtain the
    same build result as you did with:
    
    @example
    $ guix challenge @var{package}
    @end example
    
    @noindent
    
    Andreas Enge's avatar
    Andreas Enge committed
    where @var{package} is a package specification such as
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    @code{guile-2.0} or @code{glibc:debug}.
    
    The general syntax is:
    
    @example
    guix challenge @var{options} [@var{packages}@dots{}]
    @end example
    
    The one option that matters is:
    
    @table @code
    
    @item --substitute-urls=@var{urls}
    Consider @var{urls} the whitespace-separated list of substitute source
    URLs to compare to.
    
    @end table
    
    
    
    @node Invoking guix container
    @section Invoking @command{guix container}
    @cindex 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
    
    Alex Kost's avatar
    Alex Kost committed
    ``container'', typically created by the @command{guix environment}
    
    (@pxref{Invoking guix environment}) and @command{guix system container}
    (@pxref{Invoking guix system}) commands.
    
    The general syntax is:
    
    @example
    guix container @var{action} @var{options}@dots{}
    @end example
    
    @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.
    
    The syntax is:
    
    @example
    guix container exec @var{pid} @var{program} @var{arguments}@dots{}
    @end example
    
    @var{pid} specifies the process ID of the running container.
    
    Andreas Enge's avatar
    Andreas Enge committed
    @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
    GuixSD container, started by @command{guix system container}, and whose
    process ID is 9001:
    
    @example
    guix container exec 9001 /run/current-system/profile/bin/bash --login
    @end example
    
    Note that the @var{pid} cannot be the parent process of a container.  It
    
    Andreas Enge's avatar
    Andreas Enge committed
    must be PID 1 of the container or one of its child processes.
    
    @c *********************************************************************
    @node GNU Distribution
    @chapter GNU Distribution
    
    
    @cindex Guix System Distribution
    
    @cindex GuixSD
    
    Guix comes with a distribution of the GNU system consisting entirely of
    free software@footnote{The term ``free'' here refers to the
    
    @url{http://www.gnu.org/philosophy/free-sw.html,freedom provided to
    
    users of that software}.}.  The
    
    distribution can be installed on its own (@pxref{System Installation}),
    but it is also possible to install Guix as a package manager on top of
    an installed GNU/Linux system (@pxref{Installation}).  To distinguish
    
    between the two, we refer to the standalone distribution as the Guix
    
    System Distribution, or GuixSD.
    
    
    The distribution provides core GNU packages such as GNU libc, GCC, and
    Binutils, as well as many GNU and non-GNU applications.  The complete
    list of available packages can be browsed
    
    @url{http://www.gnu.org/software/guix/packages,on-line} or by
    
    running @command{guix package} (@pxref{Invoking guix package}):
    
    guix package --list-available
    
    Andreas Enge's avatar
    Andreas Enge committed
    Our goal is to provide a practical 100% free software distribution of
    
    Linux-based and other variants of GNU, with a focus on the promotion and
    tight integration of GNU components, and an emphasis on programs and
    tools that help users exert that freedom.
    
    
    Packages are currently available on the following platforms:
    
    
    @table @code
    
    @item x86_64-linux
    Intel/AMD @code{x86_64} architecture, Linux-Libre kernel;
    
    @item i686-linux
    Intel 32-bit architecture (IA32), Linux-Libre kernel;
    
    
    ARMv7-A architecture with hard float, Thumb-2 and NEON,
    
    Andreas Enge's avatar
    Andreas Enge committed
    using the EABI hard-float application binary interface (ABI),
    and Linux-Libre kernel.
    
    @item mips64el-linux
    little-endian 64-bit MIPS processors, specifically the Loongson series,
    
    Andreas Enge's avatar
    Andreas Enge committed
    n32 ABI, and Linux-Libre kernel.
    
    GuixSD itself is currently only available on @code{i686} and @code{x86_64}.
    
    @noindent
    For information on porting to other architectures or kernels,
    
    Andreas Enge's avatar
    Andreas Enge committed
    @pxref{Porting}.
    
    * System Installation::         Installing the whole operating system.
    
    * System Configuration::        Configuring the operating 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!  @xref{Contributing}, for information about how you can help.
    
    @node System Installation
    @section System Installation
    
    
    @cindex Guix System Distribution
    This section explains how to install the Guix System Distribution
    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 are 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
    
    
    * Limitations::                 What you can expect.
    * Hardware Considerations::     Supported hardware.
    * USB Stick Installation::      Preparing the installation medium.
    * Preparing for Installation::  Networking, partitioning, etc.
    * Proceeding with the Installation::  The real thing.
    * Building the Installation Image::  How this comes to be.
    
    @subsection Limitations
    
    
    As of version @value{VERSION}, the Guix System Distribution (GuixSD) is
    
    not production-ready.  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
    
    Andreas Enge's avatar
    Andreas Enge committed
    the more established GNU/Linux distributions}.  We hope you can soon switch
    
    to the GuixSD 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 full GNOME and KDE desktops.  Xfce and
    
    Andreas Enge's avatar
    Andreas Enge committed
    Enlightenment are available, though, if graphical desktop environments
    
    are your thing, as well as a number of X11 window managers.
    
    Support for the Logical Volume Manager (LVM) is missing.
    
    
    @item
    Few system services are currently supported out-of-the-box
    (@pxref{Services}).
    
    @item
    
    More than 3,000 packages are available, but you may
    
    occasionally find that a useful package is missing.
    @end itemize
    
    
    Andreas Enge's avatar
    Andreas Enge committed
    You have been warned!  But more than a disclaimer, this is an invitation
    to report issues (and success stories!), and to join us in improving it.
    
    @xref{Contributing}, for more info.
    
    
    @node Hardware Considerations
    @subsection Hardware Considerations
    
    @cindex hardware support on GuixSD
    GNU@tie{}GuixSD focuses on respecting the user's computing freedom.  It
    builds around the kernel Linux-libre, which means that only hardware for
    which free software drivers and firmware exists is supported.  Nowadays,
    a wide range of off-the-shelf hardware is supported on
    GNU/Linux-libre---from keyboards to graphics cards to scanners and
    Ethernet controllers.  Unfortunately, there are still areas where
    hardware vendors deny users control over their own computing, and such
    hardware is not supported on GuixSD.
    
    @cindex WiFi, hardware support
    One of the main areas where free drivers or firmware is lacking is WiFi
    devices.  WiFi devices known to work include those using Atheros chips
    (AR9271 and AR7010), which corresponds to the @code{ath9k} Linux-libre
    driver, and for which free firmware exists and is available
    out-of-the-box on GuixSD, as part of @var{%base-firmware}
    (@pxref{operating-system Reference, @code{firmware}}).
    
    @cindex RYF, Respects Your Freedom
    The @uref{https://www.fsf.org/, Free Software Foundation} runs
    @uref{https://www.fsf.org/ryf, @dfn{Respect Your Freedom}} (RYF), a
    certification program for hardware products that respect your freedom
    and your privacy and ensure that you have control over your device.  We
    encourage you to check the list of RYF-certified hardware.
    
    Another useful resource is the @uref{https://www.h-node.org/, H-Node}
    web site.  It contains a catalog of hardware devices with information
    about their support in GNU/Linux.
    
    
    
    @node USB Stick Installation
    
    @subsection USB Stick Installation
    
    An installation image for USB sticks can be downloaded from
    
    @indicateurl{ftp://alpha.gnu.org/gnu/guix/guixsd-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 guixsd-usb-install-@value{VERSION}.@var{system}.xz
    
    Andreas Enge's avatar
    Andreas Enge committed
    Insert a USB stick of 1@tie{}GiB or more into your machine, and determine
    its device name.  Assuming that the USB stick is known as @file{/dev/sdX},
    
    copy the image with:
    
    @example
    
    dd if=guixsd-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.
    
    
    @node Preparing for Installation
    
    @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
    
    Ludovic Courtès's avatar
    Ludovic Courtès committed
    Introduction}).  The installation system runs the GPM mouse daemon,
    which allows you to select text with the left mouse button and to paste
    it with the middle button.
    
    @subsubsection Keyboard Layout
    
    @cindex keyboard layout
    The installation image uses the US qwerty keyboard layout.  If you want
    to change it, you can use the @command{loadkeys} command.  For example,
    the following command selects the Dvorak keyboard layout:
    
    @example
    loadkeys dvorak
    @end example
    
    See the files under @file{/run/current-system/profile/share/keymaps} for
    a list of available keyboard layouts.  Run @command{man loadkeys} for
    more information.
    
    @subsubsection Networking
    
    Run the following command see what your network interfaces are called:
    
    @c http://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20
    
    Wired interfaces have a name starting with @samp{e}; for example, the
    interface corresponding to the first on-board Ethernet controller is
    called @samp{eno1}.  Wireless interfaces have a name starting with
    @samp{w}, like @samp{w1p2s0}.
    
    @table @asis
    @item Wired connection
    To configure a wired network run the following command, substituting
    @var{interface} with the name of the wired interface you want to use.
    
    @example
    ifconfig @var{interface} up
    @end example
    
    @item Wireless connection
    To configure wireless networking, you can create a configuration file
    for the @command{wpa_supplicant} configuration tool (its location is not
    important) using one of the available text editors such as
    @command{zile}:
    
    @example
    zile wpa_supplicant.conf
    @end example
    
    As an example, the following stanza can go to this file and will work
    for many wireless networks, provided you give the actual SSID and
    passphrase for the network you are connecting to:
    
    @example
    network=@{
      ssid=@var{my-ssid}
      key_mgmt=WPA-PSK
      psk="the network's secret passphrase"
    @}
    @end example
    
    Start the wireless service and run it in the background with the
    following command (substitute @var{interface} with the name of the
    network interface you want to use):
    
    @example
    wpa_supplicant -c wpa_supplicant.conf -i @var{interface} -B
    @end example
    
    Run @command{man wpa_supplication} for more information.
    @end table
    
    At this point, you need to acquire an IP address.  On a network where IP
    addresses are automatically assigned @i{via} DHCP, you can run:
    
    @example
    dhclient @var{interface}
    @end example
    
    Try to ping a server to see if networking is up and running:
    
    @example
    ping -c 3 gnu.org
    @end example
    
    
    Setting up network access is almost always a requirement because the
    image does not contain all the software and tools that may be needed.
    
    
    @subsubsection Disk Partitioning
    
    Unless this has already been done, the next step is to partition, and
    then format the target partition(s).
    
    The installation image includes several partitioning tools, including
    Parted (@pxref{Overview,,, parted, GNU Parted User Manual}),
    @command{fdisk}, and @command{cfdisk}.  Run it and set up your disk with
    the partition layout you want:
    
    @example
    cfdisk
    @end example
    
    Once you are done partitioning the target hard disk drive, you have to
    create a file system on the relevant partition(s)@footnote{Currently
    GuixSD pretty much assumes an ext4 file system.  In particular, code
    that reads partition UUIDs and labels only works with ext4.  This will
    be fixed in the future.}.
    
    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.  So, assuming the target root
    partition lives at @file{/dev/sda1}, a file system with the label
    @code{my-root} can be created with:
    
    @example
    mkfs.ext4 -L my-root /dev/sda1
    @end example
    
    @c FIXME: Uncomment this once GRUB fully supports encrypted roots.
    @c A typical command sequence may be:
    @c
    @c @example
    @c # fdisk /dev/sdX
    @c @dots{} Create partitions etc.@dots{}
    @c # cryptsetup luksFormat /dev/sdX1
    @c # cryptsetup open --type luks /dev/sdX1 my-partition
    @c # mkfs.ext4 -L my-root /dev/mapper/my-partition
    @c @end example
    
    In addition to e2fsprogs, the suite of tools to manipulate
    ext2/ext3/ext4 file systems, the installation image includes
    Cryptsetup/LUKS for disk encryption.
    
    Once that is done, mount the target root partition under @file{/mnt}
    with a command like (again, assuming @file{/dev/sda1} is the root
    partition):
    
    @example
    mount /dev/sda1 /mnt
    @end example
    
    @node Proceeding with the Installation
    @subsection Proceeding with the Installation
    
    With the target partitions ready and the target root mounted on
    @file{/mnt}, we're ready to go.  First, run:
    
    @example
    herd start cow-store /mnt
    @end example
    
    This makes @file{/gnu/store} copy-on-write, such that packages added to
    it during the installation phase are written to the target disk rather
    than kept in memory.
    
    Next, you 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}.
    
    
    @xref{Using the Configuration System}, for an overview of the
    configuration file.  The example configurations discussed in that
    section are available under @file{/etc/configuration} in the
    installation image.  Thus, to get started with a system configuration
    providing a graphical display server (a ``desktop'' system), you can run
    something along these lines:
    
    @example
    # mkdir /mnt/etc
    # cp /etc/configuration/desktop.scm /mnt/etc/config.scm
    # zile /mnt/etc/config.scm
    @end example
    
    You should pay attention to what your configuration file contains, and
    in particular:
    
    @itemize