guix-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Fix installer restart.


From: Mathieu Othacehe
Subject: Fix installer restart.
Date: Mon, 10 Feb 2020 14:58:09 +0100
User-agent: mu4e 1.2.0; emacs 26.3

Hello,

Here are two patches that should fix the "Installer fails when
restarted" issue.

For memory, the issue is caused by the store overlay created at
cow-store service start that I was unable to remove. Failing to remove
this overlay, caused the target device to be seen as busy by the kernel
and made further umount calls to fail[1].

I also fixed the "installation failed dialog". There are now two
options:
* "Resume": let the user resume the installation from any step (from the
installation menu)
* "Retry": restart the installer process.

WDYT?

Thanks,

Mathieu

>From f02ef650526973af55cf1629de1cc48e888c714f Mon Sep 17 00:00:00 2001
From: Mathieu Othacehe <address@hidden>
Date: Mon, 10 Feb 2020 14:43:05 +0100
Subject: [PATCH 1/2] installer: Remove the cow-store overlay after system
 installation.

* gnu/installer/final.scm (umount-cow-store): New procedure ...,
(install-system): ... used here, to remove the store overlay so that the
target device is not seen as busy during further umount calls.
---
 gnu/installer/final.scm | 25 +++++++++++++++++++++++--
 1 file changed, 23 insertions(+), 2 deletions(-)

diff --git a/gnu/installer/final.scm b/gnu/installer/final.scm
index 1b85900912..b969ec3676 100644
--- a/gnu/installer/final.scm
+++ b/gnu/installer/final.scm
@@ -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))))
-- 
2.25.0

>From 50884fca871cfceb020d63e556c957163fdd6064 Mon Sep 17 00:00:00 2001
From: Mathieu Othacehe <address@hidden>
Date: Mon, 10 Feb 2020 14:47:56 +0100
Subject: [PATCH 2/2] installer: Fix installer restart dialog.

* gnu/installer/newt/final.scm (run-install-failed-page): Propose between
installer resume or restart. Do actually resume the installation by raising an
&installer-step-abort condition if "Resume" button is pressed. Otherwise, keep
going as the installer will be restarted by login.
* gnu/installer.scm (installer-program): Remove the associated TODO comment.
---
 gnu/installer.scm            |  5 +++--
 gnu/installer/newt/final.scm | 15 +++++++++------
 2 files changed, 12 insertions(+), 8 deletions(-)

diff --git a/gnu/installer.scm b/gnu/installer.scm
index 1676a91801..806f80ec9c 100644
--- a/gnu/installer.scm
+++ b/gnu/installer.scm
@@ -389,8 +389,9 @@ selected keymap."
                      ;; We did it!  Let's reboot!
                      (sync)
                      (stop-service 'root))
-                    (_                            ;installation failed
-                     ;; TODO: Honor the result of 'run-install-failed-page'.
+                    (_
+                     ;; The installation failed, exit so that it is restarted
+                     ;; by login.
                      #f)))
                 (const #f)
                 (lambda (key . args)
diff --git a/gnu/installer/newt/final.scm b/gnu/installer/newt/final.scm
index 061bcd3f78..fb1b2281da 100644
--- a/gnu/installer/newt/final.scm
+++ b/gnu/installer/newt/final.scm
@@ -73,12 +73,15 @@ 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.")))
+  (case (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))))))
 
 (define* (run-install-shell locale
                             #:key (users '()))
-- 
2.25.0

[1]: https://lists.gnu.org/archive/html/guix-devel/2018-12/msg00161.html

reply via email to

[Prev in Thread] Current Thread [Next in Thread]