From mboxrd@z Thu Jan 1 00:00:00 1970 From: Mathieu Othacehe Subject: Fix installer restart. Date: Mon, 10 Feb 2020 14:58:09 +0100 Message-ID: <87sgjimtn2.fsf@gmail.com> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:470:142:3::10]:52175) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1j19Zo-0002wT-9m for guix-devel@gnu.org; Mon, 10 Feb 2020 08:58:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1j19Zm-0005gV-Ok for guix-devel@gnu.org; Mon, 10 Feb 2020 08:58:16 -0500 Received: from mail-wm1-x334.google.com ([2a00:1450:4864:20::334]:55623) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1j19Zm-0005g8-Fk for guix-devel@gnu.org; Mon, 10 Feb 2020 08:58:14 -0500 Received: by mail-wm1-x334.google.com with SMTP id q9so389993wmj.5 for ; Mon, 10 Feb 2020 05:58:13 -0800 (PST) Received: from meru (lfbn-ann-1-237-90.w86-200.abo.wanadoo.fr. [86.200.196.90]) by smtp.gmail.com with ESMTPSA id a16sm671764wrt.30.2020.02.10.05.58.10 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Feb 2020 05:58:11 -0800 (PST) List-Id: "Development of GNU Guix and the GNU System distribution." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-devel-bounces+gcggd-guix-devel=m.gmane-mx.org@gnu.org Sender: "Guix-devel" To: Guix Devel --=-=-= Content-Type: text/plain 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 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-installer-Remove-the-cow-store-overlay-after-system-.patch >From f02ef650526973af55cf1629de1cc48e888c714f Mon Sep 17 00:00:00 2001 From: Mathieu Othacehe 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 --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0002-installer-Fix-installer-restart-dialog.patch >From 50884fca871cfceb020d63e556c957163fdd6064 Mon Sep 17 00:00:00 2001 From: Mathieu Othacehe 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 --=-=-= Content-Type: text/plain [1]: https://lists.gnu.org/archive/html/guix-devel/2018-12/msg00161.html --=-=-=--