summaryrefslogtreecommitdiff
path: root/gnu/installer
diff options
context:
space:
mode:
Diffstat (limited to 'gnu/installer')
-rw-r--r--gnu/installer/final.scm27
-rw-r--r--gnu/installer/newt/final.scm21
2 files changed, 38 insertions, 10 deletions
diff --git a/gnu/installer/final.scm b/gnu/installer/final.scm
index 1b85900912..8c2185e36f 100644
--- a/gnu/installer/final.scm
+++ b/gnu/installer/final.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2018, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2019 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
@@ -23,6 +23,7 @@
#:use-module (gnu installer utils)
#:use-module (gnu installer user)
#:use-module (gnu services herd)
+ #:use-module (guix build syscalls)
#:use-module (guix build utils)
#:use-module (gnu build accounts)
#:use-module ((gnu system shadow) #:prefix sys:)
@@ -96,6 +97,15 @@ USERS."
(write-passwd password (string-append etc "/passwd"))
(write-shadow shadow (string-append etc "/shadow")))
+(define (umount-cow-store)
+ "Remove the store overlay and the bind-mount on /tmp created by the
+cow-store service."
+ (let ((tmp-dir "/remove"))
+ (mkdir-p tmp-dir)
+ (mount (%store-directory) tmp-dir "" MS_MOVE)
+ (umount tmp-dir)
+ (umount "/tmp")))
+
(define* (install-system locale #:key (users '()))
"Create /etc/shadow and /etc/passwd on the installation target for USERS.
Start COW-STORE service on target directory and launch guix install command in
@@ -114,5 +124,16 @@ or #f. Return #t on success and #f on failure."
;; passwords that we've put in there.
(create-user-database users (%installer-target-dir))
- (start-service 'cow-store (list (%installer-target-dir)))
- (run-shell-command install-command #:locale locale)))
+ (dynamic-wind
+ (lambda ()
+ (start-service 'cow-store (list (%installer-target-dir))))
+ (lambda ()
+ (run-shell-command install-command #:locale locale))
+ (lambda ()
+ (stop-service 'cow-store)
+ ;; Remove the store overlay created at cow-store service start.
+ ;; Failing to do that will result in further umount calls to fail
+ ;; because the target device is seen as busy. See:
+ ;; https://lists.gnu.org/archive/html/guix-devel/2018-12/msg00161.html.
+ (umount-cow-store)
+ #f))))
diff --git a/gnu/installer/newt/final.scm b/gnu/installer/newt/final.scm
index 061bcd3f78..405eee2540 100644
--- a/gnu/installer/newt/final.scm
+++ b/gnu/installer/newt/final.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2018 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2018, 2020 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2019, 2020 Ludovic Courtès <ludo@gnu.org>
;;;
;;; This file is part of GNU Guix.
@@ -27,6 +27,7 @@
#:use-module (guix i18n)
#:use-module (srfi srfi-34)
#:use-module (srfi srfi-35)
+ #:use-module (ice-9 match)
#:use-module (newt)
#:export (run-final-page))
@@ -73,12 +74,18 @@ press the button to reboot."))
'success)
(define (run-install-failed-page)
- (choice-window
- (G_ "Installation failed")
- (G_ "Restart installer")
- (G_ "Retry system install")
- (G_ "The final system installation step failed. You can retry the \
-last step, or restart the installer.")))
+ (match (choice-window
+ (G_ "Installation failed")
+ (G_ "Resume")
+ (G_ "Restart the installer")
+ (G_ "The final system installation step failed. You can resume from \
+a specific step, or restart the installer."))
+ (1 (raise
+ (condition
+ (&installer-step-abort))))
+ (2
+ ;; Keep going, the installer will be restarted later on.
+ #t)))
(define* (run-install-shell locale
#:key (users '()))