From be6520e6a58d7f6ee58f4cab76db9d1245410113 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ludovic=20Court=C3=A8s?= Date: Thu, 26 Mar 2020 23:21:11 +0100 Subject: vm: Distinguish between success and failure of the guest code. Fixes . Reported by Tobias Geerinckx-Rice . * 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. --- gnu/build/vm.scm | 11 ++++++++++- gnu/system/vm.scm | 15 +++++++++------ 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 +;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès ;;; Copyright © 2016 Christopher Allan Webber ;;; Copyright © 2016, 2017 Leo Famulari ;;; Copyright © 2017 Mathieu Othacehe @@ -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 ;; . (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 -- cgit v1.2.3