vm: Distinguish between success and failure of the guest code.
Fixes <https://bugs.gnu.org/34276>. Reported by Tobias Geerinckx-Rice <me@tobias.gr>. * gnu/system/vm.scm (expression->derivation-in-linux-vm)[loader]: Produce '/xchg/.exit-status' file upon success. * gnu/build/vm.scm (load-in-linux-vm): Check for 'xchg/.exit-status' once QEMU has completed and respond accordingly.master
parent
60eee3e6de
commit
be6520e6a5
|
@ -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?
|
||||
|
|
|
@ -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
|
||||
|
|
Reference in New Issue