#!/bin/bash # linux-deployment-scripts # Copyright (C) 2024 VM-Experiments # # 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. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # hardcoded paths downloads="downloads/" output="output/" chroot="chroot/" resources="resources/" # hardcoded package lists ubuntu_server_packages="nginx grub-pc linux-image-generic" ubuntu_client_packages="grub-pc linux-image-generic" ubuntu_client_gnome_packages="ubuntu-desktop" ubuntu_client_kde_packages="kubuntu-desktop" installer_packages="linux-image-generic grub-pc parted tar dosfstools util-linux e2fsprogs arch-install-scripts" # hardcoded links noble_amd64="https://cdimage.ubuntu.com/ubuntu-base/noble/daily/current/noble-base-amd64.tar.gz" noble_amd64_name="noble-base-amd64.tar.gz" jammy_amd64="https://cdimage.ubuntu.com/ubuntu-base/jammy/daily/current/jammy-base-amd64.tar.gz" jammy_amd64_name="jammy-base-amd64.tar.gz" # hardcoded names ubuntu_noble_server_output="noble-server-amd64" ubuntu_noble_ubuntu_output="noble-ubuntu-amd64" ubuntu_noble_kubuntu_output="noble-kubuntu-amd64" ubuntu_jammy_server_output="jammy-server-amd64" ubuntu_jammy_ubuntu_output="jammy-ubuntu-amd64" ubuntu_jammy_kubuntu_output="jammy-kubuntu-amd64" # creates a menu menu() { iter=1 echo "$1" echo "" shift for arg in "$@"; do echo "$iter) $arg" iter=$((iter + 1)) done read option } # chroot associated functions prepare_chroot() { sudo mount --bind /dev "$chroot/dev" sudo mount --bind /proc "$chroot/proc" sudo mount --bind /sys "$chroot/sys" sudo cp /etc/resolv.conf "$chroot/etc/" } do_chroot_command() { sudo chroot "$chroot" /bin/bash -c "$*" } do_chroot() { prepare_chroot "$chroot" sudo chroot "$chroot" close_chroot "$chroot" } close_chroot() { sudo umount "$chroot/dev" sudo umount "$chroot/proc" sudo umount "$chroot/sys" } # handle rootfs image from internet rootfs_downloader() { cd "$downloads" wget -nc "$1" sudo tar -xzf "$2" -C "../$chroot" cd .. } rootfs_creator() { cd $output sudo tar -czf "$1" -C "../$chroot" . cd .. } # packaging rootfs rootfs_package() { infile="$1.tar.gz" outfile="$1.iso" close_chroot sudo rm -rf "$chroot" sudo mkdir "$chroot" rootfs_downloader "$noble_amd64" "$noble_amd64_name" sudo cp "$infile" "$chroot/rootfs.tar.gz" prepare_chroot do_chroot_command "apt update" do_chroot_command "DEBIAN_FRONTEND=noninteractive apt install -y $installer_packages" do_chroot_command "mkdir -p /etc/systemd/system/getty@tty1.service.d/" do_chroot_command "touch /etc/systemd/system/getty@tty1.service.d/override.conf" do_chroot_command "echo -e '[Service]\nExecStart=\nExecStart=/sbin/agetty --noclear --autologin root %I \$TERM' | tee /etc/systemd/system/getty@tty1.service.d/override.conf" do_chroot_command "systemctl daemon-reload" do_chroot_command "systemctl enable getty@tty1.service" close_chroot sudo cp "$resources/grub.cfg" "$chroot/boot/grub/grub.cfg" sudo cp "$resources/install.sh" "$chroot/root" echo "./install.sh" | sudo tee -a "$chroot/root/.profile" echo "./install.sh" | sudo tee -a "$chroot/root/.bashrc" sudo grub2-mkrescue -o "$outfile" "$chroot" } # distro specific ubuntu_rootfs_prepare() { rootfs_downloader "$1" "$2" prepare_chroot do_chroot_command "apt update -y" do_chroot_command "apt full-upgrade -y" do_chroot_command "DEBIAN_FRONTEND=noninteractive apt install -y $3" close_chroot rootfs_creator "$4.tar.gz" rootfs_package "$output$4" } main() { mkdir -p "$downloads" "$output" close_chroot sudo rm -rf "$chroot" sudo mkdir "$chroot" clear menu "Welcome to the Ubuntu installer creation script. Choose an option." "Ubuntu 24.04" "Ubuntu 22.04" case $option in 1) menu "Choose an option." "Server" "Client" case $option in 1) ubuntu_rootfs_prepare "$noble_amd64" "$noble_amd64_name" "$ubuntu_server_packages" "$ubuntu_noble_server_output" ;; 2) menu "Choose an option." "Ubuntu" "Kubuntu" case $option in 1) ubuntu_rootfs_prepare "$noble_amd64" "$noble_amd64_name" "$ubuntu_client_packages $ubuntu_client_gnome_packages" "$ubuntu_noble_ubuntu_output" ;; 2) ubuntu_rootfs_prepare "$noble_amd64" "$noble_amd64_name" "$ubuntu_client_packages $ubuntu_client_kde_packages" "$ubuntu_noble_kubuntu_output" ;; *) ;; esac ;; *) ;; esac ;; 2) menu "Choose an option." "Server" "Client" case $option in 1) ubuntu_rootfs_prepare "$jammy_amd64" "$jammy_amd64_name" "$ubuntu_server_packages" "$ubuntu_jammy_server_output" ;; 2) menu "Choose an option." "Ubuntu" "Kubuntu" case $option in 1) ubuntu_rootfs_prepare "$jammy_amd64" "$jammy_amd64_name" "$ubuntu_client_packages $ubuntu_client_gnome_packages" "$ubuntu_jammy_ubuntu_output" ;; 2) ubuntu_rootfs_prepare "$jammy_amd64" "$jammy_amd64_name" "$ubuntu_client_packages $ubuntu_client_kde_packages" "$ubuntu_jammy_kubuntu_output" ;; *) ;; esac ;; *) ;; esac ;; *) ;; esac } main $*