#!/usr/bin/env bash # Script for updating existing Archboot iso with newer UEFI shell, rEFInd, and /arch/setup script in the initramfs files # Contributed by "Keshav Padram Amburay" # change to english locale! export LANG="en_US" [[ -z "${_REMOVE_x86_64}" ]] && _REMOVE_x86_64="0" [[ -z "${_REMOVE_PACKAGES}" ]] && _REMOVE_PACKAGES="0" [[ -z "${_UPDATE_CD_UEFI}" ]] && _UPDATE_CD_UEFI="0" [[ -z "${_UPDATE_SETUP}" ]] && _UPDATE_SETUP="0" [[ -z "${_UPDATE_UEFI_PREBOOTLOADER}" ]] && _UPDATE_UEFI_PREBOOTLOADER="1" [[ -z "${_UPDATE_UEFI_LOCKDOWN_MS}" ]] && _UPDATE_UEFI_LOCKDOWN_MS="1" [[ -z "${_UPDATE_UEFI_SHELL}" ]] && _UPDATE_UEFI_SHELL="1" [[ -z "${_UPDATE_UEFI_GUMMIBOOT}" ]] && _UPDATE_UEFI_GUMMIBOOT="1" [[ -z "${_UPDATE_UEFI_X64_GRUB}" ]] && _UPDATE_UEFI_X64_GRUB="1" [[ -z "${_UPDATE_UEFI_IA32_GRUB}" ]] && _UPDATE_UEFI_IA32_GRUB="1" [[ -z "${_UPDATE_UEFI_IA32_SYSLINUX}" ]] && _UPDATE_UEFI_IA32_SYSLINUX="1" [[ -z "${_UPDATE_SYSLINUX_BIOS}" ]] && _UPDATE_SYSLINUX_BIOS="0" [[ -z "${_UPDATE_SYSLINUX_BIOS_CONFIG}" ]] && _UPDATE_SYSLINUX_BIOS_CONFIG="1" [[ "${_UPDATE_SYSLINUX_BIOS}" == "1" ]] && _UPDATE_SYSLINUX_BIOS_CONFIG="1" [[ -z "${_CARCH}" ]] && _CARCH="x86_64" if [[ "${_CARCH}" == "x86_64" ]]; then _UEFI_ARCH="X64" _SPEC_UEFI_ARCH="x64" else _UEFI_ARCH="IA32" _SPEC_UEFI_ARCH="ia32" fi ############################# _BASENAME="$(basename "${0}")" _ARCHBOOT_ISO_OLD_PATH="${1}" _ARCHBOOT_ISO_WD="$(dirname "${_ARCHBOOT_ISO_OLD_PATH}")" _ARCHBOOT_ISO_OLD_NAME="$(basename "${_ARCHBOOT_ISO_OLD_PATH}" | sed 's|\.iso||g')" _ARCHBOOT_ISO_EXT_DIR="$(mktemp -d /var/tmp/archboot_iso_ext.XXXXXXXXXX)" ############################# _ARCHBOOT_ISO_UPDATED_NAME="${_ARCHBOOT_ISO_OLD_NAME}-updated-x86_64" [[ "${_UPDATE_CD_UEFI}" == "1" ]] && _ARCHBOOT_ISO_UPDATED_NAME="${_ARCHBOOT_ISO_OLD_NAME}"-updated-x86_64-uefi [[ "${_REMOVE_PACKAGES}" == "1" ]] && _ARCHBOOT_ISO_UPDATED_NAME="${_ARCHBOOT_ISO_OLD_NAME}"-updated-x86_64-network [[ "${_REMOVE_PACKAGES}" == "1" && "${_UPDATE_CD_UEFI}" == "1" ]] && _ARCHBOOT_ISO_UPDATED_NAME="${_ARCHBOOT_ISO_OLD_NAME}"-updated-x86_64-uefi-network _ARCHBOOT_ISO_UPDATED_PATH="${_ARCHBOOT_ISO_WD}/${_ARCHBOOT_ISO_UPDATED_NAME}.iso" ############################# echo if [[ -z "${1}" ]]; then echo echo "Usage: ${_BASENAME} " echo echo "Example: ${_BASENAME} /home/user/Desktop/archlinux-2012.12-1-archboot.iso" echo echo "Updated iso will be saved at /home/user/Desktop/archlinux-2012.12-1-archboot_updated.iso " echo "(for example)." echo echo "This script should be run as root user." echo exit 0 fi ### check for root if ! [[ ${UID} -eq 0 ]]; then echo "ERROR: Please run as root user!" exit 1 fi ### check for available loop devices in a container for i in $(seq 0 7); do ! [[ -e /dev/loop$i ]] && mknod /dev/loop$i b 7 $i done ! [[ -e /dev/loop-control ]] && mknod /dev/loop-control c 10 237 set -x ## Remove old files rm -f "${_ARCHBOOT_ISO_UPDATED_PATH}" || true echo cd "${_ARCHBOOT_ISO_EXT_DIR}/" echo ## Extract the archboot iso using bsdtar bsdtar -C "${_ARCHBOOT_ISO_EXT_DIR}/" -xf "${_ARCHBOOT_ISO_OLD_PATH}" # 7z x -o "${_ARCHBOOT_ISO_EXT_DIR}/" "${_ARCHBOOT_ISO_OLD_PATH}" echo rm -rf "${_ARCHBOOT_ISO_EXT_DIR}/[BOOT]/" || true echo [[ -e "${_ARCHBOOT_ISO_WD}/splash.png" ]] && cp -f "${_ARCHBOOT_ISO_WD}/splash.png" "${_ARCHBOOT_ISO_EXT_DIR}/boot/syslinux/splash.png" echo _update_uefi_prebootloader_files() { rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/BOOTX64.EFI" || true rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/HashTool.efi" || true rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/KeyTool.efi" || true cp -f "/usr/share/efitools/efi/PreLoader.efi" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/BOOTX64.EFI" cp -f "/usr/share/efitools/efi/HashTool.efi" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/HashTool.efi" cp -f "/usr/share/efitools/efi/KeyTool.efi" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/KeyTool.efi" } _update_uefi_lockdown_ms_files() { rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/LockDown_ms.efi" || true cp -f "/usr/lib/lockdown-ms/LockDown_ms.efi" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/LockDown_ms.efi" } _update_syslinux_iso_files() { rm -f "${_ARCHBOOT_ISO_EXT_DIR}/boot/syslinux"/*.{com,bin,c32} || true cp -f "/usr/lib/syslinux"/bios/*.{com,bin,c32} "${_ARCHBOOT_ISO_EXT_DIR}/boot/syslinux/" } _update_syslinux_iso_config() { rm -f "${_ARCHBOOT_ISO_EXT_DIR}/boot/syslinux/syslinux.cfg" || true cat << EOF > "${_ARCHBOOT_ISO_EXT_DIR}/boot/syslinux/syslinux.cfg" SERIAL 0 38400 DEFAULT vesamenu.c32 PROMPT 0 MENU TITLE Arch Linux (archboot) MENU BACKGROUND splash.png TIMEOUT 300 F1 boot.msg F2 options.msg MENU WIDTH 78 MENU MARGIN 4 MENU ROWS 10 MENU VSHIFT 9 MENU TIMEOUTROW 15 MENU TABMSGROW 16 MENU CMDLINEROW 17 MENU HELPMSGROW 18 MENU HELPMSGENDROW -1 # Refer to http://syslinux.zytor.com/wiki/index.php/Doc/menu MENU COLOR border 30;44 #40ffffff #a0000000 std MENU COLOR title 1;36;44 #9033ccff #a0000000 std MENU COLOR sel 7;37;40 #e0ffffff #20ffffff all MENU COLOR unsel 37;44 #50ffffff #a0000000 std MENU COLOR help 37;40 #c0ffffff #a0000000 std MENU COLOR timeout_msg 37;40 #80ffffff #00000000 std MENU COLOR timeout 1;37;40 #c0ffffff #00000000 std MENU COLOR msg07 37;40 #90ffffff #a0000000 std MENU COLOR tabmsg 31;40 #30ffffff #00000000 std LABEL help TEXT HELP For general information press F1 key. For troubleshooting and other options press F2 key. ENDTEXT MENU LABEL Help LABEL arch64 TEXT HELP Boot the Arch Linux (x86_64) archboot medium. It allows you to install Arch Linux or perform system maintenance. ENDTEXT MENU LABEL Boot Arch Linux (x86_64) LINUX /boot/vmlinuz_x86_64 APPEND cgroup_disable=memory rootdelay=10 rootfstype=ramfs INITRD /boot/intel-ucode.img,/boot/amd-ucode.img,/boot/initramfs_x86_64.img LABEL existing TEXT HELP Boot an existing operating system. Press TAB to edit the disk and partition number to boot. ENDTEXT MENU LABEL Boot existing OS COM32 chain.c32 APPEND hd0 0 # http://www.memtest.org/ LABEL memtest MENU LABEL Run Memtest86+ (RAM test) LINUX /boot/memtest LABEL hdt MENU LABEL Run HDT (Hardware Detection Tool) COM32 hdt.c32 LABEL reboot MENU LABEL Reboot COM32 reboot.c32 LABEL poweroff MENU LABEL Power Off COMBOOT poweroff.com ONTIMEOUT arch64 EOF } _download_uefi_shell_tianocore() { mkdir -p "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/" if [[ -e "/usr/share/uefi-shell/shellx64_v2.efi" ]]; then rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v2.efi" || true cp -f "/usr/share/uefi-shell/shellx64_v2.efi" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v2.efi" else ## Download Tianocore UDK/EDK2 ShellBinPkg UEFI X64 "Full Shell" - For UEFI Spec. >=2.3 systems curl --verbose -f -C - --ftp-pasv --retry 3 --retry-delay 3 -o "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v2.efi.temp" "https://raw.githubusercontent.com/tianocore/edk2/master/ShellBinPkg/UefiShell/X64/Shell.efi" || true echo if [[ "$(file "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v2.efi.temp" | grep 'executable')" ]]; then rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v2.efi" || true mv "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v2.efi.temp" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v2.efi" || true fi fi ## Download Tianocore UDK/EDK2 EdkShellBinPkg UEFI X64 "Full Shell" - For Spec. Ver. <2.3 systems curl --verbose -f -C - --ftp-pasv --retry 3 --retry-delay 3 -o "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v1.efi.temp" "https://raw.githubusercontent.com/tianocore/edk2/master/EdkShellBinPkg/FullShell/X64/Shell_Full.efi" || true echo if [[ "$(file "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v1.efi.temp" | grep 'executable')" ]]; then rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v1.efi" || true mv "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v1.efi.temp" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellx64_v1.efi" || true fi if [[ -e "/usr/share/uefi-shell/shellia32_v2.efi" ]]; then rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v2.efi" || true cp -f "/usr/share/uefi-shell/shellia32_v2.efi" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v2.efi" else ## Download Tianocore UDK/EDK2 ShellBinPkg UEFI IA32 "Full Shell" - For UEFI Spec. >=2.3 systems curl --verbose -f -C - --ftp-pasv --retry 3 --retry-delay 3 -o "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v2.efi.temp" "https://raw.githubusercontent.com/tianocore/edk2/master/ShellBinPkg/UefiShell/Ia32/Shell.efi" || true echo if [[ "$(file "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v2.efi.temp" | grep 'executable')" ]]; then rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v2.efi" || true mv "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v2.efi.temp" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v2.efi" || true fi fi ## Download Tianocore UDK/EDK2 EdkShellBinPkg UEFI IA32 "Full Shell" - For Spec. Ver. <2.3 systems curl --verbose -f -C - --ftp-pasv --retry 3 --retry-delay 3 -o "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v1.efi.temp" "https://raw.githubusercontent.com/tianocore/edk2/master/EdkShellBinPkg/FullShell/Ia32/Shell_Full.efi" || true echo if [[ "$(file "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v1.efi.temp" | grep 'executable')" ]]; then rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v1.efi" || true mv "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v1.efi.temp" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/tools/shellia32_v1.efi" || true fi } _update_uefi_gummiboot_USB_files() { mkdir -p "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT" rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/loader.efi" || true cp -f "/usr/lib/systemd/boot/efi/systemd-bootx64.efi" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/loader.efi" rm -rf "${_ARCHBOOT_ISO_EXT_DIR}/loader" || true mkdir -p "${_ARCHBOOT_ISO_EXT_DIR}/loader/entries" cat << GUMEOF > "${_ARCHBOOT_ISO_EXT_DIR}/loader/loader.conf" timeout 4 default default-* GUMEOF cat << GUMEOF > "${_ARCHBOOT_ISO_EXT_DIR}/loader/entries/archboot-x86_64-efistub.conf" title Arch Linux x86_64 Archboot EFISTUB linux /boot/vmlinuz_x86_64 initrd /boot/intel-ucode.img initrd /boot/amd-ucode.img initrd /boot/initramfs_x86_64.img options cgroup_disable=memory add_efi_memmap _X64_UEFI=1 rootfstype=ramfs architecture x64 GUMEOF cat << GUMEOF > "${_ARCHBOOT_ISO_EXT_DIR}/loader/entries/uefi-shell-x64-v2.conf" title UEFI Shell X64 v2 efi /EFI/tools/shellx64_v2.efi architecture x64 GUMEOF cat << GUMEOF > "${_ARCHBOOT_ISO_EXT_DIR}/loader/entries/uefi-shell-x64-v1.conf" title UEFI Shell X64 v1 efi /EFI/tools/shellx64_v1.efi architecture x64 GUMEOF cat << GUMEOF > "${_ARCHBOOT_ISO_EXT_DIR}/loader/entries/grub-x64-gummiboot.conf" title GRUB X64 - if EFISTUB boot fails efi /EFI/grub/grubx64.efi architecture x64 GUMEOF mv "${_ARCHBOOT_ISO_EXT_DIR}/loader/entries/archboot-x86_64-efistub.conf" "${_ARCHBOOT_ISO_EXT_DIR}/loader/entries/default-x64.conf" } _update_uefi_X64_GRUB_USB_files() { mkdir -p "${_ARCHBOOT_ISO_EXT_DIR}/EFI/grub" rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/grub/grubx64.efi" || true rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/grub/grubx64.cfg" || true echo echo 'configfile ${cmdpath}/grubx64.cfg' > /var/tmp/grubx64.cfg grub-mkstandalone -d /usr/lib/grub/x86_64-efi/ -O x86_64-efi --modules="part_gpt part_msdos" --fonts="unicode" --locales="en@quot" --themes="" -o "${_ARCHBOOT_ISO_EXT_DIR}/EFI/grub/grubx64.efi" "boot/grub/grub.cfg=/var/tmp/grubx64.cfg" -v cat << GRUBEOF > "${_ARCHBOOT_ISO_EXT_DIR}/EFI/grub/grubx64.cfg" insmod part_gpt insmod part_msdos insmod fat insmod efi_gop insmod efi_uga insmod video_bochs insmod video_cirrus insmod font if loadfont "${prefix}/fonts/unicode.pf2" ; then insmod gfxterm set gfxmode="1366x768x32;1280x800x32;1024x768x32;auto" terminal_input console terminal_output gfxterm fi set default="Arch Linux x86_64 Archboot Non-EFISTUB" set timeout="2" menuentry "Arch Linux x86_64 Archboot Non-EFISTUB" { set gfxpayload=keep search --no-floppy --set=root --file /boot/vmlinuz_x86_64 linux /boot/vmlinuz_x86_64 cgroup_disable=memory add_efi_memmap _X64_UEFI=1 rootfstype=ramfs initrd /boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs_x86_64.img } menuentry "UEFI Shell X64 v2" { search --no-floppy --set=root --file /EFI/tools/shellx64_v2.efi chainloader /EFI/tools/shellx64_v2.efi } menuentry "UEFI Shell X64 v1" { search --no-floppy --set=root --file /EFI/tools/shellx64_v1.efi chainloader /EFI/tools/shellx64_v1.efi } menuentry "Exit GRUB" { exit } GRUBEOF } _update_uefi_IA32_GRUB_USB_files() { mkdir -p "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT" rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/BOOTIA32.EFI" || true rm -f "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/bootia32.cfg" || true echo echo 'configfile ${cmdpath}/bootia32.cfg' > /var/tmp/bootia32.cfg grub-mkstandalone -d /usr/lib/grub/i386-efi/ -O i386-efi --modules="part_gpt part_msdos" --fonts="unicode" --locales="en@quot" --themes="" -o "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/BOOTIA32.EFI" "boot/grub/grub.cfg=/var/tmp/bootia32.cfg" -v cat << GRUBEOF > "${_ARCHBOOT_ISO_EXT_DIR}/EFI/BOOT/bootia32.cfg" insmod part_gpt insmod part_msdos insmod fat insmod efi_gop insmod efi_uga insmod video_bochs insmod video_cirrus insmod font if loadfont "${prefix}/fonts/unicode.pf2" ; then insmod gfxterm set gfxmode="1366x768x32;1280x800x32;1024x768x32;auto" terminal_input console terminal_output gfxterm fi set default="Arch Linux x86_64 Archboot - EFI MIXED MODE" set timeout="2" menuentry "Arch Linux x86_64 Archboot - EFI MIXED MODE" { set gfxpayload=keep search --no-floppy --set=root --file /boot/vmlinuz_x86_64 linux /boot/vmlinuz_x86_64 cgroup_disable=memory add_efi_memmap _IA32_UEFI=1 rootfstype=ramfs initrd /boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs_x86_64.img } menuentry "Arch Linux i686 Archboot Non-EFISTUB" { set gfxpayload=keep search --no-floppy --set=root --file /boot/vmlinuz_i686 linux /boot/vmlinuz_i686 cgroup_disable=memory add_efi_memmap _IA32_UEFI=1 rootfstype=ramfs initrd /boot/intel-ucode.img /boot/amd-ucode.img /boot/initramfs_i686.img } # menuentry "Syslinux for x86_64 Kernel in IA32 UEFI" { # search --no-floppy --set=root --file /EFI/syslinux/efi32/syslinux.efi # chainloader /EFI/syslinux/efi32/syslinux.efi # } menuentry "UEFI Shell IA32 v2" { search --no-floppy --set=root --file /EFI/tools/shellia32_v2.efi chainloader /EFI/tools/shellia32_v2.efi } menuentry "UEFI Shell IA32 v1" { search --no-floppy --set=root --file /EFI/tools/shellia32_v1.efi chainloader /EFI/tools/shellia32_v1.efi } menuentry "Exit GRUB" { exit } GRUBEOF } _update_uefi_IA32_syslinux_USB_files() { rm -rf "${_ARCHBOOT_ISO_EXT_DIR}/EFI/syslinux" mkdir -p "${_ARCHBOOT_ISO_EXT_DIR}/EFI/syslinux" cp -rf "/usr/lib/syslinux/efi32" "${_ARCHBOOT_ISO_EXT_DIR}/EFI/syslinux/efi32" echo cat << EOF > "${_ARCHBOOT_ISO_EXT_DIR}/EFI/syslinux/efi32/syslinux.cfg" PATH /EFI/syslinux/efi32 # UI vesamenu.c32 UI menu.c32 DEFAULT archboot-x86_64 PROMPT 1 TIMEOUT 40 MENU TITLE SYSLINUX MENU RESOLUTION 1280 800 LABEL archboot-x86_64 MENU LABEL Arch Linux x86_64 Archboot - EFI MIXED MODE LINUX /boot/vmlinuz_x86_64 APPEND cgroup_disable=memory add_efi_memmap _IA32_UEFI=1 rootfstype=ramfs INITRD /boot/intel-ucode.img,/boot/amd-ucode.img,/boot/initramfs_x86_64.img LABEL archboot-i686 MENU LABEL Arch Linux i686 Archboot - EFI HANDOVER PROTOCOL LINUX /boot/vmlinuz_i686 APPEND cgroup_disable=memory add_efi_memmap _IA32_UEFI=1 rootfstype=ramfs INITRD /boot/intel-ucode.img,/boot/amd-ucode.img,/boot/initramfs_i686.img EOF } _remove_x86_64_iso_files() { rm -rf "${_ARCHBOOT_ISO_EXT_DIR}/EFI" || true rm -rf "${_ARCHBOOT_ISO_EXT_DIR}/loader" || true rm -f "${_ARCHBOOT_ISO_EXT_DIR}/boot/vmlinuz_x86_64" || true rm -f "${_ARCHBOOT_ISO_EXT_DIR}/boot/initramfs_x86_64.img" || true rm -f "${_ARCHBOOT_ISO_EXT_DIR}/packages/archboot_packages_x86_64.squashfs" || true echo } _remove_packages() { rm -rf "${_ARCHBOOT_ISO_EXT_DIR}/packages" || true echo } _update_arch_setup_initramfs() { _initramfs_ext="$(mktemp -d /var/tmp/${_initramfs_name}_ext.XXXXXXXXXX)" echo cd "${_initramfs_ext}/" if [[ -e "${_ARCHBOOT_ISO_EXT_DIR}/boot/${_initramfs_name}.img" ]]; then bsdtar xf "${_ARCHBOOT_ISO_EXT_DIR}/boot/${_initramfs_name}.img" echo mv "${_initramfs_ext}/arch/setup" "${_initramfs_ext}/arch/setup.old" cp --verbose "${_ARCHBOOT_ISO_WD}/setup" "${_initramfs_ext}/arch/setup" chmod 755 "${_initramfs_ext}/arch/setup" echo cd "${_initramfs_ext}/" find . -print0 | bsdcpio -0oH newc | lzma > "${_ARCHBOOT_ISO_WD}/${_initramfs_name}.img" echo rm -f "${_ARCHBOOT_ISO_EXT_DIR}/boot/${_initramfs_name}.img" || true cp --verbose "${_ARCHBOOT_ISO_WD}/${_initramfs_name}.img" "${_ARCHBOOT_ISO_EXT_DIR}/boot/${_initramfs_name}.img" rm -f "${_ARCHBOOT_ISO_WD}/${_initramfs_name}.img" echo fi rm -rf "${_initramfs_ext}/" echo unset _initramfs_ext unset _initramfs_name echo } ## Not currently used - simply left untouched for now _download_pkgs() { pacman -Sy echo pacman -Sw ${_PKG} echo _PKGVER="$(pacman -Si ${_PKG} | grep -i 'Version' | sed 's|Version : ||g')" cp /var/cache/pacman/pkg/${_PKG}-${_PKGVER}-*.pkg.tar* "${_ARCHBOOT_ISO_WD}/" unset _PKG unset _PKGVER echo } _update_cd_uefi() { TEMP_DIR=$(mktemp -d) MOUNT_FSIMG=$(mktemp -d) ## Copy UEFI files fo cdefiboot.img mkdir "${TEMP_DIR}"/boot cp -r "${_ARCHBOOT_ISO_EXT_DIR}"/{EFI,loader} "${TEMP_DIR}"/ cp "${_ARCHBOOT_ISO_EXT_DIR}"/boot/vmlinuz_x86_64 "${TEMP_DIR}"/boot/ cp "${_ARCHBOOT_ISO_EXT_DIR}"/boot/intel-ucode.img "${TEMP_DIR}"/boot/ cp "${_ARCHBOOT_ISO_EXT_DIR}"/boot/amd-ucode.img "${TEMP_DIR}"/boot/ cp "${_ARCHBOOT_ISO_EXT_DIR}"/boot/initramfs_x86_64.img "${TEMP_DIR}"/boot/ ## Delete IA32 UEFI files rm -f "${TEMP_DIR}"/loader/*ia32*.conf rm -rf "${TEMP_DIR}"/EFI/syslinux/efi32 ## get size of boot x86_64 files BOOTSIZE=$(du -bc ${TEMP_DIR} | grep total | cut -f1) IMGSZ=$(( (${BOOTSIZE}*102)/100/1024 + 1)) # image size in sectors rm -rf "${_ARCHBOOT_ISO_EXT_DIR}"/CDEFI/ mkdir -p "${_ARCHBOOT_ISO_EXT_DIR}"/CDEFI/ ## Create cdefiboot.img dd if=/dev/zero of="${_ARCHBOOT_ISO_EXT_DIR}"/CDEFI/cdefiboot.img bs="${IMGSZ}" count=1024 mkfs.vfat "${_ARCHBOOT_ISO_EXT_DIR}"/CDEFI/cdefiboot.img LOOPDEV="$(losetup --find --show "${_ARCHBOOT_ISO_EXT_DIR}"/CDEFI/cdefiboot.img)" ## Mount cdefiboot.img mount -t vfat -o rw,users "${LOOPDEV}" "${MOUNT_FSIMG}" ## Copy all files from TEMP_DIR to MOUNT_FSIMG # repeat all steps from above cp * is not working here! mkdir "${MOUNT_FSIMG}"/boot cp -r "${TEMP_DIR}"/{EFI,loader} "${MOUNT_FSIMG}"/ cp "${TEMP_DIR}"/boot/vmlinuz_x86_64 "${MOUNT_FSIMG}"/boot cp "${TEMP_DIR}"/boot/intel-ucode.img "${MOUNT_FSIMG}"/boot cp "${TEMP_DIR}"/boot/initramfs_x86_64.img "${MOUNT_FSIMG}"/boot ## Unmount cdefiboot.img umount -d "${LOOPDEV}" rm -rf "${MOUNT_FSIMG}" rm -rf "${TEMP_DIR}" _CD_UEFI_PARAMETERS="-eltorito-alt-boot -e CDEFI/cdefiboot.img -isohybrid-gpt-basdat -no-emul-boot" } [[ "${_REMOVE_x86_64}" == "1" ]] && _remove_x86_64_iso_files [[ "${_REMOVE_PACKAGES}" == "1" ]] && _remove_packages if [[ "${_UPDATE_SETUP}" == "1" ]] && [[ -e "${_ARCHBOOT_ISO_WD}/setup" ]]; then cd "${_ARCHBOOT_ISO_WD}/" mkdir -p "${_ARCHBOOT_ISO_EXT_DIR}/arch/" || true rm -f "${_ARCHBOOT_ISO_EXT_DIR}/arch/setup" || true cp -f "${_ARCHBOOT_ISO_WD}/setup" "${_ARCHBOOT_ISO_EXT_DIR}/arch/setup" echo if [[ "${_REMOVE_x86_64}" != "1" ]]; then _initramfs_name="initramfs_x86_64" _update_arch_setup_initramfs fi echo fi [[ "${_UPDATE_UEFI_PREBOOTLOADER}" == "1" ]] && _update_uefi_prebootloader_files [[ "${_UPDATE_UEFI_LOCKDOWN_MS}" == "1" ]] && _update_uefi_lockdown_ms_files [[ "${_UPDATE_UEFI_SHELL}" == "1" ]] && _download_uefi_shell_tianocore [[ "${_UPDATE_UEFI_GUMMIBOOT}" == "1" ]] && _update_uefi_gummiboot_USB_files [[ "${_UPDATE_UEFI_X64_GRUB}" == "1" ]] && _update_uefi_X64_GRUB_USB_files [[ "${_UPDATE_UEFI_IA32_GRUB}" == "1" ]] && _update_uefi_IA32_GRUB_USB_files # [[ "${_UPDATE_UEFI_IA32_SYSLINUX}" == "1" ]] && _update_uefi_IA32_syslinux_USB_files [[ "${_UPDATE_SYSLINUX_BIOS}" == "1" ]] && _update_syslinux_iso_files [[ "${_UPDATE_SYSLINUX_BIOS_CONFIG}" == "1" ]] && _update_syslinux_iso_config [[ "${_UPDATE_CD_UEFI}" == "1" ]] && _update_cd_uefi cd "${_ARCHBOOT_ISO_WD}/" ## Generate the BIOS+ISOHYBRID CD image using xorriso (extra/libisoburn package) in mkisofs emulation mode echo "Generating the modified ISO ..." xorriso -as mkisofs \ -iso-level 3 \ -full-iso9660-filenames \ -volid "ARCHBOOT" \ -preparer "prepared by ${_BASENAME}" \ -eltorito-boot boot/syslinux/isolinux.bin \ -eltorito-catalog boot/syslinux/boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -isohybrid-mbr /usr/lib/syslinux/bios/isohdpfx.bin \ ${_CD_UEFI_PARAMETERS} \ -output "${_ARCHBOOT_ISO_UPDATED_PATH}" "${_ARCHBOOT_ISO_EXT_DIR}/" &> "/var/tmp/archboot_update_xorriso.log" echo set +x if [[ -e "${_ARCHBOOT_ISO_UPDATED_PATH}" ]]; then echo echo "Updated iso has been saved at ${_ARCHBOOT_ISO_UPDATED_PATH} ." echo rm -rf "${_ARCHBOOT_ISO_EXT_DIR}/" echo else echo echo "No updated iso found at ${_ARCHBOOT_ISO_UPDATED_PATH} due to some error." echo "Check the script and try again." echo fi unset _UEFI_ARCH unset _SPEC_UEFI_ARCH unset _REMOVE_x86_64 unset _REMOVE_PACKAGES unset _UPDATE_SETUP unset _UPDATE_UEFI_PREBOOTLOADER unset _UPDATE_UEFI_LOCKDOWN_MS unset _UPDATE_UEFI_SHELL unset _UPDATE_UEFI_GUMMIBOOT unset _UPDATE_UEFI_X64_GRUB unset _UPDATE_UEFI_IA32_SYSLINUX unset _UPDATE_SYSLINUX_BIOS unset _UPDATE_SYSLINUX_BIOS_CONFIG unset _CD_UEFI_PARAMETERS unset _ARCHBOOT_ISO_OLD_PATH unset _ARCHBOOT_ISO_WD unset _ARCHBOOT_ISO_OLD_NAME unset _ARCHBOOT_ISO_EXT_DIR unset _ARCHBOOT_ISO_UPDATED_NAME unset _ARCHBOOT_ISO_UPDATED_PATH