Message info
 
To:arch-releng@archlinux.org From:Gerardo Exequiel Pozzi Subject:[arch-releng] [DRAFT][RFC][PATCH][archiso] Add UEFI boot support via Linux >= 3.3 EFI boot stub. Date:Tue, 20 Mar 2012 12:59:00 -0300
 

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