From d66d9e8425d52cc698851e2e85bd56aa96f45fc9 Mon Sep 17 00:00:00 2001 From: Shea Levy Date: Wed, 4 Feb 2015 11:46:38 -0500 Subject: [PATCH] Require linux 3.13 or later for chroot Fixes #453 --- doc/manual/command-ref/conf-file.xml | 3 ++- src/libstore/build.cc | 7 ++++++- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/doc/manual/command-ref/conf-file.xml b/doc/manual/command-ref/conf-file.xml index 053f4d43c..4bd73b2fc 100644 --- a/doc/manual/command-ref/conf-file.xml +++ b/doc/manual/command-ref/conf-file.xml @@ -243,7 +243,8 @@ flag, e.g. --option gc-keep-outputs false. users” feature to perform the actual builds under different users than root). Currently, chroot builds only work on Linux because Nix uses “bind mounts” to make the Nix store and other - directories available inside the chroot. + directories available inside the chroot. Kernel version 3.13 or later + is needed due to a PID namespace fix nix depends on. diff --git a/src/libstore/build.cc b/src/libstore/build.cc index e0398e2fb..259324734 100644 --- a/src/libstore/build.cc +++ b/src/libstore/build.cc @@ -1970,7 +1970,12 @@ void DerivationGoal::startBuilder() char stack[32 * 1024]; pid_t child = clone(childEntry, stack + sizeof(stack) - 8, CLONE_NEWPID | CLONE_NEWNS | CLONE_NEWNET | CLONE_NEWIPC | CLONE_NEWUTS | CLONE_PARENT | SIGCHLD, this); - if (child == -1) throw SysError("cloning builder process"); + if (child == -1) { + if (errno == EINVAL) + throw SysError("cloning builder process (Linux chroot builds require 3.13 or later)"); + else + throw SysError("cloning builder process"); + } writeFull(builderOut.writeSide, int2String(child) + "\n"); _exit(0); });