arkdep/arkanium-build

186 lines
6 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:
2023-08-14 08:53:26 +02:00
archlinux Plain Arch Linux TTY image
2023-06-21 18:36:52 +02:00
arkanelinux Arkane Linux GNOME image
Variants are loaded based on their directory names, the ones listed here
2023-08-14 08:35:35 +02:00
are included by default.
2023-08-14 08:50:48 +02:00
Variables:
ARKANIUM_NO_TAR Do not create a compressed tarball, only create the images
ARKANIUM_OVERWRITE_RANDOM Define a custom image name
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-08-13 06:13:19 +02:00
declare -r output_target="$(pwd)/target/"
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-13 06:13:19 +02:00
rm -rf $workdir/etc \
2023-06-26 00:32:59 +02:00
$workdir/var \
2023-08-13 06:13:19 +02:00
$workdir
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 () {
2023-08-14 08:22:38 +02:00
if [[ -v ARKANIUM_OVERWRITE_RANDOM ]]; then
random=$ARKANIUM_OVERWRITE_RANDOM
else
random=$(openssl rand -hex 100 | head -c 42)
fi
2023-08-11 08:04:36 +02:00
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'
2023-08-13 06:13:19 +02:00
# If overlay directory exists in variant copy it's contents to the temporary subvolume
if [[ -d arkanium-build.d/$variant/overlay ]]; then
cp -rv arkanium-build.d/$variant/overlay/* $workdir/
fi
2023-08-10 06:44:20 +02:00
2023-08-13 06:13:19 +02:00
# Read package list and install secondary system components, skip if not used
if [[ -e arkanium-build.d/$variant/package.list ]]; 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-13 06:13:19 +02:00
readarray packages < arkanium-build.d/$variant/package.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
# Enable systemd services if requested
if [[ -e arkanium-build.d/$variant/systemd.services ]]; then
2023-08-13 06:13:19 +02:00
printf '\e[1;34m-->\e[0m\e[1m Enabling systemd services...\e[0m\n'
readarray services < arkanium-build.d/$variant/systemd.services
2023-08-09 08:09:20 +02:00
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
printf "\e[1;34m-->\e[0m\e[1m Generating psuedo-random image name...\e[0m\n"
2023-08-11 08:04:36 +02:00
# Generate random name for new image
declare -r image_name=$(gen_random_string)
printf "$image_name\n"
2023-08-11 08:04:36 +02:00
# 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-13 06:13:19 +02:00
btrfs send -f $output_target/$image_name/$image_name-rootfs.img $workdir
btrfs send -f $output_target/$image_name/$image_name-etc.img $workdir/etc
btrfs send -f $output_target/$image_name/$image_name-var.img $workdir/var
2023-08-14 08:50:48 +02:00
if [[ ! -v ARKANIUM_NO_TAR ]]; then
printf "\e[1;34m-->\e[0m\e[1m Compressing images...\e[0m\n"
tar -cv -I 'zstd -12 -T0 ' -f $output_target/$image_name.tar.zst $output_target/$image_name
fi
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