From 71b98b9de9d2658f4787d2fb77609a95b09ff3ea Mon Sep 17 00:00:00 2001 From: Ludovic Courtès Date: Tue, 9 Jan 2018 16:48:35 +0100 Subject: services: qemu-binfmt: Extend guix-daemon with extra chroot directories. Fixes . * gnu/services/virtualization.scm ()[guix-support?]: New field. (qemu-binfmt-guix-chroot): New procedure. (qemu-binfmt-service-type)[extensions]: Add GUIX-SERVICE-TYPE. * doc/guix.texi (Virtualization Services): Document 'guix-support?'. (Additional Build Options): Mention binfmt_misc and offloading under '--system'. --- gnu/services/virtualization.scm | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) (limited to 'gnu/services') diff --git a/gnu/services/virtualization.scm b/gnu/services/virtualization.scm index 0a8f67fb8e..bf71e7f26a 100644 --- a/gnu/services/virtualization.scm +++ b/gnu/services/virtualization.scm @@ -662,7 +662,9 @@ (define-record-type* (qemu qemu-binfmt-configuration-qemu (default qemu)) (platforms qemu-binfmt-configuration-platforms - (default '()))) ;safest default + (default '())) ;safest default + (guix-support? qemu-binfmt-configuration-guix-support? + (default #f))) (define (qemu-platform->binfmt qemu platform) "Return a gexp that evaluates to a binfmt string for PLATFORM, using the @@ -724,6 +726,19 @@ (define qemu-binfmt-shepherd-services '#$(map qemu-platform-name platforms)) #f))))))) +(define qemu-binfmt-guix-chroot + (match-lambda + ;; Add QEMU and its dependencies to the guix-daemon chroot so that our + ;; binfmt_misc handlers work in the chroot (otherwise 'execve' would fail + ;; with ENOENT.) + ;; + ;; The 'F' flag of binfmt_misc is meant to address this problem by loading + ;; the interpreter upfront rather than lazily, but apparently that is + ;; insufficient (perhaps it loads the 'qemu-ARCH' binary upfront but looks + ;; up its dependencies lazily?). + (($ qemu platforms guix?) + (if guix? (list qemu) '())))) + (define qemu-binfmt-service-type ;; TODO: Make a separate binfmt_misc service out of this? (service-type (name 'qemu-binfmt) @@ -732,7 +747,9 @@ (define qemu-binfmt-service-type (const (list %binary-format-file-system))) (service-extension shepherd-root-service-type - qemu-binfmt-shepherd-services))) + qemu-binfmt-shepherd-services) + (service-extension guix-service-type + qemu-binfmt-guix-chroot))) (default-value (qemu-binfmt-configuration)) (description "This service supports transparent emulation of binaries -- cgit v1.2.3