[arch-releng] [DRAFT][RFC][PATCH][archiso] Add UEFI boot support via Linux >= 3.3 EFI boot stub.

Gerardo Exequiel Pozzi vmlinuz386 at yahoo.com.ar
Tue Mar 20 11:59:00 EDT 2012


Support is only added to x86_64. This only works via (U)EFI shell. Boot with:

fs0:\EFI\linux\vmlinuz.efi archisolabel=ARCH_201203 initrd=\EFI\linux\archiso.img

There are plans to support command line options via a config file (not yet in linux-3.3),
in such case vmlinuz.efi can be renamed to bootia64.efi and placed to \EFI\boot to automatic boot.

---
 archiso/mkarchiso       |   11 ++++++++++-
 configs/releng/build.sh |   25 +++++++++++++++++++++++++
 2 files changed, 35 insertions(+), 1 deletion(-)

diff --git a/archiso/mkarchiso b/archiso/mkarchiso
index ad88b0b..208f7b6 100755
--- a/archiso/mkarchiso
+++ b/archiso/mkarchiso
@@ -380,6 +380,8 @@ command_checksum () {
 
 # Create an ISO9660 filesystem from "iso" directory.
 command_iso () {
+    local _iso_efi_boot_args
+
     if [[ ! -f "${work_dir}/iso/isolinux/isolinux.bin" ]]; then
          _msg_error "The file '${work_dir}/iso/isolinux/isolinux.bin' does not exist." 1
     fi
@@ -387,6 +389,12 @@ command_iso () {
          _msg_error "The file '${work_dir}/iso/isolinux/isohdpfx.bin' does not exist." 1
     fi
 
+    if [[ -d "${work_dir}/iso/EFI" ]]; then
+        _iso_efi_boot_args="-eltorito-alt-boot --efi-boot EFI/archiso/archiso.fat -no-emul-boot"
+    else
+        _iso_efi_boot_args=""
+    fi
+
     _show_config iso
 
     if _is_directory_changed "${work_dir}/iso" "${out_dir}/${img_name}"; then
@@ -398,9 +406,10 @@ command_iso () {
         fi
         xorriso -as mkisofs ${_qflag} -r -l \
             -b isolinux/isolinux.bin -c isolinux/boot.cat \
-            -iso-level 3 \
             -no-emul-boot -boot-load-size 4 -boot-info-table \
+            ${_iso_efi_boot_args} \
             -isohybrid-mbr ${work_dir}/iso/isolinux/isohdpfx.bin \
+            -iso-level 3 \
             -p "prepared by mkarchiso" \
             -publisher "${iso_publisher}" \
             -A "${iso_application}" \
diff --git a/configs/releng/build.sh b/configs/releng/build.sh
index 2faf210..f4ca11e 100755
--- a/configs/releng/build.sh
+++ b/configs/releng/build.sh
@@ -58,6 +58,29 @@ make_boot() {
     fi
 }
 
+# Prepare /EFI (using linux EFI boot stub)
+make_boot_efi() {
+    if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then
+        if [[ ${arch} == "x86_64" ]]; then
+            mkdir -p ${work_dir}/iso/EFI/linux
+            cp ${work_dir}/iso/${install_dir}/boot/x86_64/vmlinuz ${work_dir}/iso/EFI/linux/vmlinuz.efi
+            cp ${work_dir}/iso/${install_dir}/boot/x86_64/archiso.img ${work_dir}/iso/EFI/linux/archiso.img
+            # There are plans to support command line options via a config file (not yet in linux-3.3)
+            # echo "archisolabel=${iso_label} initrd=\EFI\linux\archiso.img" | iconv -f ascii -t ucs2 > ${work_dir}/iso/EFI/linux/vmlinuz.conf
+            mkdir -p ${work_dir}/iso/EFI/archiso
+            mkdir -p ${work_dir}/fat
+            dd of=${work_dir}/iso/EFI/archiso/archiso.fat bs=1 seek=32M count=0
+            mkfs.vfat ${work_dir}/iso/EFI/archiso/archiso.fat
+            mount ${work_dir}/iso/EFI/archiso/archiso.fat ${work_dir}/fat/
+            mkdir -p ${work_dir}/fat/EFI/linux
+            cp ${work_dir}/iso/EFI/linux/vmlinuz.efi ${work_dir}/fat/EFI/linux
+            cp ${work_dir}/iso/EFI/linux/archiso.img ${work_dir}/fat/EFI/linux
+            # cp ${work_dir}/iso/EFI/linux/vmlinuz.conf ${work_dir}/fat/EFI/linux
+            umount ${work_dir}/fat/
+        fi
+    fi
+}
+
 # Prepare /${install_dir}/boot/syslinux
 make_syslinux() {
     if [[ ! -e ${work_dir}/build.${FUNCNAME} ]]; then
@@ -155,6 +178,7 @@ make_core_repo() {
     fi
 }
 
+
 # Process aitab
 # args: $1 (core | netinstall)
 make_aitab() {
@@ -259,6 +283,7 @@ make_common_single() {
     make_packages
     make_setup_mkinitcpio
     make_boot
+    make_boot_efi
     make_syslinux
     make_isolinux
     make_customize_root_image
-- 
1.7.9.4



More information about the arch-releng mailing list