archboot/usr/lib/archboot/release.sh

172 lines
8.8 KiB
Bash
Raw Normal View History

#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
2022-03-21 22:31:09 +01:00
. /etc/archboot/defaults
2023-01-19 10:52:27 +01:00
_ISONAME="archboot-$(date +%Y.%m.%d-%H.%M)"
_AMD_UCODE="boot/amd-ucode.img"
_INTEL_UCODE="boot/intel-ucode.img"
2023-01-17 21:06:20 +01:00
_INITRAMFS="boot/initramfs-${_ARCH}.img"
2023-01-17 19:39:23 +01:00
_INITRAMFS_LATEST="boot/initramfs-latest-${_ARCH}.img"
_INITRAMFS_LOCAL="boot/initramfs-local-${_ARCH}.img"
if [[ "${_ARCH}" == "aarch64" ]]; then
_KERNEL="boot/Image-${_ARCH}.gz"
_KERNEL_ARCHBOOT="boot/Image-archboot-${_ARCH}.gz"
else
_KERNEL="boot/vmlinuz-${_ARCH}"
_KERNEL_ARCHBOOT="boot/vmlinuz-archboot-${_ARCH}"
fi
2022-02-21 10:12:50 +01:00
_PRESET_LATEST="${_ARCH}-latest"
2022-03-18 17:43:40 +01:00
_PRESET_LOCAL="${_ARCH}-local"
_W_DIR="$(mktemp -u archboot-release.XXX)"
_usage () {
echo "CREATE ARCHBOOT RELEASE IMAGE"
echo "-----------------------------"
2022-02-15 21:39:34 +01:00
echo "Usage: ${_BASENAME} <directory> <server>"
echo "This will create an archboot release image in <directory>."
2022-02-15 21:39:34 +01:00
echo "You can specify a certain <server> with an archboot repository."
exit 0
}
_create_iso() {
mkdir -p "${1}"
cd "${1}" || exit 1
# create container
2022-10-01 18:33:21 +02:00
archboot-"${_ARCH}"-create-container.sh "${_W_DIR}" -cc --install-source="${2}" || exit 1
_create_archboot_db "${_W_DIR}"/var/cache/pacman/pkg
# riscv64 does not support kexec at the moment
if ! [[ "${_ARCH}" == "riscv64" ]]; then
# generate tarball in container, umount tmp it's a tmpfs and weird things could happen then
2023-01-19 09:25:52 +01:00
# removing not working lvm2 from latest image
2023-01-19 08:57:01 +01:00
echo "Removing lvm2 from container ${_W_DIR}..."
2023-01-19 08:14:30 +01:00
${_NSPAWN} "${_W_DIR}" pacman -Rdd lvm2 --noconfirm &>/dev/null
# generate latest tarball in container
2023-01-19 08:57:59 +01:00
echo "Generating local ISO..."
# generate local iso in container
2023-01-19 10:48:42 +01:00
${_NSPAWN} "${_W_DIR}" /bin/bash -c "umount /tmp;rm -rf /tmp/*; archboot-${_ARCH}-iso.sh -g -p=${_PRESET_LOCAL} \
-i=${_ISONAME}-local-${_ARCH}" || exit 1
2022-10-01 18:33:21 +02:00
rm -rf "${_W_DIR}"/var/cache/pacman/pkg/*
2023-01-19 08:57:59 +01:00
echo "Generating latest ISO..."
# generate latest iso in container
2023-01-19 10:48:42 +01:00
${_NSPAWN} "${_W_DIR}" /bin/bash -c "umount /tmp;rm -rf /tmp/*;archboot-${_ARCH}-iso.sh -g -p=${_PRESET_LATEST} \
-i=${_ISONAME}-latest-${_ARCH}" || exit 1
2023-01-19 09:26:39 +01:00
echo "Installing lvm2 to container ${_W_DIR}..."
2023-01-19 08:14:30 +01:00
${_NSPAWN} "${_W_DIR}" pacman -Sy lvm2 --noconfirm &>/dev/null
fi
2023-01-19 08:57:59 +01:00
echo "Generating normal ISO..."
2022-05-09 14:19:19 +02:00
# generate iso in container
2023-01-19 10:48:42 +01:00
${_NSPAWN} "${_W_DIR}" /bin/bash -c "umount /tmp;archboot-${_ARCH}-iso.sh -g \
-i=${_ISONAME}-${_ARCH}" || exit 1
# move iso out of container
2023-01-19 08:14:30 +01:00
mv "${_W_DIR}"/*.iso ./ &>/dev/null
mv "${_W_DIR}"/*.img ./ &>/dev/null
# create boot directory with ramdisks
2023-01-19 08:53:00 +01:00
echo "Creating boot directory..."
2023-01-20 09:07:23 +01:00
mkdir -p boot/
2022-09-17 13:30:48 +02:00
if [[ "${_ARCH}" == "riscv64" ]]; then
2022-09-17 14:07:22 +02:00
for i in *.img; do
if echo "${i}" | grep -v local | grep -vq latest; then
2022-09-20 18:43:50 +02:00
mcopy -m -i "${i}"@@1048576 ::/"${_KERNEL}" ./"${_KERNEL_ARCHBOOT}"
mcopy -m -i "${i}"@@1048576 ::/"${_INITRAMFS}" ./"${_INITRAMFS}"
2022-09-17 14:07:22 +02:00
elif echo "${i}" | grep -q latest; then
2022-09-20 18:43:50 +02:00
mcopy -m -i "${i}"@@1048576 ::/"${_INITRAMFS}" ./"${_INITRAMFS_LATEST}"
2022-09-17 14:07:22 +02:00
elif echo "${i}" | grep -q local; then
2022-09-20 18:43:50 +02:00
mcopy -m -i "${i}"@@1048576 ::/"${_INITRAMFS}" ./"${_INITRAMFS_LOCAL}"
2022-09-17 14:07:22 +02:00
fi
done
2022-09-17 13:30:48 +02:00
else
for i in *.iso; do
if echo "${i}" | grep -v local | grep -vq latest; then
2023-02-11 17:24:40 +01:00
isoinfo -R -i "${i}" -x /efi.img 2>/dev/null > efi.img
2023-02-11 13:57:15 +01:00
mcopy -m -i efi.img ::/"${_AMD_UCODE}" ./"${_AMD_UCODE}"
2023-02-11 15:40:20 +01:00
[[ "${_ARCH}" == "aarch64" ]] || mcopy -m -i efi.img ::/"${_INTEL_UCODE}" ./"${_INTEL_UCODE}"
2023-02-11 13:57:15 +01:00
mcopy -m -i efi.img ::/"${_INITRAMFS}" ./"${_INITRAMFS}"
mcopy -m -i efi.img ::/"${_KERNEL}" ./"${_KERNEL_ARCHBOOT}"
2022-09-17 13:30:48 +02:00
elif echo "${i}" | grep -q latest; then
2023-02-11 17:24:40 +01:00
isoinfo -R -i "${i}" -x /efi.img 2>/dev/null > efi.img
2023-02-11 13:57:15 +01:00
mcopy -m -i efi.img ::/"${_INITRAMFS}" ./"${_INITRAMFS_LATEST}"
2022-09-17 13:30:48 +02:00
elif echo "${i}" | grep -q local; then
2023-02-11 17:24:40 +01:00
isoinfo -R -i "${i}" -x /efi.img 2>/dev/null > efi.img
2023-02-11 13:58:05 +01:00
mcopy -m -i efi.img ::/"${_INITRAMFS}" ./"${_INITRAMFS_LOCAL}"
2022-09-17 13:30:48 +02:00
fi
2023-02-11 17:24:40 +01:00
rm efi.img
2022-09-17 13:30:48 +02:00
done
echo "Generating Unified Kernel Images..."
# create unified kernel image UKI, code adapted from wiki
# https://wiki.archlinux.org/title/Unified_kernel_image
2023-01-20 09:43:24 +01:00
_SPLASH="usr/share/archboot/uki/archboot-background.bmp"
_OSREL="usr/share/archboot/base/etc/os-release"
2023-01-20 09:07:23 +01:00
# add AMD ucode license
mkdir -p boot/licenses/amd-ucode
cp /usr/share/licenses/amd-ucode/* boot/licenses/amd-ucode/
2023-02-04 08:14:45 +01:00
_CMDLINE="boot/cmdline.txt"
if [[ "${_ARCH}" == "x86_64" ]]; then
2023-01-20 09:07:23 +01:00
# add INTEL ucode license
mkdir -p boot/licenses/intel-ucode
cp /usr/share/licenses/intel-ucode/* boot/licenses/intel-ucode/
_EFISTUB="usr/lib/systemd/boot/efi/linuxx64.efi.stub"
2023-02-14 12:13:38 +01:00
echo "console=ttyS0,115200 console=tty0 audit=0" > ${_CMDLINE}
2023-01-20 09:07:23 +01:00
_UCODE="${_INTEL_UCODE} ${_AMD_UCODE}"
fi
if [[ "${_ARCH}" == "aarch64" ]]; then
2023-02-14 12:13:38 +01:00
echo "nr_cpus=1 console=ttyAMA0,115200 console=tty0 loglevel=4 audit=0" > ${_CMDLINE}
_EFISTUB="usr/lib/systemd/boot/efi/linuxaa64.efi.stub"
_UCODE="${_AMD_UCODE}"
# replace aarch64 Image.gz with Image kernel for UKI, compressed image is not working at the moment
2023-02-05 20:30:08 +01:00
cp "${_W_DIR}/boot/Image" "boot/Image-archboot-${_ARCH}"
_KERNEL_ARCHBOOT="boot/Image-archboot-${_ARCH}"
fi
2023-01-20 09:07:23 +01:00
rm -r "${_W_DIR:?}"/boot
mv boot "${_W_DIR}"
2023-01-20 10:25:36 +01:00
_OSREL_OFFS=$(${_NSPAWN} "${_W_DIR}" objdump -h "${_EFISTUB}" | awk 'NF==7 {size=strtonum("0x"$3); offset=strtonum("0x"$4)} END {print size + offset}')
2023-01-20 11:49:26 +01:00
_CMDLINE_OFFS=$((_OSREL_OFFS + $(stat -Lc%s "${_W_DIR}"/"${_OSREL}")))
_SPLASH_OFFS=$((_CMDLINE_OFFS + $(stat -Lc%s "${_W_DIR}"/"${_CMDLINE}")))
2023-01-20 11:53:37 +01:00
_KERNEL_OFFS=$((_SPLASH_OFFS + $(stat -Lc%s "${_W_DIR}"/"${_SPLASH}")))
2023-01-20 11:49:26 +01:00
_INITRAMFS_OFFS=$((_KERNEL_OFFS + $(stat -Lc%s "${_W_DIR}"/"${_KERNEL_ARCHBOOT}")))
for initramfs in ${_INITRAMFS} ${_INITRAMFS_LATEST} ${_INITRAMFS_LOCAL}; do
[[ "${initramfs}" == "${_INITRAMFS}" ]] && _UKI="boot/archboot-${_ARCH}.efi"
[[ "${initramfs}" == "${_INITRAMFS_LATEST}" ]] && _UKI="boot/archboot-latest-${_ARCH}.efi"
[[ "${initramfs}" == "${_INITRAMFS_LOCAL}" ]] && _UKI="boot/archboot-local-${_ARCH}.efi"
2023-02-04 08:53:08 +01:00
${_NSPAWN} "${_W_DIR}" /bin/bash -c "objcopy -p --add-section .osrel=${_OSREL} --change-section-vma .osrel=$(printf 0x%x ${_OSREL_OFFS}) \
2023-02-04 09:04:19 +01:00
--add-section .cmdline=${_CMDLINE} --change-section-vma .cmdline=$(printf 0x%x ${_CMDLINE_OFFS}) \
2023-02-04 08:53:08 +01:00
--add-section .splash=${_SPLASH} --change-section-vma .splash=$(printf 0x%x ${_SPLASH_OFFS}) \
--add-section .linux=${_KERNEL_ARCHBOOT} --change-section-vma .linux=$(printf 0x%x ${_KERNEL_OFFS}) \
--add-section .initrd=<(cat ${_UCODE} ${initramfs}) \
2023-02-04 08:53:08 +01:00
--change-section-vma .initrd=$(printf 0x%x ${_INITRAMFS_OFFS}) ${_EFISTUB} ${_UKI}" || exit 1
done
# fix permission and timestamp
mv "${_W_DIR}"/boot ./
2023-01-20 11:57:18 +01:00
rm "${_CMDLINE}"
chmod 644 boot/*.efi
touch boot/*.efi
fi
2023-01-17 18:07:14 +01:00
# create Release.txt with included main archlinux packages
2023-01-19 08:57:59 +01:00
echo "Generating Release.txt..."
2023-01-17 18:07:14 +01:00
(echo "Welcome to ARCHBOOT INSTALLATION / RESCUEBOOT SYSTEM";\
echo "Creation Tool: 'archboot' Tobias Powalowski <tpowa@archlinux.org>";\
echo "Homepage: https://bit.ly/archboot";\
echo "Architecture: ${_ARCH}";\
2023-02-12 19:53:04 +01:00
echo "RAM requirement to boot: 800M or greater";\
2023-01-17 18:07:14 +01:00
echo "Archboot:$(${_NSPAWN} "${_W_DIR}" pacman -Qi "${_ARCHBOOT}" | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")";\
[[ "${_ARCH}" == "riscv64" ]] || echo "Grub:$(${_NSPAWN} "${_W_DIR}" pacman -Qi grub | grep Version | cut -d ":" -f3 | sed -e "s/\r//g")";\
echo "Kernel:$(${_NSPAWN} "${_W_DIR}" pacman -Qi linux | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")";\
echo "Pacman:$(${_NSPAWN} "${_W_DIR}" pacman -Qi pacman | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")";\
echo "Systemd:$(${_NSPAWN} "${_W_DIR}" pacman -Qi systemd | grep Version | cut -d ":" -f2 | sed -e "s/\r//g")") >>Release.txt
2023-01-19 09:25:52 +01:00
# removing container
2023-01-19 08:57:01 +01:00
echo "Removing container ${_W_DIR}..."
2023-01-17 18:07:14 +01:00
rm -r "${_W_DIR}"
# create sha256sums
2023-01-19 08:03:15 +01:00
echo "Generating sha256sum..."
for i in *; do
2023-02-05 20:30:08 +01:00
if [[ -f "${i}" ]]; then
cksum -a sha256 "${i}" >> sha256sum.txt
fi
done
for i in boot/*; do
2023-02-05 20:30:08 +01:00
if [[ -f "${i}" ]]; then
cksum -a sha256 "${i}" >> sha256sum.txt
fi
done
}
# vim: set ft=sh ts=4 sw=4 et: