[PATCH 00/10] Further work on the image API.

  • Done
  • quality assurance status badge
Details
2 participants
  • Ludovic Courtès
  • Mathieu Othacehe
Owner
unassigned
Submitted by
Mathieu Othacehe
Severity
normal
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:02
(address . guix-patches@gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130204.29996-1-othacehe@gnu.org
Hello,

This series contains further work on the image API that I have postponed for
over a year. In short:

* The guix system image command now supports the docker image type, which
means that the docker-image command is deprecated.

* The docker images are not created in a VM (not needed), which results in a
creation speedup of around 6 times: 3 minutes vs 19 minutes for a simple
docker image on my x86 machine.

* Most of the (gnu build vm) and (gnu system vm) code is removed. This is code
was largely duplicated in (gnu build image) and (gnu system image). We now
have a single entry point for creating images, that is faster, more robust
and portable.

* I have added a "volatile?" flag to the <virtual-machine> record so that the
system tests can use a persistent or a volatile storage. I have adapted the
docker tests to use persistent storage. This means that those tests that
have been broken for a long time are now fixed.

Thanks,

Mathieu

Mathieu Othacehe (10):
build: image: Add optional closure copy support.
image: Add a shared-store? field.
image: Add a shared-network? field.
system: image: Add docker support.
system: vm: Use the image API to generate QEMU images.
Remove VM generation dead-code.
scripts: system: Deprecate the docker-image command.
scripts: system: Pass the volatile field to VM generation.
scripts: system: Use the disk-image size argument for VM generation.
tests: docker: Fix it.

doc/guix.texi | 23 +-
gnu/build/image.scm | 39 ++-
gnu/build/marionette.scm | 14 +-
gnu/build/vm.scm | 500 ----------------------------------
gnu/image.scm | 6 +
gnu/local.mk | 1 -
gnu/system/image.scm | 125 ++++++++-
gnu/system/vm.scm | 564 ++++-----------------------------------
gnu/tests/docker.scm | 51 ++--
gnu/tests/install.scm | 2 +-
guix/scripts/system.scm | 32 ++-
tests/modules.scm | 6 +-
12 files changed, 279 insertions(+), 1084 deletions(-)
delete mode 100644 gnu/build/vm.scm

--
2.34.0
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 01/10] build: image: Add optional closure copy support.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-1-othacehe@gnu.org
* gnu/build/image.scm (initialize-root-partition): Add a closure-copy?
argument and honor it.
---
gnu/build/image.scm | 39 ++++++++++++++++++++++++++++++---------
1 file changed, 30 insertions(+), 9 deletions(-)

Toggle diff (74 lines)
diff --git a/gnu/build/image.scm b/gnu/build/image.scm
index 6eb0290256..bdd5ec25a9 100644
--- a/gnu/build/image.scm
+++ b/gnu/build/image.scm
@@ -166,6 +166,7 @@ (define* (initialize-root-partition root
bootcfg-location
bootloader-package
bootloader-installer
+ (copy-closures? #t)
(deduplicate? #t)
references-graphs
(register-closures? #t)
@@ -176,30 +177,50 @@ (define* (initialize-root-partition root
"Initialize the given ROOT directory. Use BOOTCFG and BOOTCFG-LOCATION to
install the bootloader configuration.
-If REGISTER-CLOSURES? is true, register REFERENCES-GRAPHS in the store. If
+If COPY-CLOSURES? is true, copy all of REFERENCES-GRAPHS to the partition. If
+REGISTER-CLOSURES? is true, register REFERENCES-GRAPHS in the store. If
DEDUPLICATE? is true, then also deduplicate files common to CLOSURES and the
rest of the store when registering the closures. SYSTEM-DIRECTORY is the name
of the directory of the 'system' derivation. Pass WAL-MODE? to
register-closure."
+ (define root-store
+ (string-append root (%store-directory)))
+
+ (define tmp-store ".tmp-store")
+
(populate-root-file-system system-directory root)
- (populate-store references-graphs root
- #:deduplicate? deduplicate?)
+
+ (when copy-closures?
+ (populate-store references-graphs root
+ #:deduplicate? deduplicate?))
;; Populate /dev.
(when make-device-nodes
(make-device-nodes root))
(when register-closures?
+ (unless copy-closures?
+ ;; XXX: 'register-closure' wants to palpate the things it registers, so
+ ;; create a symlink to the store.
+ (rename-file root-store tmp-store)
+ (symlink (%store-directory) root-store))
+
(for-each (lambda (closure)
(register-closure root closure
#:wal-mode? wal-mode?))
- references-graphs))
+ references-graphs)
+
+ (unless copy-closures?
+ (delete-file root-store)
+ (rename-file tmp-store root-store)))
- (when bootloader-installer
- (display "installing bootloader...\n")
- (bootloader-installer bootloader-package #f root))
- (when bootcfg
- (install-boot-config bootcfg bootcfg-location root)))
+ ;; There's no point installing a bootloader if we do not populate the store.
+ (when copy-closures?
+ (when bootloader-installer
+ (display "installing bootloader...\n")
+ (bootloader-installer bootloader-package #f root))
+ (when bootcfg
+ (install-boot-config bootcfg bootcfg-location root))))
(define* (make-iso9660-image xorriso grub-mkrescue-environment
grub bootcfg system-directory root target
--
2.34.0
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 03/10] image: Add a shared-network? field.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-3-othacehe@gnu.org
* gnu/image.scm (<image>)[shared-network?]: New field.
---
gnu/image.scm | 3 +++
1 file changed, 3 insertions(+)

Toggle diff (23 lines)
diff --git a/gnu/image.scm b/gnu/image.scm
index 8423cf1d9c..0b3a5a096b 100644
--- a/gnu/image.scm
+++ b/gnu/image.scm
@@ -43,6 +43,7 @@ (define-module (gnu image)
image-compression?
image-volatile-root?
image-shared-store?
+ image-shared-network?
image-substitutable?
image-type
@@ -98,6 +99,8 @@ (define-record-type* <image>
(default #t))
(shared-store? image-shared-store? ;boolean
(default #f))
+ (shared-network? image-shared-network? ;boolean
+ (default #f))
(substitutable? image-substitutable? ;boolean
(default #t)))
--
2.34.0
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 02/10] image: Add a shared-store? field.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-2-othacehe@gnu.org
* gnu/image.scm (<image>)[shared-store?]: New field.
---
gnu/image.scm | 3 +++
1 file changed, 3 insertions(+)

Toggle diff (23 lines)
diff --git a/gnu/image.scm b/gnu/image.scm
index 1c954af8cf..8423cf1d9c 100644
--- a/gnu/image.scm
+++ b/gnu/image.scm
@@ -42,6 +42,7 @@ (define-module (gnu image)
image-partitions
image-compression?
image-volatile-root?
+ image-shared-store?
image-substitutable?
image-type
@@ -95,6 +96,8 @@ (define-record-type* <image>
(default #t))
(volatile-root? image-volatile-root? ;boolean
(default #t))
+ (shared-store? image-shared-store? ;boolean
+ (default #f))
(substitutable? image-substitutable? ;boolean
(default #t)))
--
2.34.0
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 04/10] system: image: Add docker support.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-4-othacehe@gnu.org
* gnu/system/image.scm (docker-image, docker-image-type): New variables.
(system-docker-image): New procedure.
(image->root-file-system): Add docker image support.
(system-image): Ditto.
---
gnu/system/image.scm | 125 +++++++++++++++++++++++++++++++++++++++----
1 file changed, 116 insertions(+), 9 deletions(-)

Toggle diff (219 lines)
diff --git a/gnu/system/image.scm b/gnu/system/image.scm
index 4b6aaf2e32..42e215f614 100644
--- a/gnu/system/image.scm
+++ b/gnu/system/image.scm
@@ -1,5 +1,5 @@
;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2020 Mathieu Othacehe <m.othacehe@gmail.com>
+;;; Copyright © 2020, 2021 Mathieu Othacehe <m.othacehe@gmail.com>
;;; Copyright © 2020 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
;;;
;;; This file is part of GNU Guix.
@@ -36,12 +36,14 @@ (define-module (gnu system image)
#:use-module (gnu services base)
#:use-module (gnu system)
#:use-module (gnu system file-systems)
+ #:use-module (gnu system linux-container)
#:use-module (gnu system uuid)
#:use-module (gnu system vm)
#:use-module (guix packages)
#:use-module (gnu packages base)
#:use-module (gnu packages bootloaders)
#:use-module (gnu packages cdrom)
+ #:use-module (gnu packages compression)
#:use-module (gnu packages disk)
#:use-module (gnu packages gawk)
#:use-module (gnu packages genimage)
@@ -67,6 +69,7 @@ (define-module (gnu system image)
efi-disk-image
iso9660-image
+ docker-image
raw-with-offset-disk-image
image-with-os
@@ -74,6 +77,7 @@ (define-module (gnu system image)
qcow2-image-type
iso-image-type
uncompressed-iso-image-type
+ docker-image-type
raw-with-offset-image-type
image-with-label
@@ -127,6 +131,10 @@ (define iso9660-image
(label "GUIX_IMAGE")
(flags '(boot)))))))
+(define docker-image
+ (image
+ (format 'docker)))
+
(define* (raw-with-offset-disk-image #:optional (offset root-offset))
(image
(format 'disk-image)
@@ -179,6 +187,11 @@ (define uncompressed-iso-image-type
(compression? #f))
<>))))
+(define docker-image-type
+ (image-type
+ (name 'docker)
+ (constructor (cut image-with-os docker-image <>))))
+
(define raw-with-offset-image-type
(image-type
(name 'raw-with-offset)
@@ -220,8 +233,7 @@ (define gcrypt-sqlite3&co
(define-syntax-rule (with-imported-modules* gexp* ...)
(with-extensions gcrypt-sqlite3&co
(with-imported-modules `(,@(source-module-closure
- '((gnu build vm)
- (gnu build image)
+ '((gnu build image)
(gnu build bootloader)
(gnu build hurd-boot)
(gnu build linux-boot)
@@ -229,8 +241,7 @@ (define-syntax-rule (with-imported-modules* gexp* ...)
#:select? not-config?)
((guix config) => ,(make-config.scm)))
#~(begin
- (use-modules (gnu build vm)
- (gnu build image)
+ (use-modules (gnu build image)
(gnu build bootloader)
(gnu build hurd-boot)
(gnu build linux-boot)
@@ -337,6 +348,8 @@ (define (partition-image partition)
(initializer image-root
#:references-graphs '#$graph
#:deduplicate? #f
+ #:copy-closures? (not
+ #$(image-shared-store? image))
#:system-directory #$os
#:grub-efi #+grub-efi
#:bootloader-package
@@ -527,6 +540,97 @@ (define (image-with-label base-image label)
(label label))
others))))))
+
+;;
+;; 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?))))
+
;;
;; Image creation.
@@ -534,10 +638,11 @@ (define (image-with-label base-image label)
(define (image->root-file-system image)
"Return the IMAGE root partition file-system type."
- (let ((format (image-format image)))
- (if (eq? format 'iso9660)
- "iso9660"
- (partition-file-system (find-root-partition image)))))
+ (case (image-format image)
+ ((iso9660) "iso9660")
+ ((docker) "dummy")
+ (else
+ (partition-file-system (find-root-partition image)))))
(define (root-size image)
"Return the root partition size of IMAGE."
@@ -671,6 +776,8 @@ (define target (cond
#:register-closures? register-closures?
#:inputs `(("system" ,os)
("bootcfg" ,bootcfg))))
+ ((memq image-format '(docker))
+ (system-docker-image image*))
((memq image-format '(iso9660))
(system-iso9660-image
image*
--
2.34.0
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 05/10] system: vm: Use the image API to generate QEMU images.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-5-othacehe@gnu.org
Also add a volatile? argument to the virtual-machine record. When volatile? is
true generate a QEMU script that mounts an overlay on top of a read only
storage. When volatile? is false, use a persistent, read-write storage.

* gnu/system/vm.scm (common-qemu-options): Add a rw-image? argument to use a
persistent storage.
(system-qemu-image/shared-store-script): Add a volatile? argument and honor
it. Use the image API to build the QEMU image.
(<virtual-machine>)[volatile?]: New field.
(virtual-machine-compiler): Pass the volatile? argument to the
system-qemu-image/shared-store-script procedure.
---
gnu/system/vm.scm | 77 +++++++++++++++++++++++++++++++++--------------
1 file changed, 54 insertions(+), 23 deletions(-)

Toggle diff (187 lines)
diff --git a/gnu/system/vm.scm b/gnu/system/vm.scm
index 2487539b61..db5c4132c0 100644
--- a/gnu/system/vm.scm
+++ b/gnu/system/vm.scm
@@ -51,6 +51,8 @@ (define-module (gnu system vm)
#:use-module (gnu bootloader)
#:use-module (gnu bootloader grub)
+ #:use-module (gnu image)
+ #:use-module (gnu system image)
#:use-module (gnu system linux-container)
#:use-module (gnu system linux-initrd)
#:use-module (gnu bootloader)
@@ -60,7 +62,7 @@ (define-module (gnu system vm)
#:use-module (gnu services base)
#:use-module (gnu system uuid)
- #:use-module (srfi srfi-1)
+ #:use-module ((srfi srfi-1) #:hide (partition))
#:use-module (srfi srfi-26)
#:use-module (rnrs bytevectors)
#:use-module (ice-9 match)
@@ -592,7 +594,8 @@ (define (mapping->file-system mapping)
(check? #f)
(create-mount-point? #t)))))
-(define* (virtualized-operating-system os mappings #:optional (full-boot? #f))
+(define* (virtualized-operating-system os mappings
+ #:key (full-boot? #f) volatile?)
"Return an operating system based on OS suitable for use in a virtualized
environment with the store shared with the host. MAPPINGS is a list of
<file-system-mapping> to realize in the virtualized OS."
@@ -635,7 +638,7 @@ (define virtual-file-systems
(initrd (lambda (file-systems . rest)
(apply (operating-system-initrd os)
file-systems
- #:volatile-root? #t
+ #:volatile-root? volatile?
rest)))
;; Disable swap.
@@ -692,7 +695,8 @@ (define bootcfg
#:register-closures? #f
#:copy-inputs? full-boot?))
-(define* (common-qemu-options image shared-fs)
+(define* (common-qemu-options image shared-fs
+ #:key rw-image?)
"Return the a string-value gexp with the common QEMU options to boot IMAGE,
with '-virtfs' options for the host file systems listed in SHARED-FS."
@@ -712,8 +716,10 @@ (define (virtfs-option fs)
"-device" "virtio-rng-pci,rng=guix-vm-rng"
#$@(map virtfs-option shared-fs)
- (format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly=on"
- #$image)))
+ #$@(if rw-image?
+ #~((format #f "-drive file=~a,if=virtio" #$image))
+ #~((format #f "-drive file=~a,if=virtio,cache=writeback,werror=report,readonly=on"
+ #$image)))))
(define* (system-qemu-image/shared-store-script os
#:key
@@ -721,7 +727,8 @@ (define* (system-qemu-image/shared-store-script os
(target (%current-target-system))
(qemu qemu)
(graphic? #t)
- (memory-size 256)
+ (volatile? #t)
+ (memory-size 2048)
(mappings '())
full-boot?
(disk-image-size
@@ -736,20 +743,31 @@ (define* (system-qemu-image/shared-store-script os
systems into the guest.
When FULL-BOOT? is true, the returned script runs everything starting from the
-bootloader; otherwise it directly starts the operating system kernel. The
-DISK-IMAGE-SIZE parameter specifies the size in bytes of the root disk image;
-it is mostly useful when FULL-BOOT? is true."
- (mlet* %store-monad ((os -> (virtualized-operating-system os mappings full-boot?))
- (image (system-qemu-image/shared-store
- os
- #:system system
- #:target target
+bootloader; otherwise it directly starts the operating system kernel. When
+VOLATILE? is true, an overlay is created on top of a read-only
+storage. Otherwise the storage is made persistent. The DISK-IMAGE-SIZE
+parameter specifies the size in bytes of the root disk image; it is mostly
+useful when FULL-BOOT? is true."
+ (mlet* %store-monad ((os -> (virtualized-operating-system
+ os mappings
#:full-boot? full-boot?
- #:disk-image-size disk-image-size)))
+ #:volatile? volatile?))
+ (base-image -> (system-image
+ (image
+ (inherit
+ (raw-with-offset-disk-image))
+ (operating-system os)
+ (size disk-image-size)
+ (shared-store?
+ (and (not full-boot?) volatile?))
+ (volatile-root? volatile?)))))
(define kernel-arguments
#~(list #$@(if graphic? #~() #~("console=ttyS0"))
#+@(operating-system-kernel-arguments os "/dev/vda1")))
+ (define rw-image
+ #~(format #f "/tmp/.~a-rw" (basename #$base-image)))
+
(define qemu-exec
#~(list #+(file-append qemu "/bin/"
(qemu-command (or target system)))
@@ -761,17 +779,25 @@ (define qemu-exec
"-initrd" #$(file-append os "/initrd")
(format #f "-append ~s"
(string-join #$kernel-arguments " "))))
- #$@(common-qemu-options image
+ #$@(common-qemu-options (if volatile? base-image rw-image)
(map file-system-mapping-source
- (cons %store-mapping mappings)))
+ (cons %store-mapping mappings))
+ #:rw-image? (not volatile?))
"-m " (number->string #$memory-size)
#$@options))
(define builder
#~(call-with-output-file #$output
(lambda (port)
- (format port "#!~a~% exec ~a \"$@\"~%"
- #+(file-append bash "/bin/sh")
+ (format port "#!~a~%"
+ #+(file-append bash "/bin/sh"))
+ (when (not #$volatile?)
+ (format port "~a~%"
+ #$(program-file "copy-image"
+ #~(unless (file-exists? #$rw-image)
+ (copy-file #$base-image #$rw-image)
+ (chmod #$rw-image #o640)))))
+ (format port "exec ~a \"$@\"~%"
(string-join #$qemu-exec " "))
(chmod port #o555))))
@@ -788,6 +814,8 @@ (define-record-type* <virtual-machine> %virtual-machine
(operating-system virtual-machine-operating-system) ;<operating-system>
(qemu virtual-machine-qemu ;<package>
(default qemu-minimal))
+ (volatile? virtual-machine-volatile? ;Boolean
+ (default #t))
(graphic? virtual-machine-graphic? ;Boolean
(default #f))
(memory-size virtual-machine-memory-size ;integer (MiB)
@@ -821,17 +849,19 @@ (define (port-forwardings->qemu-options forwardings)
(define-gexp-compiler (virtual-machine-compiler (vm <virtual-machine>)
system target)
(match vm
- (($ <virtual-machine> os qemu graphic? memory-size disk-image-size ())
+ (($ <virtual-machine> os qemu volatile? graphic? memory-size
+ disk-image-size ())
(system-qemu-image/shared-store-script os
#:system system
#:target target
#:qemu qemu
#:graphic? graphic?
+ #:volatile? volatile?
#:memory-size memory-size
#:disk-image-size
disk-image-size))
- (($ <virtual-machine> os qemu graphic? memory-size disk-image-size
- forwardings)
+ (($ <virtual-machine> os qemu volatile? graphic? memory-size
+ disk-image-size forwardings)
(let ((options
`("-nic" ,(string-append
"user,model=virtio-net-pci,"
@@ -841,6 +871,7 @@ (define-gexp-compiler (virtual-machine-compiler (vm <virtual-machine>)
#:target target
#:qemu qemu
#:graphic? graphic?
+ #:volatile? volatile?
#:memory-size memory-size
#:disk-image-size
disk-image-size
--
2.34.0
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 06/10] Remove VM generation dead-code.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-6-othacehe@gnu.org
This code duplicates the (gnu system image) and (gnu build image) code. Using
VM for image generation is not needed, not portable and really slow. Remove
all the VM image generation code to make sure that only the image API is used.

* gnu/build/vm.scm: Remove it. Move the qemu-command procedure to ...
* gnu/build/marionette.scm: ... here.
* gnu/local.mk (GNU_SYSTEM_MODULES): Adapt it.
* tests/modules.scm: Ditto.
* gnu/tests/install.scm: Ditto.
* gnu/system/vm.scm: Adapt it and remove expression->derivation-in-linux-vm,
qemu-img, system-qemu-image/shared-store and system-docker-image procedures.
* doc/guix.texi (G-Expressions): Adapt it.
---
doc/guix.texi | 4 +-
gnu/build/marionette.scm | 14 +-
gnu/build/vm.scm | 500 ---------------------------------------
gnu/local.mk | 1 -
gnu/system/vm.scm | 487 +-------------------------------------
gnu/tests/install.scm | 2 +-
tests/modules.scm | 6 +-
7 files changed, 21 insertions(+), 993 deletions(-)
delete mode 100644 gnu/build/vm.scm

Toggle diff (476 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index 7b1a64deb9..dd991542cf 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -10173,11 +10173,11 @@ headers, which comes in handy in this case:
(with-imported-modules (source-module-closure
'((guix build utils)
- (gnu build vm)))
+ (gnu build image)))
(gexp->derivation "something-with-vms"
#~(begin
(use-modules (guix build utils)
- (gnu build vm))
+ (gnu build image))
@dots{})))
@end lisp
diff --git a/gnu/build/marionette.scm b/gnu/build/marionette.scm
index 0ebe535526..b336024610 100644
--- a/gnu/build/marionette.scm
+++ b/gnu/build/marionette.scm
@@ -24,6 +24,7 @@ (define-module (gnu build marionette)
#:use-module (rnrs io ports)
#:use-module (ice-9 match)
#:use-module (ice-9 popen)
+ #:use-module (ice-9 regex)
#:export (marionette?
make-marionette
marionette-eval
@@ -36,7 +37,8 @@ (define-module (gnu build marionette)
%qwerty-us-keystrokes
marionette-type
- system-test-runner))
+ system-test-runner
+ qemu-command))
;;; Commentary:
;;;
@@ -426,4 +428,14 @@ (define* (system-test-runner #:optional log-directory)
(exit success?))))
runner))
+(define* (qemu-command #:optional (system %host-type))
+ "Return the default name of the QEMU command for SYSTEM."
+ (let ((cpu (substring system 0
+ (string-index system #\-))))
+ (string-append "qemu-system-"
+ (cond
+ ((string-match "^i[3456]86$" cpu) "i386")
+ ((string-match "armhf" cpu) "arm")
+ (else cpu)))))
+
;;; marionette.scm ends here
diff --git a/gnu/build/vm.scm b/gnu/build/vm.scm
deleted file mode 100644
index 9d32824764..0000000000
--- a/gnu/build/vm.scm
+++ /dev/null
@@ -1,500 +0,0 @@
-;;; GNU Guix --- Functional package management for GNU
-;;; Copyright © 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020 Ludovic Courtès <ludo@gnu.org>
-;;; Copyright © 2016 Christine Lemmer-Webber <cwebber@dustycloud.org>
-;;; Copyright © 2016, 2017 Leo Famulari <leo@famulari.name>
-;;; Copyright © 2017 Mathieu Othacehe <m.othacehe@gmail.com>
-;;; Copyright © 2017 Marius Bakke <mbakke@fastmail.com>
-;;; Copyright © 2018 Chris Marusich <cmmarusich@gmail.com>
-;;; Copyright © 2020 Tobias Geerinckx-Rice <me@tobias.gr>
-;;;
-;;; 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 build vm)
- #:use-module (guix build utils)
- #:use-module (guix build store-copy)
- #:use-module (guix build syscalls)
- #:use-module (guix store database)
- #:use-module (gnu build bootloader)
- #:use-module (gnu build linux-boot)
- #:use-module (gnu build install)
- #:use-module (gnu system uuid)
- #:use-module (guix records)
- #:use-module ((guix combinators) #:select (fold2))
- #:use-module (ice-9 format)
- #:use-module (ice-9 ftw)
- #: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-19)
- #:use-module (srfi srfi-26)
- #:export (qemu-command
- load-in-linux-vm
- format-partition
-
- partition
- partition?
- partition-device
- partition-size
- partition-file-system
- partition-label
- partition-flags
- partition-initializer
-
- estimated-partition-size
- root-partition-initializer
- initialize-partition-table
- initialize-hard-disk))
-
-;;; Commentary:
-;;;
-;;; This module provides supporting code to run virtual machines and build
-;;; virtual machine images using QEMU.
-;;;
-;;; Code:
-
-(define* (qemu-command #:optional (system %host-type))
- "Return the default name of the QEMU command for SYSTEM."
- (let ((cpu (substring system 0
- (string-index system #\-))))
- (string-append "qemu-system-"
- (cond
- ((string-match "^i[3456]86$" cpu) "i386")
- ((string-match "armhf" cpu) "arm")
- (else cpu)))))
-
-(define* (load-in-linux-vm builder
- #:key
- output
- (qemu (qemu-command)) (memory-size 512)
- linux initrd
- make-disk-image?
- single-file-output?
- (disk-image-size (* 100 (expt 2 20)))
- (disk-image-format "qcow2")
- (references-graphs '()))
- "Run BUILDER, a Scheme file, into a VM running LINUX with INITRD, and copy
-the result to OUTPUT. If SINGLE-FILE-OUTPUT? is true, copy a single file from
-/xchg to OUTPUT. Otherwise, copy the contents of /xchg to a new directory
-OUTPUT.
-
-When MAKE-DISK-IMAGE? is true, OUTPUT will contain a VM image of
-DISK-IMAGE-SIZE bytes resulting from the execution of BUILDER, which may
-access it via /dev/hda.
-
-REFERENCES-GRAPHS can specify a list of reference-graph files as produced by
-the #:references-graphs parameter of 'derivation'."
-
- (define target-arm32?
- (string-prefix? "arm-" %host-type))
-
- (define target-aarch64?
- (string-prefix? "aarch64-" %host-type))
-
- (define target-arm?
- (or target-arm32? target-aarch64?))
-
- (define arch-specific-flags
- `(;; On ARM, a machine has to be specified. Use "virt" machine to avoid
- ;; hardware limits imposed by other machines.
- ,@(if target-arm?
- '("-M" "virt")
- '())
-
- ;; On ARM32, if the kernel is built without LPAE support, ECAM conflicts
- ;; with VIRT_PCIE_MMIO causing PCI devices not to show up. Disable
- ;; explicitely highmem to fix it.
- ;; See: https://bugs.launchpad.net/qemu/+bug/1790975.
- ,@(if target-arm32?
- '("-machine" "highmem=off")
- '())
-
- ;; Only enable kvm if we see /dev/kvm exists. This allows users without
- ;; hardware virtualization to still use these commands. KVM support is
- ;; still buggy on some ARM boards. Do not use it even if available.
- ,@(if (and (file-exists? "/dev/kvm")
- (not target-arm?))
- '("-enable-kvm")
- '())
-
- ;; Pass "panic=1" so that the guest dies upon error.
- "-append"
- ,(string-append "panic=1 --load=" builder
-
- ;; The serial port name differs between emulated
- ;; architectures/machines.
- " console="
- (if target-arm? "ttyAMA0" "ttyS0"))))
-
- (when make-disk-image?
- (format #t "creating ~a image of ~,2f MiB...~%"
- disk-image-format (/ disk-image-size (expt 2 20)))
- (force-output)
- (invoke "qemu-img" "create" "-f" disk-image-format output
- (number->string disk-image-size)))
-
- (mkdir "xchg")
- (mkdir "tmp")
-
- (match references-graphs
- ((graph-files ...)
- ;; Copy the reference-graph files under xchg/ so EXP can access it.
- (map (lambda (file)
- (copy-file file (string-append "xchg/" file)))
- graph-files))
- (_ #f))
-
- (apply invoke qemu "-nographic" "-no-reboot"
- ;; CPU "max" behaves as "host" when KVM is enabled, and like a system
- ;; CPU with the maximum possible feature set otherwise.
- "-cpu" "max"
- "-m" (number->string memory-size)
- "-nic" "user,model=virtio-net-pci"
- "-object" "rng-random,filename=/dev/urandom,id=guix-vm-rng"
- "-device" "virtio-rng-pci,rng=guix-vm-rng"
- "-virtfs"
- (string-append "local,id=store_dev,path="
- (%store-directory)
- ",security_model=none,mount_tag=store")
- "-virtfs"
- (string-append "local,id=xchg_dev,path=xchg"
- ",security_model=none,mount_tag=xchg")
- "-virtfs"
- ;; Some programs require more space in /tmp than is normally
- ;; available in the guest. Accommodate such programs by sharing a
- ;; temporary directory.
- (string-append "local,id=tmp_dev,path=tmp"
- ",security_model=none,mount_tag=tmp")
- "-kernel" linux
- "-initrd" initrd
- (append
- (if make-disk-image?
- `("-device" "virtio-blk,drive=myhd"
- "-drive" ,(string-append "if=none,file=" output
- ",format=" disk-image-format
- ",id=myhd"))
- '())
- arch-specific-flags))
-
- (unless (file-exists? "xchg/.exit-status")
- (error "VM did not produce an exit code"))
-
- (match (call-with-input-file "xchg/.exit-status" read)
- (0 #t)
- (status (error "guest VM code exited with a non-zero status" status)))
-
- (delete-file "xchg/.exit-status")
-
- ;; When MAKE-DISK-IMAGE? is true, the image is in OUTPUT already.
- (unless make-disk-image?
- (if single-file-output?
- (let ((graph? (lambda (name stat)
- (member (basename name) references-graphs))))
- (match (find-files "xchg" (negate graph?))
- ((result)
- (copy-file result output))
- (x
- (error "did not find a single result file" x))))
- (begin
- (mkdir output)
- (copy-recursively "xchg" output)))))
-
-(define* (register-closure prefix closure
- #:key
- (schema (sql-schema)))
- "Register CLOSURE in PREFIX, where PREFIX is the directory name of the
-target store and CLOSURE is the name of a file containing a reference graph as
-produced by #:references-graphs."
- (let ((items (call-with-input-file closure read-reference-graph)))
- (parameterize ((sql-schema schema))
- (with-database (store-database-file #:prefix prefix) db
- (register-items db items
- #:prefix prefix
- #:registration-time %epoch)))))
-
-
-;;;
-;;; Partitions.
-;;;
-
-(define-record-type* <partition> partition make-partition
- partition?
- (device partition-device (default #f))
- (size partition-size)
- (file-system partition-file-system (default "ext4"))
- (file-system-options partition-file-system-options ;passed to 'mkfs.FS'
- (default '()))
- (label partition-label (default #f))
- (uuid partition-uuid (default #f))
- (flags partition-flags (default '()))
- (initializer partition-initializer (default (const #t))))
-
-(define (estimated-partition-size graphs)
- "Return the estimated size of a partition that can store the store items
-given by GRAPHS, a list of file names produced by #:references-graphs."
- ;; Simply add a 25% overhead.
- (round (* 1.25 (closure-size graphs))))
-
-(define* (initialize-partition-table device partitions
- #:key
- (label-type "msdos")
- (offset (expt 2 20)))
- "Create on DEVICE a partition table of type LABEL-TYPE, containing the given
-PARTITIONS (a list of <partition> objects), starting at OFFSET bytes. On
-success, return PARTITIONS with their 'device' field changed to reflect their
-actual /dev name based on DEVICE."
- (define (partition-options part offset index)
- (cons* "mkpart" "primary" "ext2"
- (format #f "~aB" offset)
- (format #f "~aB" (+ offset (partition-size part)))
- (append-map (lambda (flag)
- (list "set" (number->string index)
- (symbol->string flag) "on"))
- (partition-flags part))))
-
- (define (options partitions offset)
- (let loop ((partitions partitions)
- (offset offset)
- (index 1)
- (result '()))
- (match partitions
- (()
- (concatenate (reverse result)))
- ((head tail ...)
- (loop tail
- ;; Leave one sector (512B) between partitions to placate
- ;; Parted.
- (+ offset 512 (partition-size head))
- (+ 1 index)
- (cons (partition-options head offset index)
- result))))))
-
- (format #t "creating partition table with ~a partitions (~a)...\n"
- (length partitions)
- (string-join (map (compose (cut string-append <> " MiB")
- number->string
- (lambda (size)
- (round (/ size (expt 2. 20))))
- partition-size)
- partitions)
- ", "))
- (apply invoke "parted" "--script"
- device "mklabel" label-type
- (options partitions offset))
-
- ;; Set the 'device' field of each partition.
- (reverse
- (fold2 (lambda (part result index)
- (values (cons (partition
- (inherit part)
- (device (string-append device
- (number->string index))))
- result)
- (+ 1 index)))
- '()
- 1
- partitions)))
-
-(define MS_BIND 4096) ; <sys/mounts.h> again!
-
-(define* (create-ext-file-system partition type
- #:key label uuid (options '()))
- "Create an ext-family file system of TYPE on PARTITION. If LABEL is true,
-use that as the volume name. If UUID is true, use it as the partition UUID."
- (format #t "creating ~a partition... ~@[label: ~s~] ~@[uuid: ~s~]\n"
- type label (and uuid (uuid->string uuid)))
- (apply invoke (string-append "mkfs." type)
- "-F" partition
- `(,@(if label
- `("-L" ,label)
- '())
- ,@(if uuid
- `("-U" ,(uuid->string uuid))
- '())
- ,@options)))
-
-(define* (create-fat-file-system partition
- #:key label uuid (options '()))
- "Create a FAT file system on PARTITION. The number of File Allocation Tables
-will be determined based on file system size. If LABEL is true, use that as the
-volume name."
- ;; FIXME: UUID is ignored!
- (format #t "creating FAT partition...\n")
- (apply invoke "mkfs.fat" partition
- (append (if label `("-n" ,label) '()) options)))
-
-(define* (format-partition partition type
- #:key label uuid (options '()))
- "Create a file system TYPE on PARTITION. If LABEL is true, use that as the
-volume name. Options is a list of command-line options passed to 'mkfs.FS'."
- (cond ((string-prefix? "ext" type)
- (create-ext-file-system partition type #:label label #:uuid uuid
- #:options options))
- ((or (string-prefix? "fat" type) (string= "vfat" type))
- (create-fat-file-system partition #:label label #:uuid uuid
- #:options options))
- (else (error "Unsupported file system."))))
-
-(define (initialize-partition partition)
- "Format PARTITION, a <partition> object with a non-#f 'device' field, mount
-it, run its initializer, and unmount it."
- (let ((target "/fs"))
- (format-partition (partition-device partition)
- (partition-file-system partition)
- #:label (partition-label partition)
- #:uuid (partition-uuid partition)
- #:options (partition-file-system-options partition))
- (mkdir-p target)
- (mount (partition-device partition) target
- (partition-file-system partition))
-
- ((partition-initializer partition) target)
-
- (umount target)
- partition))
-
-(define* (root-partition-initializer #:key (closures '())
- copy-closures?
- (register-closures? #t)
- system-directory
- (deduplicate? #t)
- (make-device-nodes
- make-essential-device-nodes)
- (extra-directives '()))
- "Return a procedure to initialize a root partition.
-
-If REGISTER-CLOSURES? is true, register all of CLOSURES in the partition's
-store. If DEDUPLICATE? is true, then also deduplicate files common to
-CLOSURES and the rest of the store when registering the closures. If
-COPY-CLOSURES? is true, copy all of CLOSURES to the partition.
-SYSTEM-DIRECTORY is the name of the directory of the 'system' derivation.
-
-EXTRA-DIRECTIVES is an optional list of directives to populate the root file
-system that is passed to 'populate-root-file-system'."
- (lambda (target)
- (define target-store
- (string-append target (%store-directory)))
-
- (when copy-closures?
- ;; Populate the store.
- (populate-store (map (cut string-append "/xchg/" <>) closures)
- target
- #:deduplicate? deduplicate?))
-
- ;; Populate /dev.
- (make-device-nodes target)
-
- ;; Optionally, register the inputs in the image's store.
- (when register-closures?
- (unless copy-closures?
- ;; XXX: 'register-closure' wants to palpate the things it registers, so
- ;; bind-mount the store on the target.
- (mkdir-p target-store)
- (mount (%store-directory) target-store "" MS_BIND))
-
- (display "registering closures...\n")
- (for-each (lambda (closure)
- (register-closure target
- (string-append "/xchg/" closure)))
- closures)
- (unless copy-closures?
- (umount targe
This message was truncated. Download the full message here.
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 07/10] scripts: system: Deprecate the docker-image command.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-7-othacehe@gnu.org
* guix/scripts/system.scm (system-derivation-for-action): Use the image API to
generate the docker images and deprecate the docker-image command.
(process-action): Ditto.
* doc/guix.texi (Invoking guix system): Adapt it.
---
doc/guix.texi | 19 +++++--------------
guix/scripts/system.scm | 22 ++++++++++++----------
2 files changed, 17 insertions(+), 24 deletions(-)

Toggle diff (92 lines)
diff --git a/doc/guix.texi b/doc/guix.texi
index dd991542cf..f0f5538427 100644
--- a/doc/guix.texi
+++ b/doc/guix.texi
@@ -34986,15 +34986,6 @@ QEMU monitor and the VM.
@cindex System images, creation in various formats
@cindex Creating system images in various formats
@item image
-@itemx docker-image
-Return a virtual machine, disk image, or Docker image of the operating
-system declared in @var{file} that stands alone. By default,
-@command{guix system} estimates the size of the image needed to store
-the system, but you can use the @option{--image-size} option to specify
-a value. Docker images are built to contain exactly what they need, so
-the @option{--image-size} option is ignored in the case of
-@code{docker-image}.
-
@cindex image, creating disk images
The @code{image} command can produce various image types. The
image type can be selected using the @option{--image-type} option. It
@@ -35040,11 +35031,11 @@ uses the SeaBIOS BIOS by default, expecting a bootloader to be installed
in the Master Boot Record (MBR).
@cindex docker-image, creating docker images
-When using @code{docker-image}, a Docker image is produced. Guix builds
-the image from scratch, not from a pre-existing Docker base image. As a
-result, it contains @emph{exactly} what you define in the operating
-system configuration file. You can then load the image and launch a
-Docker container using commands like the following:
+When using the @code{docker} image type, a Docker image is produced.
+Guix builds the image from scratch, not from a pre-existing Docker base
+image. As a result, it contains @emph{exactly} what you define in the
+operating system configuration file. You can then load the image and
+launch a Docker container using commands like the following:
@example
image_id="$(docker load < guix-system-docker-image.tar.gz)"
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index 1db788a534..a5d9bb4779 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -713,16 +713,14 @@ (define* (system-derivation-for-action image action
image-size
(* 70 (expt 2 20)))
#:mappings mappings))
- ((image disk-image vm-image)
+ ((image disk-image vm-image docker-image)
(when (eq? action 'disk-image)
(warning (G_ "'disk-image' is deprecated: use 'image' instead~%")))
(when (eq? action 'vm-image)
(warning (G_ "'vm-image' is deprecated: use 'image' instead~%")))
- (lower-object (system-image image)))
- ((docker-image)
- (system-docker-image os
- #:memory-size 1024
- #:shared-network? container-shared-network?)))))
+ (when (eq? action 'docker-image)
+ (warning (G_ "'docker-image' is deprecated: use 'image' instead~%")))
+ (lower-object (system-image image))))))
(define (maybe-suggest-running-guix-pull)
"Suggest running 'guix pull' if this has never been done before."
@@ -1214,11 +1212,14 @@ (define save-provenance?
(label (assoc-ref opts 'label))
(image-type (lookup-image-type-by-name
(assoc-ref opts 'image-type)))
- (image (let* ((image-type (if (eq? action 'vm-image)
- qcow2-image-type
- image-type))
+ (image (let* ((image-type (case action
+ ((vm-image) qcow2-image-type)
+ ((docker-image) docker-image-type)
+ (else image-type)))
(image-size (assoc-ref opts 'image-size))
(volatile? (assoc-ref opts 'volatile-root?))
+ (shared-network?
+ (assoc-ref opts 'container-shared-network?))
(base-image (if (operating-system? obj)
(os->image obj
#:type image-type)
@@ -1228,7 +1229,8 @@ (define save-provenance?
(image-with-label base-image label)
base-image))
(size image-size)
- (volatile-root? volatile?))))
+ (volatile-root? volatile?)
+ (shared-network? shared-network?))))
(os (image-operating-system image))
(target-file (match args
((first second) second)
--
2.34.0
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 08/10] scripts: system: Pass the volatile field to VM generation.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-8-othacehe@gnu.org
* guix/scripts/system.scm (system-derivation-for-action): Add new volatile?
argument and pass it to system-qemu-image/shared-store-script.
(perform-action): Add new volatile? argument and pass it to
system-derivation-for-action.
(process-action): Pass the volatile? argument to perform-action.
---
guix/scripts/system.scm | 5 +++++
1 file changed, 5 insertions(+)

Toggle diff (46 lines)
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index a5d9bb4779..a73fe55418 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -689,6 +689,7 @@ (define file-systems
(define* (system-derivation-for-action image action
#:key
full-boot?
+ volatile?
(graphic? #t)
container-shared-network?
mappings)
@@ -707,6 +708,7 @@ (define* (system-derivation-for-action image action
((vm)
(system-qemu-image/shared-store-script os
#:full-boot? full-boot?
+ #:volatile? volatile?
#:graphic? graphic?
#:disk-image-size
(if full-boot?
@@ -772,6 +774,7 @@ (define* (perform-action action image
dry-run? derivations-only?
use-substitutes? target
full-boot?
+ volatile?
(graphic? #t)
container-shared-network?
(mappings '())
@@ -826,6 +829,7 @@ (define bootcfg
(mlet* %store-monad
((sys (system-derivation-for-action image action
#:full-boot? full-boot?
+ #:volatile? volatile?
#:graphic? graphic?
#:container-shared-network? container-shared-network?
#:mappings mappings))
@@ -1277,6 +1281,7 @@ (define (graph-backend)
#:validate-reconfigure
(assoc-ref opts 'validate-reconfigure)
#:full-boot? (assoc-ref opts 'full-boot?)
+ #:volatile? (assoc-ref opts 'volatile-root?)
#:graphic? (not (assoc-ref opts 'no-graphic?))
#:container-shared-network?
(assoc-ref opts 'container-shared-network?)
--
2.34.0
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 09/10] scripts: system: Use the disk-image size argument for VM generation.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-9-othacehe@gnu.org
* guix/scripts/system.scm (system-derivation-for-action): Use the given
image-size unconditionnaly when calling system-qemu-image/shared-store-script.
---
guix/scripts/system.scm | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)

Toggle diff (18 lines)
diff --git a/guix/scripts/system.scm b/guix/scripts/system.scm
index a73fe55418..f7e17d2db4 100644
--- a/guix/scripts/system.scm
+++ b/guix/scripts/system.scm
@@ -710,10 +710,7 @@ (define* (system-derivation-for-action image action
#:full-boot? full-boot?
#:volatile? volatile?
#:graphic? graphic?
- #:disk-image-size
- (if full-boot?
- image-size
- (* 70 (expt 2 20)))
+ #:disk-image-size image-size
#:mappings mappings))
((image disk-image vm-image docker-image)
(when (eq? action 'disk-image)
--
2.34.0
M
M
Mathieu Othacehe wrote on 16 Dec 2021 14:06
[PATCH 10/10] tests: docker: Fix it.
(address . 52550@debbugs.gnu.org)(name . Mathieu Othacehe)(address . othacehe@gnu.org)
20211216130649.30285-10-othacehe@gnu.org
The docker tests are broken because the docker overlay doesn't support running
on our own storage overlay. Use the new <virtual-machine> volatile? field to
spawn a VM with a persistent storage and no overlay.

* gnu/tests/docker.scm (run-docker-test): Add the docker-tarball to the gc
roots as the host store is not shared anymore. Spawn a VM without volatile
storage.
(run-docker-system-test): Ditto.
(%test-docker-system): Adapt it to use the image API.
---
gnu/tests/docker.scm | 51 +++++++++++++++++++++++++-------------------
1 file changed, 29 insertions(+), 22 deletions(-)

Toggle diff (112 lines)
diff --git a/gnu/tests/docker.scm b/gnu/tests/docker.scm
index bc119988b7..6302bd0727 100644
--- a/gnu/tests/docker.scm
+++ b/gnu/tests/docker.scm
@@ -18,9 +18,11 @@
;;; along with GNU Guix. If not, see <http://www.gnu.org/licenses/>.
(define-module (gnu tests docker)
+ #:use-module (gnu image)
#:use-module (gnu tests)
#:use-module (gnu system)
#:use-module (gnu system file-systems)
+ #:use-module (gnu system image)
#:use-module (gnu system vm)
#:use-module (gnu services)
#:use-module (gnu services dbus)
@@ -35,7 +37,7 @@ (define-module (gnu tests docker)
#:use-module (guix monads)
#:use-module (guix packages)
#:use-module (guix profiles)
- #:use-module (guix scripts pack)
+ #:use-module ((guix scripts pack) #:prefix pack:)
#:use-module (guix store)
#:use-module (guix tests)
#:use-module (guix build-system trivial)
@@ -56,15 +58,18 @@ (define (run-docker-test docker-tarball)
inside %DOCKER-OS."
(define os
(marionette-operating-system
- %docker-os
+ (operating-system-with-gc-roots
+ %docker-os
+ (list docker-tarball))
#:imported-modules '((gnu services herd)
(guix combinators))))
(define vm
(virtual-machine
(operating-system os)
- (memory-size 700)
- (disk-image-size (* 1500 (expt 2 20)))
+ (volatile? #f)
+ (memory-size 1024)
+ (disk-image-size (* 3000 (expt 2 20)))
(port-forwardings '())))
(define test
@@ -173,11 +178,12 @@ (define (build-tarball&run-docker-test)
guest-script-package))
#:hooks '()
#:locales? #f))
- (tarball (docker-image "docker-pack" profile
- #:symlinks '(("/bin/Guile" -> "bin/guile")
- ("aa.scm" -> "a.scm"))
- #:entry-point "bin/guile"
- #:localstatedir? #t)))
+ (tarball (pack:docker-image
+ "docker-pack" profile
+ #:symlinks '(("/bin/Guile" -> "bin/guile")
+ ("aa.scm" -> "a.scm"))
+ #:entry-point "bin/guile"
+ #:localstatedir? #t)))
(run-docker-test tarball)))
(define %test-docker
@@ -192,19 +198,18 @@ (define (run-docker-system-test tarball)
inside %DOCKER-OS."
(define os
(marionette-operating-system
- %docker-os
+ (operating-system-with-gc-roots
+ %docker-os
+ (list tarball))
#:imported-modules '((gnu services herd)
(guix combinators))))
(define vm
(virtual-machine
(operating-system os)
- ;; FIXME: Because we're using the volatile-root setup where the root file
- ;; system is a tmpfs overlaid over a small root file system, 'docker
- ;; load' must be able to store the whole image into memory, hence the
- ;; huge memory requirements. We should avoid the volatile-root setup
- ;; instead.
- (memory-size 4500)
+ (volatile? #f)
+ (disk-image-size (* 5000 (expt 2 20)))
+ (memory-size 2048)
(port-forwardings '())))
(define test
@@ -293,10 +298,12 @@ (define %test-docker-system
(description "Run a system image as produced by @command{guix system
docker-image} inside Docker.")
(value (with-monad %store-monad
- (>>= (system-docker-image (operating-system
- (inherit (simple-operating-system))
- ;; Use locales for a single libc to
- ;; reduce space requirements.
- (locale-libcs (list glibc)))
- #:memory-size 1024)
+ (>>= (lower-object
+ (system-image (os->image
+ (operating-system
+ (inherit (simple-operating-system))
+ ;; Use locales for a single libc to
+ ;; reduce space requirements.
+ (locale-libcs (list glibc)))
+ #:type docker-image-type)))
run-docker-system-test)))))
--
2.34.0
L
L
Ludovic Courtès wrote on 22 Dec 2021 22:39
Re: bug#52550: [PATCH 00/10] Further work on the image API.
(name . Mathieu Othacehe)(address . othacehe@gnu.org)(address . 52550@debbugs.gnu.org)
87zgosz5ci.fsf@gnu.org
Hi!

Mathieu Othacehe <othacehe@gnu.org> skribis:

Toggle quote (20 lines)
> This series contains further work on the image API that I have postponed for
> over a year. In short:
>
> * The guix system image command now supports the docker image type, which
> means that the docker-image command is deprecated.
>
> * The docker images are not created in a VM (not needed), which results in a
> creation speedup of around 6 times: 3 minutes vs 19 minutes for a simple
> docker image on my x86 machine.
>
> * Most of the (gnu build vm) and (gnu system vm) code is removed. This is code
> was largely duplicated in (gnu build image) and (gnu system image). We now
> have a single entry point for creating images, that is faster, more robust
> and portable.
>
> * I have added a "volatile?" flag to the <virtual-machine> record so that the
> system tests can use a persistent or a volatile storage. I have adapted the
> docker tests to use persistent storage. This means that those tests that
> have been broken for a long time are now fixed.

This is great. I didn’t try to run the code but I did look at the
patches and it LGTM.

Toggle quote (2 lines)
> gnu/build/vm.scm | 500 ----------------------------------

Bye bye vm.scm, you were one of the oldest Guix System files.

Toggle quote (2 lines)
> 12 files changed, 279 insertions(+), 1084 deletions(-)

I like that. :-)

Thank you!

Ludo’.
M
M
Mathieu Othacehe wrote on 23 Dec 2021 10:57
(name . Ludovic Courtès)(address . ludo@gnu.org)(address . 52550-done@debbugs.gnu.org)
87a6gr3apy.fsf_-_@gnu.org
Hey!

Toggle quote (3 lines)
> This is great. I didn’t try to run the code but I did look at the
> patches and it LGTM.

Thanks for having a look :). I added a fix for the nfs test that has
been failing forever before pushing.

Now the hurd test should be the only failing system test!

Thanks,

Mathieu
Closed
?