[PATCH] image: Prefer gpt partition table for efi disk images

  • Done
  • quality assurance status badge
Details
2 participants
  • Josselin Poiret
  • Sergey Trofimov
Owner
unassigned
Submitted by
Sergey Trofimov
Severity
normal
S
S
Sergey Trofimov wrote on 16 Mar 2023 18:31
(address . guix-patches@gnu.org)(name . Sergey Trofimov)(address . sarg@sarg.org.ru)
20230316173137.25074-1-sarg@sarg.org.ru
Hi guix, I got curious, what the easiest way to migrate existing guix os to a
new machine could be, and I've came to a conclusion that `guix system image`
fits this scenario perfectly. So I've tried to run `guix system image
--image-type=efi-raw --persistent --save-provenance system.scm`, but the
resulting image contained MBR style partition table. Although MBR support is a
must for an UEFI implementor, a better choice would be to use GPT style table.

* gnu/system/image.scm (efi-disk-image): Use gpt partition-table-type.
(efi32-disk-image): Use gpt partition-table-type.
* gnu/tests/image.scm: Assert partition table type of efi-disk-image.
---
gnu/system/image.scm | 2 ++
gnu/tests/image.scm | 23 ++++++++++++++++++-----
2 files changed, 20 insertions(+), 5 deletions(-)

Toggle diff (75 lines)
diff --git a/gnu/system/image.scm b/gnu/system/image.scm
index afef79185f..5356ecd616 100644
--- a/gnu/system/image.scm
+++ b/gnu/system/image.scm
@@ -147,11 +147,13 @@ (define root-partition
(define efi-disk-image
(image-without-os
(format 'disk-image)
+ (partition-table-type 'gpt)
(partitions (list esp-partition root-partition))))
(define efi32-disk-image
(image-without-os
(format 'disk-image)
+ (partition-table-type 'gpt)
(partitions (list esp32-partition root-partition))))
(define iso9660-image
diff --git a/gnu/tests/image.scm b/gnu/tests/image.scm
index 99d34b7670..be6852cae0 100644
--- a/gnu/tests/image.scm
+++ b/gnu/tests/image.scm
@@ -20,7 +20,7 @@ (define-module (gnu tests image)
#:use-module (gnu)
#:use-module (gnu image)
#:use-module (gnu tests)
- #:autoload (gnu system image) (system-image root-offset)
+ #:autoload (gnu system image) (system-image root-offset image-with-os efi-disk-image)
#:use-module (gnu system uuid)
#:use-module (gnu system vm)
#:use-module (gnu packages guile)
@@ -153,6 +153,10 @@ (define i5
(flags '(boot))
(initializer dummy-initializer))))))
+;; A efi disk image with default partitions
+(define i6
+ (image-with-os efi-disk-image %simple-efi-os))
+
(define (run-images-test)
(define test
(with-imported-modules '((srfi srfi-64)
@@ -202,10 +206,10 @@ (define d2-device
(disk-get-primary-partition-count (disk-new d2-device)))
(test-equal "test"
- (let* ((disk (disk-new d2-device))
- (partitions (disk-partitions disk))
- (boot-partition (find normal-partition? partitions)))
- (partition-get-name boot-partition)))
+ (let* ((disk (disk-new d2-device))
+ (partitions (disk-partitions disk))
+ (boot-partition (find normal-partition? partitions)))
+ (partition-get-name boot-partition)))
;; Image i3.
(define i3-image
@@ -259,6 +263,15 @@ (define (sector->byte sector)
(filter data-partition?
(disk-partitions (disk-new d5-device)))))
+ ;; Image i6.
+ (define i6-image
+ #$(system-image i6))
+ (define d6-device
+ (get-device i6-image))
+
+ (test-equal "gpt"
+ (disk-type-name (disk-probe d6-device)))
+
(test-end)))))
(gexp->derivation "images-test" test))
--
2.39.2
J
J
Josselin Poiret wrote on 21 Mar 2023 22:41
(name . Sergey Trofimov)(address . sarg@sarg.org.ru)
87mt45rdcy.fsf@jpoiret.xyz
Hi Sergey,

Sergey Trofimov <sarg@sarg.org.ru> writes:

Toggle quote (7 lines)
> Hi guix, I got curious, what the easiest way to migrate existing guix os to a
> new machine could be, and I've came to a conclusion that `guix system image`
> fits this scenario perfectly. So I've tried to run `guix system image
> --image-type=efi-raw --persistent --save-provenance system.scm`, but the
> resulting image contained MBR style partition table. Although MBR support is a
> must for an UEFI implementor, a better choice would be to use GPT style table.

Thanks for the patch! First off, if you want to add a comment to your
mail but not to the commit message, you should add it below the first --
(under the commit message), before the diff, that way it doesn't end up
in the commit message.

With this applied, I cannot build an example qcow2 image using `guix
system image -t qcow2 gnu/system/examples/bare-bones.tmpl`. It fails
when installing GRUB onto the image. Sure enough, the
install-grub-disk-image procedure seems to only support MBR. Could you
also have a look at this?

Best,
--
Josselin Poiret
-----BEGIN PGP SIGNATURE-----

iQHEBAEBCAAuFiEEOSSM2EHGPMM23K8vUF5AuRYXGooFAmQaJJ0QHGRldkBqcG9p
cmV0Lnh5egAKCRBQXkC5Fhcaiv8YC/470ny/Qo4JeARKij0gKV4uwhHYYOtwB2r/
sqOZEHrqWi/zmZHJhm/CJtnqesyi3SVy9p/38TPdnXN6q06UU/OPQH1BMaF7QQNM
1LSCnImkCvvrpYHYu1tABz4UVnH3UqouYSrYEo8+Xujvnb2njniQgJWb9rrSuVjB
MwnMl0bqI6QtEisV7DVjMOyWWgIMHZkmavWOcn+A3ppmBDQ+vVF8QKbvdlpvF0+f
USG22Nl1ufslE/55F5S1p+rzR+DE1v46UXP/lWxtMhsTaBa4h37ldVe9weJsMLlM
2jKHYe6OvS8yHeqBn6NBxQy0oTnAQa952poJS7nAXAt5CG5QBOQKo1gWbOxtxDfe
HQ0NP1vmxdsxf0S3m0+DI7u9gXWiAK1nRNYy/XtD3DBIbYg2+pQgwuflIqZu2lC6
3a4BP+8cOVfJ4J5EHjoAVB6u1d0BFMhwI8bVTeumeP0RPhunSMYpbT3QHVA+lzYi
rpLTwfEhZ+gZlDJ/j8tLfrqf6vercWo=
=SMjj
-----END PGP SIGNATURE-----

S
S
Sergey Trofimov wrote on 22 Mar 2023 09:14
Tested locally
(address . 62223@debbugs.gnu.org)
87fs9x5h5x.fsf@sarg.org.ru
I have created an image and verified that it boots on qemu with
proper bios.
Then I've baked an image of my real system configuration and used
it to reprovision my laptop.

vm.scm
Toggle snippet (19 lines)
...
(bootloader
(bootloader-configuration
(bootloader grub-efi-bootloader)
(targets '("/boot"))))
(file-systems
(cons*
(file-system
(mount-point "/")
(device (file-system-label "Guix_image"))
(type "ext4"))
(file-system
(mount-point "/boot")
(device (file-system-label "GNU-ESP"))
(type "vfat"))
%base-file-systems))
...

testing it with:
Toggle snippet (6 lines)
guix system image --image-type=efi-raw vm.scm

qemu-system-x86_64 \
-bios $(guix build ovmf)/share/firmware/ovmf_x64.bin \
-drive file=$HOME/vm.img,if=virtio
S
S
Sergey Trofimov wrote on 22 Mar 2023 13:48
Re: [bug#62223] [PATCH] image: Prefer gpt partition table for efi disk images
(name . Josselin Poiret)(address . dev@jpoiret.xyz)(address . 62223@debbugs.gnu.org)
87a605c5lj.fsf@sarg.org.ru
Josselin Poiret <dev@jpoiret.xyz> writes:

Toggle quote (12 lines)
> [[PGP Signed Part:Undecided]]
> Hi Sergey,
>
> Thanks for the patch! First off, if you want to add a comment
> to your
> mail but not to the commit message, you should add it below the
> first --
> (under the commit message), before the diff, that way it doesn't
> end up
> in the commit message.
>

Thanks, noted.

Toggle quote (10 lines)
>
> With this applied, I cannot build an example qcow2 image using
> `guix
> system image -t qcow2 gnu/system/examples/bare-bones.tmpl`. It
> fails
> when installing GRUB onto the image. Sure enough, the
> install-grub-disk-image procedure seems to only support MBR.
> Could you
> also have a look at this?

Yeah, I'm glad you've caught that. qcow2 should be mbr style by
default. I'll send a v2 for that.
S
S
Sergey Trofimov wrote on 22 Mar 2023 13:53
[PATCH v2] image: Prefer gpt partition table for efi images
(address . 62223@debbugs.gnu.org)
20230322125328.23578-1-sarg@sarg.org.ru
* gnu/system/image.scm (efi-disk-image): Use gpt partition-table-type.
(efi32-disk-image): Use gpt partition-table-type.
(qcow2-image-type): Use mbr partition-table-type explicitly.
* gnu/tests/image.scm: Assert partition table type of efi-disk-image.
---
gnu/system/image.scm | 3 +++
gnu/tests/image.scm | 23 ++++++++++++++++++-----
2 files changed, 21 insertions(+), 5 deletions(-)

Toggle diff (83 lines)
diff --git a/gnu/system/image.scm b/gnu/system/image.scm
index afef79185f..699feaf05d 100644
--- a/gnu/system/image.scm
+++ b/gnu/system/image.scm
@@ -147,11 +147,13 @@ (define root-partition
(define efi-disk-image
(image-without-os
(format 'disk-image)
+ (partition-table-type 'gpt)
(partitions (list esp-partition root-partition))))
(define efi32-disk-image
(image-without-os
(format 'disk-image)
+ (partition-table-type 'gpt)
(partitions (list esp32-partition root-partition))))
(define iso9660-image
@@ -214,6 +216,7 @@ (define qcow2-image-type
(constructor (cut image-with-os
(image
(inherit efi-disk-image)
+ (partition-table-type 'mbr)
(name 'image.qcow2)
(format 'compressed-qcow2))
<>))))
diff --git a/gnu/tests/image.scm b/gnu/tests/image.scm
index 99d34b7670..be6852cae0 100644
--- a/gnu/tests/image.scm
+++ b/gnu/tests/image.scm
@@ -20,7 +20,7 @@ (define-module (gnu tests image)
#:use-module (gnu)
#:use-module (gnu image)
#:use-module (gnu tests)
- #:autoload (gnu system image) (system-image root-offset)
+ #:autoload (gnu system image) (system-image root-offset image-with-os efi-disk-image)
#:use-module (gnu system uuid)
#:use-module (gnu system vm)
#:use-module (gnu packages guile)
@@ -153,6 +153,10 @@ (define i5
(flags '(boot))
(initializer dummy-initializer))))))
+;; A efi disk image with default partitions
+(define i6
+ (image-with-os efi-disk-image %simple-efi-os))
+
(define (run-images-test)
(define test
(with-imported-modules '((srfi srfi-64)
@@ -202,10 +206,10 @@ (define d2-device
(disk-get-primary-partition-count (disk-new d2-device)))
(test-equal "test"
- (let* ((disk (disk-new d2-device))
- (partitions (disk-partitions disk))
- (boot-partition (find normal-partition? partitions)))
- (partition-get-name boot-partition)))
+ (let* ((disk (disk-new d2-device))
+ (partitions (disk-partitions disk))
+ (boot-partition (find normal-partition? partitions)))
+ (partition-get-name boot-partition)))
;; Image i3.
(define i3-image
@@ -259,6 +263,15 @@ (define (sector->byte sector)
(filter data-partition?
(disk-partitions (disk-new d5-device)))))
+ ;; Image i6.
+ (define i6-image
+ #$(system-image i6))
+ (define d6-device
+ (get-device i6-image))
+
+ (test-equal "gpt"
+ (disk-type-name (disk-probe d6-device)))
+
(test-end)))))
(gexp->derivation "images-test" test))
--
2.39.2
J
J
Josselin Poiret wrote on 7 Jul 2023 21:50
(name . Sergey Trofimov)(address . sarg@sarg.org.ru)
87bkgn7b79.fsf@jpoiret.xyz
Hi Sergey,

Sergey Trofimov <sarg@sarg.org.ru> writes:

Toggle quote (5 lines)
> * gnu/system/image.scm (efi-disk-image): Use gpt partition-table-type.
> (efi32-disk-image): Use gpt partition-table-type.
> (qcow2-image-type): Use mbr partition-table-type explicitly.
> * gnu/tests/image.scm: Assert partition table type of efi-disk-image.

Pushed as 209204e23b39af09e0ea92540b6fa00a60e6a0ae, thanks!

Best,
--
Josselin Poiret
-----BEGIN PGP SIGNATURE-----

iQHEBAEBCgAuFiEEOSSM2EHGPMM23K8vUF5AuRYXGooFAmSobIoQHGRldkBqcG9p
cmV0Lnh5egAKCRBQXkC5FhcaigdqC/9nrMS9CCTr/Wuy3eT5qsn7o+Df4PvAvpSO
5Ku0t0ETTUzOn7agdCUHcZUwaRSHZ9KSrM5CZiiJjDu1GdFP4bSJp4nHPuij+7d3
UeyGhqruWlhIR+tUuWcNVQNhXhnAB3mBcFWGT4ZbeZG14tXBKv19eicWc5BvhAUY
5gvCiEkin17DdrYwDnWsoIwsX66lqYzkaKmOK46iGtTgGuBgCfJEyp1DUKckJ+Xm
MrjjTvGGrRncN9MtFc1aVUWcyC52TFXFVn34cmi4+8no3lUYkpBZasjXWgYS8j8T
RLBV+qszNoJhyt5l9Ijfu6S18Q5esHr7N352sXRKjehzw68+3d44AH4Li7tO5YFO
Yjzw3KAUTsADSyNWErbdR9Z3+Bv9m360K4q/935k3CAe7aqJFVtV4RYnDdz8+nok
G7wjQaeSVDuzTh+54Z7YbXs3O0152nch5Wn0zgfLwwHpkNK0o38+36As30w03W7t
d+hUDZheY6jKWjQZ0p3DUwQjueLsDoU=
=ED5P
-----END PGP SIGNATURE-----

Closed
?