Verified Commit 610ff2ac authored by nl6720's avatar nl6720
Browse files

mkarchiso: improve functions and comments

* Merge _make_efi_dir_on_iso9660 into _make_bootmode_uefi-x64.systemd-boot.eltorito since it's specific to that boot mode.
* Split off FAT image creation into _make_efibootimg, so it can be reused by other functions.
* Add/improve comments to better document what the script does.
parent 1cec901a
...@@ -172,6 +172,8 @@ _cleanup_pacstrap_dir() { ...@@ -172,6 +172,8 @@ _cleanup_pacstrap_dir() {
_msg_info "Done!" _msg_info "Done!"
} }
# Create a squashfs image and place it in the ISO 9660 file system.
# $@: options to pass to mksquashfs
_run_mksquashfs() { _run_mksquashfs() {
local image_path="${isofs_dir}/${install_dir}/${arch}/airootfs.sfs" local image_path="${isofs_dir}/${install_dir}/${arch}/airootfs.sfs"
if [[ "${quiet}" == "y" ]]; then if [[ "${quiet}" == "y" ]]; then
...@@ -181,7 +183,8 @@ _run_mksquashfs() { ...@@ -181,7 +183,8 @@ _run_mksquashfs() {
fi fi
} }
# Makes a ext4 filesystem inside a SquashFS from a source directory. # Create an ext4 image containing the root file system and pack it inside a squashfs image.
# Save the squashfs image on the ISO 9660 file system.
_mkairootfs_ext4+squashfs() { _mkairootfs_ext4+squashfs() {
[[ -e "${pacstrap_dir}" ]] || _msg_error "The path '${pacstrap_dir}' does not exist" 1 [[ -e "${pacstrap_dir}" ]] || _msg_error "The path '${pacstrap_dir}' does not exist" 1
...@@ -206,7 +209,7 @@ _mkairootfs_ext4+squashfs() { ...@@ -206,7 +209,7 @@ _mkairootfs_ext4+squashfs() {
rm -- "${pacstrap_dir}.img" rm -- "${pacstrap_dir}.img"
} }
# Makes a SquashFS filesystem from a source directory. # Create a squashfs image containing the root file system and saves it on the ISO 9660 file system.
_mkairootfs_squashfs() { _mkairootfs_squashfs() {
[[ -e "${pacstrap_dir}" ]] || _msg_error "The path '${pacstrap_dir}' does not exist" 1 [[ -e "${pacstrap_dir}" ]] || _msg_error "The path '${pacstrap_dir}' does not exist" 1
...@@ -215,7 +218,7 @@ _mkairootfs_squashfs() { ...@@ -215,7 +218,7 @@ _mkairootfs_squashfs() {
_run_mksquashfs "${pacstrap_dir}" _run_mksquashfs "${pacstrap_dir}"
} }
# Makes an EROFS file system from a source directory. # Create an EROFS image containing the root file system and saves it on the ISO 9660 file system.
_mkairootfs_erofs() { _mkairootfs_erofs() {
local fsuuid local fsuuid
[[ -e "${pacstrap_dir}" ]] || _msg_error "The path '${pacstrap_dir}' does not exist" 1 [[ -e "${pacstrap_dir}" ]] || _msg_error "The path '${pacstrap_dir}' does not exist" 1
...@@ -229,6 +232,7 @@ _mkairootfs_erofs() { ...@@ -229,6 +232,7 @@ _mkairootfs_erofs() {
_msg_info "Done!" _msg_info "Done!"
} }
# Create checksum file for the rootfs image.
_mkchecksum() { _mkchecksum() {
_msg_info "Creating checksum file for self-test..." _msg_info "Creating checksum file for self-test..."
cd -- "${isofs_dir}/${install_dir}/${arch}" cd -- "${isofs_dir}/${install_dir}/${arch}"
...@@ -241,6 +245,7 @@ _mkchecksum() { ...@@ -241,6 +245,7 @@ _mkchecksum() {
_msg_info "Done!" _msg_info "Done!"
} }
# GPG sign the root file system image.
_mksignature() { _mksignature() {
_msg_info "Signing rootfs image..." _msg_info "Signing rootfs image..."
cd -- "${isofs_dir}/${install_dir}/${arch}" cd -- "${isofs_dir}/${install_dir}/${arch}"
...@@ -255,6 +260,7 @@ _mksignature() { ...@@ -255,6 +260,7 @@ _mksignature() {
} }
# Helper function to run functions only one time. # Helper function to run functions only one time.
# $1: function name
_run_once() { _run_once() {
if [[ ! -e "${work_dir}/${run_once_mode}.${1}" ]]; then if [[ ! -e "${work_dir}/${run_once_mode}.${1}" ]]; then
"$1" "$1"
...@@ -262,13 +268,13 @@ _run_once() { ...@@ -262,13 +268,13 @@ _run_once() {
fi fi
} }
# Set up custom pacman.conf with custom cache and pacman hook directories # Set up custom pacman.conf with custom cache and pacman hook directories.
_make_pacman_conf() { _make_pacman_conf() {
local _cache_dirs _system_cache_dirs _profile_cache_dirs local _cache_dirs _system_cache_dirs _profile_cache_dirs
_system_cache_dirs="$(pacman-conf CacheDir| tr '\n' ' ')" _system_cache_dirs="$(pacman-conf CacheDir| tr '\n' ' ')"
_profile_cache_dirs="$(pacman-conf --config "${pacman_conf}" CacheDir| tr '\n' ' ')" _profile_cache_dirs="$(pacman-conf --config "${pacman_conf}" CacheDir| tr '\n' ' ')"
# only use the profile's CacheDir, if it is not the default and not the same as the system cache dir # Only use the profile's CacheDir, if it is not the default and not the same as the system cache dir.
if [[ "${_profile_cache_dirs}" != "/var/cache/pacman/pkg" ]] && \ if [[ "${_profile_cache_dirs}" != "/var/cache/pacman/pkg" ]] && \
[[ "${_system_cache_dirs}" != "${_profile_cache_dirs}" ]]; then [[ "${_system_cache_dirs}" != "${_profile_cache_dirs}" ]]; then
_cache_dirs="${_profile_cache_dirs}" _cache_dirs="${_profile_cache_dirs}"
...@@ -287,7 +293,7 @@ _make_pacman_conf() { ...@@ -287,7 +293,7 @@ _make_pacman_conf() {
/\[options\]/a HookDir = ${pacstrap_dir}/etc/pacman.d/hooks/" > "${work_dir}/${buildmode}.pacman.conf" /\[options\]/a HookDir = ${pacstrap_dir}/etc/pacman.d/hooks/" > "${work_dir}/${buildmode}.pacman.conf"
} }
# Prepare working directory and copy custom airootfs files (airootfs) # Prepare working directory and copy custom root file system files.
_make_custom_airootfs() { _make_custom_airootfs() {
local passwd=() local passwd=()
local filename permissions local filename permissions
...@@ -320,7 +326,7 @@ _make_custom_airootfs() { ...@@ -320,7 +326,7 @@ _make_custom_airootfs() {
fi fi
} }
# Install desired packages to airootfs # Install desired packages to the root file system
_make_packages() { _make_packages() {
_msg_info "Installing packages to '${pacstrap_dir}/'..." _msg_info "Installing packages to '${pacstrap_dir}/'..."
...@@ -344,7 +350,7 @@ _make_packages() { ...@@ -344,7 +350,7 @@ _make_packages() {
_msg_info "Done! Packages installed successfully." _msg_info "Done! Packages installed successfully."
} }
# Customize installation (airootfs) # Customize installation.
_make_customize_airootfs() { _make_customize_airootfs() {
local passwd=() local passwd=()
...@@ -390,7 +396,7 @@ _make_bootmodes() { ...@@ -390,7 +396,7 @@ _make_bootmodes() {
done done
} }
# Prepare kernel/initramfs ${install_dir}/boot/ # Copy kernel and initramfs to ISO 9660
_make_boot_on_iso9660() { _make_boot_on_iso9660() {
local ucode_image local ucode_image
_msg_info "Preparing kernel and initramfs for the ISO 9660 file system..." _msg_info "Preparing kernel and initramfs for the ISO 9660 file system..."
...@@ -411,7 +417,7 @@ _make_boot_on_iso9660() { ...@@ -411,7 +417,7 @@ _make_boot_on_iso9660() {
_msg_info "Done!" _msg_info "Done!"
} }
# Prepare /syslinux for booting from MBR # Prepare syslinux for booting from MBR (isohybrid)
_make_bootmode_bios.syslinux.mbr() { _make_bootmode_bios.syslinux.mbr() {
_msg_info "Setting up SYSLINUX for BIOS booting from a disk..." _msg_info "Setting up SYSLINUX for BIOS booting from a disk..."
install -d -m 0755 -- "${isofs_dir}/syslinux" install -d -m 0755 -- "${isofs_dir}/syslinux"
...@@ -451,7 +457,7 @@ _make_bootmode_bios.syslinux.mbr() { ...@@ -451,7 +457,7 @@ _make_bootmode_bios.syslinux.mbr() {
_msg_info "Done! SYSLINUX set up for BIOS booting from a disk successfully." _msg_info "Done! SYSLINUX set up for BIOS booting from a disk successfully."
} }
# Prepare /syslinux for El-Torito booting # Prepare syslinux for El-Torito booting
_make_bootmode_bios.syslinux.eltorito() { _make_bootmode_bios.syslinux.eltorito() {
_msg_info "Setting up SYSLINUX for BIOS booting from an optical disc..." _msg_info "Setting up SYSLINUX for BIOS booting from an optical disc..."
install -d -m 0755 -- "${isofs_dir}/syslinux" install -d -m 0755 -- "${isofs_dir}/syslinux"
...@@ -464,32 +470,7 @@ _make_bootmode_bios.syslinux.eltorito() { ...@@ -464,32 +470,7 @@ _make_bootmode_bios.syslinux.eltorito() {
_msg_info "Done! SYSLINUX set up for BIOS booting from an optical disc successfully." _msg_info "Done! SYSLINUX set up for BIOS booting from an optical disc successfully."
} }
# Prepare /EFI on ISO-9660 # Copy kernel and initramfs to FAT image
_make_efi_dir_on_iso9660() {
_msg_info "Preparing an /EFI directory for the ISO 9660 file system..."
install -d -m 0755 -- "${isofs_dir}/EFI/BOOT"
install -m 0644 -- "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" \
"${isofs_dir}/EFI/BOOT/BOOTx64.EFI"
install -d -m 0755 -- "${isofs_dir}/loader/entries"
install -m 0644 -- "${profile}/efiboot/loader/loader.conf" "${isofs_dir}/loader/"
for _conf in "${profile}/efiboot/loader/entries/"*".conf"; do
sed "s|%ARCHISO_LABEL%|${iso_label}|g;
s|%INSTALL_DIR%|${install_dir}|g;
s|%ARCH%|${arch}|g" \
"${_conf}" > "${isofs_dir}/loader/entries/${_conf##*/}"
done
# edk2-shell based UEFI shell
# shellx64.efi is picked up automatically when on /
if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ]]; then
install -m 0644 -- "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" "${isofs_dir}/shellx64.efi"
fi
_msg_info "Done!"
}
# Prepare kernel/initramfs on efiboot.img
_make_boot_on_fat() { _make_boot_on_fat() {
local ucode_image all_ucode_images=() local ucode_image all_ucode_images=()
_msg_info "Preparing kernel and initramfs for the FAT file system..." _msg_info "Preparing kernel and initramfs for the FAT file system..."
...@@ -508,9 +489,30 @@ _make_boot_on_fat() { ...@@ -508,9 +489,30 @@ _make_boot_on_fat() {
_msg_info "Done!" _msg_info "Done!"
} }
# Prepare efiboot.img::/EFI for EFI boot mode # Create a FAT image (efiboot.img) which will serve as the EFI system partition
# $1: image size in bytes
_make_efibootimg() {
local imgsize="0"
# Convert from bytes to KiB and round up to the next full MiB with an additional MiB for reserved sectors.
imgsize="$(awk 'function ceil(x){return int(x)+(x>int(x))}
function byte_to_kib(x){return x/1024}
function mib_to_kib(x){return x*1024}
END {print mib_to_kib(ceil((byte_to_kib($1)+1024)/1024))}' <<< "${1}"
)"
# The FAT image must be created with mkfs.fat not mformat, as some systems have issues with mformat made images:
# https://lists.gnu.org/archive/html/grub-devel/2019-04/msg00099.html
[[ -e "${work_dir}/efiboot.img" ]] && rm -f -- "${work_dir}/efiboot.img"
_msg_info "Creating FAT image of size: ${imgsize} KiB..."
mkfs.fat -C -n ARCHISO_EFI "${work_dir}/efiboot.img" "${imgsize}"
# Create the default/fallback boot path in which a boot loaders will be placed later.
mmd -i "${work_dir}/efiboot.img" ::/EFI ::/EFI/BOOT
}
# Prepare system-boot for booting when written to a disk (isohybrid)
_make_bootmode_uefi-x64.systemd-boot.esp() { _make_bootmode_uefi-x64.systemd-boot.esp() {
local _file efiboot_imgsize="0" local _file efiboot_imgsize
local _available_ucodes=() local _available_ucodes=()
_msg_info "Setting up systemd-boot for UEFI booting..." _msg_info "Setting up systemd-boot for UEFI booting..."
...@@ -519,7 +521,7 @@ _make_bootmode_uefi-x64.systemd-boot.esp() { ...@@ -519,7 +521,7 @@ _make_bootmode_uefi-x64.systemd-boot.esp() {
_available_ucodes+=("${pacstrap_dir}/boot/${_file}") _available_ucodes+=("${pacstrap_dir}/boot/${_file}")
fi fi
done done
# the required image size in KiB (rounded up to the next full MiB with an additional MiB for reserved sectors) # Calculate the required FAT image size in bytes
efiboot_imgsize="$(du -bc \ efiboot_imgsize="$(du -bc \
"${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" \ "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" \
"${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" \ "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" \
...@@ -527,21 +529,15 @@ _make_bootmode_uefi-x64.systemd-boot.esp() { ...@@ -527,21 +529,15 @@ _make_bootmode_uefi-x64.systemd-boot.esp() {
"${pacstrap_dir}/boot/vmlinuz-"* \ "${pacstrap_dir}/boot/vmlinuz-"* \
"${pacstrap_dir}/boot/initramfs-"*".img" \ "${pacstrap_dir}/boot/initramfs-"*".img" \
"${_available_ucodes[@]}" \ "${_available_ucodes[@]}" \
2>/dev/null | awk 'function ceil(x){return int(x)+(x>int(x))} 2>/dev/null | awk 'END { print $1 }')"
function byte_to_kib(x){return x/1024} # Create a FAT image for the EFI system partition
function mib_to_kib(x){return x*1024} _make_efibootimg "$efiboot_imgsize"
END {print mib_to_kib(ceil((byte_to_kib($1)+1024)/1024))}'
)"
# The FAT image must be created with mkfs.fat not mformat, as some systems have issues with mformat made images:
# https://lists.gnu.org/archive/html/grub-devel/2019-04/msg00099.html
[[ -e "${work_dir}/efiboot.img" ]] && rm -f -- "${work_dir}/efiboot.img"
_msg_info "Creating FAT image of size: ${efiboot_imgsize} KiB..."
mkfs.fat -C -n ARCHISO_EFI "${work_dir}/efiboot.img" "$efiboot_imgsize"
mmd -i "${work_dir}/efiboot.img" ::/EFI ::/EFI/BOOT # Copy systemd-boot EFI binary to the default/fallback boot path
mcopy -i "${work_dir}/efiboot.img" \ mcopy -i "${work_dir}/efiboot.img" \
"${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" ::/EFI/BOOT/BOOTx64.EFI "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" ::/EFI/BOOT/BOOTx64.EFI
# Copy systemd-boot configuration files
mmd -i "${work_dir}/efiboot.img" ::/loader ::/loader/entries mmd -i "${work_dir}/efiboot.img" ::/loader ::/loader/entries
mcopy -i "${work_dir}/efiboot.img" "${profile}/efiboot/loader/loader.conf" ::/loader/ mcopy -i "${work_dir}/efiboot.img" "${profile}/efiboot/loader/loader.conf" ::/loader/
for _conf in "${profile}/efiboot/loader/entries/"*".conf"; do for _conf in "${profile}/efiboot/loader/entries/"*".conf"; do
...@@ -557,17 +553,46 @@ _make_bootmode_uefi-x64.systemd-boot.esp() { ...@@ -557,17 +553,46 @@ _make_bootmode_uefi-x64.systemd-boot.esp() {
"${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ::/shellx64.efi "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ::/shellx64.efi
fi fi
# Copy kernel and initramfs # Copy kernel and initramfs to FAT image.
# systemd-boot can only access files from the EFI system partition it was launched from.
_make_boot_on_fat _make_boot_on_fat
_msg_info "Done! systemd-boot set up for UEFI booting successfully." _msg_info "Done! systemd-boot set up for UEFI booting successfully."
} }
# Prepare efiboot.img::/EFI for "El Torito" EFI boot mode # Prepare system-boot for El Torito booting
_make_bootmode_uefi-x64.systemd-boot.eltorito() { _make_bootmode_uefi-x64.systemd-boot.eltorito() {
# El Torito UEFI boot requires an image containing the EFI system partition.
# uefi-x64.systemd-boot.eltorito has the same requirements as uefi-x64.systemd-boot.esp
_run_once _make_bootmode_uefi-x64.systemd-boot.esp _run_once _make_bootmode_uefi-x64.systemd-boot.esp
# Set up /EFI on ISO-9660 to allow preparing an installation medium by manually copying files
_run_once _make_efi_dir_on_iso9660 # Additionally set up system-boot in ISO 9660. This allows creating a medium for the live environment by using
# manual partitioning and simply copying the ISO 9660 file system contents.
# This is not related to El Torito booting and no firmware uses these files.
_msg_info "Preparing an /EFI directory for the ISO 9660 file system..."
install -d -m 0755 -- "${isofs_dir}/EFI/BOOT"
# Copy systemd-boot EFI binary to the default/fallback boot path
install -m 0644 -- "${pacstrap_dir}/usr/lib/systemd/boot/efi/systemd-bootx64.efi" \
"${isofs_dir}/EFI/BOOT/BOOTx64.EFI"
# Copy systemd-boot configuration files
install -d -m 0755 -- "${isofs_dir}/loader/entries"
install -m 0644 -- "${profile}/efiboot/loader/loader.conf" "${isofs_dir}/loader/"
for _conf in "${profile}/efiboot/loader/entries/"*".conf"; do
sed "s|%ARCHISO_LABEL%|${iso_label}|g;
s|%INSTALL_DIR%|${install_dir}|g;
s|%ARCH%|${arch}|g" \
"${_conf}" > "${isofs_dir}/loader/entries/${_conf##*/}"
done
# edk2-shell based UEFI shell
# shellx64.efi is picked up automatically when on /
if [[ -e "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" ]]; then
install -m 0644 -- "${pacstrap_dir}/usr/share/edk2-shell/x64/Shell_Full.efi" "${isofs_dir}/shellx64.efi"
fi
_msg_info "Done!"
} }
_validate_requirements_bootmode_bios.syslinux.mbr() { _validate_requirements_bootmode_bios.syslinux.mbr() {
...@@ -609,6 +634,7 @@ _validate_requirements_bootmode_bios.syslinux.mbr() { ...@@ -609,6 +634,7 @@ _validate_requirements_bootmode_bios.syslinux.mbr() {
} }
_validate_requirements_bootmode_bios.syslinux.eltorito() { _validate_requirements_bootmode_bios.syslinux.eltorito() {
# bios.syslinux.eltorito has the exact same requirements as bios.syslinux.mbr
_validate_requirements_bootmode_bios.syslinux.mbr _validate_requirements_bootmode_bios.syslinux.mbr
} }
...@@ -772,7 +798,7 @@ _add_xorrisofs_options_bios.syslinux.eltorito() { ...@@ -772,7 +798,7 @@ _add_xorrisofs_options_bios.syslinux.eltorito() {
) )
} }
# SYSLINUX MBR # SYSLINUX MBR (isohybrid)
_add_xorrisofs_options_bios.syslinux.mbr() { _add_xorrisofs_options_bios.syslinux.mbr() {
xorrisofs_options+=( xorrisofs_options+=(
# SYSLINUX MBR bootstrap code; does not work without "-eltorito-boot syslinux/isolinux.bin" # SYSLINUX MBR bootstrap code; does not work without "-eltorito-boot syslinux/isolinux.bin"
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment