arkdep/arkanium-build

171 lines
5.5 KiB
Text
Raw Normal View History

2023-06-21 18:36:52 +02:00
#!/usr/bin/env bash
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
# Print manual if no parameters provided or invalid amount of parameters is provided
if [[ ! -n $1 || -n $2 ]]; then
cat <<- END
2023-08-09 08:09:20 +02:00
Usage: arkanium-build [variant]
2023-06-21 18:36:52 +02:00
Variants:
archlinux Plain Arch Linux TTY image
arkanelinux Arkane Linux GNOME image
debian Plain Debian TTY image
Variants are loaded based on their directory names, the ones listed here
are included by default. For information on the exact configuration of
2023-08-09 08:09:20 +02:00
these variants or to create your own see /etc/arkanium/variants.
2023-06-21 18:36:52 +02:00
END
exit 0
fi
## Set common variables
#
2023-06-26 00:32:59 +02:00
declare -r workdir='/var/tmp/rootfs'
2023-08-09 08:22:08 +02:00
declare -r configs_dir="./arkanium-build.d/"
declare -r variant="$1"
declare -r type="$(cat $(readlink -m $configs_dir/$variant/type))"
2023-06-26 00:32:59 +02:00
declare -r output_target="$(pwd)/"
2023-06-21 18:36:52 +02:00
## Common functions
#
# Cleanup and quit if error
cleanup_and_quit () {
# If any paramters are passed we will assume it to be an error
2023-06-22 02:27:51 +02:00
[[ -n $1 ]] && printf "\e[1;31m<#>\e[0m $*\e[0m\n" >&2
2023-06-21 18:36:52 +02:00
2023-06-26 00:32:59 +02:00
btrfs property set -ts $workdir ro false
btrfs property set -ts $workdir/etc ro false
btrfs property set -ts $workdir/var ro false
2023-06-21 18:36:52 +02:00
# Remove temporary btrfs volumes
2023-08-09 08:09:20 +02:00
[[ ! -n $arkanium_NO_CLEANUP ]] && btrfs subvolume delete $workdir/etc \
2023-06-26 00:32:59 +02:00
$workdir/var \
$workdir 2> /dev/null
2023-06-21 18:36:52 +02:00
# Quit program if argument provided to function
[[ -n $1 ]] && exit 1
# Otherwise just quit, there is no error
exit 0
}
2023-08-11 08:04:36 +02:00
# Generate a 42 character long random string, used for generating psuedo-random
# image names
gen_random_string () {
random=$(openssl rand -hex 100 | head -c 42)
printf "${random}\n"
}
2023-06-21 18:36:52 +02:00
## Error checking
#
# Quit if not root
[[ ! $EUID -eq 0 ]] &&
2023-06-22 02:27:51 +02:00
printf '\e[1;31m<#>\e[0m\e[1m This program has to be run as root\n\e[0m' &&
2023-06-21 18:36:52 +02:00
exit 1
# Check if all dependencies are installed, quit if not
for prog in btrfs pacstrap; do
if ! command -v $prog > /dev/null; then
2023-06-22 02:27:51 +02:00
printf "\e[1;31m<#>\e[0m\e[1m Failed to locate $prog, ensure it is installed\e[0m\n"
2023-06-21 18:36:52 +02:00
exit 1
fi
done
# Check if requested variant exists
2023-08-09 08:09:20 +02:00
[[ ! -d arkanium-build.d/$variant ]] &&
2023-06-22 02:27:51 +02:00
printf '\e[1;31m<#>\e[0m\e[1m The requested variant does not exist\e[0m\n' &&
2023-06-21 18:36:52 +02:00
exit 1
2023-06-22 01:53:19 +02:00
## Variants
#
2023-06-21 18:36:52 +02:00
# Build archlinux type image
2023-06-25 20:27:47 +02:00
if [[ $type == 'archlinux' ]]; then
2023-06-21 18:36:52 +02:00
# Ensure base.list exists, if not error and quit
2023-08-10 06:44:20 +02:00
if [[ ! -e arkanium-build.d/$variant/base.list ]]; then
printf "\e[1;31m<#>\e[0m\e[1m The required file 'base.list' is not preset in $(readlink -m $configs_dir/$variant)\e[0m\n" &&
2023-06-21 18:36:52 +02:00
exit 1
2023-08-10 06:44:20 +02:00
fi
2023-06-21 18:36:52 +02:00
2023-06-22 02:27:51 +02:00
printf '\e[1;34m-->\e[0m\e[1m Started Arch linux image build\e[0m\n'
2023-06-21 18:36:52 +02:00
# Create temporary Btrfs subvolume
2023-06-26 00:32:59 +02:00
printf "\e[1;34m-->\e[0m\e[1m Creating temporary Btrfs subvolumes at $(readlink -m $workdir)\e[0m\n"
2023-06-22 02:33:11 +02:00
btrfs subvolume create $workdir || cleanup_and_quit "Failed to create btrfs subvolume $(readlink -m $workdir)"
2023-06-26 00:32:59 +02:00
btrfs subvolume create $workdir/etc || cleanup_and_quit "Failed to create btrfs subvolume $(readlink -m $workdir/etc)"
btrfs subvolume create $workdir/var || cleanup_and_quit "Failed to create btrfs subvolume $(readlink -m $workdir/var)"
2023-06-21 18:36:52 +02:00
# Read base package list and install base system
2023-08-09 08:09:20 +02:00
readarray base_packages < arkanium-build.d/$variant/base.list
2023-06-22 02:27:51 +02:00
printf "\e[1;34m-->\e[0m\e[1m Installing base packages\e[0m\n"
2023-06-21 18:36:52 +02:00
pacstrap $workdir ${base_packages[*]} || cleanup_and_quit 'Failed to install secondary package list'
# Read package list and install secondary system components, skip if not used
2023-08-10 06:44:20 +02:00
2023-06-21 18:36:52 +02:00
if [[ ! -n skip_secondary_package_installation ]]; then
2023-06-22 02:27:51 +02:00
printf '\e[1;34m-->\e[0m\e[1m Installing secondary packages...\e[0m\n'
2023-08-09 08:09:20 +02:00
readarray packages < arkanium-build.d/$variant/packages.list
2023-06-21 18:36:52 +02:00
arch-chroot $workdir pacman -S --noconfirm ${packages[*]} || cleanup_and_quit 'Failed to install base packages'
fi
2023-08-09 08:09:20 +02:00
# If overlay directory exists in variant copy it to the temporary subvolume
if [[ -d arkanium-build.d/$variant/overlay ]]; then
cp -rv arkanium-build.d/$variant/overlay/* $workdir/
2023-06-21 18:36:52 +02:00
fi
2023-08-09 08:09:20 +02:00
# Enable systemd services if requested
if [[ -e arkanium-build.d/$variant/systemd.services ]]; then
readarray services < "arkanium-build.d/$variant/systemd.services"
for service in services; do
arch-chroot $workdir systemctl enable $service
done
fi
# Clear pacman cache
arch-chroot $workdir pacman --noconfirm -Scc
2023-06-21 18:36:52 +02:00
# Remove subvolumes created by systemd
[[ -d $workdir/var/lib/portables ]] &&
2023-06-22 02:27:51 +02:00
printf "\e[1;34m-->\e[0m\e[1m Removing systemd subvolume var/lib/portables\e[0m\n" &&
2023-06-21 18:36:52 +02:00
btrfs subvolume delete $workdir/var/lib/portables
[[ -d $workdir/var/lib/machines ]] &&
2023-06-22 02:27:51 +02:00
printf "\e[1;34m-->\e[0m\e[1m Removing systemd subvolume var/lib/machines\e[0m\n" &&
2023-06-21 18:36:52 +02:00
btrfs subvolume delete $workdir/var/lib/machines
2023-06-25 17:53:30 +02:00
# Clear pacman cache
rm -rf $workdir/var/cache/pacman/pkg/*
rm -rf $workdir/var/lib/pacman/local/*
2023-06-21 18:36:52 +02:00
# Make subvolume read-only
2023-06-26 00:32:59 +02:00
printf "\e[1;34m-->\e[0m\e[1m Adding read-only property to subvolumes\e[0m\n"
2023-06-21 18:36:52 +02:00
btrfs property set -ts $workdir ro true
2023-06-26 00:32:59 +02:00
btrfs property set -ts $workdir/etc ro true
btrfs property set -ts $workdir/var ro true
2023-06-21 18:36:52 +02:00
2023-08-11 08:04:36 +02:00
# Generate random name for new image
declare -r image_name=$(gen_random_string)
# Create dir for storing the images
mkdir -vp $(readlink -m $output_target/$image_name)
2023-06-21 18:36:52 +02:00
# Write subvolume to image
2023-06-26 00:32:59 +02:00
printf "\e[1;34m-->\e[0m\e[1m Creating images...\e[0m\n"
2023-08-11 08:04:36 +02:00
btrfs send -f $output_target/$image_name/rootfs.img $workdir
btrfs send -f $output_target/$image_name/etc.img $workdir/etc
btrfs send -f $output_target/$image_name/var.img $workdir/var
2023-06-21 18:36:52 +02:00
cleanup_and_quit
2023-08-11 08:04:36 +02:00
2023-06-21 18:36:52 +02:00
fi