mirror of
https://github.com/NixOS/nix-pills
synced 2024-09-19 04:00:13 -04:00
b6c9f6348c
We pretty much drop the existing instructions in favour of instructions that can be found on the site. The current instructions are not only outdated but link to resources that are no longer available.
350 lines
11 KiB
XML
350 lines
11 KiB
XML
<chapter xmlns="http://docbook.org/ns/docbook"
|
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
|
xmlns:xi="http://www.w3.org/2001/XInclude"
|
|
version="5.0"
|
|
xml:id="install-on-your-running-system">
|
|
|
|
<title>Install on Your Running System</title>
|
|
|
|
<para>
|
|
Welcome to the second Nix pill. In the <link
|
|
linkend="why-you-should-give-it-a-try">first</link> pill we
|
|
briefly described Nix.
|
|
</para>
|
|
|
|
<para>
|
|
Now we'll install Nix on our running system and understand what
|
|
changed in our system after the installation.
|
|
</para>
|
|
|
|
<para>
|
|
<link
|
|
xlink:href="https://nixos.org/nix/manual/#chap-installation">Nix
|
|
installation</link> is as easy as installing any other package.
|
|
It will not revolutionize our system, it will stay in its own
|
|
place out of our way.
|
|
</para>
|
|
|
|
<section>
|
|
<title>Download</title>
|
|
|
|
<para>
|
|
You can grab the nix installation script (nix 1.11.5 during this
|
|
writing) here: <link
|
|
xlink:href="https://nixos.org/nix/install">https://nixos.org/nix/install</link>.
|
|
</para>
|
|
|
|
<para>
|
|
One way to install is simply to run <command>curl https://nixos.org/nix/install | sh</command> as a non-root user. You may prefer
|
|
to download the installation script and verify its integrity
|
|
using GPG signatures, instructions for doing that can be found
|
|
here: <link
|
|
xlink:href="https://nixos.org/nix/download.html">https://nixos.org/nix/download.html</link>.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Installation</title>
|
|
|
|
<para>
|
|
To ensure we don't mess with the system, you could create a
|
|
custom user to let him own the Nix store, let's call it
|
|
<literal>nix</literal>.
|
|
</para>
|
|
|
|
<para>
|
|
As root:
|
|
</para>
|
|
|
|
<screen><xi:include href="./02/add-user-chown.txt" parse="text" /></screen>
|
|
|
|
<para>
|
|
From now on, all the operations we do on the shell are done from
|
|
this nix user:
|
|
</para>
|
|
|
|
<screen><xi:include href="./02/extract-as-nix.txt" parse="text" /></screen>
|
|
|
|
<para>
|
|
My pills are not a simple tutorial, there's are several articles
|
|
out there to learn the basics of nix and unix. We'll instead
|
|
walk through the nix system to understand the fundamentals.
|
|
</para>
|
|
|
|
<para>
|
|
First thing to note: those stuff in nix store refer to software
|
|
in nix store itself. It doesn't use libc from our system or
|
|
whatelse. It's a self-contained nix bootstrap.
|
|
</para>
|
|
|
|
<para>
|
|
Quick note: in a normal installation, the store is owned by root
|
|
and multiple users can install and build software through a nix
|
|
daemon.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>So small nix store</title>
|
|
|
|
<para>
|
|
Start inspecting the output of the install command:
|
|
</para>
|
|
|
|
<screen>copying Nix to /nix/store..........................</screen>
|
|
|
|
<para>
|
|
Effectively, that's right the <literal>/nix/store</literal> we
|
|
were talking in the first pill. The contents is the strictly
|
|
necessary software to bootstrap a Nix system. You can see bash,
|
|
core utils, the toolchain, perl libraries, sqlite and nix itself
|
|
with its own tools and libnix.
|
|
</para>
|
|
|
|
<para>
|
|
You surely noticed that in <literal>/nix/store</literal> not
|
|
only directories are allowed, but also files, always in the form
|
|
<replaceable>hash-name</replaceable>.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>The holy database</title>
|
|
|
|
<para>
|
|
Right after copying the store, the installation process
|
|
initializes the database with the current information:
|
|
</para>
|
|
|
|
<screen>initialising Nix database...</screen>
|
|
|
|
<para>
|
|
Oh Nix also has a database. It's under
|
|
<literal>/nix/var/nix/db</literal>. It is an sqlite database
|
|
that keeps track of the dependencies between derivations.
|
|
</para>
|
|
|
|
<para>
|
|
The schema is very simple: there's a table of valid paths,
|
|
mapping from auto increment integer to store path.
|
|
</para>
|
|
|
|
<para>
|
|
Then there's a dependency relation from one path to other paths.
|
|
</para>
|
|
|
|
<para>
|
|
Inspect it running <command>/nix/store/*sqlite*/bin/sqlite3
|
|
/nix/var/nix/db/db.sqlite</command>
|
|
</para>
|
|
|
|
<para>
|
|
<emphasis>Important rule:</emphasis> never change
|
|
<literal>/nix/store</literal> manually because that wouldn't be
|
|
in sync with the sqlite db, unless you know what you are doing.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>The first profile</title>
|
|
|
|
<para>
|
|
Then we discover the <link
|
|
xlink:href="https://nixos.org/nix/manual/#sec-profiles">profile</link>
|
|
concept during the installation:
|
|
</para>
|
|
|
|
<xi:include href="./02/user-environment.xml" parse="xml" />
|
|
|
|
<para>
|
|
A profile in nix is a general and very convenient concept for
|
|
realizing rollbacks. Profiles are used to compose more
|
|
components that are spread among multiple paths, under a new
|
|
unified path. Not only, profiles are made up of multiple
|
|
generations: they are versioned. Whenever you change a profile,
|
|
a new generation is created.
|
|
</para>
|
|
|
|
<para>
|
|
Generations thus can be switched and rollback-ed atomatically.
|
|
</para>
|
|
|
|
<para>
|
|
Let's take a closer look at our profile:
|
|
</para>
|
|
|
|
<xi:include href="./02/profile.xml" parse="xml" />
|
|
<para>
|
|
That <package>nix-1.7</package> derivation in the nix store is
|
|
nix itself, with binaries and libraries. The installation
|
|
basically reproduced the hierarchy of the
|
|
<package>nix-1.7</package> derivation in the profile by means of
|
|
symbolic links.
|
|
</para>
|
|
<para>
|
|
The contents of this profile are special, because only one
|
|
program has been installed in our profile, therefore e.g. the
|
|
bin directory fully points to the only program being installed.
|
|
</para>
|
|
<para>
|
|
But that's only the contents of the latest generation of our
|
|
profile. In fact, <literal>~/.nix-profile</literal> itself is a
|
|
symbolic link to
|
|
<literal>/nix/var/nix/profiles/default</literal>.
|
|
</para>
|
|
|
|
<para>
|
|
In turn, that's a symlink to <literal>default-1-link</literal>
|
|
in the same directory. Yes, that means it's the generation #1 of
|
|
the <literal>default</literal> profile.
|
|
</para>
|
|
|
|
<para>
|
|
Finally that's a symlink to the nix store "user-environment"
|
|
derivation that you saw printed during the installation process.
|
|
</para>
|
|
|
|
<para>
|
|
The <filename>manifest.nix</filename> will be meat for the next pill.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Meet nixpkgs expressions</title>
|
|
|
|
<para>
|
|
More wild output from the installer:
|
|
</para>
|
|
|
|
<screen><xi:include href="./02/nixpkgs-expressions.txt"
|
|
parse="text" /></screen>
|
|
|
|
<para>
|
|
<link
|
|
xlink:href="https://nixos.org/nix/manual/#chap-writing-nix-expressions">Nix
|
|
expressions</link> are used to describe packages and how to
|
|
build them. <link
|
|
xlink:href="https://nixos.org/nixpkgs/">Nixpkgs</link> is the
|
|
repository containing all these expressions: <link
|
|
xlink:href="https://github.com/NixOS/nixpkgs">https://github.com/NixOS/nixpkgs</link>.
|
|
</para>
|
|
|
|
<para>
|
|
The installer downloaded the package descriptions from commit
|
|
<literal>a1a2851</literal>.
|
|
</para>
|
|
|
|
<para>
|
|
The second profile we meet is the channels profile.
|
|
<filename>~/.nix-defexpr/channels</filename> points to
|
|
<filename>/nix/var/nix/profiles/per-user/nix/channels</filename>
|
|
which points to <literal>channels-1-link</literal> which points
|
|
to a nix store directory containing the downloaded nix
|
|
expressions.
|
|
</para>
|
|
|
|
<para>
|
|
Channels are a set of packages and expressions available for
|
|
download. Similar to debian stable and unstable, there's a
|
|
stable and unstable channel. In this installation, we're
|
|
tracking nixpkgs unstable.
|
|
</para>
|
|
|
|
<para>
|
|
Don't bother yet with nix expressions.
|
|
</para>
|
|
|
|
<para>
|
|
Finally, for your own convenience, it modified
|
|
<filename>~/.profile</filename> to automatically enter the nix
|
|
environment. What
|
|
<filename>~/.nix-profile/etc/profile.d/nix.sh</filename> really
|
|
does is simply adding <filename>~/.nix-profile/bin</filename> to
|
|
<varname>PATH</varname> and
|
|
<filename>~/.nix-defexpr/channels/nixpkgs</filename> to
|
|
<varname>NIX_PATH</varname>. We'll discuss about
|
|
<varname>NIX_PATH</varname> in another pill.
|
|
</para>
|
|
|
|
<para>
|
|
Read <filename>nix.sh</filename>, it's short.
|
|
</para>
|
|
|
|
</section>
|
|
|
|
<section>
|
|
<title>FAQ: Can I change /nix to something else?</title>
|
|
|
|
<para>
|
|
You can, but there's a strong reason to keep using
|
|
<literal>/nix</literal> instead of a different directory. All
|
|
the derivations depend on other derivations by absolute path. I
|
|
remind you in pill 1 that bash pointed to a
|
|
<package>glibc</package> under <filename>/nix/store</filename>.
|
|
</para>
|
|
|
|
<para>
|
|
You can see now by yourself, don't worry if you see multiple
|
|
bash derivations:
|
|
</para>
|
|
|
|
|
|
<screen><xi:include href="./02/ldd-bash.txt" parse="text" /></screen>
|
|
|
|
<para>
|
|
Keeping the store in <filename>/nix</filename> means we can grab
|
|
the binary cache from nixos.org (just like you grab packages
|
|
from debian mirrors) otherwise:
|
|
|
|
<itemizedlist>
|
|
<listitem><para><package>glibc</package> would be installed under <filename>/foo/store</filename></para></listitem>
|
|
<listitem><para>thus bash needs to point to <package>glibc</package> under <filename>/foo/store</filename></para></listitem>
|
|
<listitem><para>the binary cache won't help, and we'd have to recompile all the stuff by ourselves</para></listitem>
|
|
</itemizedlist>
|
|
</para>
|
|
|
|
<para>
|
|
After all <filename>/nix</filename> is a cool place.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Conclusion</title>
|
|
<para>
|
|
We've installed nix on our system, fully isolated and owned by
|
|
the <literal>nix</literal> user as we're still diffident with
|
|
this new system.
|
|
</para>
|
|
<para>
|
|
We learned some new concepts like profiles and channels. In
|
|
particular, with profiles we're able to manage multiple
|
|
generations of a composition of packages, while with channels
|
|
we're able to download binaries from nixos.org.
|
|
</para>
|
|
<para>
|
|
The installation put everything under <filename>/nix</filename>,
|
|
and some symlinks in the nix user home. That's because every
|
|
user is able to install and use software in her own environment.
|
|
</para>
|
|
<para>
|
|
I hope I left nothing uncovered in a way that you think there's
|
|
some kind of magic behind. It's all about putting components in
|
|
the store and symlinking these components together.
|
|
</para>
|
|
<para>
|
|
Also I hope the commands in this pill were consistent with your
|
|
fresh nix installation.
|
|
</para>
|
|
</section>
|
|
|
|
<section>
|
|
<title>Next pill...</title>
|
|
|
|
<para>
|
|
...we will enter the nix environment and learn how to interact
|
|
with the store.
|
|
</para>
|
|
</section>
|
|
|
|
</chapter>
|