From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([2001:4830:134:3::10]:39368) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1d71rP-0005As-Ss for guix-patches@gnu.org; Sat, 06 May 2017 11:43:09 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1d71rM-0000GP-M0 for guix-patches@gnu.org; Sat, 06 May 2017 11:43:07 -0400 Received: from debbugs.gnu.org ([208.118.235.43]:60210) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1d71rM-0000GL-I7 for guix-patches@gnu.org; Sat, 06 May 2017 11:43:04 -0400 Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1d71rM-0002dA-CB for guix-patches@gnu.org; Sat, 06 May 2017 11:43:04 -0400 Subject: bug#26339: [PATCH v3 8/9] scripts: system: Adapt "switch-generation" to new bootloader API. Resent-Message-ID: From: Mathieu Othacehe Date: Sat, 6 May 2017 17:41:53 +0200 Message-Id: <20170506154154.17836-9-m.othacehe@gmail.com> In-Reply-To: <20170506154154.17836-1-m.othacehe@gmail.com> References: <20170506154154.17836-1-m.othacehe@gmail.com> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: guix-patches-bounces+kyle=kyleam.com@gnu.org Sender: "Guix-patches" To: 26339@debbugs.gnu.org * guix/scripts/system.scm (reinstall-grub): Rename to reinstall-bootloader. Read boot-device and boot-type from parameters file to be able to restore the correct bootloader on specified device. Factorize bootloader installation code by calling install-bootloader. (switch-to-system-generation): Adapt. --- guix/scripts/system.scm | 67 +++++++++++++++++++++++++++++-------------------- 1 file changed, 40 insertions(+), 27 deletions(-) diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm index b3e2d7b72..adab1cedb 100644 --- a/guix/scripts/system.scm +++ b/guix/scripts/system.scm @@ -412,49 +412,62 @@ connection to the store." ;;; (define (switch-to-system-generation store spec) "Switch the system profile to the generation specified by SPEC, and -re-install grub with a grub configuration file that uses the specified system +re-install bootloader with a configuration file that uses the specified system generation as its default entry. STORE is an open connection to the store." (let ((number (relative-generation-spec->number %system-profile spec))) (if number (begin - (reinstall-grub store number) + (reinstall-bootloader store number) (switch-to-generation* %system-profile number)) (leave (G_ "cannot switch to system generation '~a'~%") spec)))) -(define (reinstall-grub store number) - "Re-install grub for existing system profile generation NUMBER. STORE is an -open connection to the store." +(define (reinstall-bootloader store number) + "Re-install bootloader for existing system profile generation NUMBER. +STORE is an open connection to the store." (let* ((generation (generation-file-name %system-profile number)) (params (unless-file-not-found (read-boot-parameters-file generation))) - (root-device (boot-parameters-root-device params)) + (boot-device (boot-parameters-boot-device params)) ;; We don't currently keep track of past menu entries' details. The ;; default values will allow the system to boot, even if they differ ;; from the actual past values for this generation's entry. - (grub-config (grub-configuration (device root-device))) + (boot-config (bootloader-configuration + (inherit (lookup-bootloader-configuration + (boot-parameters-boot-type params))) + (device boot-device))) ;; Make the specified system generation the default entry. (entries (profile-boot-parameters %system-profile (list number))) (old-generations (delv number (generation-numbers %system-profile))) - (old-entries (profile-boot-parameters %system-profile old-generations)) - (grub.cfg (run-with-store store - (grub-configuration-file grub-config - entries - #:old-entries old-entries)))) - (show-what-to-build store (list grub.cfg)) - (build-derivations store (list grub.cfg)) - ;; This is basically the same as install-grub*, but for now we avoid - ;; re-installing the GRUB boot loader itself onto a device, mainly because - ;; we don't in general have access to the same version of the GRUB package - ;; which was used when installing this other system generation. - (let* ((grub.cfg-path (derivation->output-path grub.cfg)) - (gc-root (string-append %gc-roots-directory "/grub.cfg")) - (temp-gc-root (string-append gc-root ".new"))) - (switch-symlinks temp-gc-root grub.cfg-path) - (unless (false-if-exception (install-grub-config grub.cfg-path "/")) - (delete-file temp-gc-root) - (leave (G_ "failed to re-install GRUB configuration file: '~a'~%") - grub.cfg-path)) - (rename-file temp-gc-root gc-root)))) + (old-entries (profile-boot-parameters + %system-profile old-generations))) + (run-with-store store + (mlet* %store-monad + ((bootcfg ((bootloader-configuration-file-generator boot-config) + boot-config entries + #:old-entries old-entries)) + (bootcfg-location -> (bootloader-configuration-file-name + boot-config)) + (bootloader (package->derivation + (bootloader-configuration-bootloader boot-config))) + (target -> "/") + (install-proc + (let ((procedure (bootloader-configuration-installer + boot-config))) + (install-bootloader-derivation + procedure bootloader boot-device target))) + (drvs -> (list bootcfg bootloader install-proc))) + (mbegin %store-monad + (show-what-to-build* drvs) + (built-derivations drvs) + ;; PARAMS file may not contain a suitable BOOT-DEVICE. If BOOT-DEVICE + ;; is #f do not run INSTALL-PROC during bootloader installation. + (install-bootloader (if boot-device + install-proc + #f) + #:bootcfg bootcfg + #:bootcfg-location bootcfg-location + #:device boot-device + #:target target)))))) ;;; -- 2.12.2