pvc-installer/buildiso.sh
Joshua M. Boniface 133d6fe994 Complete implementation of seed install
Some fixed decisions were made, namely that bond0 would be created by
the installer from "all other interfaces" to facilitate easy
provisioning.
2021-12-11 18:48:26 -05:00

163 lines
4.8 KiB
Bash
Executable File

#!/usr/bin/env bash
# Generate a PVC autoinstaller ISO via live-build
# This ISO makes a number of assumptions about the system and asks
# minimal questions in order to streamline the install process versus
# using a standard Debian intaller ISO. The end system is suitable
# for immediate bootstrapping with the PVC Ansible roles.
fail() {
echo "$@"
exit 1
}
which lb &>/dev/null || fail "This script requires live-build"
sudo -n true &>/dev/null || fail "The user running this script must have sudo privileges."
isofilename="pvc-installer_$(date +%Y-%m-%d).iso"
deployusername="deploy"
show_help() {
echo -e "PVC install ISO generator"
echo
echo -e " Generates a mostly-automated installer ISO for a PVC node base system via lb."
echo
echo -e "Usage: $0 [-h] [-o <output_filename>] [-u username] [-a]"
echo
echo -e " -h: Display this help message."
echo -e " -o: Create the ISO as <output_filename> instead of the default."
echo -e " -u: Change 'deploy' user to a new username."
echo -e " -a: Preserve live-build artifacts."
echo -e " -k: Preserve live-build config."
}
while [ $# -gt 0 ]; do
case "${1}" in
-h|\?)
show_help
exit 0
;;
-o)
isofilename="${2}"
shift 2
;;
-u)
deployusername="${2}"
shift 2
;;
-a)
preserve_artifacts='y'
shift
;;
-k)
preserve_livebuild='y'
shift
;;
*)
echo "Invalid option: ${1}"
echo
show_help
exit 1
;;
esac
done
PACKAGE_LIST_MAIN="live-tools live-boot live-boot-initramfs-tools linux-image-amd64 mdadm lvm2 parted gdisk dosfstools debootstrap grub-pc-bin grub-efi-amd64 sipcalc vim ca-certificates vlan tftp-hpa curl ipmitool"
PACKAGE_LIST_NONFREE="firmware-bnx2 firmware-bnx2x"
mkdir -p artifacts/lb
pushd artifacts/lb &>/dev/null
echo "Pre-cleaning live-build environment..."
sudo lb clean
echo "Initializing config..."
# Initialize the live-build config
lb config --distribution buster --architectures amd64 --archive-areas "main contrib non-free" --apt-recommends false
# Configure the "standard" live task (no GUI)
echo "live-task-standard" > config/package-lists/desktop.list.chroot
# Add additional live packages
echo ${PACKAGE_LIST_MAIN} > config/package-lists/installer.list.chroot
echo ${PACKAGE_LIST_NONFREE} > config/package-lists/nonfree.list.chroot
# Add root password hook
mkdir -p config/includes.chroot/lib/live/config/
cat <<EOF > config/includes.chroot/lib/live/config/2000-remove-root-pw
#!/bin/sh
echo "I: remove root password"
passwd --delete root
EOF
chmod +x config/includes.chroot/lib/live/config/2000-remove-root-pw
# Set root bashrc
mkdir -p config/includes.chroot/root
echo "/install.sh" > config/includes.chroot/root/.bashrc
# Set hostname and resolv.conf
mkdir -p config/includes.chroot/etc
echo "pvc-live-installer" > config/includes.chroot/etc/hostname
echo "nameserver 8.8.8.8" > config/includes.chroot/etc/resolv.conf
# Set single vty
mkdir -p config/includes.chroot/etc/systemd/
cat <<EOF > config/includes.chroot/etc/systemd/logind.conf
[Login]
NAutoVTs=2
EOF
mkdir -p config/includes.chroot/etc/systemd/system/getty@.service.d
cat <<EOF > config/includes.chroot/etc/systemd/system/getty@.service.d/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty -o '-p -- \\\u' --autologin root --noclear %I \$TERM
EOF
mkdir -p config/includes.chroot/etc/systemd/system/serial-getty@.service.d
cat <<EOF > config/includes.chroot/etc/systemd/system/serial-getty@.service.d/override.conf
[Service]
ExecStart=
ExecStart=-/sbin/agetty -o '-p -- \\\u' --autologin root --noclear --keep-baud 115200,38400,9600 %I \$TERM
EOF
# Install GRUB config, theme, and splash
mkdir -p config/includes.chroot/boot/grub
cp ../../grub.cfg config/includes.chroot/boot/grub/grub.cfg
cp ../../theme.txt config/includes.chroot/boot/grub/theme.txt
cp ../../splash.png config/includes.chroot/splash.png
# Install install.sh script
cp ../../install.sh config/includes.chroot/install.sh
chmod +x config/includes.chroot/install.sh
# Customize install.sh script
sed -i "s/XXDATEXX/$(date)/g" config/includes.chroot/install.sh
sed -i "s/XXDEPLOYUSERXX/${deployusername}/g" config/includes.chroot/install.sh
# Build the live image
echo "Building live image..."
sudo lb build
# Move the ISO image out
cp live-image-amd64.hybrid.iso ../../${isofilename}
# Clean up the artifacts
if [[ -z ${preserve_artifacts} ]]; then
echo "Cleaning live-build environment..."
sudo lb clean
fi
popd &>/dev/null
# Clean up the config
if [[ -z ${preserve_livebuild} ]]; then
echo -n "Removing artifacts... "
sudo rm -rf artifacts/lb
echo "done."
fi
echo
echo "Build completed. ISO file: ${isofilename}"