diff options
author | Marius Bakke <mbakke@fastmail.com> | 2018-07-02 12:18:58 +0200 |
---|---|---|
committer | Marius Bakke <mbakke@fastmail.com> | 2018-07-02 12:18:58 +0200 |
commit | 92af3ce417fdcb932c3f291e0c79106466a40c66 (patch) | |
tree | 610d10ca5c4197c1a0ae14f1972dc72fb78a39d3 /gnu/build/vm.scm | |
parent | cb4b508cd68df89bfbd5255a0c5569f8318ad50f (diff) | |
parent | 6e65eb3cad1d1148eade9ed2228cdea90d531a94 (diff) | |
download | patches-92af3ce417fdcb932c3f291e0c79106466a40c66.tar patches-92af3ce417fdcb932c3f291e0c79106466a40c66.tar.gz |
Merge branch 'master' into staging
Diffstat (limited to 'gnu/build/vm.scm')
-rw-r--r-- | gnu/build/vm.scm | 98 |
1 files changed, 62 insertions, 36 deletions
diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm index 73d0191de7..abecc8c470 100644 --- a/gnu/build/vm.scm +++ b/gnu/build/vm.scm @@ -34,6 +34,7 @@ #:use-module (ice-9 format) #:use-module (ice-9 match) #:use-module (ice-9 regex) + #:use-module (ice-9 popen) #:use-module (srfi srfi-1) #:use-module (srfi srfi-9) #:use-module (srfi srfi-26) @@ -408,42 +409,67 @@ SYSTEM-DIRECTORY is the name of the directory of the 'system' derivation." register-closures? (closures '())) "Given a GRUB package, creates an iso image as TARGET, using CONFIG-FILE as GRUB configuration and OS-DRV as the stuff in it." - (let ((grub-mkrescue (string-append grub "/bin/grub-mkrescue")) - (target-store (string-append "/tmp/root" (%store-directory)))) - (populate-root-file-system os-drv "/tmp/root") - - (mount (%store-directory) target-store "" MS_BIND) - - (when register-closures? - (display "registering closures...\n") - (for-each (lambda (closure) - (register-closure - "/tmp/root" - (string-append "/xchg/" closure) - ;; XXX: Using deduplication causes cross device link errors. - #:deduplicate? #f)) - closures)) - - (apply invoke - `(,grub-mkrescue "-o" ,target - ,(string-append "boot/grub/grub.cfg=" config-file) - ,(string-append "gnu/store=" os-drv "/..") - "etc=/tmp/root/etc" - "var=/tmp/root/var" - "run=/tmp/root/run" - ;; /mnt is used as part of the installation - ;; process, as the mount point for the target - ;; file system, so create it. - "mnt=/tmp/root/mnt" - "--" - "-volid" ,(string-upcase volume-id) - ,@(if volume-uuid - `("-volume_date" "uuid" - ,(string-filter (lambda (value) - (not (char=? #\- value))) - (iso9660-uuid->string - volume-uuid))) - `()))))) + (define grub-mkrescue + (string-append grub "/bin/grub-mkrescue")) + + (define target-store + (string-append "/tmp/root" (%store-directory))) + + (define items + ;; The store items to add to the image. + (delete-duplicates + (append-map (lambda (closure) + (map store-info-item + (call-with-input-file (string-append "/xchg/" closure) + read-reference-graph))) + closures))) + + (populate-root-file-system os-drv "/tmp/root") + (mount (%store-directory) target-store "" MS_BIND) + + (when register-closures? + (display "registering closures...\n") + (for-each (lambda (closure) + (register-closure + "/tmp/root" + (string-append "/xchg/" closure) + + ;; TARGET-STORE is a read-only bind-mount so we shouldn't try + ;; to modify it. + #:deduplicate? #f + #:reset-timestamps? #f)) + closures) + (register-bootcfg-root "/tmp/root" config-file)) + + (let ((pipe + (apply open-pipe* OPEN_WRITE + grub-mkrescue "-o" target + (string-append "boot/grub/grub.cfg=" config-file) + "etc=/tmp/root/etc" + "var=/tmp/root/var" + "run=/tmp/root/run" + ;; /mnt is used as part of the installation + ;; process, as the mount point for the target + ;; file system, so create it. + "mnt=/tmp/root/mnt" + "-path-list" "-" + "--" + "-volid" (string-upcase volume-id) + (if volume-uuid + `("-volume_date" "uuid" + ,(string-filter (lambda (value) + (not (char=? #\- value))) + (iso9660-uuid->string + volume-uuid))) + `())))) + ;; Pass lines like 'gnu/store/…-x=/gnu/store/…-x' corresponding to the + ;; '-path-list -' option. + (for-each (lambda (item) + (format pipe "~a=~a~%" + (string-drop item 1) item)) + items) + (unless (zero? (close-pipe pipe)) + (error "oh, my! grub-mkrescue failed" grub-mkrescue)))) (define* (initialize-hard-disk device #:key |