minimal/src/12_generate_iso.sh

157 lines
4.6 KiB
Bash
Executable File

#!/bin/sh
echo "*** GENERATE ISO BEGIN ***"
SRC_DIR=$(pwd)
# Save the kernel installation directory.
KERNEL_INSTALLED=$SRC_DIR/work/kernel/kernel_installed
# Find the Syslinux build directory.
cd work/syslinux
cd $(ls -d *)
WORK_SYSLINUX_DIR=$(pwd)
cd $SRC_DIR
# Remove the old ISO file if it exists.
rm -f minimal_linux_live.iso
echo "Old ISO image files has been removed."
# Remove the old ISO generation area if it exists.
echo "Removing old ISO image work area. This may take a while..."
rm -rf work/isoimage
# This is the root folder of the ISO image.
mkdir work/isoimage
echo "Prepared new ISO image work area."
# Read the 'COPY_SOURCE_ISO' property from '.config'
COPY_SOURCE_ISO="$(grep -i ^COPY_SOURCE_ISO .config | cut -f2 -d'=')"
if [ "$COPY_SOURCE_ISO" = "true" ] ; then
# Copy all prepared source files and folders to '/src'. Note that the scripts
# will not work there because you also need proper toolchain.
cp -r work/src work/isoimage
echo "Source files and folders have been copied to '/src'."
else
echo "Source files and folders have been skipped."
fi
# Read the 'OVERLAY_BUNDLES' property from '.config'
OVERLAY_BUNDLES="$(grep -i ^OVERLAY_BUNDLES .config | cut -f2 -d'=')"
if [ ! "$OVERLAY_BUNDLES" = "" ] ; then
echo "Generating additional overlay bundles. This may take a while..."
time sh build_minimal_linux_overlay.sh
else
echo "Generation of additional overlay bundles has been skipped."
fi
cd work/isoimage
# Copy the precompiled files 'isolinux.bin' and 'ldlinux.c32' in the ISO image
# root folder.
cp $WORK_SYSLINUX_DIR/bios/core/isolinux.bin .
cp $WORK_SYSLINUX_DIR/bios/com32/elflink/ldlinux/ldlinux.c32 .
# Now we copy the kernel.
cp $KERNEL_INSTALLED/kernel ./kernel.xz
# Now we copy the root file system.
cp ../rootfs.cpio.xz ./rootfs.xz
# Read the 'OVERLAY_TYPE' property from '.config'
OVERLAY_TYPE="$(grep -i ^OVERLAY_TYPE $SRC_DIR/.config | cut -f2 -d'=')"
if [ "$OVERLAY_TYPE" = "sparse" -a "$(id -u)" = "0" ] ; then
# Use sparse file as storage place. The above check guarantees that the whole
# script is executed with root permissions or otherwise this block is skipped.
# All files and folders located in the folder 'minimal_overlay' will be merged
# with the root folder on boot.
echo "Using sparse file for overlay."
# This is the BusyBox executable that we have already generated.
BUSYBOX=../rootfs/bin/busybox
# Create sparse image file with 1MB size. Note that this increases the ISO
# image size.
$BUSYBOX truncate -s 1M minimal.img
# Find available loop device.
LOOP_DEVICE=$($BUSYBOX losetup -f)
# Associate the available loop device with the sparse image file.
$BUSYBOX losetup $LOOP_DEVICE minimal.img
# Format the sparse image file with Ext2 file system.
$BUSYBOX mkfs.ext2 $LOOP_DEVICE
# Mount the sparse file in folder 'sparse".
mkdir sparse
$BUSYBOX mount minimal.img sparse
# Create the overlay folders.
mkdir -p sparse/rootfs
mkdir -p sparse/work
# Copy the overlay content.
cp -r $SRC_DIR/work/src/minimal_overlay/* sparse/rootfs/
# Unmount the sparse file and delete the temporary folder.
$BUSYBOX umount sparse
rm -rf sparse
# Detach the loop device since we no longer need it.
$BUSYBOX losetup -d $LOOP_DEVICE
elif [ "$OVERLAY_TYPE" = "folder" ] ; then
# Use normal folder structure for overlay. All files and folders located in
# the folder 'minimal_overlay' will be merged with the root folder on boot.
echo "Using folder structure for overlay."
mkdir -p minimal/rootfs
mkdir -p minimal/work
cp -rf $SRC_DIR/work/src/minimal_overlay/* minimal/rootfs/
else
echo "Generating ISO image with no overlay structure..."
fi
# Create the ISOLINUX configuration file.
echo 'default kernel.xz initrd=rootfs.xz vga=ask' > ./isolinux.cfg
# Now we generate the ISO image file.
genisoimage \
-J \
-r \
-o ../minimal_linux_live.iso \
-b isolinux.bin \
-c boot.cat \
-input-charset UTF-8 \
-no-emul-boot \
-boot-load-size 4 \
-boot-info-table \
./
# This allows the ISO image to be bootable if it is burned on USB flash drive.
# The -u option is used in EFI boot mode (still not supported) and it reduces
# the ISO image size.
isohybrid -u ../minimal_linux_live.iso 2>/dev/null || true
# Copy the ISO image to the root project folder.
cp ../minimal_linux_live.iso ../../
if [ "$(id -u)" = "0" ] ; then
# Apply ownership back to original owner for all affected files.
chown $(logname) ../../minimal_linux_live.iso
chown $(logname) ../../work/minimal_linux_live.iso
chown -R $(logname) .
echo "Applied original ownership to all affected files and folders."
fi
cd $SRC_DIR
echo "*** GENERATE ISO END ***"