Files
2026-04-11 05:29:20 -07:00

223 lines
8.6 KiB
Bash
Executable File

#!/bin/bash -e
SQUASHFS_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.squashfs"
unmount "${ROOTFS_DIR}"
# ── 1. Raw squashfs ────────────────────────────────────────────────────────────
mksquashfs "${ROOTFS_DIR}" "${SQUASHFS_FILE}" \
-comp xz \
-noappend \
-e boot/efi
# Locate kernel and initrd inside the rootfs
VMLINUZ=$(find "${ROOTFS_DIR}/boot" -maxdepth 1 -name "vmlinuz-*" | sort | tail -1)
INITRD=$(find "${ROOTFS_DIR}/boot" -maxdepth 1 -name "initrd.img-*" | sort | tail -1)
VMLINUZ_FILE=""
INITRD_FILE=""
if [ -n "${VMLINUZ}" ]; then
VMLINUZ_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.vmlinuz"
cp "${VMLINUZ}" "${VMLINUZ_FILE}"
fi
if [ -n "${INITRD}" ]; then
INITRD_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}.initrd"
cp "${INITRD}" "${INITRD_FILE}"
fi
mkdir -p "${DEPLOY_DIR}"
rm -f "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}."*
case "${DEPLOY_COMPRESSION}" in
zip)
pushd "${STAGE_WORK_DIR}" > /dev/null
ZIP_MEMBERS="$(basename "${SQUASHFS_FILE}")"
[ -n "${VMLINUZ_FILE}" ] && ZIP_MEMBERS="${ZIP_MEMBERS} $(basename "${VMLINUZ_FILE}")"
[ -n "${INITRD_FILE}" ] && ZIP_MEMBERS="${ZIP_MEMBERS} $(basename "${INITRD_FILE}")"
# shellcheck disable=SC2086
zip -"${COMPRESSION_LEVEL}" \
"${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.zip" \
${ZIP_MEMBERS}
popd > /dev/null
echo "Archive created at ${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.zip"
;;
gz)
pigz --force -"${COMPRESSION_LEVEL}" "${SQUASHFS_FILE}" --stdout > \
"${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.squashfs.gz"
[ -n "${VMLINUZ_FILE}" ] && cp "${VMLINUZ_FILE}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.vmlinuz"
[ -n "${INITRD_FILE}" ] && cp "${INITRD_FILE}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.initrd"
echo "Squashfs exported at ${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.squashfs.gz"
;;
xz)
xz --compress --force --threads 0 --memlimit-compress=50% -"${COMPRESSION_LEVEL}" \
--stdout "${SQUASHFS_FILE}" > "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.squashfs.xz"
[ -n "${VMLINUZ_FILE}" ] && cp "${VMLINUZ_FILE}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.vmlinuz"
[ -n "${INITRD_FILE}" ] && cp "${INITRD_FILE}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.initrd"
echo "Squashfs exported at ${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.squashfs.xz"
;;
none | *)
cp "${SQUASHFS_FILE}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.squashfs"
[ -n "${VMLINUZ_FILE}" ] && cp "${VMLINUZ_FILE}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.vmlinuz"
[ -n "${INITRD_FILE}" ] && cp "${INITRD_FILE}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.initrd"
echo "Squashfs exported at ${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}.squashfs"
;;
esac
# ── 2. Liveboot squashfs (only when LIVEBOOT=1 and amd64) ──────────────────────
if [ "${LIVEBOOT}" == "1" ]; then
if [ "${ARCH}" != "amd64" ]; then
echo "squashfs-export: skipping live boot squashfs for non-amd64 arch (${ARCH})"
else
echo "squashfs-export: applying live boot changes for liveboot squashfs"
on_chroot << EOF
apt-get install -y \
live-boot \
live-boot-initramfs-tools \
live-config \
live-config-systemd
EOF
# Write live-config user settings
mkdir -p "${ROOTFS_DIR}/etc/live"
cat > "${ROOTFS_DIR}/etc/live/config.conf" << EOF
LIVE_USERNAME="${LIVE_USERNAME:-vesperos}"
LIVE_USER_FULLNAME="${LIVE_USER_FULLNAME:-Live User}"
LIVE_USER_DEFAULT_GROUPS="audio cdrom dip floppy video plugdev netdev bluetooth"
LIVE_USER_SHELL="/bin/zsh"
LIVE_USER_PASSWORD="${LIVE_USER_PASSWORD:-vesperos}"
LIVE_LOGIN="true"
EOF
# Rewrite fstab for the live environment.
# live-boot manages root via overlayfs — build-time disk entries cause fsck failures at boot.
cat > "${ROOTFS_DIR}/etc/fstab" << 'FSTABEOF'
# Live system fstab — root is managed by live-boot via overlayfs, not this file.
tmpfs /tmp tmpfs defaults,nosuid,nodev 0 0
FSTABEOF
# Remove first-boot trigger so GDM uses autologin in the live session.
rm -f "${ROOTFS_DIR}/var/lib/gdm/run-initial-setup"
# Make GDM wait for live-config
mkdir -p "${ROOTFS_DIR}/etc/systemd/system/gdm.service.d"
cat > "${ROOTFS_DIR}/etc/systemd/system/gdm.service.d/override.conf" << EOF
[Unit]
After=live-config.service
EOF
# Enable autoLogin on GDM
mkdir -p "${ROOTFS_DIR}/etc/gdm3"
cat > "${ROOTFS_DIR}/etc/gdm3/daemon.conf" << EOF
[daemon]
AutomaticLoginEnable=true
AutomaticLogin=${LIVE_USERNAME:-vesperos}
EOF
# Configure initramfs for live boot — squashfs and overlay are required
if [ -f "${ROOTFS_DIR}/etc/initramfs-tools/initramfs.conf" ]; then
sed -i 's/^MODULES=.*/MODULES=most/' "${ROOTFS_DIR}/etc/initramfs-tools/initramfs.conf"
fi
for mod in squashfs overlay; do
grep -qx "${mod}" "${ROOTFS_DIR}/etc/initramfs-tools/modules" 2>/dev/null || \
echo "${mod}" >> "${ROOTFS_DIR}/etc/initramfs-tools/modules"
done
# Enable live-config system wide, instead of via grub
on_chroot << EOF
systemctl enable live-config.service
EOF
# Live-only dconf: separate database + profile so the live wallpaper
# is shown in the live session but not on the real installed system.
FINALISE_DIR="$(dirname "$0")/../03-finalise"
mkdir -p "${ROOTFS_DIR}/etc/dconf/db/live.d"
install -m 644 "${FINALISE_DIR}/files/live-default-settings" "${ROOTFS_DIR}/etc/dconf/db/live.d/00-default-settings"
install -m 644 "${FINALISE_DIR}/files/dconf-profile-live-user" "${ROOTFS_DIR}/etc/dconf/profile/live"
# Hook sets DCONF_PROFILE=live for the live user at boot
install -m 755 "${FINALISE_DIR}/files/9999-vesperos-dconf" "${ROOTFS_DIR}/lib/live/config/9999-vesperos-dconf"
on_chroot << EOF
dconf update
EOF
# Add calamares installer and related packages to the live image
on_chroot << EOF
apt-get install -y calamares calamares-settings-vesperos \
libcrack2 cracklib-runtime \
grub-efi-amd64 grub-pc-bin efibootmgr \
parted gdisk dosfstools e2fsprogs
EOF
# Set quiet splash after grub installs its default /etc/default/grub
sed -i 's/^GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"/' \
"${ROOTFS_DIR}/etc/default/grub"
# Keep the graphical framebuffer so Plymouth can render its splash.
# Without this, GRUB switches to text mode before handing off to the kernel
# and Plymouth falls back to a hidden/text renderer, showing nothing.
grep -q 'GRUB_GFXPAYLOAD_LINUX' "${ROOTFS_DIR}/etc/default/grub" || \
echo 'GRUB_GFXPAYLOAD_LINUX=keep' >> "${ROOTFS_DIR}/etc/default/grub"
# Rebuild initramfs with live-boot modules
on_chroot << EOF
update-initramfs -k all -u
EOF
LIVE_SQUASHFS_FILE="${STAGE_WORK_DIR}/${IMG_FILENAME}${IMG_SUFFIX}-live.squashfs"
unmount "${ROOTFS_DIR}"
mksquashfs "${ROOTFS_DIR}" "${LIVE_SQUASHFS_FILE}" \
-comp xz \
-noappend \
-e boot/efi
# Locate updated kernel/initrd for liveboot
LIVE_VMLINUZ=$(find "${ROOTFS_DIR}/boot" -maxdepth 1 -name "vmlinuz-*" | sort | tail -1)
LIVE_INITRD=$(find "${ROOTFS_DIR}/boot" -maxdepth 1 -name "initrd.img-*" | sort | tail -1)
case "${DEPLOY_COMPRESSION}" in
zip)
pushd "${STAGE_WORK_DIR}" > /dev/null
LIVE_ZIP_MEMBERS="$(basename "${LIVE_SQUASHFS_FILE}")"
# shellcheck disable=SC2086
zip -"${COMPRESSION_LEVEL}" \
"${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.zip" \
${LIVE_ZIP_MEMBERS}
popd > /dev/null
echo "Live archive created at ${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.zip"
;;
gz)
pigz --force -"${COMPRESSION_LEVEL}" "${LIVE_SQUASHFS_FILE}" --stdout > \
"${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.squashfs.gz"
echo "Live squashfs exported at ${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.squashfs.gz"
;;
xz)
xz --compress --force --threads 0 --memlimit-compress=50% -"${COMPRESSION_LEVEL}" \
--stdout "${LIVE_SQUASHFS_FILE}" > "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.squashfs.xz"
echo "Live squashfs exported at ${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.squashfs.xz"
;;
none | *)
cp "${LIVE_SQUASHFS_FILE}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.squashfs"
echo "Live squashfs exported at ${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.squashfs"
;;
esac
[ -n "${LIVE_VMLINUZ}" ] && cp "${LIVE_VMLINUZ}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.vmlinuz"
[ -n "${LIVE_INITRD}" ] && cp "${LIVE_INITRD}" "${DEPLOY_DIR}/${ARCHIVE_FILENAME}${IMG_SUFFIX}-live.initrd"
fi
fi
# Cleanup
#rm -f "${SQUASHFS_FILE}"
#[ -n "${VMLINUZ_FILE}" ] && rm -f "${VMLINUZ_FILE}"
#[ -n "${INITRD_FILE}" ] && rm -f "${INITRD_FILE}"
# cleanup stage work dir
#rm -rf "${STAGE_WORK_DIR}"