aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gnu/build/vm.scm11
-rw-r--r--gnu/system/vm.scm15
2 files changed, 19 insertions, 7 deletions
diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
index 9a9e5bd001..79eed48c1f 100644
--- a/gnu/build/vm.scm
+++ b/gnu/build/vm.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019 Ludovic Courtès <ludo@gnu.org>
+;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
;;; Copyright © 2016 Christopher Allan Webber <cwebber@dustycloud.org>
;;; Copyright © 2016, 2017 Leo Famulari <leo@famulari.name>
;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
@@ -183,6 +183,15 @@ the #:references-graphs parameter of 'derivation'."
'())
arch-specific-flags))
+ (unless (file-exists? "xchg/.exit-status")
+ (error "VM did not produce an exit code"))
+
+ (match (call-with-input-file "xchg/.exit-status" read)
+ (0 #t)
+ (status (error "guest VM code exited with a non-zero status" status)))
+
+ (delete-file "xchg/.exit-status")
+
;; When MAKE-DISK-IMAGE? is true, the image is in OUTPUT already.
(unless make-disk-image?
(if single-file-output?
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index d1c131ecb4..c6ec25a895 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -186,12 +186,15 @@ made available under the /xchg CIFS share."
;; the initrd. See example at
;; <https://lists.gnu.org/archive/html/guix-devel/2017-10/msg00233.html>.
(program-file "linux-vm-loader"
- ;; When USER-BUILDER succeeds, reboot (indicating a
- ;; success), otherwise die, which causes a kernel panic
- ;; ("Attempted to kill init!").
- #~(if (zero? (system* #$user-builder))
- (reboot)
- (exit 1))))
+ ;; Communicate USER-BUILDER's exit status via /xchg so that
+ ;; the host can distinguish between success, failure, and
+ ;; kernel panic.
+ #~(let ((status (system* #$user-builder)))
+ (call-with-output-file "/xchg/.exit-status"
+ (lambda (port)
+ (write status port)))
+ (sync)
+ (reboot))))
(let ((initrd (or initrd
(base-initrd file-systems