vm: Create installation media with MBR and HFS only, no GPT.
* gnu/build/vm.scm (make-iso9660-image): Accept XORRISO, GRUB-MKRESCUE-ENVIRONMENT. * gnu/system/vm.scm (iso9660-image): Pass XORRISO; accept GRUB-MKRESCUE-ENVIRONMENT. (system-disk-image): Pass GRUB-MKRESCUE-ENVIRONMENT. * gnu/packages/patches/xorriso-no-mbr-in-inner-efi.patch: New file. * gnu/packages/patches/xorriso-no-partition-table-in-inner-efi.patch: New file. * gnu/local.mk (dist_patch_DATA): Add them. * gnu/packages/cdrom.scm (xorriso)[source]: Add patches. [arguments]<#:phases>[install-frontends]: Add phase.
This commit is contained in:
parent
08eafef865
commit
1d86b05618
|
@ -423,7 +423,8 @@ SYSTEM-DIRECTORY is the name of the directory of the 'system' derivation."
|
||||||
;; Graft the configuration file onto the image.
|
;; Graft the configuration file onto the image.
|
||||||
(string-append "boot/grub/grub.cfg=" config-file))))
|
(string-append "boot/grub/grub.cfg=" config-file))))
|
||||||
|
|
||||||
(define* (make-iso9660-image grub config-file os-drv target
|
(define* (make-iso9660-image xorriso grub-mkrescue-environment
|
||||||
|
grub config-file os-drv target
|
||||||
#:key (volume-id "Guix_image") (volume-uuid #f)
|
#:key (volume-id "Guix_image") (volume-uuid #f)
|
||||||
register-closures? (closures '()))
|
register-closures? (closures '()))
|
||||||
"Given a GRUB package, creates an iso image as TARGET, using CONFIG-FILE as
|
"Given a GRUB package, creates an iso image as TARGET, using CONFIG-FILE as
|
||||||
|
@ -431,6 +432,9 @@ GRUB configuration and OS-DRV as the stuff in it."
|
||||||
(define grub-mkrescue
|
(define grub-mkrescue
|
||||||
(string-append grub "/bin/grub-mkrescue"))
|
(string-append grub "/bin/grub-mkrescue"))
|
||||||
|
|
||||||
|
(define grub-mkrescue-sed.sh
|
||||||
|
(string-append xorriso "/bin/grub-mkrescue-sed.sh"))
|
||||||
|
|
||||||
(define target-store
|
(define target-store
|
||||||
(string-append "/tmp/root" (%store-directory)))
|
(string-append "/tmp/root" (%store-directory)))
|
||||||
|
|
||||||
|
@ -483,9 +487,19 @@ GRUB configuration and OS-DRV as the stuff in it."
|
||||||
#x77777777)
|
#x77777777)
|
||||||
16))
|
16))
|
||||||
|
|
||||||
|
(setenv "MKRESCUE_SED_MODE" "original")
|
||||||
|
(setenv "MKRESCUE_SED_XORRISO" (string-append xorriso
|
||||||
|
"/bin/xorriso"))
|
||||||
|
(setenv "MKRESCUE_SED_IN_EFI_NO_PT" "yes")
|
||||||
|
(for-each (match-lambda
|
||||||
|
((name . value) (setenv name value)))
|
||||||
|
grub-mkrescue-environment)
|
||||||
|
|
||||||
(let ((pipe
|
(let ((pipe
|
||||||
(apply open-pipe* OPEN_WRITE
|
(apply open-pipe* OPEN_WRITE
|
||||||
grub-mkrescue "-o" target
|
grub-mkrescue
|
||||||
|
(string-append "--xorriso=" grub-mkrescue-sed.sh)
|
||||||
|
"-o" target
|
||||||
(string-append "boot/grub/grub.cfg=" config-file)
|
(string-append "boot/grub/grub.cfg=" config-file)
|
||||||
"etc=/tmp/root/etc"
|
"etc=/tmp/root/etc"
|
||||||
"var=/tmp/root/var"
|
"var=/tmp/root/var"
|
||||||
|
|
|
@ -1372,7 +1372,9 @@ dist_patch_DATA = \
|
||||||
%D%/packages/patches/xfce4-session-fix-xflock4.patch \
|
%D%/packages/patches/xfce4-session-fix-xflock4.patch \
|
||||||
%D%/packages/patches/xfce4-settings-defaults.patch \
|
%D%/packages/patches/xfce4-settings-defaults.patch \
|
||||||
%D%/packages/patches/xinetd-fix-fd-leak.patch \
|
%D%/packages/patches/xinetd-fix-fd-leak.patch \
|
||||||
%D%/packages/patches/xinetd-CVE-2013-4342.patch
|
%D%/packages/patches/xinetd-CVE-2013-4342.patch \
|
||||||
|
%D%/packages/patches/xorriso-no-partition-table-in-inner-efi.patch \
|
||||||
|
%D%/packages/patches/xorriso-no-mbr-in-inner-efi.patch
|
||||||
|
|
||||||
MISC_DISTRO_FILES = \
|
MISC_DISTRO_FILES = \
|
||||||
%D%/packages/ld-wrapper.in
|
%D%/packages/ld-wrapper.in
|
||||||
|
|
|
@ -162,8 +162,20 @@ libcdio.")
|
||||||
version ".tar.gz"))
|
version ".tar.gz"))
|
||||||
(sha256
|
(sha256
|
||||||
(base32
|
(base32
|
||||||
"0aq6lvlwlkxz56l5sbvgycr6j5c82ch2bv6zrnc2345ibfpafgx9"))))
|
"0aq6lvlwlkxz56l5sbvgycr6j5c82ch2bv6zrnc2345ibfpafgx9"))
|
||||||
|
(patches
|
||||||
|
(search-patches "xorriso-no-partition-table-in-inner-efi.patch"
|
||||||
|
"xorriso-no-mbr-in-inner-efi.patch"))))
|
||||||
(build-system gnu-build-system)
|
(build-system gnu-build-system)
|
||||||
|
(arguments
|
||||||
|
`(#:phases
|
||||||
|
(modify-phases %standard-phases
|
||||||
|
(add-after 'install 'install-frontends
|
||||||
|
(lambda* (#:key outputs #:allow-other-keys)
|
||||||
|
(let* ((out (assoc-ref outputs "out"))
|
||||||
|
(out-bin (string-append out "/bin")))
|
||||||
|
(install-file "frontend/grub-mkrescue-sed.sh" out-bin)
|
||||||
|
#t))))))
|
||||||
(inputs
|
(inputs
|
||||||
`(("acl" ,acl)
|
`(("acl" ,acl)
|
||||||
("readline" ,readline)
|
("readline" ,readline)
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
https://dev.lovelyhq.com/libburnia/libisoburn/commit/1eb51f44dadb8b6c5f87533ca357186cdc1ac625
|
||||||
|
diff --git a/frontend/grub-mkrescue-sed.sh b/frontend/grub-mkrescue-sed.sh
|
||||||
|
index b3948c99..dcd9d696 100755
|
||||||
|
--- a/frontend/grub-mkrescue-sed.sh
|
||||||
|
+++ b/frontend/grub-mkrescue-sed.sh
|
||||||
|
@@ -120,6 +120,7 @@ fi
|
||||||
|
# "yes" overwrites the MBR partition table area in the EFI boot image by zeros.
|
||||||
|
# Some EFI implementations get stuck when seeing in the EFI partition a
|
||||||
|
# partition table entry which begins at LBA 0.
|
||||||
|
+# "extra" not only zeros the partition table but also the MBR signature.
|
||||||
|
efi_zero_inner_pt=no
|
||||||
|
if test -n "$MKRESCUE_SED_IN_EFI_NO_PT"
|
||||||
|
then
|
||||||
|
@@ -192,24 +193,31 @@ then
|
||||||
|
find "$dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
-if test "$efi_zero_inner_pt" = yes
|
||||||
|
+if test "$efi_zero_inner_pt" = yes -o "$efi_zero_inner_pt" = extra
|
||||||
|
then
|
||||||
|
did_dd=0
|
||||||
|
if test -e "$dir"/efi.img
|
||||||
|
then
|
||||||
|
+ # Look for 0x55 0xAA in bytes 510 and 511
|
||||||
|
magic=$(dd bs=1 skip=510 count=2 if="$dir"/efi.img 2>/dev/null | \
|
||||||
|
od -c | head -1 | awk '{print $2 " " $3}')
|
||||||
|
if test "$magic" = "U 252"
|
||||||
|
then
|
||||||
|
+ echo "Performing actions for MKRESCUE_SED_IN_EFI_NO_PT=$efi_zero_inner_pt" >&2
|
||||||
|
dd if=/dev/zero bs=1 seek=446 count=64 conv=notrunc of="$dir"/efi.img
|
||||||
|
did_dd=1
|
||||||
|
+ if test "$efi_zero_inner_pt" = extra
|
||||||
|
+ then
|
||||||
|
+ dd if=/dev/zero bs=1 seek=510 count=2 conv=notrunc of="$dir"/efi.img
|
||||||
|
+ fi
|
||||||
|
+ echo >&2
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
if test "$did_dd" = 0
|
||||||
|
then
|
||||||
|
echo >&2
|
||||||
|
echo "$0 : NOTE : No EFI image found or no MBR signature in it." >&2
|
||||||
|
- echo "$0 : NOTE : Will not obey MKRESCUE_SED_IN_EFI_NO_PT=yes" >&2
|
||||||
|
+ echo "$0 : NOTE : Will not obey MKRESCUE_SED_IN_EFI_NO_PT=$efi_zero_inner_pt" >&2
|
||||||
|
echo >&2
|
||||||
|
fi
|
||||||
|
fi
|
|
@ -0,0 +1,107 @@
|
||||||
|
https://dev.lovelyhq.com/libburnia/libisoburn/commit/3a2a3ba737a06162c22ace0ae09d33ba97aa2673
|
||||||
|
diff --git a/frontend/grub-mkrescue-sed.sh b/frontend/grub-mkrescue-sed.sh
|
||||||
|
index d772ff22..b3948c99 100755
|
||||||
|
--- a/frontend/grub-mkrescue-sed.sh
|
||||||
|
+++ b/frontend/grub-mkrescue-sed.sh
|
||||||
|
@@ -1,6 +1,6 @@
|
||||||
|
#!/bin/sh
|
||||||
|
|
||||||
|
-# Copyright (C) 2015 - 2016
|
||||||
|
+# Copyright (C) 2015 - 2019
|
||||||
|
# Thomas Schmitt <scdbackup@gmx.net>, libburnia-project.org
|
||||||
|
# Provided under BSD license: Use, modify, and distribute as you like.
|
||||||
|
|
||||||
|
@@ -117,6 +117,15 @@ fi
|
||||||
|
# command line.)
|
||||||
|
# Each argument must be a single word. No whitespace. No quotation marks.
|
||||||
|
|
||||||
|
+# "yes" overwrites the MBR partition table area in the EFI boot image by zeros.
|
||||||
|
+# Some EFI implementations get stuck when seeing in the EFI partition a
|
||||||
|
+# partition table entry which begins at LBA 0.
|
||||||
|
+efi_zero_inner_pt=no
|
||||||
|
+if test -n "$MKRESCUE_SED_IN_EFI_NO_PT"
|
||||||
|
+then
|
||||||
|
+ efi_zero_inner_pt="$MKRESCUE_SED_IN_EFI_NO_PT"
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
|
||||||
|
#
|
||||||
|
# Do the work
|
||||||
|
@@ -183,12 +192,48 @@ then
|
||||||
|
find "$dir"
|
||||||
|
fi
|
||||||
|
|
||||||
|
+if test "$efi_zero_inner_pt" = yes
|
||||||
|
+then
|
||||||
|
+ did_dd=0
|
||||||
|
+ if test -e "$dir"/efi.img
|
||||||
|
+ then
|
||||||
|
+ magic=$(dd bs=1 skip=510 count=2 if="$dir"/efi.img 2>/dev/null | \
|
||||||
|
+ od -c | head -1 | awk '{print $2 " " $3}')
|
||||||
|
+ if test "$magic" = "U 252"
|
||||||
|
+ then
|
||||||
|
+ dd if=/dev/zero bs=1 seek=446 count=64 conv=notrunc of="$dir"/efi.img
|
||||||
|
+ did_dd=1
|
||||||
|
+ fi
|
||||||
|
+ fi
|
||||||
|
+ if test "$did_dd" = 0
|
||||||
|
+ then
|
||||||
|
+ echo >&2
|
||||||
|
+ echo "$0 : NOTE : No EFI image found or no MBR signature in it." >&2
|
||||||
|
+ echo "$0 : NOTE : Will not obey MKRESCUE_SED_IN_EFI_NO_PT=yes" >&2
|
||||||
|
+ echo >&2
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
efi_tmp_name=
|
||||||
|
+if test x"$mode" = xmjg \
|
||||||
|
+ -o x"$mode" = xmbr_only \
|
||||||
|
+ -o x"$mode" = xgpt_appended \
|
||||||
|
+ -o x"$mode" = xmbr_hfs
|
||||||
|
+then
|
||||||
|
+ # Move EFI partition image file out of the "$dir" tree, i.e. out of the ISO
|
||||||
|
+ efi_tmp_name=grub-mkrescue-sed-efi-img.$$
|
||||||
|
+ if test -e "$dir"/efi.img
|
||||||
|
+ then
|
||||||
|
+ mv "$dir"/efi.img /tmp/$efi_tmp_name
|
||||||
|
+ elif test -e /tmp/$efi_tmp_name
|
||||||
|
+ then
|
||||||
|
+ rm /tmp/$efi_tmp_name
|
||||||
|
+ fi
|
||||||
|
+fi
|
||||||
|
+
|
||||||
|
if test x"$mode" = xmjg
|
||||||
|
then
|
||||||
|
# Exchange arguments for the experimental GRUB2 mjg layout
|
||||||
|
- efi_tmp_name=grub-mkrescue-sed-efi-img.$$
|
||||||
|
- mv "$dir"/efi.img /tmp/$efi_tmp_name
|
||||||
|
x=$(echo " $*" | sed \
|
||||||
|
-e "s/-efi-boot-part --efi-boot-image/-no-pad -append_partition $partno 0xef \/tmp\/$efi_tmp_name/" \
|
||||||
|
-e "s/--efi-boot efi\.img/-eltorito-alt-boot -e --interval:appended_partition_${partno}:all:: -no-emul-boot -isohybrid-gpt-basdat/" \
|
||||||
|
@@ -207,8 +252,6 @@ then
|
||||||
|
elif test x"$mode" = xmbr_only
|
||||||
|
then
|
||||||
|
# Exchange arguments for no-HFS MBR-only layout
|
||||||
|
- efi_tmp_name=grub-mkrescue-sed-efi-img.$$
|
||||||
|
- mv "$dir"/efi.img /tmp/$efi_tmp_name
|
||||||
|
x=$(echo " $*" | sed \
|
||||||
|
-e "s/-efi-boot-part --efi-boot-image/$iso_mbr_part_type -no-pad -append_partition 2 0xef \/tmp\/$efi_tmp_name/" \
|
||||||
|
-e "s/--efi-boot efi\.img/-eltorito-alt-boot -e --interval:appended_partition_2:all:: -no-emul-boot/" \
|
||||||
|
@@ -228,8 +271,6 @@ then
|
||||||
|
elif test x"$mode" = xmbr_hfs
|
||||||
|
then
|
||||||
|
# Exchange arguments for MBR and HFS+ layout
|
||||||
|
- efi_tmp_name=grub-mkrescue-sed-efi-img.$$
|
||||||
|
- mv "$dir"/efi.img /tmp/$efi_tmp_name
|
||||||
|
x=$(echo " $*" | sed \
|
||||||
|
-e "s/-efi-boot-part --efi-boot-image/$iso_mbr_part_type -no-pad -append_partition 2 0xef \/tmp\/$efi_tmp_name/" \
|
||||||
|
-e "s/--efi-boot efi\.img/-eltorito-alt-boot -e --interval:appended_partition_2:all:: -no-emul-boot/" \
|
||||||
|
@@ -247,8 +288,6 @@ then
|
||||||
|
elif test x"$mode" = xgpt_appended
|
||||||
|
then
|
||||||
|
# Exchange arguments for no-HFS MBR-only layout
|
||||||
|
- efi_tmp_name=grub-mkrescue-sed-efi-img.$$
|
||||||
|
- mv "$dir"/efi.img /tmp/$efi_tmp_name
|
||||||
|
x=$(echo " $*" | sed \
|
||||||
|
-e "s/-efi-boot-part --efi-boot-image/-no-pad -append_partition 2 0xef \/tmp\/$efi_tmp_name -appended_part_as_gpt -partition_offset 16/" \
|
||||||
|
-e "s/--efi-boot efi\.img/-eltorito-alt-boot -e --interval:appended_partition_2:all:: -no-emul-boot/" \
|
|
@ -266,7 +266,8 @@ made available under the /xchg CIFS share."
|
||||||
bootcfg-drv
|
bootcfg-drv
|
||||||
bootloader
|
bootloader
|
||||||
(register-closures? (has-guix-service-type? os))
|
(register-closures? (has-guix-service-type? os))
|
||||||
(inputs '()))
|
(inputs '())
|
||||||
|
(grub-mkrescue-environment '()))
|
||||||
"Return a bootable, stand-alone iso9660 image.
|
"Return a bootable, stand-alone iso9660 image.
|
||||||
|
|
||||||
INPUTS is a list of inputs (as for packages)."
|
INPUTS is a list of inputs (as for packages)."
|
||||||
|
@ -313,7 +314,9 @@ INPUTS is a list of inputs (as for packages)."
|
||||||
inputs)))
|
inputs)))
|
||||||
|
|
||||||
(set-path-environment-variable "PATH" '("bin" "sbin") inputs)
|
(set-path-environment-variable "PATH" '("bin" "sbin") inputs)
|
||||||
(make-iso9660-image #$(bootloader-package bootloader)
|
(make-iso9660-image #$xorriso
|
||||||
|
'#$grub-mkrescue-environment
|
||||||
|
#$(bootloader-package bootloader)
|
||||||
#$bootcfg-drv
|
#$bootcfg-drv
|
||||||
#$os
|
#$os
|
||||||
"/xchg/guixsd.iso"
|
"/xchg/guixsd.iso"
|
||||||
|
@ -704,7 +707,9 @@ to USB sticks meant to be read-only."
|
||||||
#:bootloader (bootloader-configuration-bootloader
|
#:bootloader (bootloader-configuration-bootloader
|
||||||
(operating-system-bootloader os))
|
(operating-system-bootloader os))
|
||||||
#:inputs `(("system" ,os)
|
#:inputs `(("system" ,os)
|
||||||
("bootcfg" ,bootcfg)))
|
("bootcfg" ,bootcfg))
|
||||||
|
#:grub-mkrescue-environment
|
||||||
|
'(("MKRESCUE_SED_MODE" . "mbr_hfs")))
|
||||||
(qemu-image #:name name
|
(qemu-image #:name name
|
||||||
#:os os
|
#:os os
|
||||||
#:bootcfg-drv bootcfg
|
#:bootcfg-drv bootcfg
|
||||||
|
|
Loading…
Reference in New Issue