Archlinux32 using the iso remastering kit with 32bit uefi bios

I have atempted to make my own respin off of the EndevourOS archiso offline on github and could use a little help understanding how the properly get the iso to boot with bootia32.efi files which I cannot seem to get any uefi bios to read. heres the build script ```#!/bin/bash

set -e -u

iso_publisher=“Arch Linux
iso_application=“Arch Linux Live/Rescue CD”
iso_version=$(date +%Y.%m.%d)

script_path=$(readlink -f ${0%/*})

umask 0022

_usage ()
echo “usage ${0} [options]”
echo " General options:"
echo " -N <iso_name> Set an iso filename (prefix)"
echo " Default: ${iso_name}"
echo " -V <iso_version> Set an iso version (in filename)"
echo " Default: ${iso_version}"
echo " -L <iso_label> Set an iso label (disk label)"
echo " Default: ${iso_label}"
echo " -P Set a publisher for the disk"
echo " Default: ‘${iso_publisher}’"
echo " -A Set an application name for the disk"
echo " Default: ‘${iso_application}’"
echo " -D <install_dir> Set an install_dir (directory inside iso)"
echo " Default: ${install_dir}"
echo " -w <work_dir> Set the working directory"
echo " Default: ${work_dir}"
echo " -o <out_dir> Set the output directory"
echo " Default: ${out_dir}"
echo " -v Enable verbose output"
echo " -h This help message"
exit ${1}

Helper function to run make_*() only one time per architecture.

run_once() {
if [[ ! -e ${work_dir}/build.${1} ]]; then
touch ${work_dir}/build.${1}

Setup custom pacman.conf with current cache directories.

make_pacman_conf() {
local _cache_dirs
_cache_dirs=($(pacman -v 2>&1 | grep ‘^Cache Dirs:’ | sed ‘s/Cache Dirs:\s*//g’))
sed -r “s|^#?\s*CacheDir.+|CacheDir = $(echo -n ${_cache_dirs[@]})|g” ${script_path}/pacman.conf > ${work_dir}/pacman.conf

Base installation, plus needed packages (airootfs)

make_basefs() {
$MKARCHISO ${verbose} -w “${work_dir}/i686” -C “${work_dir}/pacman.conf” -D “${install_dir}” init
$MKARCHISO ${verbose} -w “${work_dir}/i686” -C “${work_dir}/pacman.conf” -D “${install_dir}” -p “haveged intel-ucode amd-ucode memtest86+ mkinitcpio-nfs-utils nbd zsh efitools” install

Additional packages (airootfs)

make_packages() {
$MKARCHISO ${verbose} -w “${work_dir}/i686” -C “${work_dir}/pacman.conf” -D “${install_dir}” -p “$(grep -h -v ^# ${script_path}/packages.i686)” install

Copy mkinitcpio archiso hooks and build initramfs (airootfs)

make_setup_mkinitcpio() {
local _hook
mkdir -p ${work_dir}/i686/airootfs/etc/initcpio/hooks
mkdir -p ${work_dir}/i686/airootfs/etc/initcpio/install
for _hook in archiso archiso_shutdown archiso_loop_mnt; do
cp /usr/lib/initcpio/hooks/${_hook} ${work_dir}/i686/airootfs/etc/initcpio/hooks
cp /usr/lib/initcpio/install/${_hook} ${work_dir}/i686/airootfs/etc/initcpio/install
sed -i “s|/usr/lib/initcpio/|/etc/initcpio/|g” ${work_dir}/i686/airootfs/etc/initcpio/install/archiso_shutdown
cp /usr/lib/initcpio/install/archiso_kms ${work_dir}/i686/airootfs/etc/initcpio/install
cp /usr/lib/initcpio/archiso_shutdown ${work_dir}/i686/airootfs/etc/initcpio
cp ${script_path}/mkinitcpio.conf ${work_dir}/i686/airootfs/etc/mkinitcpio-archiso.conf
if [[ ${gpg_key} ]]; then
gpg --export ${gpg_key} >${work_dir}/gpgkey
exec 17<>${work_dir}/gpgkey
ARCHISO_GNUPG_FD=${gpg_key:+17} $MKARCHISO ${verbose} -w “${work_dir}/i686” -C “${work_dir}/pacman.conf” -D “${install_dir}” -r ‘mkinitcpio -c /etc/mkinitcpio-archiso.conf -k /boot/vmlinuz-linux -g /boot/archiso.img’ run
if [[ ${gpg_key} ]]; then
exec 17<&-

Customize installation (airootfs)

make_customize_airootfs() {
cp -af ${script_path}/airootfs ${work_dir}/i686

cp ${script_path}/pacman.conf ${work_dir}/i686/airootfs/etc

curl -o ${work_dir}/i686/airootfs/etc/pacman.d/mirrorlist ''

#lynx -dump -nolist '' >> ${work_dir}/i686/airootfs/root/install.txt

$MKARCHISO ${verbose} -w "${work_dir}/i686" -C "${work_dir}/pacman.conf" -D "${install_dir}" -r '/root/' run

rm ${work_dir}/i686/airootfs/root/


Prepare kernel/initramfs ${install_dir}/boot/

make_boot() {
mkdir -p ${work_dir}/iso/${install_dir}/boot/i686
cp ${work_dir}/i686/airootfs/boot/archiso.img ${work_dir}/iso/${install_dir}/boot/i686/archiso.img
cp ${work_dir}/i686/airootfs/boot/vmlinuz-linux ${work_dir}/iso/${install_dir}/boot/i686/vmlinuz

Add other aditional/extra files to ${install_dir}/boot/

make_boot_extra() {
cp ${work_dir}/i686/airootfs/boot/memtest86+/memtest.bin ${work_dir}/iso/${install_dir}/boot/memtest
cp ${work_dir}/i686/airootfs/usr/share/licenses/common/GPL2/license.txt ${work_dir}/iso/${install_dir}/boot/memtest.COPYING
cp ${work_dir}/i686/airootfs/boot/intel-ucode.img ${work_dir}/iso/${install_dir}/boot/intel_ucode.img
cp ${work_dir}/i686/airootfs/usr/share/licenses/intel-ucode/LICENSE ${work_dir}/iso/${install_dir}/boot/intel_ucode.LICENSE
cp ${work_dir}/i686/airootfs/boot/amd-ucode.img ${work_dir}/iso/${install_dir}/boot/amd_ucode.img
cp ${work_dir}/i686/airootfs/usr/share/licenses/amd-ucode/LICENSE ${work_dir}/iso/${install_dir}/boot/amd_ucode.LICENSE

Prepare /${install_dir}/boot/syslinux

make_syslinux() {
_uname_r=$(file -b ${work_dir}/i686/airootfs/boot/vmlinuz-linux| awk ‘f{print;f=0} /version/{f=1}’ RS=’ ')
mkdir -p ${work_dir}/iso/${install_dir}/boot/syslinux
for _cfg in ${script_path}/syslinux/.cfg; do
sed “s|%ARCHISO_LABEL%|${iso_label}|g;
s|%INSTALL_DIR%|${install_dir}|g” ${_cfg} > ${work_dir}/iso/${install_dir}/boot/syslinux/${_cfg##
cp ${script_path}/syslinux/splash.png ${work_dir}/iso/${install_dir}/boot/syslinux
cp ${work_dir}/i686/airootfs/usr/lib/syslinux/bios/*.c32 ${work_dir}/iso/${install_dir}/boot/syslinux
cp ${work_dir}/i686/airootfs/usr/lib/syslinux/bios/lpxelinux.0 ${work_dir}/iso/${install_dir}/boot/syslinux
cp ${work_dir}/i686/airootfs/usr/lib/syslinux/bios/memdisk ${work_dir}/iso/${install_dir}/boot/syslinux
mkdir -p ${work_dir}/iso/${install_dir}/boot/syslinux/hdt
gzip -c -9 ${work_dir}/i686/airootfs/usr/share/hwdata/pci.ids > ${work_dir}/iso/${install_dir}/boot/syslinux/hdt/pciids.gz
gzip -c -9 ${work_dir}/i686/airootfs/usr/lib/modules/${_uname_r}/modules.alias > ${work_dir}/iso/${install_dir}/boot/syslinux/hdt/modalias.gz

Prepare /isolinux

make_isolinux() {
mkdir -p ${work_dir}/iso/isolinux
sed “s|%INSTALL_DIR%|${install_dir}|g” ${script_path}/isolinux/isolinux.cfg > ${work_dir}/iso/isolinux/isolinux.cfg
cp ${work_dir}/i686/airootfs/usr/lib/syslinux/bios/isolinux.bin ${work_dir}/iso/isolinux/
cp ${work_dir}/i686/airootfs/usr/lib/syslinux/bios/isohdpfx.bin ${work_dir}/iso/isolinux/
cp ${work_dir}/i686/airootfs/usr/lib/syslinux/bios/ldlinux.c32 ${work_dir}/iso/isolinux/

Prepare /EFI

make_efi() {
mkdir -p ${work_dir}/iso/EFI/boot
cp ${work_dir}/i686/airootfs/usr/share/efitools/efi/Loader.efi ${work_dir}/iso/EFI/boot/bootx64.efi
cp ${work_dir}/i686/airootfs/usr/share/efitools/efi/HashTool.efi ${work_dir}/iso/EFI/boot/

cp ${work_dir}/i686/airootfs/usr/lib/systemd/boot/efi/systemd-bootia32.efi ${work_dir}/iso/EFI/boot/loader.efi

mkdir -p ${work_dir}/iso/loader/entries
cp ${script_path}/efiboot/loader/loader.conf ${work_dir}/iso/loader/
cp ${script_path}/efiboot/loader/entries/uefi-shell-v2-i686.conf ${work_dir}/iso/loader/entries/
cp ${script_path}/efiboot/loader/entries/uefi-shell-v1-i686.conf ${work_dir}/iso/loader/entries/

sed "s|%ARCHISO_LABEL%|${iso_label}|g;
     s|%INSTALL_DIR%|${install_dir}|g" \
    ${script_path}/efiboot/loader/entries/archiso-i686-usb.conf > ${work_dir}/iso/loader/entries/archiso-i686.conf

# EFI Shell 2.0 for UEFI 2.3+
curl -o ${work_dir}/iso/EFI/shellx64_v2.efi
# EFI Shell 1.0 for non UEFI 2.3+
curl -o ${work_dir}/iso/EFI/shellx64_v1.efi


Prepare efiboot.img::/EFI for “El Torito” EFI boot mode

make_efiboot() {
mkdir -p ${work_dir}/iso/EFI/archiso
truncate -s 64M ${work_dir}/iso/EFI/archiso/efiboot.img
mkfs.fat -n ARCHISO_EFI ${work_dir}/iso/EFI/archiso/efiboot.img

mkdir -p ${work_dir}/efiboot
mount ${work_dir}/iso/EFI/archiso/efiboot.img ${work_dir}/efiboot

mkdir -p ${work_dir}/efiboot/EFI/archiso
cp ${work_dir}/iso/${install_dir}/boot/i686/vmlinuz ${work_dir}/efiboot/EFI/archiso/vmlinuz.efi
cp ${work_dir}/iso/${install_dir}/boot/i686/archiso.img ${work_dir}/efiboot/EFI/archiso/archiso.img

cp ${work_dir}/iso/${install_dir}/boot/intel_ucode.img ${work_dir}/efiboot/EFI/archiso/intel_ucode.img
cp ${work_dir}/iso/${install_dir}/boot/amd_ucode.img ${work_dir}/efiboot/EFI/archiso/amd_ucode.img

mkdir -p ${work_dir}/efiboot/EFI/boot
cp ${work_dir}/i686/airootfs/usr/share/efitools/efi/Loader.efi ${work_dir}/efiboot/EFI/boot/bootx64.efi
cp ${work_dir}/i686/airootfs/usr/share/efitools/efi/HashTool.efi ${work_dir}/efiboot/EFI/boot/

cp ${work_dir}/i686/airootfs/usr/lib/systemd/boot/efi/systemd-bootia32.efi ${work_dir}/efiboot/EFI/boot/loader.efi

mkdir -p ${work_dir}/efiboot/loader/entries
cp ${script_path}/efiboot/loader/loader.conf ${work_dir}/efiboot/loader/
cp ${script_path}/efiboot/loader/entries/uefi-shell-v2-i686.conf ${work_dir}/efiboot/loader/entries/
cp ${script_path}/efiboot/loader/entries/uefi-shell-v1-i686.conf ${work_dir}/efiboot/loader/entries/

sed "s|%ARCHISO_LABEL%|${iso_label}|g;
     s|%INSTALL_DIR%|${install_dir}|g" \
    ${script_path}/efiboot/loader/entries/archiso-i686-cd.conf > ${work_dir}/efiboot/loader/entries/archiso-i686.conf

cp ${work_dir}/iso/EFI/shellx64_v2.efi ${work_dir}/efiboot/EFI/
cp ${work_dir}/iso/EFI/shellx64_v1.efi ${work_dir}/efiboot/EFI/

umount -d ${work_dir}/efiboot


Build airootfs filesystem image

make_prepare() {
cp -a -l -f ${work_dir}/i686/airootfs ${work_dir}
$MKARCHISO ${verbose} -w “${work_dir}” -D “${install_dir}” pkglist
$MKARCHISO ${verbose} -w “${work_dir}” -D “${install_dir}” ${gpg_key:±g ${gpg_key}} prepare
rm -rf ${work_dir}/airootfs
# rm -rf ${work_dir}/i686/airootfs (if low space, this helps)

Build ISO

make_iso() {
$MKARCHISO ${verbose} -w “${work_dir}” -D “${install_dir}” -L “${iso_label}” -P “${iso_publisher}” -A “${iso_application}” -o “${out_dir}” iso “${iso_name}-${iso_version}-i686.iso”

if [[ ${EUID} -ne 0 ]]; then
echo “This script must be run as root.”
_usage 1

while getopts ‘N:v:L:P:a:D:w:o:g:vh’ arg; do
case “${arg}” in
N) iso_name="${OPTARG}" ;;
V) iso_version="${OPTARG}" ;;
L) iso_label="${OPTARG}" ;;
P) iso_publisher="${OPTARG}" ;;
A) iso_application="${OPTARG}" ;;
D) install_dir="${OPTARG}" ;;
w) work_dir="${OPTARG}" ;;
o) out_dir="${OPTARG}" ;;
g) gpg_key="${OPTARG}" ;;
v) verbose="-v" ;;
h) _usage 0 ;;
echo “Invalid argument ‘${arg}’”
_usage 1

mkdir -p ${work_dir}

run_once make_pacman_conf
run_once make_basefs
run_once make_packages
run_once make_setup_mkinitcpio
run_once make_customize_airootfs
run_once make_boot
run_once make_boot_extra
run_once make_syslinux
run_once make_isolinux
run_once make_efi
run_once make_efiboot
run_once make_prepare
run_once make_iso


Hi there is no support for EFI using 32 bits systems.
There were some attempts to use it from projects like Pacbang and others (i don’t remember the names right now)

Not sure if any of them fully accomplished this.

If you’re willing to dig this on the internet try looking for archiso projects that used to build 32 and 64 bits in the same iso (dual_boot, dual_iso).
Keep in mind this is all old, from the time when archlinux still had 32 bits support. Look for github pages, i’m sure some of them are still there, just repeating; abandoned.

Yes it’s abandoned but I’m still eager to make it work :slight_smile:

1 Like

I know UEFI 32bit booting is possible using bootia32.efi I made a macjaro32 project using the Manjaro tools scripts and it supports 32bit UEFI out of the box and bios so hybrid. And clover bootloader and my Macs bios detects and boots it just fine manjaro-tools scripts can be found on there gitlab page. Its possible to implement it’s just how did they do it is the bigger question. :wink:

1 Like

ok, i wish you good luck and hope you find a solution. this is what I’m currently going to try.


32bit EFI boot has been achieved by editing the grub.cfg label to match the iso label in the project above I will push my forked changes to gitlab :smiley:

1 Like