2020-04-28 08:15:28 -04:00
|
|
|
|
;;; GNU Guix --- Functional package management for GNU
|
2022-09-06 05:42:34 -04:00
|
|
|
|
;;; Copyright © 2020, 2021, 2022 Mathieu Othacehe <othacehe@gnu.org>
|
2020-06-11 16:52:12 -04:00
|
|
|
|
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
|
2022-05-22 09:52:45 -04:00
|
|
|
|
;;; Copyright © 2022 Pavel Shlyak <p.shlyak@pantherx.org>
|
2022-06-18 01:18:35 -04:00
|
|
|
|
;;; Copyright © 2022 Denis 'GNUtoo' Carikli <GNUtoo@cyberdimension.org>
|
2022-02-06 17:29:47 -05:00
|
|
|
|
;;; Copyright © 2022 Alex Griffin <a@ajgrf.com>
|
2020-04-28 08:15:28 -04:00
|
|
|
|
;;;
|
|
|
|
|
;;; This file is part of GNU Guix.
|
|
|
|
|
;;;
|
|
|
|
|
;;; GNU Guix is free software; you can redistribute it and/or modify it
|
|
|
|
|
;;; under the terms of the GNU General Public License as published by
|
|
|
|
|
;;; the Free Software Foundation; either version 3 of the License, or (at
|
|
|
|
|
;;; your option) any later version.
|
|
|
|
|
;;;
|
|
|
|
|
;;; GNU Guix is distributed in the hope that it will be useful, but
|
|
|
|
|
;;; WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
;;; GNU General Public License for more details.
|
|
|
|
|
;;;
|
|
|
|
|
;;; You should have received a copy of the GNU General Public License
|
|
|
|
|
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
|
|
(define-module (gnu system image)
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
#:use-module (guix diagnostics)
|
|
|
|
|
#:use-module (guix discovery)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (guix gexp)
|
|
|
|
|
#:use-module (guix modules)
|
|
|
|
|
#:use-module (guix monads)
|
|
|
|
|
#:use-module (guix records)
|
|
|
|
|
#:use-module (guix store)
|
|
|
|
|
#:use-module (guix ui)
|
|
|
|
|
#:use-module (guix utils)
|
|
|
|
|
#:use-module ((guix self) #:select (make-config.scm))
|
|
|
|
|
#:use-module (gnu bootloader)
|
|
|
|
|
#:use-module (gnu bootloader grub)
|
2022-02-06 17:29:47 -05:00
|
|
|
|
#:use-module (gnu compression)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (gnu image)
|
2022-05-23 16:37:26 -04:00
|
|
|
|
#:use-module (guix platform)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (gnu services)
|
|
|
|
|
#:use-module (gnu services base)
|
|
|
|
|
#:use-module (gnu system)
|
2022-02-07 19:37:25 -05:00
|
|
|
|
#:use-module (gnu system accounts)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (gnu system file-systems)
|
2021-12-16 02:51:56 -05:00
|
|
|
|
#:use-module (gnu system linux-container)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (gnu system uuid)
|
|
|
|
|
#:use-module (gnu system vm)
|
|
|
|
|
#:use-module (guix packages)
|
|
|
|
|
#:use-module (gnu packages base)
|
2022-02-07 19:37:25 -05:00
|
|
|
|
#:use-module (gnu packages bash)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (gnu packages bootloaders)
|
|
|
|
|
#:use-module (gnu packages cdrom)
|
2021-12-16 02:51:56 -05:00
|
|
|
|
#:use-module (gnu packages compression)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (gnu packages disk)
|
|
|
|
|
#:use-module (gnu packages gawk)
|
|
|
|
|
#:use-module (gnu packages genimage)
|
|
|
|
|
#:use-module (gnu packages guile)
|
|
|
|
|
#:autoload (gnu packages gnupg) (guile-gcrypt)
|
2020-05-23 13:10:44 -04:00
|
|
|
|
#:use-module (gnu packages hurd)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (gnu packages linux)
|
|
|
|
|
#:use-module (gnu packages mtools)
|
2020-09-29 05:37:19 -04:00
|
|
|
|
#:use-module (gnu packages virtualization)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module ((srfi srfi-1) #:prefix srfi-1:)
|
|
|
|
|
#:use-module (srfi srfi-11)
|
|
|
|
|
#:use-module (srfi srfi-26)
|
2020-10-14 05:07:40 -04:00
|
|
|
|
#:use-module (srfi srfi-34)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (srfi srfi-35)
|
|
|
|
|
#:use-module (rnrs bytevectors)
|
2020-09-29 05:37:19 -04:00
|
|
|
|
#:use-module (ice-9 format)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:use-module (ice-9 match)
|
2020-06-13 11:33:10 -04:00
|
|
|
|
#:export (root-offset
|
|
|
|
|
root-label
|
2022-09-05 12:12:22 -04:00
|
|
|
|
image-without-os
|
2020-06-13 11:33:10 -04:00
|
|
|
|
|
|
|
|
|
esp-partition
|
2022-06-18 01:18:35 -04:00
|
|
|
|
esp32-partition
|
2020-04-28 08:15:28 -04:00
|
|
|
|
root-partition
|
|
|
|
|
|
|
|
|
|
efi-disk-image
|
|
|
|
|
iso9660-image
|
2021-12-16 02:51:56 -05:00
|
|
|
|
docker-image
|
2022-02-06 17:29:47 -05:00
|
|
|
|
tarball-image
|
2022-02-07 19:37:25 -05:00
|
|
|
|
wsl2-image
|
2021-08-30 12:24:27 -04:00
|
|
|
|
raw-with-offset-disk-image
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
image-with-os
|
2020-12-03 05:53:53 -05:00
|
|
|
|
efi-raw-image-type
|
2022-06-18 01:18:35 -04:00
|
|
|
|
efi32-raw-image-type
|
2020-10-02 08:54:26 -04:00
|
|
|
|
qcow2-image-type
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
iso-image-type
|
|
|
|
|
uncompressed-iso-image-type
|
2021-12-16 02:51:56 -05:00
|
|
|
|
docker-image-type
|
2022-02-06 17:29:47 -05:00
|
|
|
|
tarball-image-type
|
2022-02-07 19:37:25 -05:00
|
|
|
|
wsl2-image-type
|
2021-08-30 12:24:27 -04:00
|
|
|
|
raw-with-offset-image-type
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
|
|
|
|
|
image-with-label
|
2020-08-29 09:34:56 -04:00
|
|
|
|
system-image
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
|
|
|
|
|
%image-types
|
|
|
|
|
lookup-image-type-by-name))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;;
|
|
|
|
|
;;; Images definitions.
|
|
|
|
|
;;;
|
|
|
|
|
|
2020-05-29 03:05:53 -04:00
|
|
|
|
;; This is the offset before the first partition. GRUB will install itself in
|
|
|
|
|
;; this post-MBR gap.
|
|
|
|
|
(define root-offset (* 512 2048))
|
|
|
|
|
|
|
|
|
|
;; Generic root partition label.
|
|
|
|
|
(define root-label "Guix_image")
|
|
|
|
|
|
2022-09-05 12:12:22 -04:00
|
|
|
|
(define-syntax-rule (image-without-os . fields)
|
|
|
|
|
"Return an image record with the mandatory operating-system field set to
|
|
|
|
|
#false. This is useful when creating an image record that will serve as a
|
|
|
|
|
parent image record."
|
|
|
|
|
(image (operating-system #false) . fields))
|
|
|
|
|
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(define esp-partition
|
|
|
|
|
(partition
|
|
|
|
|
(size (* 40 (expt 2 20)))
|
2020-05-29 03:05:53 -04:00
|
|
|
|
(offset root-offset)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(label "GNU-ESP") ;cosmetic only
|
|
|
|
|
;; Use "vfat" here since this property is used when mounting. The actual
|
|
|
|
|
;; FAT-ness is based on file system size (16 in this case).
|
|
|
|
|
(file-system "vfat")
|
|
|
|
|
(flags '(esp))
|
|
|
|
|
(initializer (gexp initialize-efi-partition))))
|
|
|
|
|
|
2022-06-18 01:18:35 -04:00
|
|
|
|
(define esp32-partition
|
|
|
|
|
(partition
|
|
|
|
|
(inherit esp-partition)
|
|
|
|
|
(initializer (gexp initialize-efi32-partition))))
|
|
|
|
|
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(define root-partition
|
|
|
|
|
(partition
|
|
|
|
|
(size 'guess)
|
2020-05-29 03:05:53 -04:00
|
|
|
|
(label root-label)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(file-system "ext4")
|
|
|
|
|
(flags '(boot))
|
|
|
|
|
(initializer (gexp initialize-root-partition))))
|
|
|
|
|
|
|
|
|
|
(define efi-disk-image
|
2022-09-05 12:12:22 -04:00
|
|
|
|
(image-without-os
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(format 'disk-image)
|
|
|
|
|
(partitions (list esp-partition root-partition))))
|
|
|
|
|
|
2022-06-18 01:18:35 -04:00
|
|
|
|
(define efi32-disk-image
|
2022-09-05 12:12:22 -04:00
|
|
|
|
(image-without-os
|
2022-06-18 01:18:35 -04:00
|
|
|
|
(format 'disk-image)
|
|
|
|
|
(partitions (list esp32-partition root-partition))))
|
|
|
|
|
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(define iso9660-image
|
2022-09-05 12:12:22 -04:00
|
|
|
|
(image-without-os
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(format 'iso9660)
|
|
|
|
|
(partitions
|
|
|
|
|
(list (partition
|
|
|
|
|
(size 'guess)
|
|
|
|
|
(label "GUIX_IMAGE")
|
2020-06-24 14:50:42 -04:00
|
|
|
|
(flags '(boot)))))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
2021-12-16 02:51:56 -05:00
|
|
|
|
(define docker-image
|
2022-09-05 12:12:22 -04:00
|
|
|
|
(image-without-os
|
2021-12-16 02:51:56 -05:00
|
|
|
|
(format 'docker)))
|
|
|
|
|
|
2022-02-06 17:29:47 -05:00
|
|
|
|
(define tarball-image
|
|
|
|
|
(image-without-os
|
|
|
|
|
(format 'tarball)))
|
|
|
|
|
|
2022-02-07 19:37:25 -05:00
|
|
|
|
(define wsl2-image
|
|
|
|
|
(image-without-os
|
|
|
|
|
(format 'wsl2)))
|
|
|
|
|
|
2021-08-30 12:24:27 -04:00
|
|
|
|
(define* (raw-with-offset-disk-image #:optional (offset root-offset))
|
2022-09-05 12:12:22 -04:00
|
|
|
|
(image-without-os
|
2020-10-05 05:07:53 -04:00
|
|
|
|
(format 'disk-image)
|
|
|
|
|
(partitions
|
|
|
|
|
(list (partition
|
|
|
|
|
(inherit root-partition)
|
2021-01-02 11:56:25 -05:00
|
|
|
|
(offset offset))))
|
2020-10-05 05:07:53 -04:00
|
|
|
|
;; FIXME: Deleting and creating "/var/run" and "/tmp" on the overlayfs
|
|
|
|
|
;; fails.
|
|
|
|
|
(volatile-root? #f)))
|
|
|
|
|
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
|
|
|
|
|
;;;
|
|
|
|
|
;;; Images types.
|
|
|
|
|
;;;
|
|
|
|
|
|
|
|
|
|
(define-syntax-rule (image-with-os base-image os)
|
|
|
|
|
"Return an image inheriting from BASE-IMAGE, with the operating-system field
|
|
|
|
|
set to the given OS."
|
|
|
|
|
(image
|
|
|
|
|
(inherit base-image)
|
|
|
|
|
(operating-system os)))
|
|
|
|
|
|
2020-12-03 05:53:53 -05:00
|
|
|
|
(define efi-raw-image-type
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
(image-type
|
2020-12-03 05:53:53 -05:00
|
|
|
|
(name 'efi-raw)
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
(constructor (cut image-with-os efi-disk-image <>))))
|
|
|
|
|
|
2022-06-18 01:18:35 -04:00
|
|
|
|
(define efi32-raw-image-type
|
|
|
|
|
(image-type
|
|
|
|
|
(name 'efi32-raw)
|
|
|
|
|
(constructor (cut image-with-os efi32-disk-image <>))))
|
|
|
|
|
|
2020-10-02 08:54:26 -04:00
|
|
|
|
(define qcow2-image-type
|
|
|
|
|
(image-type
|
|
|
|
|
(name 'qcow2)
|
|
|
|
|
(constructor (cut image-with-os
|
|
|
|
|
(image
|
|
|
|
|
(inherit efi-disk-image)
|
|
|
|
|
(name 'image.qcow2)
|
|
|
|
|
(format 'compressed-qcow2))
|
|
|
|
|
<>))))
|
|
|
|
|
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
(define iso-image-type
|
|
|
|
|
(image-type
|
|
|
|
|
(name 'iso9660)
|
|
|
|
|
(constructor (cut image-with-os iso9660-image <>))))
|
|
|
|
|
|
|
|
|
|
(define uncompressed-iso-image-type
|
|
|
|
|
(image-type
|
|
|
|
|
(name 'uncompressed-iso9660)
|
|
|
|
|
(constructor (cut image-with-os
|
|
|
|
|
(image
|
|
|
|
|
(inherit iso9660-image)
|
|
|
|
|
(compression? #f))
|
|
|
|
|
<>))))
|
|
|
|
|
|
2021-12-16 02:51:56 -05:00
|
|
|
|
(define docker-image-type
|
|
|
|
|
(image-type
|
|
|
|
|
(name 'docker)
|
|
|
|
|
(constructor (cut image-with-os docker-image <>))))
|
|
|
|
|
|
2022-02-06 17:29:47 -05:00
|
|
|
|
(define tarball-image-type
|
|
|
|
|
(image-type
|
|
|
|
|
(name 'tarball)
|
|
|
|
|
(constructor (cut image-with-os tarball-image <>))))
|
|
|
|
|
|
2022-02-07 19:37:25 -05:00
|
|
|
|
(define wsl2-image-type
|
|
|
|
|
(image-type
|
|
|
|
|
(name 'wsl2)
|
|
|
|
|
(constructor (cut image-with-os wsl2-image <>))))
|
|
|
|
|
|
2021-08-30 12:24:27 -04:00
|
|
|
|
(define raw-with-offset-image-type
|
2020-10-05 05:07:53 -04:00
|
|
|
|
(image-type
|
2021-08-30 12:24:27 -04:00
|
|
|
|
(name 'raw-with-offset)
|
|
|
|
|
(constructor (cut image-with-os (raw-with-offset-disk-image) <>))))
|
2020-10-05 05:07:53 -04:00
|
|
|
|
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; Helpers.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(define not-config?
|
|
|
|
|
;; Select (guix …) and (gnu …) modules, except (guix config).
|
|
|
|
|
(match-lambda
|
|
|
|
|
(('guix 'config) #f)
|
|
|
|
|
(('guix rest ...) #t)
|
|
|
|
|
(('gnu rest ...) #t)
|
|
|
|
|
(rest #f)))
|
|
|
|
|
|
|
|
|
|
(define (partition->gexp partition)
|
|
|
|
|
"Turn PARTITION, a <partition> object, into a list-valued gexp suitable for
|
|
|
|
|
'make-partition-image'."
|
|
|
|
|
#~'(#$@(list (partition-size partition))
|
|
|
|
|
#$(partition-file-system partition)
|
2020-05-26 10:25:25 -04:00
|
|
|
|
#$(partition-file-system-options partition)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#$(partition-label partition)
|
|
|
|
|
#$(and=> (partition-uuid partition)
|
2022-05-22 09:53:49 -04:00
|
|
|
|
uuid-bytevector)
|
|
|
|
|
#$(partition-flags partition)))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
(define gcrypt-sqlite3&co
|
|
|
|
|
;; Guile-Gcrypt, Guile-SQLite3, and their propagated inputs.
|
|
|
|
|
(srfi-1:append-map
|
|
|
|
|
(lambda (package)
|
|
|
|
|
(cons package
|
|
|
|
|
(match (package-transitive-propagated-inputs package)
|
|
|
|
|
(((labels packages) ...)
|
|
|
|
|
packages))))
|
2020-08-25 06:39:11 -04:00
|
|
|
|
(list guile-gcrypt guile-sqlite3)))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
(define-syntax-rule (with-imported-modules* gexp* ...)
|
|
|
|
|
(with-extensions gcrypt-sqlite3&co
|
|
|
|
|
(with-imported-modules `(,@(source-module-closure
|
2021-12-16 02:51:56 -05:00
|
|
|
|
'((gnu build image)
|
2020-10-05 04:58:55 -04:00
|
|
|
|
(gnu build bootloader)
|
2020-06-01 03:46:39 -04:00
|
|
|
|
(gnu build hurd-boot)
|
2020-05-23 13:10:44 -04:00
|
|
|
|
(gnu build linux-boot)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(guix store database))
|
|
|
|
|
#:select? not-config?)
|
|
|
|
|
((guix config) => ,(make-config.scm)))
|
|
|
|
|
#~(begin
|
2021-12-16 02:51:56 -05:00
|
|
|
|
(use-modules (gnu build image)
|
2020-10-05 04:58:55 -04:00
|
|
|
|
(gnu build bootloader)
|
2020-06-01 03:46:39 -04:00
|
|
|
|
(gnu build hurd-boot)
|
2020-05-23 13:10:44 -04:00
|
|
|
|
(gnu build linux-boot)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(guix store database)
|
|
|
|
|
(guix build utils))
|
|
|
|
|
gexp* ...))))
|
|
|
|
|
|
2020-05-23 13:09:14 -04:00
|
|
|
|
(define (root-partition? partition)
|
|
|
|
|
"Return true if PARTITION is the root partition, false otherwise."
|
|
|
|
|
(member 'boot (partition-flags partition)))
|
|
|
|
|
|
|
|
|
|
(define (find-root-partition image)
|
|
|
|
|
"Return the root partition of the given IMAGE."
|
2022-07-01 04:38:37 -04:00
|
|
|
|
(or (srfi-1:find root-partition? (image-partitions image))
|
|
|
|
|
(raise (formatted-message
|
|
|
|
|
(G_ "image lacks a partition with the 'boot' flag")))))
|
2020-05-23 13:09:14 -04:00
|
|
|
|
|
|
|
|
|
(define (root-partition-index image)
|
|
|
|
|
"Return the index of the root partition of the given IMAGE."
|
|
|
|
|
(1+ (srfi-1:list-index root-partition? (image-partitions image))))
|
|
|
|
|
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; Disk image.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(define* (system-disk-image image
|
|
|
|
|
#:key
|
|
|
|
|
(name "disk-image")
|
|
|
|
|
bootcfg
|
|
|
|
|
bootloader
|
|
|
|
|
register-closures?
|
|
|
|
|
(inputs '()))
|
|
|
|
|
"Return as a file-like object, the disk-image described by IMAGE. Said
|
|
|
|
|
image can be copied on a USB stick as is. BOOTLOADER is the bootloader that
|
|
|
|
|
will be installed and configured according to BOOTCFG parameter.
|
|
|
|
|
|
|
|
|
|
Raw images of the IMAGE partitions are first created. Then, genimage is used
|
|
|
|
|
to assemble the partition images into a disk-image without resorting to a
|
|
|
|
|
virtual machine.
|
|
|
|
|
|
|
|
|
|
INPUTS is a list of inputs (as for packages). When REGISTER-CLOSURES? is
|
|
|
|
|
true, register INPUTS in the store database of the image so that Guix can be
|
|
|
|
|
used in the image."
|
|
|
|
|
|
|
|
|
|
(define genimage-name "image")
|
|
|
|
|
|
|
|
|
|
(define (image->genimage-cfg image)
|
|
|
|
|
;; Return as a file-like object, the genimage configuration file
|
|
|
|
|
;; describing the given IMAGE.
|
|
|
|
|
(define (format->image-type format)
|
|
|
|
|
;; Return the genimage format corresponding to FORMAT. For now, only
|
|
|
|
|
;; the hdimage format (raw disk-image) is supported.
|
2020-09-29 05:37:19 -04:00
|
|
|
|
(cond
|
|
|
|
|
((memq format '(disk-image compressed-qcow2)) "hdimage")
|
2022-05-23 03:03:51 -04:00
|
|
|
|
(else
|
|
|
|
|
(raise (condition
|
|
|
|
|
(&message
|
|
|
|
|
(message
|
2022-05-23 03:16:30 -04:00
|
|
|
|
(format #f (G_ "unsupported image type: ~a")
|
2022-05-23 03:03:51 -04:00
|
|
|
|
format))))))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
(define (partition->dos-type partition)
|
|
|
|
|
;; Return the MBR partition type corresponding to the given PARTITION.
|
|
|
|
|
;; See: https://en.wikipedia.org/wiki/Partition_type.
|
2022-05-22 09:52:45 -04:00
|
|
|
|
(let ((flags (partition-flags partition))
|
|
|
|
|
(file-system (partition-file-system partition)))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(cond
|
|
|
|
|
((member 'esp flags) "0xEF")
|
2022-05-22 09:52:45 -04:00
|
|
|
|
((string-prefix? "ext" file-system) "0x83")
|
2022-05-26 14:00:51 -04:00
|
|
|
|
((or (string=? file-system "vfat")
|
|
|
|
|
(string=? file-system "fat16")) "0x0E")
|
|
|
|
|
((string=? file-system "fat32") "0x0C")
|
2022-05-22 09:52:45 -04:00
|
|
|
|
(else
|
|
|
|
|
(raise (condition
|
|
|
|
|
(&message
|
|
|
|
|
(message
|
|
|
|
|
(format #f (G_ "unsupported partition type: ~a")
|
|
|
|
|
file-system)))))))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
2021-11-04 04:35:11 -04:00
|
|
|
|
(define (partition->gpt-type partition)
|
2022-05-22 09:53:30 -04:00
|
|
|
|
;; Return the genimage GPT partition type code corresponding to the
|
|
|
|
|
;; given PARTITION. See:
|
|
|
|
|
;; https://github.com/pengutronix/genimage/blob/master/README.rst
|
|
|
|
|
(let ((flags (partition-flags partition))
|
|
|
|
|
(file-system (partition-file-system partition)))
|
2021-11-04 04:35:11 -04:00
|
|
|
|
(cond
|
2022-05-22 09:53:30 -04:00
|
|
|
|
((member 'esp flags) "U")
|
|
|
|
|
((string-prefix? "ext" file-system) "L")
|
2022-05-26 14:00:51 -04:00
|
|
|
|
((or (string=? file-system "vfat")
|
|
|
|
|
(string=? file-system "fat16")
|
|
|
|
|
(string=? file-system "fat32")) "F")
|
2022-05-22 09:53:30 -04:00
|
|
|
|
(else
|
|
|
|
|
(raise (condition
|
|
|
|
|
(&message
|
|
|
|
|
(message
|
|
|
|
|
(format #f (G_ "unsupported partition type: ~a")
|
|
|
|
|
file-system)))))))))
|
2021-11-04 04:35:11 -04:00
|
|
|
|
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(define (partition-image partition)
|
|
|
|
|
;; Return as a file-like object, an image of the given PARTITION. A
|
|
|
|
|
;; directory, filled by calling the PARTITION initializer procedure, is
|
|
|
|
|
;; first created within the store. Then, an image of this directory is
|
|
|
|
|
;; created using tools such as 'mke2fs' or 'mkdosfs', depending on the
|
|
|
|
|
;; partition file-system type.
|
|
|
|
|
(let* ((os (image-operating-system image))
|
|
|
|
|
(schema (local-file (search-path %load-path
|
|
|
|
|
"guix/store/schema.sql")))
|
|
|
|
|
(graph (match inputs
|
|
|
|
|
(((names . _) ...)
|
|
|
|
|
names)))
|
2020-06-22 11:40:10 -04:00
|
|
|
|
(type (partition-file-system partition))
|
|
|
|
|
(image-builder
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(with-imported-modules*
|
2022-07-01 04:26:17 -04:00
|
|
|
|
(let ((initializer (or #$(partition-initializer partition)
|
|
|
|
|
initialize-root-partition))
|
2020-06-23 03:51:20 -04:00
|
|
|
|
(inputs '#+(list e2fsprogs fakeroot dosfstools mtools))
|
2020-06-22 11:40:10 -04:00
|
|
|
|
(image-root "tmp-root"))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(sql-schema #$schema)
|
|
|
|
|
|
2020-06-22 11:40:10 -04:00
|
|
|
|
(set-path-environment-variable "PATH" '("bin" "sbin") inputs)
|
|
|
|
|
|
2020-04-28 08:15:28 -04:00
|
|
|
|
;; Allow non-ASCII file names--e.g., 'nss-certs'--to be
|
|
|
|
|
;; decoded.
|
|
|
|
|
(setenv "GUIX_LOCPATH"
|
|
|
|
|
#+(file-append glibc-utf8-locales "/lib/locale"))
|
|
|
|
|
(setlocale LC_ALL "en_US.utf8")
|
|
|
|
|
|
2020-06-22 11:40:10 -04:00
|
|
|
|
(initializer image-root
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:references-graphs '#$graph
|
|
|
|
|
#:deduplicate? #f
|
2021-12-16 02:51:56 -05:00
|
|
|
|
#:copy-closures? (not
|
|
|
|
|
#$(image-shared-store? image))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:system-directory #$os
|
2020-05-23 13:10:04 -04:00
|
|
|
|
#:grub-efi #+grub-efi
|
2022-06-18 01:18:35 -04:00
|
|
|
|
#:grub-efi32 #+grub-efi32
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:bootloader-package
|
2020-05-23 13:09:53 -04:00
|
|
|
|
#+(bootloader-package bootloader)
|
|
|
|
|
#:bootloader-installer
|
|
|
|
|
#+(bootloader-installer bootloader)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:bootcfg #$bootcfg
|
|
|
|
|
#:bootcfg-location
|
2020-06-22 11:40:10 -04:00
|
|
|
|
#$(bootloader-configuration-file bootloader))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(make-partition-image #$(partition->gexp partition)
|
|
|
|
|
#$output
|
2020-06-22 11:40:10 -04:00
|
|
|
|
image-root)))))
|
|
|
|
|
(computed-file "partition.img" image-builder
|
2020-11-03 14:43:02 -05:00
|
|
|
|
;; Allow offloading so that this I/O-intensive process
|
|
|
|
|
;; doesn't run on the build farm's head node.
|
|
|
|
|
#:local-build? #f
|
2020-08-27 00:40:52 -04:00
|
|
|
|
#:options `(#:references-graphs ,inputs))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
2021-11-04 04:35:11 -04:00
|
|
|
|
(define (gpt-image? image)
|
|
|
|
|
(eq? 'gpt (image-partition-table-type image)))
|
|
|
|
|
|
|
|
|
|
(define (partition-type-values image partition)
|
|
|
|
|
(if (gpt-image? image)
|
|
|
|
|
(values "partition-type-uuid" (partition->gpt-type partition))
|
|
|
|
|
(values "partition-type" (partition->dos-type partition))))
|
|
|
|
|
|
|
|
|
|
(define (partition->config image partition)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
;; Return the genimage partition configuration for PARTITION.
|
2021-11-04 04:35:11 -04:00
|
|
|
|
(let-values (((partition-type-attribute partition-type-value)
|
|
|
|
|
(partition-type-values image partition)))
|
|
|
|
|
(let ((label (partition-label partition))
|
|
|
|
|
(image (partition-image partition))
|
2022-05-22 09:53:49 -04:00
|
|
|
|
(offset (partition-offset partition))
|
|
|
|
|
(bootable (if (memq 'boot (partition-flags partition))
|
|
|
|
|
"true" "false" )))
|
2021-11-04 04:35:11 -04:00
|
|
|
|
#~(format #f "~/partition ~a {
|
|
|
|
|
~/~/~a = ~a
|
|
|
|
|
~/~/image = \"~a\"
|
|
|
|
|
~/~/offset = \"~a\"
|
2022-05-22 09:53:49 -04:00
|
|
|
|
~/~/bootable = \"~a\"
|
2021-11-04 04:35:11 -04:00
|
|
|
|
~/}"
|
|
|
|
|
#$label
|
|
|
|
|
#$partition-type-attribute
|
|
|
|
|
#$partition-type-value
|
|
|
|
|
#$image
|
2022-05-22 09:53:49 -04:00
|
|
|
|
#$offset
|
|
|
|
|
#$bootable))))
|
2021-11-04 04:35:11 -04:00
|
|
|
|
|
|
|
|
|
(define (genimage-type-options image-type image)
|
|
|
|
|
(cond
|
2022-05-23 03:03:51 -04:00
|
|
|
|
((equal? image-type "hdimage")
|
2022-07-01 04:33:51 -04:00
|
|
|
|
(format #f "~%~/~/partition-table-type = \"~a\"~%~/"
|
|
|
|
|
(image-partition-table-type image)))
|
2022-05-23 03:03:51 -04:00
|
|
|
|
(else "")))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
(let* ((format (image-format image))
|
|
|
|
|
(image-type (format->image-type format))
|
2021-11-04 04:35:11 -04:00
|
|
|
|
(image-type-options (genimage-type-options image-type image))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(partitions (image-partitions image))
|
2021-11-04 04:35:11 -04:00
|
|
|
|
(partitions-config (map (cut partition->config image <>) partitions))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(builder
|
|
|
|
|
#~(begin
|
|
|
|
|
(let ((format (@ (ice-9 format) format)))
|
|
|
|
|
(call-with-output-file #$output
|
|
|
|
|
(lambda (port)
|
|
|
|
|
(format port
|
|
|
|
|
"\
|
|
|
|
|
image ~a {
|
2021-11-04 04:35:11 -04:00
|
|
|
|
~/~a {~a}
|
2020-04-28 08:15:28 -04:00
|
|
|
|
~{~a~^~%~}
|
2021-11-04 04:35:11 -04:00
|
|
|
|
}~%" #$genimage-name #$image-type #$image-type-options
|
|
|
|
|
(list #$@partitions-config))))))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(computed-file "genimage.cfg" builder)))
|
|
|
|
|
|
2020-06-26 04:05:58 -04:00
|
|
|
|
(let* ((image-name (image-name image))
|
|
|
|
|
(name (if image-name
|
|
|
|
|
(symbol->string image-name)
|
|
|
|
|
name))
|
2020-09-29 05:37:19 -04:00
|
|
|
|
(format (image-format image))
|
2020-06-26 03:04:43 -04:00
|
|
|
|
(substitutable? (image-substitutable? image))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(builder
|
|
|
|
|
(with-imported-modules*
|
2020-09-29 05:37:19 -04:00
|
|
|
|
(let ((inputs '#+(list genimage coreutils findutils qemu-minimal))
|
2020-05-23 13:09:14 -04:00
|
|
|
|
(bootloader-installer
|
2020-09-29 05:37:19 -04:00
|
|
|
|
#+(bootloader-disk-image-installer bootloader))
|
|
|
|
|
(out-image (string-append "images/" #$genimage-name)))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(set-path-environment-variable "PATH" '("bin" "sbin") inputs)
|
2020-09-29 05:37:19 -04:00
|
|
|
|
(genimage #$(image->genimage-cfg image))
|
2020-05-23 13:09:14 -04:00
|
|
|
|
;; Install the bootloader directly on the disk-image.
|
|
|
|
|
(when bootloader-installer
|
|
|
|
|
(bootloader-installer
|
|
|
|
|
#+(bootloader-package bootloader)
|
|
|
|
|
#$(root-partition-index image)
|
2020-09-29 05:37:19 -04:00
|
|
|
|
out-image))
|
|
|
|
|
(convert-disk-image out-image '#$format #$output)))))
|
|
|
|
|
(computed-file name builder
|
2020-11-08 08:27:35 -05:00
|
|
|
|
#:local-build? #f ;too I/O-intensive
|
2020-08-27 00:40:52 -04:00
|
|
|
|
#:options `(#:substitutable? ,substitutable?))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; ISO9660 image.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(define (has-guix-service-type? os)
|
|
|
|
|
"Return true if OS contains a service of the type GUIX-SERVICE-TYPE."
|
|
|
|
|
(not (not (srfi-1:find (lambda (service)
|
|
|
|
|
(eq? (service-kind service) guix-service-type))
|
|
|
|
|
(operating-system-services os)))))
|
|
|
|
|
|
|
|
|
|
(define* (system-iso9660-image image
|
|
|
|
|
#:key
|
2020-09-19 08:24:59 -04:00
|
|
|
|
(name "image.iso")
|
2020-04-28 08:15:28 -04:00
|
|
|
|
bootcfg
|
|
|
|
|
bootloader
|
|
|
|
|
register-closures?
|
|
|
|
|
(inputs '())
|
|
|
|
|
(grub-mkrescue-environment '()))
|
|
|
|
|
"Return as a file-like object a bootable, stand-alone iso9660 image.
|
|
|
|
|
|
|
|
|
|
INPUTS is a list of inputs (as for packages). When REGISTER-CLOSURES? is
|
|
|
|
|
true, register INPUTS in the store database of the image so that Guix can be
|
|
|
|
|
used in the image. "
|
|
|
|
|
(define root-label
|
|
|
|
|
(match (image-partitions image)
|
|
|
|
|
((partition)
|
|
|
|
|
(partition-label partition))))
|
|
|
|
|
|
|
|
|
|
(define root-uuid
|
|
|
|
|
(match (image-partitions image)
|
|
|
|
|
((partition)
|
|
|
|
|
(uuid-bytevector (partition-uuid partition)))))
|
|
|
|
|
|
|
|
|
|
(let* ((os (image-operating-system image))
|
|
|
|
|
(bootloader (bootloader-package bootloader))
|
|
|
|
|
(compression? (image-compression? image))
|
|
|
|
|
(substitutable? (image-substitutable? image))
|
|
|
|
|
(schema (local-file (search-path %load-path
|
|
|
|
|
"guix/store/schema.sql")))
|
|
|
|
|
(graph (match inputs
|
|
|
|
|
(((names . _) ...)
|
|
|
|
|
names)))
|
|
|
|
|
(builder
|
|
|
|
|
(with-imported-modules*
|
|
|
|
|
(let* ((inputs '#$(list parted e2fsprogs dosfstools xorriso
|
2020-06-22 10:14:01 -04:00
|
|
|
|
sed grep coreutils findutils gawk))
|
|
|
|
|
(image-root "tmp-root"))
|
|
|
|
|
(sql-schema #$schema)
|
|
|
|
|
|
|
|
|
|
;; Allow non-ASCII file names--e.g., 'nss-certs'--to be decoded.
|
|
|
|
|
(setenv "GUIX_LOCPATH"
|
|
|
|
|
#+(file-append glibc-utf8-locales "/lib/locale"))
|
|
|
|
|
|
|
|
|
|
(setlocale LC_ALL "en_US.utf8")
|
|
|
|
|
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(set-path-environment-variable "PATH" '("bin" "sbin") inputs)
|
2020-06-22 10:14:01 -04:00
|
|
|
|
|
|
|
|
|
(initialize-root-partition image-root
|
|
|
|
|
#:references-graphs '#$graph
|
|
|
|
|
#:deduplicate? #f
|
|
|
|
|
#:system-directory #$os)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(make-iso9660-image #$xorriso
|
|
|
|
|
'#$grub-mkrescue-environment
|
|
|
|
|
#$bootloader
|
|
|
|
|
#$bootcfg
|
|
|
|
|
#$os
|
2020-06-22 10:14:01 -04:00
|
|
|
|
image-root
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#$output
|
|
|
|
|
#:references-graphs '#$graph
|
|
|
|
|
#:register-closures? #$register-closures?
|
|
|
|
|
#:compression? #$compression?
|
|
|
|
|
#:volume-id #$root-label
|
|
|
|
|
#:volume-uuid #$root-uuid)))))
|
|
|
|
|
(computed-file name builder
|
2020-11-03 14:43:02 -05:00
|
|
|
|
;; Allow offloading so that this I/O-intensive process
|
|
|
|
|
;; doesn't run on the build farm's head node.
|
|
|
|
|
#:local-build? #f
|
2020-08-27 00:40:52 -04:00
|
|
|
|
#:options `(#:references-graphs ,inputs
|
2020-04-28 08:15:28 -04:00
|
|
|
|
#:substitutable? ,substitutable?))))
|
|
|
|
|
|
2020-08-29 09:34:56 -04:00
|
|
|
|
(define (image-with-label base-image label)
|
|
|
|
|
"The volume ID of an ISO is the label of the first partition. This procedure
|
|
|
|
|
returns an image record where the first partition's label is set to <label>."
|
|
|
|
|
(image
|
|
|
|
|
(inherit base-image)
|
|
|
|
|
(partitions
|
|
|
|
|
(match (image-partitions base-image)
|
|
|
|
|
((boot others ...)
|
|
|
|
|
(cons
|
|
|
|
|
(partition
|
|
|
|
|
(inherit boot)
|
|
|
|
|
(label label))
|
|
|
|
|
others))))))
|
|
|
|
|
|
2021-12-16 02:51:56 -05:00
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; Docker image.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(define* (system-docker-image image
|
|
|
|
|
#:key
|
|
|
|
|
(name "docker-image"))
|
|
|
|
|
"Build a docker image for IMAGE. NAME is the base name to use for the
|
|
|
|
|
output file."
|
|
|
|
|
(define boot-program
|
|
|
|
|
;; Program that runs the boot script of OS, which in turn starts shepherd.
|
|
|
|
|
(program-file "boot-program"
|
|
|
|
|
#~(let ((system (cadr (command-line))))
|
|
|
|
|
(setenv "GUIX_NEW_SYSTEM" system)
|
|
|
|
|
(execl #$(file-append guile-3.0 "/bin/guile")
|
|
|
|
|
"guile" "--no-auto-compile"
|
|
|
|
|
(string-append system "/boot")))))
|
|
|
|
|
|
|
|
|
|
(define shared-network?
|
|
|
|
|
(image-shared-network? image))
|
|
|
|
|
|
|
|
|
|
(let* ((os (operating-system-with-gc-roots
|
|
|
|
|
(containerized-operating-system
|
|
|
|
|
(image-operating-system image) '()
|
|
|
|
|
#:shared-network?
|
|
|
|
|
shared-network?)
|
|
|
|
|
(list boot-program)))
|
|
|
|
|
(substitutable? (image-substitutable? image))
|
|
|
|
|
(register-closures? (has-guix-service-type? os))
|
|
|
|
|
(schema (and register-closures?
|
|
|
|
|
(local-file (search-path %load-path
|
|
|
|
|
"guix/store/schema.sql"))))
|
|
|
|
|
(name (string-append name ".tar.gz"))
|
|
|
|
|
(graph "system-graph"))
|
|
|
|
|
(define builder
|
|
|
|
|
(with-extensions (cons guile-json-3 ;for (guix docker)
|
|
|
|
|
gcrypt-sqlite3&co) ;for (guix store database)
|
|
|
|
|
(with-imported-modules `(,@(source-module-closure
|
|
|
|
|
'((guix docker)
|
|
|
|
|
(guix store database)
|
|
|
|
|
(guix build utils)
|
|
|
|
|
(guix build store-copy)
|
|
|
|
|
(gnu build image))
|
|
|
|
|
#:select? not-config?)
|
|
|
|
|
((guix config) => ,(make-config.scm)))
|
|
|
|
|
#~(begin
|
|
|
|
|
(use-modules (guix docker)
|
|
|
|
|
(guix build utils)
|
|
|
|
|
(gnu build image)
|
|
|
|
|
(srfi srfi-19)
|
|
|
|
|
(guix build store-copy)
|
|
|
|
|
(guix store database))
|
|
|
|
|
|
|
|
|
|
;; Set the SQL schema location.
|
|
|
|
|
(sql-schema #$schema)
|
|
|
|
|
|
|
|
|
|
;; Allow non-ASCII file names--e.g., 'nss-certs'--to be decoded.
|
|
|
|
|
(setenv "GUIX_LOCPATH"
|
|
|
|
|
#+(file-append glibc-utf8-locales "/lib/locale"))
|
|
|
|
|
(setlocale LC_ALL "en_US.utf8")
|
|
|
|
|
|
|
|
|
|
(set-path-environment-variable "PATH" '("bin" "sbin") '(#+tar))
|
|
|
|
|
|
|
|
|
|
(let ((image-root (string-append (getcwd) "/tmp-root")))
|
|
|
|
|
(mkdir-p image-root)
|
|
|
|
|
(initialize-root-partition image-root
|
|
|
|
|
#:references-graphs '(#$graph)
|
|
|
|
|
#:copy-closures? #f
|
|
|
|
|
#:register-closures? #$register-closures?
|
|
|
|
|
#:deduplicate? #f
|
|
|
|
|
#:system-directory #$os)
|
|
|
|
|
(build-docker-image
|
|
|
|
|
#$output
|
|
|
|
|
(cons* image-root
|
|
|
|
|
(map store-info-item
|
|
|
|
|
(call-with-input-file #$graph
|
|
|
|
|
read-reference-graph)))
|
|
|
|
|
#$os
|
|
|
|
|
#:entry-point '(#$boot-program #$os)
|
|
|
|
|
#:compressor '(#+(file-append gzip "/bin/gzip") "-9n")
|
|
|
|
|
#:creation-time (make-time time-utc 0 1)
|
|
|
|
|
#:transformations `((,image-root -> ""))))))))
|
|
|
|
|
|
|
|
|
|
(computed-file name builder
|
|
|
|
|
;; Allow offloading so that this I/O-intensive process
|
|
|
|
|
;; doesn't run on the build farm's head node.
|
|
|
|
|
#:local-build? #f
|
|
|
|
|
#:options `(#:references-graphs ((,graph ,os))
|
|
|
|
|
#:substitutable? ,substitutable?))))
|
|
|
|
|
|
2022-02-06 17:29:47 -05:00
|
|
|
|
|
2022-09-25 03:25:49 -04:00
|
|
|
|
;;;
|
|
|
|
|
;;; Tarball image.
|
|
|
|
|
;;;
|
2022-02-06 17:29:47 -05:00
|
|
|
|
|
2022-09-25 03:25:49 -04:00
|
|
|
|
;; TODO: Some bits can be factorized with (guix scripts pack).
|
2022-02-06 17:29:47 -05:00
|
|
|
|
(define* (system-tarball-image image
|
|
|
|
|
#:key
|
|
|
|
|
(name "image")
|
2022-02-07 19:37:25 -05:00
|
|
|
|
(compressor (srfi-1:first %compressors))
|
|
|
|
|
(wsl? #f))
|
2022-02-06 17:29:47 -05:00
|
|
|
|
"Build a tarball of IMAGE. NAME is the base name to use for the
|
|
|
|
|
output file."
|
|
|
|
|
(let* ((os (image-operating-system image))
|
|
|
|
|
(substitutable? (image-substitutable? image))
|
|
|
|
|
(schema (local-file (search-path %load-path
|
|
|
|
|
"guix/store/schema.sql")))
|
|
|
|
|
(name (string-append name ".tar" (compressor-extension compressor)))
|
2022-02-07 19:37:25 -05:00
|
|
|
|
(graph "system-graph")
|
|
|
|
|
(root (srfi-1:find (lambda (user)
|
|
|
|
|
(and=> (user-account-uid user) zero?))
|
|
|
|
|
(operating-system-users os)))
|
|
|
|
|
(root-shell (or (and=> root user-account-shell)
|
|
|
|
|
(file-append bash "/bin/bash"))))
|
2022-02-06 17:29:47 -05:00
|
|
|
|
(define builder
|
|
|
|
|
(with-extensions gcrypt-sqlite3&co ;for (guix store database)
|
|
|
|
|
(with-imported-modules `(,@(source-module-closure
|
|
|
|
|
'((guix build pack)
|
|
|
|
|
(guix build store-copy)
|
|
|
|
|
(guix build utils)
|
|
|
|
|
(guix store database)
|
|
|
|
|
(gnu build image))
|
|
|
|
|
#:select? not-config?)
|
|
|
|
|
((guix config) => ,(make-config.scm)))
|
|
|
|
|
#~(begin
|
|
|
|
|
(use-modules (guix build pack)
|
|
|
|
|
(guix build store-copy)
|
|
|
|
|
(guix build utils)
|
|
|
|
|
(guix store database)
|
|
|
|
|
(gnu build image))
|
|
|
|
|
|
|
|
|
|
;; Set the SQL schema location.
|
|
|
|
|
(sql-schema #$schema)
|
|
|
|
|
|
|
|
|
|
;; Allow non-ASCII file names--e.g., 'nss-certs'--to be decoded.
|
|
|
|
|
(setenv "GUIX_LOCPATH"
|
|
|
|
|
#+(file-append glibc-utf8-locales "/lib/locale"))
|
|
|
|
|
(setlocale LC_ALL "en_US.utf8")
|
|
|
|
|
|
|
|
|
|
(let ((image-root (string-append (getcwd) "/tmp-root"))
|
|
|
|
|
(tar #+(file-append tar "/bin/tar")))
|
|
|
|
|
|
|
|
|
|
(mkdir-p image-root)
|
|
|
|
|
(initialize-root-partition image-root
|
|
|
|
|
#:references-graphs '(#$graph)
|
|
|
|
|
#:deduplicate? #f
|
|
|
|
|
#:system-directory #$os)
|
|
|
|
|
|
|
|
|
|
(with-directory-excursion image-root
|
2022-02-07 19:37:25 -05:00
|
|
|
|
#$@(if wsl?
|
|
|
|
|
#~(;; WSL requires /bin/sh. Will be overwritten by
|
|
|
|
|
;; system activation.
|
|
|
|
|
(symlink #$root-shell "./bin/sh")
|
|
|
|
|
|
|
|
|
|
;; WSL requires /bin/mount to access the host fs.
|
|
|
|
|
(symlink #$(file-append util-linux "/bin/mount")
|
|
|
|
|
"./bin/mount"))
|
|
|
|
|
#~())
|
|
|
|
|
|
2022-02-06 17:29:47 -05:00
|
|
|
|
(apply invoke tar "-cvf" #$output "."
|
|
|
|
|
(tar-base-options
|
|
|
|
|
#:tar tar
|
|
|
|
|
#:compressor
|
|
|
|
|
#+(and=> compressor compressor-command)))))))))
|
|
|
|
|
|
|
|
|
|
(computed-file name builder
|
|
|
|
|
;; Allow offloading so that this I/O-intensive process
|
|
|
|
|
;; doesn't run on the build farm's head node.
|
|
|
|
|
#:local-build? #f
|
|
|
|
|
#:options `(#:references-graphs ((,graph ,os))
|
|
|
|
|
#:substitutable? ,substitutable?))))
|
|
|
|
|
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; Image creation.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(define (image->root-file-system image)
|
|
|
|
|
"Return the IMAGE root partition file-system type."
|
2021-12-16 02:51:56 -05:00
|
|
|
|
(case (image-format image)
|
|
|
|
|
((iso9660) "iso9660")
|
2022-02-07 19:37:25 -05:00
|
|
|
|
((docker tarball wsl2) "dummy")
|
2021-12-16 02:51:56 -05:00
|
|
|
|
(else
|
|
|
|
|
(partition-file-system (find-root-partition image)))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
(define (root-size image)
|
|
|
|
|
"Return the root partition size of IMAGE."
|
|
|
|
|
(let* ((image-size (image-size image))
|
|
|
|
|
(root-partition (find-root-partition image))
|
|
|
|
|
(root-size (partition-size root-partition)))
|
|
|
|
|
(cond
|
|
|
|
|
((and (eq? root-size 'guess) image-size)
|
|
|
|
|
image-size)
|
|
|
|
|
(else root-size))))
|
|
|
|
|
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
(define* (image-with-os* base-image os)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
"Return an image based on BASE-IMAGE but with the operating-system field set
|
|
|
|
|
to OS. Also set the UUID and the size of the root partition."
|
|
|
|
|
(define root-file-system
|
|
|
|
|
(srfi-1:find
|
|
|
|
|
(lambda (fs)
|
|
|
|
|
(string=? (file-system-mount-point fs) "/"))
|
|
|
|
|
(operating-system-file-systems os)))
|
|
|
|
|
|
2020-05-23 13:10:07 -04:00
|
|
|
|
(image
|
|
|
|
|
(inherit base-image)
|
|
|
|
|
(operating-system os)
|
|
|
|
|
(partitions
|
|
|
|
|
(map (lambda (p)
|
|
|
|
|
(if (root-partition? p)
|
|
|
|
|
(partition
|
|
|
|
|
(inherit p)
|
|
|
|
|
(uuid (file-system-device root-file-system))
|
|
|
|
|
(size (root-size base-image)))
|
|
|
|
|
p))
|
|
|
|
|
(image-partitions base-image)))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
(define (operating-system-for-image image)
|
|
|
|
|
"Return an operating-system based on the one specified in IMAGE, but
|
|
|
|
|
suitable for image creation. Assign an UUID to the root file-system, so that
|
|
|
|
|
it can be used for bootloading."
|
2020-12-04 06:36:35 -05:00
|
|
|
|
(define volatile-root? (if (eq? (image-format image) 'iso9660)
|
|
|
|
|
#t
|
|
|
|
|
(image-volatile-root? image)))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
(define (root-uuid os)
|
|
|
|
|
;; UUID of the root file system, computed in a deterministic fashion.
|
|
|
|
|
;; This is what we use to locate the root file system so it has to be
|
|
|
|
|
;; different from the user's own file system UUIDs.
|
|
|
|
|
(let ((type (if (eq? (image-format image) 'iso9660)
|
|
|
|
|
'iso9660
|
|
|
|
|
'dce)))
|
|
|
|
|
(operating-system-uuid os type)))
|
|
|
|
|
|
|
|
|
|
(let* ((root-file-system-type (image->root-file-system image))
|
|
|
|
|
(base-os (image-operating-system image))
|
|
|
|
|
(file-systems-to-keep
|
|
|
|
|
(srfi-1:remove
|
|
|
|
|
(lambda (fs)
|
2020-11-10 23:09:59 -05:00
|
|
|
|
(let ((mount-point (file-system-mount-point fs)))
|
|
|
|
|
(or (string=? mount-point "/")
|
|
|
|
|
(string=? mount-point "/boot/efi"))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
(operating-system-file-systems base-os)))
|
|
|
|
|
(format (image-format image))
|
|
|
|
|
(os
|
|
|
|
|
(operating-system
|
|
|
|
|
(inherit base-os)
|
|
|
|
|
(initrd (lambda (file-systems . rest)
|
|
|
|
|
(apply (operating-system-initrd base-os)
|
|
|
|
|
file-systems
|
|
|
|
|
#:volatile-root? volatile-root?
|
|
|
|
|
rest)))
|
|
|
|
|
(bootloader (if (eq? format 'iso9660)
|
|
|
|
|
(bootloader-configuration
|
|
|
|
|
(inherit
|
|
|
|
|
(operating-system-bootloader base-os))
|
|
|
|
|
(bootloader grub-mkrescue-bootloader))
|
|
|
|
|
(operating-system-bootloader base-os)))
|
|
|
|
|
(file-systems (cons (file-system
|
|
|
|
|
(mount-point "/")
|
|
|
|
|
(device "/dev/placeholder")
|
|
|
|
|
(type root-file-system-type))
|
|
|
|
|
file-systems-to-keep))))
|
|
|
|
|
(uuid (root-uuid os)))
|
|
|
|
|
(operating-system
|
|
|
|
|
(inherit os)
|
|
|
|
|
(file-systems (cons (file-system
|
|
|
|
|
(mount-point "/")
|
|
|
|
|
(device uuid)
|
|
|
|
|
(type root-file-system-type))
|
|
|
|
|
file-systems-to-keep)))))
|
|
|
|
|
|
2020-05-23 13:10:28 -04:00
|
|
|
|
(define* (system-image image)
|
2020-04-28 08:15:28 -04:00
|
|
|
|
"Return the derivation of IMAGE. It can be a raw disk-image or an ISO9660
|
|
|
|
|
image, depending on IMAGE format."
|
2021-08-30 12:24:27 -04:00
|
|
|
|
(define platform (image-platform image))
|
|
|
|
|
|
|
|
|
|
;; The image platform definition may provide the appropriate "system"
|
|
|
|
|
;; architecture for the image. If we are already running on this system,
|
|
|
|
|
;; the image can be built natively. If we are running on a different
|
|
|
|
|
;; system, then we need to cross-compile, using the "target" provided by the
|
|
|
|
|
;; image definition.
|
|
|
|
|
(define system (and=> platform platform-system))
|
|
|
|
|
(define target (cond
|
|
|
|
|
;; No defined platform, let's use the user defined
|
|
|
|
|
;; system/target parameters.
|
|
|
|
|
((not platform)
|
|
|
|
|
(%current-target-system))
|
|
|
|
|
;; The current system is the same as the platform system, no
|
|
|
|
|
;; need to cross-compile.
|
|
|
|
|
((and system
|
|
|
|
|
(string=? system (%current-system)))
|
|
|
|
|
#f)
|
|
|
|
|
;; If there is a user defined target let's override the
|
|
|
|
|
;; platform target. Otherwise, we can cross-compile to the
|
|
|
|
|
;; platform target.
|
|
|
|
|
(else
|
|
|
|
|
(or (%current-target-system)
|
|
|
|
|
(and=> platform platform-target)))))
|
2020-06-14 11:59:07 -04:00
|
|
|
|
|
|
|
|
|
(with-parameters ((%current-target-system target))
|
|
|
|
|
(let* ((os (operating-system-for-image image))
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
(image* (image-with-os* image os))
|
2020-09-29 05:37:19 -04:00
|
|
|
|
(image-format (image-format image))
|
2020-06-14 11:59:07 -04:00
|
|
|
|
(register-closures? (has-guix-service-type? os))
|
|
|
|
|
(bootcfg (operating-system-bootcfg os))
|
|
|
|
|
(bootloader (bootloader-configuration-bootloader
|
|
|
|
|
(operating-system-bootloader os))))
|
2020-09-29 05:37:19 -04:00
|
|
|
|
(cond
|
|
|
|
|
((memq image-format '(disk-image compressed-qcow2))
|
2020-06-13 08:01:18 -04:00
|
|
|
|
(system-disk-image image*
|
|
|
|
|
#:bootcfg bootcfg
|
|
|
|
|
#:bootloader bootloader
|
|
|
|
|
#:register-closures? register-closures?
|
|
|
|
|
#:inputs `(("system" ,os)
|
|
|
|
|
("bootcfg" ,bootcfg))))
|
2021-12-16 02:51:56 -05:00
|
|
|
|
((memq image-format '(docker))
|
|
|
|
|
(system-docker-image image*))
|
2022-02-06 17:29:47 -05:00
|
|
|
|
((memq image-format '(tarball))
|
|
|
|
|
(system-tarball-image image*))
|
2022-02-07 19:37:25 -05:00
|
|
|
|
((memq image-format '(wsl2))
|
|
|
|
|
(system-tarball-image image* #:wsl? #t))
|
2020-09-29 05:37:19 -04:00
|
|
|
|
((memq image-format '(iso9660))
|
2020-06-13 08:01:18 -04:00
|
|
|
|
(system-iso9660-image
|
|
|
|
|
image*
|
|
|
|
|
#:bootcfg bootcfg
|
|
|
|
|
#:bootloader bootloader
|
|
|
|
|
#:register-closures? register-closures?
|
|
|
|
|
#:inputs `(("system" ,os)
|
|
|
|
|
("bootcfg" ,bootcfg))
|
|
|
|
|
;; Make sure to use a mode that does no imply
|
|
|
|
|
;; HFS+ tree creation that may fail with:
|
|
|
|
|
;;
|
|
|
|
|
;; "libisofs: FAILURE : Too much files to mangle,
|
|
|
|
|
;; cannot guarantee unique file names"
|
|
|
|
|
;;
|
|
|
|
|
;; This happens if some limits are exceeded, see:
|
|
|
|
|
;; https://lists.gnu.org/archive/html/grub-devel/2020-06/msg00048.html
|
|
|
|
|
#:grub-mkrescue-environment
|
2022-07-01 03:42:53 -04:00
|
|
|
|
'(("MKRESCUE_SED_MODE" . "mbr_only"))))
|
|
|
|
|
(else
|
|
|
|
|
(raise (formatted-message
|
|
|
|
|
(G_ "~a: unsupported image format") image-format)))))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
system: image: Add image-type support.
* gnu/system/image.scm (image-with-os): New macro. Rename the old
"image-with-os" procedure to ...
(image-with-os*): ... this new procedure,
(system-image): adapt according,
(raw-image-type, iso-image-type, uncompressed-iso-image-type
%image-types): new variables,
(lookup-image-type-by-name): new procedure.
(find-image): remove it.
* gnu/system/images/hurd.scm (hurd-image-type): New variable,
use it to define ...
(hurd-disk-image): ... this variable, using "os->image" procedure.
* gnu/tests/install.scm (run-install): Rename
installation-disk-image-file-system-type parameter to installation-image-type,
use os->config instead of find-image to compute the image passed to system-image,
(%test-iso-image-installer) adapt accordingly,
(guided-installation-test): ditto.
Signed-off-by: Mathieu Othacehe <othacehe@gnu.org>
2020-07-31 10:49:28 -04:00
|
|
|
|
|
|
|
|
|
;;
|
|
|
|
|
;; Image detection.
|
|
|
|
|
;;
|
|
|
|
|
|
|
|
|
|
(define (image-modules)
|
|
|
|
|
"Return the list of image modules."
|
|
|
|
|
(cons (resolve-interface '(gnu system image))
|
|
|
|
|
(all-modules (map (lambda (entry)
|
|
|
|
|
`(,entry . "gnu/system/images/"))
|
|
|
|
|
%load-path)
|
|
|
|
|
#:warn warn-about-load-error)))
|
|
|
|
|
|
|
|
|
|
(define %image-types
|
|
|
|
|
;; The list of publically-known image types.
|
|
|
|
|
(delay (fold-module-public-variables (lambda (obj result)
|
|
|
|
|
(if (image-type? obj)
|
|
|
|
|
(cons obj result)
|
|
|
|
|
result))
|
|
|
|
|
'()
|
|
|
|
|
(image-modules))))
|
|
|
|
|
|
|
|
|
|
(define (lookup-image-type-by-name name)
|
|
|
|
|
"Return the image type called NAME."
|
|
|
|
|
(or (srfi-1:find (lambda (image-type)
|
|
|
|
|
(eq? name (image-type-name image-type)))
|
|
|
|
|
(force %image-types))
|
|
|
|
|
(raise
|
2020-10-14 05:07:40 -04:00
|
|
|
|
(formatted-message (G_ "~a: no such image type") name))))
|
2020-04-28 08:15:28 -04:00
|
|
|
|
|
|
|
|
|
;;; image.scm ends here
|