commit: b799756684d80af07e9cb683d3b6d98897ea0ce6
Author: Andreas K. Hüttel <dilfridge <AT> gentoo <DOT> org>
AuthorDate: Sun Aug 30 13:03:54 2020 +0000
Commit: Andreas K. Hüttel <dilfridge <AT> gentoo <DOT> org>
CommitDate: Thu Sep 17 21:13:13 2020 +0000
URL: https://gitweb.gentoo.org/proj/catalyst.git/commit/?id=b7997566
First steps
Signed-off-by: Andreas K. Hüttel <dilfridge <AT> gentoo.org>
targets/support/create-image.sh | 169 ++++++++++++++++++++++++++++++++++++++++
1 file changed, 169 insertions(+)
diff --git a/targets/support/create-image.sh b/targets/support/create-image.sh
new file mode 100755
index 00000000..4b06a9dc
--- /dev/null
+++ b/targets/support/create-image.sh
@@ -0,0 +1,169 @@
+#!/bin/bash
+
+source ${clst_shdir}/support/functions.sh
+source ${clst_shdir}/support/filesystem-functions.sh
+
+## START RUNSCRIPT
+
+# WORK IN PROGRESS
+
+# This script takes a filesystem tree created by catalyst and converts it
+# into a readily bootable disk image for use with QEMU, cloud services, etc.
+# Things that should be configurable when it's finished:
+# * image type (raw, qcow2, vmdk)
+# * disk size
+# * system partition size? filesystem?
+# * create a blank swap partition? size?
+# * boot loader and partition type (mbr&dos, or uefi&gpt; other combos
+# not supported)
+# * start sshd?
+# * root password or (much better) root authorized_keys
+#
+# For now support is limited to arches where cloud services exist (i.e.,
+# amd64 and arm64).
+
+# Check for our bootable disk image creation tools
+# case ${clst_hostarch} in
+# *)
+# cdmaker="mkisofs"
+# cdmakerpkg="app-cdr/cdrkit or app-cdr/cdrtools"
+# ;;
+# esac
+
+# [ ! -f /usr/bin/${cdmaker} ] \
+# && echo && echo && die \
+# "!!! /usr/bin/${cdmaker} is not found. Have you merged ${cdmakerpkg}?" \
+# && echo && echo
+
+# If not volume ID is set, make up a sensible default
+if [ -z "${clst_image_volume_id}" ]
+then
+ case ${clst_image_type} in
+ gentoo-*)
+ case ${clst_hostarch} in
+ amd64)
+ clst_image_volume_id="Gentoo Linux -
AMD64"
+ ;;
+ arm64)
+ clst_image_volume_id="Gentoo Linux -
ARM64"
+ ;;
+ *)
+ clst_image_volume_id="Gentoo Linux"
+ ;;
+ esac
+ esac
+fi
+
+if [ "${#clst_image_volume_id}" -gt 32 ]; then
+ old_clst_image_volume_id=${clst_image_volume_id}
+ clst_image_volume_id="${clst_image_volume_id:0:32}"
+ echo "ISO Volume label is too long, truncating to 32 characters" 1>&2
+ echo "old: '${old_clst_image_volume_id}'" 1>&2
+ echo "new: '${clst_image_volume_id}'" 1>&2
+fi
+
+if [ "${clst_fstype}" == "zisofs" ]
+then
+ mkisofs_zisofs_opts="-z"
+else
+ mkisofs_zisofs_opts=""
+fi
+
+#we want to create a checksum for every file on the iso so we can verify it
+#from genkernel during boot. Here we make a function to create the
sha512sums, and blake2sums
+isoroot_checksum() {
+ echo "Creating checksums for all files included in the iso, please
wait..."
+ if [ -z "${1}" ] || [ "${1}" = "sha512" ]; then
+ find "${clst_target_path}" -type f ! -name 'isoroot_checksums'
! -name 'isolinux.bin' ! -name 'isoroot_b2sums' -exec sha512sum {} + >
"${clst_target_path}"/isoroot_checksums
+ ${clst_sed} -i "s#${clst_target_path}/\?##"
"${clst_target_path}"/isoroot_checksums
+ fi
+ if [ -z "${1}" ] || [ "${1}" = "blake2" ]; then
+ find "${clst_target_path}" -type f ! -name 'isoroot_checksums'
! -name 'isolinux.bin' ! -name 'isoroot_b2sums' -exec b2sum {} + >
"${clst_target_path}"/isoroot_b2sums
+ ${clst_sed} -i "s#${clst_target_path}/\?##"
"${clst_target_path}"/isoroot_b2sums
+ fi
+}
+
+run_mkisofs() {
+ if [ -n "${clst_livecd_verify}" ]; then
+ if [ "${clst_livecd_verify}" = "sha512" ]; then
+ isoroot_checksum sha512
+ elif [ "${clst_livecd_verify}" = "blake2" ]; then
+ isoroot_checksum blake2
+ else
+ isoroot_checksum
+ fi
+ fi
+ echo "Running \"mkisofs ${@}\""
+ mkisofs "${@}" || die "Cannot make ISO image"
+}
+
+# Here we actually create the ISO images for each architecture
+case ${clst_hostarch} in
+ x86|amd64)
+ # detect if an EFI bootloader is desired
+ if [ -d "${clst_target_path}/boot/efi" ] || \
+ [ -d "${clst_target_path}/boot/EFI" ] || \
+ [ -e "${clst_target_path}/gentoo.efimg" ]
+ then
+ if [ -e "${clst_target_path}/gentoo.efimg" ]
+ then
+ echo "Found prepared EFI boot image at \
+ ${clst_target_path}/gentoo.efimg"
+ else
+ echo "Preparing EFI boot image"
+ if [ -d "${clst_target_path}/boot/efi" ] && [ !
-d "${clst_target_path}/boot/EFI" ]; then
+ echo "Moving /boot/efi to /boot/EFI"
+ mv "${clst_target_path}/boot/efi"
"${clst_target_path}/boot/EFI"
+ fi
+ # prepare gentoo.efimg from clst_target_path
/boot/EFI dir
+ iaSizeTemp=$(du -sk --apparent-size
"${clst_target_path}/boot/EFI" 2>/dev/null)
+ iaSizeB=$(echo ${iaSizeTemp} | cut '-d ' -f1)
+ iaSize=$((${iaSizeB}+64)) # add slack, tested
near minimum for overhead
+ echo "Creating loopback file of size
${iaSize}kB"
+ dd if=/dev/zero
of="${clst_target_path}/gentoo.efimg" bs=1k \
+ count=${iaSize}
+ echo "Formatting loopback file with FAT16 FS"
+ mkfs.vfat -F 16 -n GENTOOLIVE
"${clst_target_path}/gentoo.efimg"
+
+ mkdir
"${clst_target_path}/gentoo.efimg.mountPoint"
+ echo "Mounting FAT16 loopback file"
+ mount -t vfat -o loop
"${clst_target_path}/gentoo.efimg" \
+
"${clst_target_path}/gentoo.efimg.mountPoint" || die "Failed to mount EFI image
file"
+
+ echo "Populating EFI image file from
${clst_target_path}/boot/EFI"
+ cp -rv "${clst_target_path}"/boot/EFI/ \
+
"${clst_target_path}/gentoo.efimg.mountPoint" || die "Failed to populate EFI
image file"
+
+ umount
"${clst_target_path}/gentoo.efimg.mountPoint"
+ rmdir
"${clst_target_path}/gentoo.efimg.mountPoint"
+
+ echo "Copying /boot/EFI to /EFI for rufus
compatability"
+ cp -rv "${clst_target_path}"/boot/EFI/
"${clst_target_path}"
+ fi
+ fi
+
+ if [ -e "${clst_target_path}/isolinux/isolinux.bin" ]; then
+ echo '** Found ISOLINUX bootloader'
+ if [ -e "${clst_target_path}/gentoo.efimg" ]; then
+ # have BIOS isolinux, plus an EFI loader image
+ echo '** Found GRUB2 EFI bootloader'
+ echo 'Creating ISO using both ISOLINUX and EFI
bootloader'
+ run_mkisofs -J -R -l ${mkisofs_zisofs_opts} -V
"${clst_iso_volume_id}" -o "${1}" -b isolinux/isolinux.bin -c isolinux/boot.cat
-no-emul-boot -boot-load-size 4 -boot-info-table -eltorito-alt-boot
-eltorito-platform efi -b gentoo.efimg -no-emul-boot -z "${clst_target_path}"/
+ isohybrid --uefi "${1}"
+ else
+ echo 'Creating ISO using ISOLINUX bootloader'
+ run_mkisofs -J -R -l ${mkisofs_zisofs_opts} -V
"${clst_iso_volume_id}" -o "${1}" -b isolinux/isolinux.bin -c isolinux/boot.cat
-no-emul-boot -boot-load-size 4 -boot-info-table "${clst_target_path}"/
+ isohybrid "${1}"
+ fi
+ elif [ -e "${clst_target_path}/gentoo.efimg" ]; then
+ echo '** Found GRUB2 EFI bootloader'
+ echo 'Creating ISO using EFI bootloader'
+ run_mkisofs -J -R -l ${mkisofs_zisofs_opts} -V
"${clst_iso_volume_id}" -o "${1}" -b gentoo.efimg -c boot.cat -no-emul-boot
"${clst_target_path}"/
+ else
+ echo '** Found no known bootloader'
+ echo 'Creating ISO with fingers crossed that you know
what you are doing...'
+ run_mkisofs -J -R -l ${mkisofs_zisofs_opts} -V
"${clst_iso_volume_id}" -o "${1}" "${clst_target_path}"/
+ fi
+ ;;
+esac
+exit $?