guix-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

01/02: website: childhurds-and-substitutes: Add "Isolated build environm


From: Ludovic Courtčs
Subject: 01/02: website: childhurds-and-substitutes: Add "Isolated build environments" section.
Date: Wed, 7 Oct 2020 09:45:38 -0400 (EDT)

civodul pushed a commit to branch master
in repository guix-artwork.

commit 4e0e26705893951ad26ea898263343be205dfbe5
Author: Ludovic Courtès <ludo@gnu.org>
AuthorDate: Wed Oct 7 15:24:53 2020 +0200

    website: childhurds-and-substitutes: Add "Isolated build environments" 
section.
    
    * website/drafts/childhurds-and-substitutes.md (Isolated build
    environments): New section.
---
 website/drafts/childhurds-and-substitutes.md | 66 +++++++++++++++++++++++++++-
 1 file changed, 65 insertions(+), 1 deletion(-)

diff --git a/website/drafts/childhurds-and-substitutes.md 
b/website/drafts/childhurds-and-substitutes.md
index fa678ad..f0dc43c 100644
--- a/website/drafts/childhurds-and-substitutes.md
+++ b/website/drafts/childhurds-and-substitutes.md
@@ -336,7 +336,7 @@ follow.  Now let's configure and build Guix:
 
 ```bash
 janneke@childhurd ~$ cd guix
-janneke@childhurd ~/guix$ guix environment --bootstrap\
+janneke@childhurd ~/guix$ guix environment --bootstrap \
   --ad-hoc gcc-toolchain@7 libgcrypt zlib
 substitute: updating substitutes from 'https://ci.guix.gnu.org'... 100.0%
 The following derivations will be built:
@@ -369,6 +369,70 @@ just like we are used to do…almost.  We are using 
`--bootstrap` and a
 targeted `--ad-hoc` to avoid dependencies like `libx11`,
 `python-minimal`, and other packages that do not build yet.
 
+# Isolated build environments
+
+To help achieve [reproducible
+builds](https://reproducible-builds.org/docs/definition/), Guix builds
+packages in _isolated build environments_: build environments contain
+nothing but the inputs explicitly declared in the package
+definition—[not even
+`/bin/sh`](https://lists.gnu.org/archive/html/bug-guix/2013-01/msg00041.html).
+Build environments also lack network access.  On GNU/Linux this is
+achieved by running builds in separate _namespaces_.  Besides, the
+environment contains device nodes and “special” file systems that are
+usually expected to be available: `/dev/null`, `/dev/pts`, `/dev/shm`,
+`/proc`, the loopback networking device, and so on.  (The exact contents
+[are
+documented](https://guix.gnu.org/manual/en/html_node/Build-Environment-Setup.html).)
+
+On GNU/Linux, these special files and file systems are implemented by
+the kernel.  Guix only cares about user-land software, meaning that
+these devices “leak” from the host kernel instead of being an explicit
+“input” of
+[derivations](https://guix.gnu.org/manual/en/html_node/Derivations.html),
+but that’s OK, that’s the deal: the kernel and hardware are considered
+outside of Guix’s control.
+
+What about GNU/Hurd, though?  In GNU/Hurd, `/dev/null`, a
+Linux-compatible `/proc`, the TCP/IP stack necessary to implement the
+loopback device, and even support for pipes are all implemented in
+user-land: writing to `/dev/null` amounts to talking to the `/hurd/null`
+service (or _translator_), operations on `AF_INET` sockets translate to
+remote procedure calls (RPCs) to `/servers/socket/2`, which the
+`/hurd/pfinet` program listens to, and so on.
+
+That raises an interesting question: what should the build environment
+contain on GNU/Hurd?  So far our GNU/Hurd builds were made in
+non-isolated environments; we have just [started implementing](XXX:
+link?) support for isolated builds but we’ll have to answer that
+question first.  If we stick to our approach—every piece of user-land
+software must be an explicit input of the build process—then code that
+implements TCP/IP, `/dev/null`, or even `pipe` should be an explicit
+input of any build process that needs those facilities.
+
+This principled approach can push the notion of controlled, reproducible
+build environments to a whole new level.  For example, we’ve
+[had](https://issues.guix.gnu.org/21280#7)
+[cases](https://issues.guix.gnu.org/20877#5) where the choice of the
+root file system—e.g., ext4 vs. Btrfs—has an observable effect on
+software behavior, leading to concrete issues such as test failures in
+one case and not in the other.  On GNU/Hurd, build processes could run
+their own root file system, doing away with this kind of discrepancy.
+
+On the other hand, there are practical issues that cannot be ignored:
+virtually all build processes need these facilities so they’ll need to
+be set up one way or another.  Also, one could argue that things like
+`/dev/null` have a well-defined interface that’s set in stone and that,
+consequently, how they’re implemented does not matter at all.  Can we
+say the same of the TCP/IP stack though?  Maybe not.  A line needs to be
+drawn somewhere.
+
+We have yet to decide where to draw the line and to precisely define
+what the build environment contains on GNU/Hurd.  These questions are
+closely related to bootstrapping issues we notably [discussed at the
+2019 Reproducible Builds
+Summit](https://guix.gnu.org/blog/2019/reproducible-builds-summit-5th-edition/).
+Tricky, but exciting.
 
 # What's next?
 



reply via email to

[Prev in Thread] Current Thread [Next in Thread]