Hi Mark, Thanks for the thorough analysis.
Mark H Weaver <m...@netris.org> skribis: > My suspicion is that my kernel (linux-libre-2.6.39.1) and Guix's glibc > are not playing nicely together. However, Guix's glibc was configured > to support kernels as early as 2.6.30, and the same 'pwd' executable > that fails within 'guix-daemon' seems to work outside of it, even when > run within a chroot. Could it have something to do with bind mounts? The method ‘DerivationGoal::initChild()’ in libstore/build.cc is what sets up the chroot environment. The /tmp/nix-build-* directory is itself bind-mounted in the chroot. So: > * The initial stat(".") syscall reports inode 7274551, which corresponds > to "/tmp/nix-build-make-boot0-3.82.drv-0/make-3.82", as expected. > > * stat("/") reports inode 1073173, which looks WRONG. > > * stat("..") reports inode 7274550, which corresponds to > "/tmp/nix-build-make-boot0-3.82.drv-0", as expected. > > * reading the contents of ".." reports inode numbers that all look > correct, including "make-3.82" with inode 7274551, the same as ".". > Thus 'pwd' concludes that its result will end with "/make-3.82". > > * stat("../..") reports inode 1073174, which looks WRONG. > > * reading the contents of "../.." reports inode numbers that all look > WRONG: > > "nix-build-make-boot0-3.82.drv-0" with inode 1073325 > ".." with inode 1073173 > "." with inode 1073174 > > None of these match the inode of "..", so 'pwd' fails. Could it be that stat("/") reports the inode of the underlying root? Can you try this in a REPL (assuming the bootstrap Guile works): (use-modules (guix store) (guix monads) (guix utils) (gnu packages bootstrap) (guix packages)) (define (test) (derivation-expression "test" (%current-system) '(and (equal? (pk 'root (stat:ino (stat "/"))) (pk 'dotdotdotdot (stat:ino (stat "../..")))) (equal? (pk 'dotdot (stat:ino (stat ".."))) (pk 'tmp (stat:ino (stat "/tmp")))) (equal? (pk 'dot (stat:ino (stat "."))) (pk 'tmpdir (stat:ino (stat "/tmp/nix-build-test.drv-0")))) (mkdir %output)) '())) (define s (open-connection)) (define drv (run-with-store s (test) #:guile-for-build (package-derivation s %bootstrap-guile))) (build-derivations s drv) If that test fails, that most likely indicates a bug in Linux-Libre. BTW, were you able to run (some of) ‘make check’? Thanks, Ludo’.