#!/bin/bash # Amelia Installer # Source: https://gitlab.com/prism7/archery # Version: 9.2.3 set -euo pipefail ################################################################################################### # COLOR FUNCTIONS nc="\e[0m" red="\e[31m" cyan="\e[36m" blue="\e[94m" green="\e[32m" yellow="\e[33m" magenta="\e[35m" yellowl="\e[93m" redbg="\e[1;41m" bwhite="\e[0;97m" cyanbg="\e[1;46m" bluebg="\e[1;44m" greenbg="\e[1;42m" yellowbg="\e[1;43m" magentabg="\e[1;45m" MAGENTABG() { echo -e "${magentabg} $1${nc}" ;} YELLOWBG() { echo -e "${yellowbg} $1${nc}" ;} YELLOWL() { echo -e "${yellowl} $1${nc}" ;} GREENBG() { echo -e "${greenbg} $1${nc}" ;} MAGENTA() { echo -e "${magenta} $1${nc}" ;} YELLOW() { echo -e "${yellow} $1${nc}" ;} BLUEBG() { echo -e "${bluebg} $1${nc}" ;} CYANBG() { echo -e "${cyanbg} $1${nc}" ;} WHITEB() { echo -e "${bwhite} $1${nc}" ;} GREEN() { echo -e "${green} $1${nc}" ;} REDBG() { echo -e "${redbg} $1${nc}" ;} BLUE() { echo -e "${blue} $1${nc}" ;} CYAN() { echo -e "${cyan} $1${nc}" ;} RED() { echo -e "${red} $1${nc}" ;} NC() { echo -e "${nc} $1${nc}" ;} # END COLOR FUNCTIONS ################################################################################################### # PROMPT FUNCTIONS skip() { sleep 0.2 YELLOW " --> Skipping.. " } reload() { sleep 0.2 NC " --> [${green}Reloading${nc}] " } alternatives() { sleep 0.2 NC " --> [${green}Providing alternatives..${nc}] " } pkg_displ() { sleep 0.2 NC " ${green}Packages to be installed${nc}: ${deskpkgs}" } deskname() { sleep 0.2 YELLOW " ### ${nc}${desktopname} ${yellow}has been selected " } vm() { sleep 0.2 RED " ---------------------------------- ### ${yellow}Virtual Machine detected ${red}### ----------------------------------" } invalid() { sleep 0.2 RED " -------------------------- ### ${yellow}Invalid Response ${red}### --------------------------" reload } err_try() { sleep 0.2 RED " -------------------------------------------- ### ${yellow}Errors occured. Please try again.. ${red}### --------------------------------------------" reload } err_abort() { sleep 0.2 RED " ------------------------ ### ${yellow}Errors occured ${red}### ------------------------" failure } reboot() { if [[ "${luks_encrypt}" == "ok" ]]; then sleep 0.2 RED " ------------------------------------------------------------------- ### ${yellow}The system will now ${nc}reboot ${yellow}for all changes to take effect ${red}### ------------------------------------------------------------------- " sleep 5 systemctl reboot fi } force_reboot() { sleep 0.2 RED " ---------------------------------------------------------------- ### ${yellow}A reboot is mandatory after performing LUKS encryption ${red}### ---------------------------------------------------------------- " sleep 5 systemctl reboot } line2() { printf '\n\n' } line3() { printf '\n\n\n' } unmount() { sleep 0.2 line3 REDBG " ${yellow}----------------------------------- " REDBG " ${yellow}[!] Unmount and Retry [!] " REDBG " ${yellow}----------------------------------- " echo reload sleep 0.2 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Unmount Filesystems${nc} ${magenta}]${nc}-----------------------------------${magenta}### " if umount -R /mnt > /dev/null 2>&1 ; then sleep 0.2 NC " ------------------ ### ${green}Unmount OK ${nc}### ------------------" else sleep 0.2 RED " ----------------------------- ### ${yellow}Unmounting Failed.. ${red}### -----------------------------" failure fi } do_umount() { unmount reload } umount_manual() { unmount sleep 0.2 NC " --> [Switching to ${green}Manual Mode${nc}]" } choice() { sleep 0.2 RED " -------------------------------------------- ### ${yellow}Please make a choice to continue.. ${red}### --------------------------------------------" reload } y_n() { sleep 0.2 RED " ---------------------------------------------- ### ${yellow}Please type 'y' or 'n' to continue.. ${red}### ----------------------------------------------" reload } yes_no() { sleep 0.2 RED " ------------------------------------------------- ### ${yellow}Please type 'yes' or 'no' to continue.. ${red}### -------------------------------------------------" reload } ok() { sleep 0.2 NC " ==> [${green}${prompt} OK${nc}] " } stage_ok() { sleep 0.2 NC " ==> [${green}${stage_prompt} OK${nc}] " sleep 0.3 } stage_fail() { sleep 0.2 line2 REDBG " ${yellow}[!] ${stage_prompt} FAILED [!]" failure } completion_err() { if [[ -e /usr/bin/pv ]]; then sleep 0.2 CYAN " (*) ${nc}Please complete${yellowl} '${stage_prompt}' ${nc}to continue "| pv -qL 70 else sleep 0.2 CYAN " (*) ${nc}Please complete${yellowl} '${stage_prompt}' ${nc}to continue " fi } term_offer() { sleep 0.2 YELLOW " ### NOTE: ${desktopname} desktop lacks a native Terminal emulator by design ### You can use linux console (ctrl+alt+F'n') for shell access > Install ${nc}'gnome-terminal' ${yellow}for convenience ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " console console="${console:-y}" console="${console,,}" case "${console}" in y) terminal="gnome-terminal" sleep 0.2 NC " ==> [${green}Terminal OK${nc}] " ;; n) skip ;; *) invalid until term_offer; do : ; done ;; esac } amd() { line2 REDBG " ------------------------------- " REDBG " ### AMD Graphics detected ### " REDBG " ------------------------------- " NC " * ${gfxcard} " } intel() { line2 BLUEBG " --------------------------------- " BLUEBG " ### INTEL Graphics detected ### " BLUEBG " --------------------------------- " NC " * ${gfxcard} " } nvidia() { line2 GREENBG " ---------------------------------- " GREENBG " ### NVIDIA Graphics detected ### " GREENBG " ---------------------------------- " NC " * ${gfxcard} " } arch() { sleep 0.2 line3 BLUEBG "************************************************************************************************* " BLUEBG " " BLUEBG " ##### Archlinux Installation ##### " BLUEBG " " BLUEBG "************************************************************************************************* " line2 } cnfg() { sleep 0.2 line3 MAGENTABG "------------------------------------------------------------------------------------------------- " MAGENTABG " ### Configuring ### " MAGENTABG "------------------------------------------------------------------------------------------------- " line3 } completion() { sleep 0.2 line3 GREENBG "************************************************************************************************* " GREENBG " " GREENBG " ### Installation Completed ### " GREENBG " " GREENBG "************************************************************************************************* " line3 } failure() { sleep 0.2 line3 REDBG "************************************************************************************************* " REDBG " " REDBG " ### Installation Aborted ### " REDBG " " REDBG "************************************************************************************************* " line3 umount -R /mnt > /dev/null 2>&1 if [[ "${luks_root}" == "ok" || "${luks_swap}" == "ok" || "${luks_home}" == "ok" ]] && [[ "${installation}" != "ok" ]]; then force_reboot fi exit } # END PROMPT FUNCTIONS ################################################################################################### # FUNCTIONS first_check() { if [[ -f /usr/share/kbd/consolefonts/ter-v18b.psf.gz && -f /usr/share/kbd/consolefonts/ter-v32b.psf.gz ]]; then if [[ "${tty}" == *"tty"* && "${run_as}" == "root" ]]; then until slct_font; do : ; done else if [[ -e /usr/bin/pv ]]; then MAGENTABG " 'Terminus Font' detected ==> Log in as 'root' in a tty & re-run to enable "| pv -qL 70 echo else MAGENTABG " 'Terminus Font' detected ==> Log in as 'root' in a tty & re-run to enable " echo fi fi fi if [[ "${run_as}" == "root" ]]; then REDBG " ${yellow}---------------------------------------- " REDBG " ${yellow}### The Installer Runs In ROOT Mode ### " REDBG " ${yellow}---------------------------------------- " else YELLOWBG " ---------------------------------------- " YELLOWBG " ### The Installer Runs In DEMO Mode ### " YELLOWBG " ---------------------------------------- " fi } ################################################################################################### slct_font() { sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Font Selection${nc} ${magenta}]${nc}--------------------------------------${magenta}### " YELLOW " > Select a Font: " NC " [1] Terminus Font [2] HiDPI Terminus Font " BLUE " Enter a number: " read -r -p " ==> " fontselect echo case "${fontselect}" in 1) setfont ter-v18b ;; 2) setfont ter-v32b ;; *) invalid return 1 ;; esac clear } ################################################################################################### uefi_check() { bitness="$(cat /sys/firmware/efi/fw_platform_size)" local prompt="UEFI ${bitness}-bit Mode" sleep 0.2 NC " ${magenta}###${nc}---------------------------------${magenta}[ ${bwhite}UEFI Mode Verification${nc} ${magenta}]${nc}---------------------------------${magenta}### " if [[ "${bitness}" == "64" ]]; then uefimode="x86_64-efi" ok elif [[ "${bitness}" == "32" ]]; then uefimode="i386-efi" ok else RED " -------------------------- ### ${yellow}Not in UEFI Mode ${red}### --------------------------" failure fi } ################################################################################################### connection_check() { local prompt="Internet Connection" sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Internet Connection Check${nc} ${magenta}]${nc}--------------------------------${magenta}### " if ping -c 3 archlinux.org > /dev/null 2>&1; then ok else RED " ---------------------------------------------------------------------- ### ${yellow}A connection to ${nc}'www.archlinux.org' ${yellow}could not be established ${red}### ---------------------------------------------------------------------- " failure fi } ################################################################################################### upd_clock() { local prompt="System Clock" sleep 0.2 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}System Clock Update${nc} ${magenta}]${nc}-----------------------------------${magenta}### " sleep 0.2 timedatectl ok } ################################################################################################### dtct_hyper() { hypervisor="$(systemd-detect-virt)" case "${hypervisor}" in kvm) vmpkgs="spice spice-vdagent spice-protocol spice-gtk qemu-guest-agent swtpm" ;; vmware) vmpkgs="open-vm-tools" vm_services="vmtoolsd vmware-vmblock-fuse" ;; oracle) vmpkgs="virtualbox-guest-utils" ;; microsoft) vmpkgs="hyperv" vm_services="hv_kvp_daemon hv_vss_daemon" ;; esac } ################################################################################################### machine_dtct() { until dtct_hyper; do : ; done local prompt="Machine Detection" sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Machine Detection${nc} ${magenta}]${nc}------------------------------------${magenta}### " CPU="$(grep -E 'vendor_id' /proc/cpuinfo)" hardw_model="$(hostnamectl | grep -E 'Hardware Model:'| sed 's| Hardware Model: ||')" hardw_model_vend="$(hostnamectl | grep -E 'Hardware Model:'| sed 's| Hardware Model: ||' | awk "{print \$1}")" hardw_vendor="$(hostnamectl | grep -E 'Hardware Vendor' | awk "{print \$3}")" machine="$(hostnamectl | grep -E 'Chassis' | awk "{print \$2}")" if [[ "${hypervisor}" != "none" ]]; then vm vendor="Virtual Machine" gfxconf="n" fi if [[ "${CPU}" == *"GenuineIntel"* ]]; then microcode="intel-ucode" nrg_plc="x86_energy_perf_policy" cpu_name="Intel" elif [[ "${CPU}" == *"AuthenticAMD"* ]]; then microcode="amd-ucode" cpu_name="AMD" fi if [[ "${hardw_model_vend}" == "${hardw_vendor}" ]]; then sleep 0.2 YELLOW " ### This system is a(n) ${nc}${hardw_model} ${yellow}${machine} ### The ${nc}${cpu_name} ${yellow}cpu microcode will be installed " else sleep 0.2 YELLOW " ### This system is a(n) ${nc}${hardw_model} ${yellow}${hardw_vendor} ${machine} ### The ${nc}${cpu_name} ${yellow}cpu microcode will be installed " fi ok } ################################################################################################### main_menu() { sleep 0.2 NC " ${magenta}###${nc}----------------------------------------${magenta}[ ${bwhite}Main Menu${nc} ${magenta}]${nc}----------------------------------------${magenta}### " YELLOW " > Make a selection: " if [[ -e /usr/bin/pv ]]; then CYAN " (*) ${nc}Select ${bwhite}[4] ${nc}to utilize ${yellowl}'Assisted Navigation' ${nc}& ${yellowl}'Smart Partitioning' ${nc}features " | pv -qL 70 else CYAN " (*) ${nc}Select ${bwhite}[4] ${nc}to utilize ${yellowl}'Assisted Navigation' ${nc}& ${yellowl}'Smart Partitioning' ${nc}features " fi NC " [1] Personalization [2] System Configuration [3] Disk Management [4] Start Installation " BLUE " Enter a number: " read -r -p " ==> " menu echo case "${menu}" in 1) until persnl_submn; do : ; done ;; 2) until sys_submn; do : ; done ;; 3) until dsks_submn; do : ; done ;; 4) until instl; do : ; done ;; "") sleep 0.2 RED " --------------------------------- ### ${yellow}Please select a Submenu ${red}### ---------------------------------" reload return 1 ;; *) invalid return 1 ;; esac } ################################################################################################### persnl_submn() { sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Personalization${nc} ${magenta}]${nc}-------------------------------------${magenta}### " YELLOW " > Select a Submenu: " NC " [1] Locale & Keyboard Layout Setup [2] User, Root User & Hostname Setup [3] Shell Selection [ ] Return to Main Menu " BLUE " Enter a number: " read -r -p " ==> " persmenu echo case "${persmenu}" in 1) until slct_locale; do : ; done until slct_kbd; do : ; done return 1 ;; 2) until user_setup; do : ; done until rootuser_setup; do : ; done until slct_hostname; do : ; done return 1 ;; 3) until slct_shell; do : ; done return 1 ;; "") until main_menu; do : ; done ;; *) invalid return 1 ;; esac } ################################################################################################### slct_locale() { local prompt="Locale" sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Locale Selection${nc} ${magenta}]${nc}------------------------------------${magenta}### " YELLOW " > Select your Locale ### [Enter ${nc}'l'${yellow} to list locales, then ${nc}'enter'${yellow} to search or ${nc}'q'${yellow} to quit] " RED " --------------------------------- ### ${yellow}Exclude ${nc}'.UTF_8' ${yellow}suffix ${red}### ---------------------------------" BLUE " Enter your Locale ${bwhite}(empty for 'en_US')${blue}: " read -r -p " ==> " LOCALESET echo if [[ -z "${LOCALESET}" ]]; then SETLOCALE="en_US.UTF-8" sleep 0.2 YELLOW " ### en_US.UTF-8 Locale has been selected " elif [[ "${LOCALESET}" == "l" ]]; then grep -E 'UTF-8' /usr/share/i18n/SUPPORTED | less return 1 elif ! grep -q "^#\?$(sed 's/[].*[]/\\&/g' <<< "${LOCALESET}") " /usr/share/i18n/SUPPORTED; then invalid return 1 else SETLOCALE="${LOCALESET}.UTF-8" sleep 0.2 YELLOW " ### ${SETLOCALE} Locale has been selected " fi ok lcl_slct="yes" } ################################################################################################### slct_kbd() { local prompt="Keyboard Layout" local stage_prompt="Setting Keyboard Layout" sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Keyboard Layout Selection${nc} ${magenta}]${nc}--------------------------------${magenta}### " YELLOW " > Select your Keyboard Layout ### [Enter ${nc}'l'${yellow} to list layouts, then ${nc}'enter'${yellow} to search or ${nc}'q'${yellow} to quit] " BLUE " Enter your keyboard layout ${bwhite}(empty for 'us')${blue}: " read -r -p " ==> " SETKBD echo if [[ -z "${SETKBD}" ]]; then SETKBD="us" sleep 0.2 YELLOW " ### us Keyboard Layout has been selected " elif [[ "${SETKBD}" == "l" ]]; then localectl list-keymaps | less return 1 elif ! localectl list-keymaps | grep -Fxq "${SETKBD}"; then invalid return 1 else sleep 0.2 YELLOW " ### ${SETKBD} Keyboard Layout has been selected " loadkeys "${SETKBD}" > /dev/null 2> amelia_log.txt || stage_fail fi ok } ################################################################################################### user_setup() { local prompt="User" sleep 0.2 NC " ${magenta}###${nc}---------------------------------------${magenta}[ ${bwhite}User Setup${nc} ${magenta}]${nc}---------------------------------------${magenta}### " BLUE " Enter a username: " read -r -p " ==> " USERNAME echo if [[ -z "${USERNAME}" ]]; then sleep 0.2 RED " --------------------------------------------- ### ${yellow}Please enter a username to continue ${red}### ---------------------------------------------" reload return 1 elif [[ "${USERNAME}" =~ [[:upper:]] ]]; then sleep 0.2 RED " ------------------------------------------------------ ### ${yellow}Uppercase is not allowed. Please try again.. ${red}### ------------------------------------------------------" reload return 1 fi BLUE " Enter a password for${nc} ${cyan}${USERNAME}${blue}: " read -r -p " ==> " USERPASSWD echo if [[ -z "${USERPASSWD}" ]]; then sleep 0.2 RED " --------------------------------------------- ### ${yellow}Please enter a password to continue ${red}### ---------------------------------------------" reload return 1 fi BLUE " Re-enter${nc} ${cyan}${USERNAME}'s ${blue}password: " read -r -p " ==> " USERPASSWD2 echo if [[ "${USERPASSWD}" != "${USERPASSWD2}" ]]; then sleep 0.2 RED " --------------------------------------------------- ### ${yellow}Passwords don't match. Please try again.. ${red}### ---------------------------------------------------" reload return 1 fi ok } ################################################################################################### rootuser_setup() { local prompt="Root User" sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Root User Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}### " BLUE " Enter a password for the${nc}${cyan} Root ${blue}user: " read -r -p " ==> " ROOTPASSWD echo if [[ -z "${ROOTPASSWD}" ]]; then sleep 0.2 RED " --------------------------------------------------------------- ### ${yellow}Please enter a password for the Root user to continue ${red}### ---------------------------------------------------------------" reload return 1 fi BLUE " Re-enter${nc} ${cyan}Root ${blue}user's password: " read -r -p " ==> " ROOTPASSWD2 echo if [[ "${ROOTPASSWD}" != "${ROOTPASSWD2}" ]]; then sleep 0.2 RED " --------------------------------------------------- ### ${yellow}Passwords don't match. Please try again.. ${red}### ---------------------------------------------------" reload return 1 fi ok } ################################################################################################### slct_hostname() { local prompt="Hostname" sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Hostname Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}### " BLUE " Enter a hostname: " read -r -p " ==> " HOSTNAME echo if [[ -z "${HOSTNAME}" ]]; then sleep 0.2 RED " --------------------------------------------- ### ${yellow}Please enter a hostname to continue ${red}### ---------------------------------------------" reload return 1 elif [[ "${HOSTNAME}" =~ [[:upper:]] ]]; then sleep 0.2 RED " ---------------------------------------------------- ### ${yellow}Lowercase is preferred. Please try again.. ${red}### ----------------------------------------------------" reload return 1 fi ok } ################################################################################################### slct_shell() { local prompt="Shell" sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Shell Selection${nc} ${magenta}]${nc}-------------------------------------${magenta}### " YELLOW " > Select a Shell: " NC " [1] Bash [2] Zsh [3] Fish " BLUE " Enter a number: " read -r -p " ==> " shellnmbr echo case "${shellnmbr}" in 1) shell="" shellname="bash" shellname2="Bash" shell_pkgs="bash-completion powerline powerline-fonts" ;; 2) shell="zsh" shellname="zsh" shellname2="Zsh" shell_pkgs="powerline powerline-fonts zsh-autocomplete zsh-autosuggestions zsh-completions zsh-syntax-highlighting" ;; 3) shell="fish" shellname="fish" shellname2="Fish" shell_pkgs="powerline powerline-fonts which" ;; "") sleep 0.2 RED " ------------------------------- ### ${yellow}Please select a Shell ${red}### -------------------------------" reload return 1 ;; *) invalid return 1 ;; esac sleep 0.2 YELLOW " ### The ${shellname2} shell has been selected " ok } ################################################################################################### sys_submn() { sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}System Configuration${nc} ${magenta}]${nc}----------------------------------${magenta}### " YELLOW " > Select a Submenu: " NC " [1] Kernel, Secureboot Signing, Bootloader & ESP Mountpoint [2] Filesystem & Swap Setup [3] Graphics Setup [4] Desktop Setup [5] EFI Boot Entries Deletion [6] Optimizations [ ] Return to Main Menu " BLUE " Enter a number: " read -r -p " ==> " sysmenu echo case "${sysmenu}" in 1) until slct_krnl; do : ; done until ask_sign; do : ; done until slct_bootldr; do : ; done until slct_espmnt; do : ; done return 1 ;; 2) until slct_fs; do : ; done until slct_swap; do : ; done return 1 ;; 3) until dtct_gfx; do : ; done return 1 ;; 4) until dsktp_setup; do : ; done return 1 ;; 5) until boot_entr; do : ; done return 1 ;; 6) until optm_submn; do : ; done return 1 ;; "") until main_menu; do : ; done ;; *) invalid return 1 ;; esac } ################################################################################################### slct_krnl() { local prompt="Kernel" sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Kernel Selection${nc} ${magenta}]${nc}------------------------------------${magenta}### " YELLOW " > Select a Kernel: " NC " [1] Linux [2] Linux LTS [3] Linux Hardened [4] Linux Zen " BLUE " Enter a number: " read -r -p " ==> " kernelnmbr echo case "${kernelnmbr}" in 1) kernel="linux" kernelname="Linux" ;; 2) kernel="linux-lts" kernelname="Linux LTS" ;; 3) CYAN " (*) ${nc}System Hibernation is ${yellowl}NOT SUPPORTED ${nc}by kernel " kernel="linux-hardened" kernelname="Linux Hardened" ;; 4) kernel="linux-zen" kernelname="Linux Zen" ;; "") sleep 0.2 RED " -------------------------------- ### ${yellow}Please select a Kernel ${red}### --------------------------------" reload return 1 ;; *) invalid return 1 ;; esac sleep 0.2 YELLOW " ### The ${kernelname} kernel has been selected " ok } ################################################################################################### ask_sign() { sleep 0.2 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Secureboot Signing${nc} ${magenta}]${nc}-----------------------------------${magenta}### " YELLOW " > Sign UKI(s), Kernel & binaries for use with ${nc}Secure Boot ${yellow}? [Y/n]" BLUE " Enter [Y/n]: " read -r -p " ==> " sb_sign echo sb_sign="${sb_sign:-y}" sb_sign="${sb_sign,,}" if [[ "${sb_sign}" == "y" ]]; then local prompt="Secure Boot 'Setup' Mode Verification" SB_Status="$(bootctl status 2> /dev/null | grep -E 'Secure Boot' | awk "{print \$4}")" if [[ ${SB_Status} == "(setup)" ]]; then ok else sleep 0.2 RED " ----------------------------------------- ### ${yellow}Secure Boot Not in 'Setup' Mode ${red}### -----------------------------------------" failure fi sleep 0.2 YELLOW " ### 'Secure Boot Signing' has been selected " sleep 0.2 YELLOW " > Create an additional bootloader ${nc}Rescue ${yellow}entry (for troubleshooting) ? [Y/n]" BLUE " Enter [Y/n]: " read -r -p " ==> " setrescue echo setrescue="${setrescue:-y}" setrescue="${setrescue,,}" if [[ "${setrescue}" == "y" ]]; then local prompt="Rescue Entry set" ok elif [[ "${setrescue}" == "n" ]]; then skip else y_n return 1 fi elif [[ "${sb_sign}" == "n" ]]; then skip else y_n return 1 fi local prompt="Secure Boot Signing setup" ok } ################################################################################################### slct_bootldr() { local prompt="Bootloader Selection" sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Bootloader Selection${nc} ${magenta}]${nc}----------------------------------${magenta}### " YELLOW " > Select a Bootloader: " NC " [1] Systemd-boot [2] Grub " BLUE " Enter a number: " read -r -p " ==> " bootloader echo case "${bootloader}" in 1) uki="y" ukify="systemd-ukify" sleep 0.2 YELLOW " ### Systemd-boot has been selected " ;; 2) uki="n" sleep 0.2 YELLOW " ### Grub has been selected " ;; "") sleep 0.2 RED " ------------------------------------ ### ${yellow}Please select a Bootloader ${red}### ------------------------------------" reload return 1 ;; *) invalid return 1 ;; esac ok } ################################################################################################### slct_espmnt() { local prompt="ESP Mountpoint" sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}ESP Mountpoint Selection${nc} ${magenta}]${nc}--------------------------------${magenta}### " YELLOW " > Select a Mountpoint for the ESP: " NC " [1] /mnt/efi [2] /mnt/boot " BLUE " Enter a number: " read -r -p " ==> " espmnt echo case "${espmnt}" in 1) esp_mount="/mnt/efi" btldr_esp_mount="/efi" sleep 0.2 YELLOW " ### '/mnt/efi' mountpoint has been selected " ;; 2) esp_mount="/mnt/boot" btldr_esp_mount="/boot" sleep 0.2 YELLOW " ### '/mnt/boot' mountpoint has been selected " ;; "") sleep 0.2 RED " ------------------------------------ ### ${yellow}Please select a Mountpoint ${red}### ------------------------------------" reload return 1 ;; *) invalid return 1 ;; esac ok if [[ "${sanity}" == "no" ]]; then until sanity_check; do : ; done fi } ################################################################################################### slct_fs() { local prompt="Filesystem Setup" sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Filesystem Selection${nc} ${magenta}]${nc}----------------------------------${magenta}### " YELLOW " > Select Filesystem to be used: " NC " [1] Ext4 [2] Btrfs " BLUE " Enter a number: " read -r -p " ==> " fs echo case "${fs}" in 1) fsname="Ext4" fs_mod="ext4" fstools="e2fsprogs" roottype="/Root" sleep 0.2 YELLOW " ### NOTE: Keeping User Data on a separate /Home Partition is supported > Make use of a ${nc}dedicated ${yellow}/Home Partition ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " sep_home echo sep_home="${sep_home:-y}" sep_home="${sep_home,,}" case "${sep_home}" in y) sleep 0.2 YELLOW " ### A /Home Partition will be created ";; n) skip echo;; *) invalid return 1 ;; esac sleep 0.2 YELLOW " ### ${fsname} has been selected " ;; 2) fsname="Btrfs" fs_mod="btrfs" fstools="btrfs-progs" roottype="/@" btrfs_bootopts="rootflags=subvol=@" sleep 0.2 YELLOW " ### ${fsname} has been selected " sleep 0.2 YELLOW " > Label your Btrfs ${nc}snapshots ${yellow}directory: " BLUE " Enter a name: " read -r -p " ==> " snapname echo if [[ -z "${snapname}" ]]; then invalid return 1 fi ;; "") sleep 0.2 RED " ------------------------------------ ### ${yellow}Please select a Filesystem ${red}### ------------------------------------" reload return 1 ;; *) invalid return 1 ;; esac ok } ################################################################################################### slct_swap() { local prompt="Swap Setup" sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Swap Selection${nc} ${magenta}]${nc}-------------------------------------${magenta}### " YELLOW " > Select Swap type: " NC " [1] Swap Partition [2] Swapfile [3] Zram Swap [4] None " BLUE " Enter a number: " read -r -p " ==> " swapmode echo case "${swapmode}" in 1) swaptype="swappart" sleep 0.2 YELLOW " ### Swap Partition has been selected " ;; 2) if [[ "${fs}" == "1" ]]; then swaptype="swapfile" elif [[ "${fs}" == "2" ]]; then swaptype="swapfile_btrfs" fi sleep 0.2 YELLOW " ### Swapfile has been selected " until set_swapsize; do : ; done ;; 3) CYAN " (*) ${nc}Hibernating to Swap on Zram is ${yellowl}NOT SUPPORTED " zram="zram-generator" YELLOW " ### Zram Swap has been selected " ;; 4) sleep 0.2 YELLOW " ### No Swap will be used " skip ;; "") choice return 1 ;; *) invalid return 1 ;; esac ok } ################################################################################################### set_swapsize() { local prompt="Swapsize" BLUE " Enter Swap size ${bwhite}(in GB)${blue}: " read -r -p " ==> " swapsize echo if [[ -z "${swapsize}" ]]; then sleep 0.2 RED " ------------------------------------------ ### ${yellow}Please enter a value to continue ${red}### ------------------------------------------" reload line2 return 1 elif [[ "${swapsize}" == [[:digit:]] ]]; then ok else sleep 0.2 RED " --------------------------------------------- ### ${yellow}Please use only integers as a value ${red}### ---------------------------------------------" reload line2 return 1 fi } ################################################################################################### dtct_gfx() { gfx_slct="yes" vendor="" vendors="" if [[ "${hypervisor}" != "none" ]]; then vendor="Virtual Machine" vm sleep 0.2 YELLOW " --> Graphics Setup skipped " return 0 else sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Graphics Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}### " gfxcount="$(lspci | grep -E -c 'VGA|Display|3D')" gfxcard="$(lspci | grep -E 'VGA|Display|3D' | sed 's/^.*: //g')" intelcount="$(lspci | grep -E 'VGA|Display|3D' | grep -E -c 'Intel Corporation')" intelcards="$(lspci | grep -E 'VGA|Display|3D' | grep -E 'Intel Corporation'| sed 's/.*Corporation //g' | cat --number | sed 's/.[0-9]//')" amdcount="$(lspci | grep -E 'VGA|Display|3D' | grep -E -c 'Advanced Micro Devices')" amdcards="$(lspci | grep -E 'VGA|Display|3D' | grep -E 'Advanced Micro Devices' | sed 's/.*\[AMD\/ATI\] //g' | cat --number | sed 's/.[0-9]//')" nvidiacount="$(lspci | grep -E 'VGA|Display|3D' | grep -E -c 'NVIDIA Corporation')" nvidiacards="$(lspci | grep -E 'VGA|Display|3D' | grep -E 'NVIDIA Corporation'| sed 's/.*Corporation //g' | cat --number | sed 's/.[0-9]//')" if [[ "${gfxcount}" == "1" ]]; then dtct_single_gfx else dtct_multi_gfx fi fi } ################################################################################################### dtct_single_gfx() { if [[ "${intelcount}" -eq "1" ]]; then vendor="Intel" sourcetype="Open-source" sleep 0.2 intel elif [[ "${amdcount}" -eq "1" ]]; then vendor="AMD" sourcetype="Open-source" sleep 0.2 amd elif [[ "${nvidiacount}" -eq "1" ]]; then vendor="Nvidia" sourcetype="Proprietary" nvidia fi if [[ "${vendor}" == "Nvidia" ]]; then sleep 0.2 RED " ---------------------------------------------------- ### ${yellow}Only for NV110 ${nc}(Maxwell) ${yellow}Graphics or newer ${red}### ----------------------------------------------------" fi YELLOW " > Configure the Graphics subsystem and enable HW acceleration ? [Y/n] " if [[ "${vendor}" == "Nvidia" ]]; then YELLOW " ### Selecting ${nc}'(n)o' ${yellow}defaults to using the open-source ${nc}'nouveau' ${yellow}driver" fi BLUE " Enter [Y/n]: " read -r -p " ==> " gfxconf gfxconf="${gfxconf:-y}" gfxconf="${gfxconf,,}" if [[ "${gfxconf}" == "y" ]]; then gfx_conf elif [[ "${gfxconf}" == "n" ]]; then local prompt="Graphics Setup" skip ok else invalid return 1 fi } ################################################################################################### dtct_multi_gfx() { if [[ "${gfxcount}" == "2" ]]; then gfx_setup="Dual" elif [[ "${gfxcount}" == "3" ]]; then gfx_setup="Triple" fi sleep 0.2 YELLOW " ### ${gfx_setup} Graphics setup detected, consisting of: " NC " ____________________________________________________________________" if [[ "${intelcount}" -ge "1" ]]; then vendor1="Intel" echo BLUEBG " ------------------------------- " BLUEBG " [${intelcount}] Intel Graphics device(s) " BLUEBG " ------------------------------- " NC " ${intelcards} ____________________________________________________________________" fi if [[ "${amdcount}" -ge "1" ]]; then vendor2="AMD" echo REDBG " ------------------------------- " REDBG " [${amdcount}] AMD Graphics device(s) " REDBG " ------------------------------- " NC " ${amdcards} ____________________________________________________________________" fi if [[ "${nvidiacount}" -ge "1" ]]; then vendor3="Nvidia" echo GREENBG " ------------------------------- " GREENBG " [${nvidiacount}] Nvidia Graphics device(s) " GREENBG " ------------------------------- " NC " ${nvidiacards} ____________________________________________________________________" fi YELLOW " > Configure the Graphics subsystem and enable HW acceleration for : " if [[ -n "${vendor1}" && -n "${vendor2}" ]]; then NC " [1] Intel [2] AMD [3] Both [4] None " BLUE " Enter a number: " read -r -p " ==> " vendor_slct case "${vendor_slct}" in 1) vendor="Intel" ;; 2) vendor="AMD" ;; 3) vendors="Intel & AMD" ;; 4) vendor="none" ;; "") choice return 1 ;; *) invalid return 1 ;; esac elif [[ -n "${vendor1}" && -n "${vendor3}" ]]; then NC " [1] Intel ${red}----------------------------------------------------${nc} [2] Nvidia ${red}### ${yellow}Only for NV110 ${nc}(Maxwell) ${yellow}Graphics or newer ${red}###${nc} ${red}----------------------------------------------------${nc} [3] Both [4] None " BLUE " Enter a number: " read -r -p " ==> " vendor_slct case "${vendor_slct}" in 1) vendor="Intel" ;; 2) vendor="Nvidia" ;; 3) vendors="Intel & Nvidia" ;; 4) vendor="none" ;; "") choice return 1 ;; *) invalid return 1 ;; esac elif [[ -n "${vendor2}" && -n "${vendor3}" ]]; then NC " [1] Amd ${red}----------------------------------------------------${nc} [2] Nvidia ${red}### ${yellow}Only for NV110 ${nc}(Maxwell) ${yellow}Graphics or newer ${red}###${nc} ${red}----------------------------------------------------${nc} [3] Both [4] None " BLUE " Enter a number: " read -r -p " ==> " vendor_slct case "${vendor_slct}" in 1) vendor="AMD" ;; 2) vendor="Nvidia" ;; 3) vendors="AMD & Nvidia" ;; 4) vendor="none" ;; "") choice return 1 ;; *) invalid return 1 ;; esac fi if [[ "${vendor}" =~ ^(intel|AMD)$ ]]; then sourcetype="Open-source" gfxconf="y" gfx_conf elif [[ "${vendor}" == "Nvidia" ]]; then sourcetype="Proprietary" gfxconf="y" gfx_conf elif [[ "${vendors}" == "Intel & AMD" ]]; then sourcetype="Open-source" gfxconf="y" gfx_conf elif [[ "${vendors}" =~ ^(Intel & Nvidia|AMD & Nvidia)$ ]]; then sourcetype="Open-source & Proprietary" gfxconf="y" gfx_conf elif [[ "${vendor}" == "none" ]]; then local prompt="Graphics Setup" gfxconf="n" skip ok fi } ################################################################################################### gfx_conf() { if [[ "${vendor}" != "none" ]]; then sleep 0.2 YELLOW " ### ${sourcetype} drivers will be used " fi if [[ "${vendor}" == "AMD" || "${vendors}" =~ "AMD" ]]; then sleep 0.2 YELLOW " > Enable 'amdgpu' driver support for: " NC " [1] 'Southern Islands' Graphics [2] 'Sea Islands' Graphics " BLUE " Enter a number ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " islands case "${islands}" in 1) sleep 0.2 NC " ==> [${green}Southern Islands OK${nc}] " ;; 2) sleep 0.2 NC " ==> [${green}Sea Islands OK${nc}] " ;; "") skip echo ;; *) invalid return 1 ;; esac fi if [[ "${vendor}" == "Nvidia" || "${vendors}" =~ "Nvidia" ]]; then sleep 0.2 YELLOW " > Select Nvidia architecture: " NC " [1] Turing (NV160) Graphics or newer [Nvidia Open] [2] Maxwell (NV110) Graphics or newer [Nvidia Proprietary / Disabling GSP Firmware available] " BLUE " Enter a number: " read -r -p " ==> " family case "${family}" in 1) # Turing+ Family sleep 0.2 NC " ==> [${green}Turing+ OK${nc}] " ;; 2) # Maxwell+ Family sleep 0.2 NC " ==> [${green}Maxwell+ OK${nc}] " local prompt="GSP Firmware Disabled" sleep 0.2 YELLOW " > Disable 'GSP' firmware (for troubleshooting) ? [y/n] " BLUE " Enter [y/n]: " read -r -p " ==> " nogsp if [[ "${nogsp}" == "n" ]]; then skip echo elif [[ "${nogsp}" == "y" ]]; then ok echo else y_n return 1 fi ;; "") choice return 1 ;; *) invalid return 1 ;; esac local prompt="Low Latency Display Interrupts enabled" sleep 0.2 YELLOW " > Enable Low Latency Display Interrupts (experimental) ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " lowlat lowlat="${lowlat:-y}" lowlat="${lowlat,,}" if [[ "${lowlat}" == "n" ]]; then skip echo elif [[ "${lowlat}" == "y" ]]; then ok echo else y_n return 1 fi fi sleep 0.2 YELLOW " ### ${vendor}${vendors} Graphics will be automatically configured " local prompt="Graphics Setup" ok } ################################################################################################### gfxpkgs_set() { # Graphics packages gfxpkgs=() # Configure Graphics = yes if [[ "${gfxconf}" == "y" ]]; then # Intel Graphics if [[ "${vendor}" == "Intel" || "${vendors}" =~ "Intel" ]]; then # /etc/sysctl.d/99-sysctld.conf perf_stream="dev.i915.perf_stream_paranoid = 0" gfxpkgs+=(intel-compute-runtime intel-media-driver intel-media-sdk libva-intel-driver libva-utils libvpl opencl-headers vpl-gpu-rt vkd3d vulkan-intel vulkan-mesa-layers) fi # AMD Graphics if [[ "${vendor}" == "AMD" || "${vendors}" =~ "AMD" ]]; then gfxpkgs+=(libva-mesa-driver mesa-utils mesa-vdpau opencl-headers rocm-opencl-runtime vkd3d vulkan-mesa-layers vulkan-radeon) fi # Nvidia Graphics if [[ "${vendor}" == "Nvidia" || "${vendors}" =~ "Nvidia" ]]; then # Swap partition|swapfile|zram-swap = yes if [[ "${swapmode}" =~ ^(1|2|3)$ ]]; then sleep 0.2 RED " ---------------------------------------------------------------- ### ${yellowl}INFO: ${nc}${yellow}When ${nc}Hibernating ${red}### ### ${yellow}Nvidia's ${nc}'Preserve Video Memory after suspend' ${yellow}feature ${red}### ### ${yellow}is incompatible with ${nc}'Early KMS' ${yellow}use ${red}### ----------------------------------------------------------------" NC " ${bwhite}Press any key to continue${nc} " read -r -s -n 1 fi # Turing+ GPUs if [[ "${family}" == "1" ]]; then # Linux Kernel if [[ "${kernelnmbr}" == "1" ]]; then nvname="nvidia-open" gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia-open nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d) # Other Kernels else gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia-open-dkms nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d) fi # Maxwell+ GPUs elif [[ "${family}" == "2" ]]; then # Linux Kernel if [[ "${kernelnmbr}" == "1" ]]; then nvname="nvidia" gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d) # Linux LTS Kernel elif [[ "${kernelnmbr}" == "2" ]]; then nvname="nvidia-lts" gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia-lts nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d) # Other Kernels else gfxpkgs+=(libva-mesa-driver libva-nvidia-driver libvdpau-va-gl nvidia-dkms nvidia-settings nvidia-utils opencl-nvidia opencl-headers vkd3d) fi fi fi # Configure Graphics = no elif [[ "${gfxconf}" == "n" ]]; then # Nvidia Graphics if [[ "${vendor}" == "Nvidia" || "${vendors}" =~ "Nvidia" ]]; then gfxpkgs+=(libva-mesa-driver vulkan-nouveau) fi fi } ################################################################################################### dsktp_setup() { sleep 0.2 NC " ${magenta}###${nc}--------------------------------------${magenta}[ ${bwhite}Desktop Setup${nc} ${magenta}]${nc}--------------------------------------${magenta}### " sleep 0.2 YELLOW " > Make a selection: " NC " [1] Desktop Selection [2] Arch 'base-devel' Meta-package [3] Web browser Selection [4] Printer & Scanner Support [ ] Return to System Configuration " BLUE " Enter a number: " read -r -p " ==> " desk_setup case "${desk_setup}" in 1) until dsktp_slct; do : ; done return 1 ;; 2) until base_devel; do : ; done return 1 ;; 3) until web_browser; do : ; done return 1 ;; 4) until print_scan; do : ; done return 1 ;; "") until sys_submn; do : ; done ;; *) invalid return 1 ;; esac } ################################################################################################### dsktp_slct() { sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Desktop Selection${nc} ${magenta}]${nc}------------------------------------${magenta}### " deskpkgs="" custompkgs="" console="" local prompt="Desktop Selection" sleep 0.2 YELLOW " > Make a selection: " NC " [1] Plasma [2] Plasma Light (Amelia's version) [3] Gnome [4] Gnome Light (Amelia's version) [5] Xfce [6] Cinnamon [7] Deepin [8] Budgie [9] Lxqt [10] Mate [11] Basic Arch Linux (No GUI) [12] Custom Arch Linux [13] Cosmic ${red}## ${yellow}Alpha ${red}## " BLUE " Enter a number: " read -r -p " ==> " desktop echo case "${desktop}" in 1) desktopname="Plasma" deskname ;; 2) desktopname="Plasma Light" deskname ;; 3) desktopname="Gnome" deskname ;; 4) desktopname="Gnome Light" deskname ;; 5) desktopname="Xfce" deskname ;; 6) desktopname="Cinnamon" deskname term_offer ;; 7) desktopname="Deepin" deskname ;; 8) desktopname="Budgie" deskname term_offer ;; 9) desktopname="Lxqt" deskname ;; 10) desktopname="Mate" deskname ;; 11) desktopname="Basic Arch Linux" deskname ;; 12) desktopname="Custom Arch Linux" until cust_sys; do :; done return 0 ;; 13) desktopname="Cosmic" deskname ;; "") choice return 1 ;; *) invalid return 1 ;; esac ok if [[ -n "${web}" && "${desktop}" =~ ^(11|12)$ ]]; then until web_browser; do : ; done fi if [[ "${printer}" == "y" && "${desktop}" =~ ^(11|12)$ ]]; then until print_scan; do : ; done fi } ################################################################################################### cust_sys() { local prompt="Custom Arch Linux" until add_pkgs; do : ; done until add_services; do : ; done echo ok } ################################################################################################### add_pkgs() { local prompt="Add Packages" sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Add Your Packages${nc} ${magenta}]${nc}------------------------------------${magenta}### " YELLOW " ### 'base', 'linux-firmware' (if on bare-metal), 'sudo' & your current choices are already included " BLUE " Enter any additional packages ${bwhite}(space-seperated)${blue}: " read -r -p " ==> " custompkgs if [[ -z "${custompkgs}" ]]; then sleep 0.2 RED " --------------------------------------------- ### ${yellow}Please enter package(s) to continue ${red}### ---------------------------------------------" reload return 1 elif [[ "${custompkgs}" =~ "lightdm" ]]; then sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}LightDM Greeter Selection${nc} ${magenta}]${nc}--------------------------------${magenta}### " YELLOW " > Select a Greeter: " NC " [1] Gtk [2] Slick [3] Deepin " BLUE " Enter a number: " read -r -p " ==> " greeternmbr case "${greeternmbr}" in 1) greeter="lightdm-gtk-greeter" sleep 0.2 NC " ==> [${green}Lightdm Gtk Greeter OK${nc}] " ;; 2) greeter="lightdm-slick-greeter" sleep 0.2 NC " ==> [${green}Lightdm Slick Greeter OK${nc}] " ;; 3) greeter="lightdm-deepin-greeter" sleep 0.2 NC " ==> [${green}Lightdm Deepin Greeter OK${nc}] " ;; "") choice return 1 ;; *) invalid return 1 ;; esac ok else ok fi } ################################################################################################### add_services() { local prompt="Add Services" sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Add Your Services${nc} ${magenta}]${nc}------------------------------------${magenta}### " YELLOW " ### Empty to skip " BLUE " Enter services to be enabled ${bwhite}(space-seperated)${blue}: " read -r -p " ==> " customservices if [[ -z "${customservices}" ]]; then skip else ok fi } ################################################################################################### base_devel() { sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}'base-devel' Meta-package${nc} ${magenta}]${nc}--------------------------------${magenta}### " local prompt="'base-devel'" sleep 0.2 YELLOW " ### NOTE: The ${nc}'base' ${yellow}meta-package does not include the tools needed for building packages > Install ${nc}'base-devel' ${yellow}meta-package ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " dev dev="${dev:-y}" dev="${dev,,}" case "${dev}" in y) devel="base-devel" ok ;; n) skip ;; *) invalid return 1 ;; esac } ################################################################################################### web_browser() { if [[ "${desktop}" =~ ^(11|12)$ ]] && [[ -n "${revision}" ]]; then web_browser="" web_slct="" return 0 fi sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Web browser Selection${nc} ${magenta}]${nc}----------------------------------${magenta}### " local prompt="Web Browser" if [[ ! "${desktop}" =~ ^(11|12)$ ]]; then sleep 0.2 YELLOW " ### Web Browser support is available > Select ${nc}Web Browser ${yellow}to install " NC " [1] Firefox [2] Chromium [3] Vivaldi [4] Tor Browser [5] Falkon [6] Qutebrowser " BLUE " Enter a number ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " web local prompt="Web Browser" case "${web}" in 1) web_browser="firefox" web_slct="yes" ok ;; 2) web_browser="chromium" web_slct="yes" ok ;; 3) web_browser="vivaldi" web_slct="yes" ok ;; 4) web_browser="torbrowser-launcher" web_slct="yes" ok ;; 5) web_browser="falkon" web_slct="yes" ok ;; 6) web_browser="qutebrowser" web_slct="yes" ok ;; "") web_browser="" web_slct="yes" skip ;; *) invalid return 1 ;; esac else sleep 0.2 RED " ----------------------------------------- ### ${yellow}Incompatible Selection detected ${red}### -----------------------------------------" sleep 0.2 YELLOW " ### Basic Arch Linux / Custom Arch Linux detected or No Desktop selected yet ### No Browser selected " web_browser="" web_slct="" skip NC " ${bwhite}Press any key to continue${nc} " read -r -s -n 1 fi } ################################################################################################### print_scan() { sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Printer & Scanner Support${nc} ${magenta}]${nc}--------------------------------${magenta}### " local prompt="Printer & Scanner Support" if [[ "${hypervisor}" == "none" ]]; then if [[ ! "${desktop}" =~ ^(11|12)$ ]]; then sleep 0.2 YELLOW " ### Printer & Scanner support is available > Enable ${nc}Printer & Scanner ${yellow}support ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " printer printer="${printer:-y}" printer="${printer,,}" case "${printer}" in y) if [[ "${desktop}" == "2" ]]; then print_pkgs="cups-pdf cups-browsed cups-pk-helper ipp-usb nss-mdns sane-airscan print-manager skanlite system-config-printer xdg-utils colord" elif [[ "${desktop}" == "4" ]]; then print_pkgs="cups-pdf cups-browsed cups-pk-helper ipp-usb nss-mdns sane-airscan simple-scan system-config-printer xdg-utils colord" else print_pkgs="cups-pdf cups-browsed cups-pk-helper ipp-usb nss-mdns sane-airscan system-config-printer xdg-utils colord" fi ok ;; n) print_pkgs="" skip ;; *) invalid return 1 ;; esac else sleep 0.2 RED " ----------------------------------------- ### ${yellow}Incompatible Selection detected ${red}### -----------------------------------------" sleep 0.2 YELLOW " ### Basic Arch Linux / Custom Arch Linux detected or No Desktop selected yet ### Printer/Scanner support not enabled " print_pkgs="" skip NC " ${bwhite}Press any key to continue${nc} " read -r -s -n 1 fi else vm print_pkgs="" skip fi } ################################################################################################### boot_entr() { if [[ "${hypervisor}" != "none" ]]; then efi_entr_del="yes" vm sleep 0.2 YELLOW " --> EFI Boot Entries Deletion skipped " return 0 fi local prompt="Boot Entries" sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}EFI Boot Entries Deletion${nc} ${magenta}]${nc}--------------------------------${magenta}### " YELLOW " > Select an EFI Boot Entry to Delete ${red}[!] ${nc}(${yellow}CAUTION${nc}) ${red}[!] " sleep 0.2 efibootmgr --unicode entrnmbr="$(efibootmgr --unicode | grep -E 'BootOrder' | awk "{print \$2}")" boot_entry=" " while [[ -n "${boot_entry}" ]]; do BLUE " Enter a Boot Entry number for Deletion ${bwhite}(empty to skip)${blue}: ${cyan}Entries: ${yellow}${entrnmbr} " read -r -p " ==> " boot_entry if [[ -n "${boot_entry}" ]]; then if [[ "${run_as}" != "root" ]]; then sleep 0.2 RED " ----------------------------------- ### ${yellow}Root Privileges Missing.. ${red}### -----------------------------------" reload until sys_submn; do : ; done fi if efibootmgr -b "${boot_entry}" -B --unicode; then sleep 0.2 NC " ==> [${green}Entry ${boot_entry} Deleted${nc}] " else err_try return 1 fi else skip ok fi done efi_entr_del="yes" } ################################################################################################### optm_submn() { sleep 0.2 NC " ${magenta}###${nc}--------------------------------------${magenta}[ ${bwhite}Optimizations${nc} ${magenta}]${nc}--------------------------------------${magenta}### " sleep 0.2 YELLOW " > Make a selection: " NC " [1] Custom Kernel Parameters [2] System Watchdogs [3] General System Optimizations [4] Wireless Regulatory Domain [5] Systemd-oomd [6] Irqbalance [7] Thermald [8] Rng-tools [9] Rtkit [10] Tlp [ ] Return to System Configuration " BLUE " Enter a number: " read -r -p " ==> " set_optm case "${set_optm}" in 1) until cust_kern_param; do : ; done return 1 ;; 2) until sys_watchdog; do : ; done return 1 ;; 3) until gen_optm; do : ; done return 1 ;; 4) until ask_wireless_regdom; do : ; done return 1 ;; 5) until systemd_oomd; do : ; done return 1 ;; 6) until irqbalance; do : ; done return 1 ;; 7) until thermald; do : ; done return 1 ;; 8) until rngd; do : ; done return 1 ;; 9) until rtkit; do : ; done return 1 ;; 10) until tlp; do : ; done return 1 ;; "") set_optm_slct="yes" until sys_submn; do : ; done ;; *) invalid return 1 ;; esac } ################################################################################################### cust_kern_param() { sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Custom Kernel Parameters${nc} ${magenta}]${nc}--------------------------------${magenta}### " sleep 0.2 YELLOW " ### ${nc}Custom ${yellow}Kernel Parameters can be set at boot time > Enter your ${nc}own ${yellow}additional Kernel Parameters to be ${nc}added ${yellow}to the Kernel Cmdline ? [y/N] " BLUE " Enter [y/N]: " read -r -p " ==> " ask_param ask_param="${ask_param:-n}" ask_param="${ask_param,,}" case "${ask_param}" in y) until add_prmtrs; do : ; done ;; n) skip ;; *) invalid return 1 ;; esac } ################################################################################################### add_prmtrs() { local prompt="Kernel Parameters" YELLOW " ### Add Your Kernel Parameters ### Empty to skip " BLUE " Enter your own Kernel parameters to be set at boot ${bwhite}(space-seperated)${blue}: " read -r -p " ==> " cust_bootopts if [[ -z "${cust_bootopts}" ]]; then skip else ok fi } ################################################################################################### sys_watchdog() { sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}System Watchdogs${nc} ${magenta}]${nc}------------------------------------${magenta}### " sleep 0.2 YELLOW " ### A watchdog is a hardware or software component that keeps track of a system's performance ### and intervenes if it notices any strange behaviour or malfunctions ### [Applicable for ${nc}non mission-critical ${yellow}platforms such as desktops & laptops] > Disable ${nc}Watchdogs ${yellow}in the installed system ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " kill_watchdog kill_watchdog="${kill_watchdog:-y}" kill_watchdog="${kill_watchdog,,}" case "${kill_watchdog}" in y) local prompt="Watchdogs Disabled" ok ;; n) skip ;; *) invalid return 1 ;; esac } ################################################################################################### gen_optm() { sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}General Optimizations${nc} ${magenta}]${nc}----------------------------------${magenta}### " sleep 0.2 YELLOW " ### General ${nc}System Optimizations ${yellow}are available ### Type ${nc}'v' ${yellow}to view a summary > Enable System Optimizations ? [Y/n/v] " BLUE " Enter [Y/n]: " read -r -p " ==> " genoptm genoptm="${genoptm:-y}" genoptm="${genoptm,,}" case "${genoptm}" in y) local prompt="System Optimizations" ok ;; n) skip ;; v) view_optm return 1 ;; *) invalid return 1 ;; esac } ################################################################################################### ask_wireless_regdom() { if [[ "${hypervisor}" != "none" ]]; then vm sleep 0.2 YELLOW " --> Wireless Regulatory Domain Setup skipped " return 0 fi local prompt="Wireless Regdom Setup" sleep 0.2 NC " ${magenta}###${nc}----------------------------${magenta}[ ${bwhite}Wireless Regulatory Domain Setup${nc} ${magenta}]${nc}----------------------------${magenta}### " YELLOW " ### The regulatory domain is used to reconfigure wireless drivers, to make sure that wireless ### hardware usage complies with local laws set by the FCC, ETSI and other organizations > Select your Country Code (e.g. ${nc}US${yellow}) ### [Enter ${nc}'l'${yellow} to list country codes, then ${nc}'enter'${yellow} to search or ${nc}'q'${yellow} to quit] " BLUE " Enter your Country Code, ie:${nc} ${cyan}US ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " REGDOM if [[ -z "${REGDOM}" ]]; then skip elif [[ "${REGDOM}" == "l" ]]; then sed 's|^#WIRELESS_REGDOM=||g' /etc/conf.d/wireless-regdom |sed 's|"||g'| less return 1 elif [[ "${REGDOM}" =~ [[:lower:]] ]]; then sleep 0.2 RED " ------------------------------------------------------ ### ${yellow}Lowercase is not allowed. Please try again.. ${red}### ------------------------------------------------------" reload return 1 elif ! grep \""${REGDOM}"\" /etc/conf.d/wireless-regdom > /dev/null 2>&1 ; then invalid return 1 else wireless_reg="wireless-regdb" sleep 0.2 YELLOW " ### ${REGDOM} Country Code has been selected " fi ok } ################################################################################################### systemd_oomd() { local prompt="Systemd-oomd Setup" sleep 0.2 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Systemd-oomd Setup${nc} ${magenta}]${nc}-----------------------------------${magenta}### " sleep 0.2 YELLOW " ### A system service that uses cgroups-v2 and pressure stall information (PSI) ### to monitor system and take corrective action before an 'OOM' occurs in the kernel space > Enable ${nc}'systemd-oomd' ${yellow} ? [Y/n] " RED " ------------------------------------------------------------------------ ### ${yellow}Swapping enabled is ${nc}highly recommended ${yellow}for optimal performance ${red}### ------------------------------------------------------------------------" BLUE " Enter [Y/n]: " read -r -p " ==> " oomd echo oomd="${oomd:-y}" oomd="${oomd,,}" if [[ "${oomd}" == "y" ]]; then YELLOW " ### 'Systemd-oomd' service will be enabled " elif [[ "${oomd}" == "n" ]]; then skip else y_n return 1 fi ok } ################################################################################################### irqbalance() { local prompt="Irqbalance Setup" sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Irqbalance Setup${nc} ${magenta}]${nc}------------------------------------${magenta}### " sleep 0.2 YELLOW " ### Distributes hardware interrupts across processors on a multiprocessor system ### in order to increase performance > Install & enable ${nc}'irqbalance' ${yellow} ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " irqbalance echo irqbalance="${irqbalance:-y}" irqbalance="${irqbalance,,}" if [[ "${irqbalance}" == "y" ]]; then YELLOW " ### 'irqbalance' service will be enabled " elif [[ "${irqbalance}" == "n" ]]; then skip else y_n return 1 fi ok } ################################################################################################### thermald() { local prompt="Thermald Setup" sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Thermald Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}### " sleep 0.2 YELLOW " ### A Linux daemon used to prevent the overheating of platforms ### This daemon monitors temperature and applies compensation using available cooling methods > Install & enable ${nc}'thermald' ${yellow} ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " thermald echo thermald="${thermald:-y}" thermald="${thermald,,}" if [[ "${thermald}" == "y" ]]; then YELLOW " ### 'thermald' service will be enabled " elif [[ "${thermald}" == "n" ]]; then skip else y_n return 1 fi ok } ################################################################################################### rngd() { local prompt="Rng-tools Setup" sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Rng-tools Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}### " sleep 0.2 YELLOW " ### The rngd daemon is capable of using both environmental noise ### and hardware random number generators for extracting entropy > Install & enable ${nc}'rngd' ${yellow} ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " rngd echo rngd="${rngd:-y}" rngd="${rngd,,}" if [[ "${rngd}" == "y" ]]; then YELLOW " ### 'rngd' service will be enabled " elif [[ "${rngd}" == "n" ]]; then skip else y_n return 1 fi ok } ################################################################################################### rtkit() { local prompt="Rtkit Setup" sleep 0.2 NC " ${magenta}###${nc}---------------------------------------${magenta}[ ${bwhite}Rtkit Setup${nc} ${magenta}]${nc}---------------------------------------${magenta}### " sleep 0.2 YELLOW " ### RealtimeKit is a D-Bus system service that changes the scheduling policy ### of user processes/threads to SCHED_RR, [Realtime Scheduling Mode on request] > Install & enable ${nc}'rtkit' ${yellow} ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " rtkit echo rtkit="${rtkit:-y}" rtkit="${rtkit,,}" if [[ "${rtkit}" == "y" ]]; then YELLOW " ### 'rtkit' service will be enabled " elif [[ "${rtkit}" == "n" ]]; then skip else y_n return 1 fi ok } ################################################################################################### tlp() { local prompt="Tlp Setup" sleep 0.2 NC " ${magenta}###${nc}----------------------------------------${magenta}[ ${bwhite}Tlp Setup${nc} ${magenta}]${nc}----------------------------------------${magenta}### " sleep 0.2 YELLOW " ### Tlp is a laptop battery power saving utility for Linux ### working out-of-the-box & easy to further configure > Install & enable ${nc}'tlp' ${yellow} ? [y/N] " BLUE " Enter [y/N]: " read -r -p " ==> " tlp echo tlp="${tlp:-n}" tlp="${tlp,,}" if [[ "${tlp}" == "y" ]]; then YELLOW " ### 'tlp' service will be enabled " elif [[ "${tlp}" == "n" ]]; then skip else y_n return 1 fi ok } ################################################################################################### dsks_submn() { sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Disk Management${nc} ${magenta}]${nc}-------------------------------------${magenta}### " YELLOW " > Select a Submenu: " NC " [1] Disk GPT Manager [2] Partition Manager [ ] Return to Main Menu " BLUE " Enter a number: " read -r -p " ==> " diskmenu echo case "${diskmenu}" in 1) until gpt_mngr; do : ; done ;; 2) until disk_mngr; do : ; done ;; "") until main_menu; do : ; done ;; *) invalid return 1 ;; esac } ################################################################################################### gpt_mngr() { local prompt="Disk GPT" sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Disk GPT Manager${nc} ${magenta}]${nc}------------------------------------${magenta}### " gpt_dsk_nmbr=" " while [[ -n "${gpt_dsk_nmbr}" ]]; do YELLOW " > Select a disk to manage its GPT: ### Select disk and: ### Type ${nc}'?'${yellow} for help, ${nc}'x'${yellow} for extra functionality or ${nc}'q'${yellow} to quit " NC " ${disks}" BLUE " Enter a disk number ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " gpt_dsk_nmbr echo if [[ -n "${gpt_dsk_nmbr}" ]]; then gptdrive="$(echo "${disks}" | awk "\$1 == ${gpt_dsk_nmbr} {print \$2}")" if [[ -e "${gptdrive}" ]]; then if [[ "${run_as}" != "root" ]]; then sleep 0.2 RED " ----------------------------------- ### ${yellow}Root Privileges Missing.. ${red}### -----------------------------------" reload until dsks_submn; do : ; done fi NC " ______________________________________________ " gdisk "${gptdrive}" sleep 0.2 NC " ==> [${green}${gptdrive} OK${nc}] " else invalid return 1 fi else skip ok if [[ "${install}" == "yes" ]]; then until instl_dsk; do : ; done else until dsks_submn; do : ; done fi fi done } ################################################################################################### ask_multibooting() { local prompt="MultiBoot Status" sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}MultiBoot Status${nc} ${magenta}]${nc}-------------------------------------${magenta}### " YELLOW " > Are you ${nc}Dual/Multi-Booting ${yellow}with other OS's ? [y/n] ### If ${nc}'(y)es'${yellow} then: " RED " ---------------------------------------------------------- ### ${yellow}Your ${nc}EFI ${yellow}System Partition (ESP) will stay ${nc}intact ${red}### ---------------------------------------------------------- ------------------------------------------------------------------------------- ### ${yellow}Only ${nc}'Manual' ${yellow}Disk Partitioning will be available for ${nc}Disk Management ${red}### -------------------------------------------------------------------------------" BLUE " Enter [y/n]: " read -r -p " ==> " multibooting case "${multibooting}" in y) sleep 0.2 YELLOW " ### Dual/Multi-Boot selected " ;; n) sleep 0.2 YELLOW " ### No Dual/Multi-Boot " ;; "") y_n return 1 ;; *) invalid return 1 ;; esac ok } ################################################################################################### disk_mngr() { if [[ "${multibooting}" == "y" ]]; then until manual_part; do : ; done return 0 fi sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Partition Manager${nc} ${magenta}]${nc}------------------------------------${magenta}### " YELLOW " > Select a Mode: " NC " [1] Automatic Partitioning [2] Manual Partitioning " BLUE " Enter a number: " read -r -p " ==> " part_mode case "${part_mode}" in 1) until auto_part; do : ; done ;; 2) until manual_part; do : ; done ;; "") sleep 0.2 RED " ------------------------------ ### ${yellow}Please select a Mode ${red}### ------------------------------" reload return 1 ;; *) invalid return 1 ;; esac } ################################################################################################### auto_part() { sleep 0.2 NC " ${magenta}###${nc}---------------------------------${magenta}[ ${bwhite}Automatic Partitioning${nc} ${magenta}]${nc}---------------------------------${magenta}### " sleep 0.2 line2 REDBG " ------------------------------------------------------------ " REDBG " [!] WARNING: All data on selected disk will be destroyed [!] " REDBG " ------------------------------------------------------------ " line2 if [[ -e "${instl_drive}" ]]; then sgdsk_nmbr="${instl_dsk_nmbr}" sgdrive="$(echo "${disks}" | awk "\$1 == ${sgdsk_nmbr} {print \$2}")" if [[ -e "${sgdrive}" ]]; then capacity="$(fdisk -l "${sgdrive}" | grep -E 'bytes' | grep -E 'Disk' | awk "{print \$5}")" cap_gib="$((capacity/1024000000))" rootsize="$((capacity*25/100/1024000000))" if [[ "${run_as}" != "root" ]]; then sleep 0.2 RED " ----------------------------------- ### ${yellow}Root Privileges Missing.. ${red}### -----------------------------------" reload until dsks_submn; do : ; done fi else invalid return 1 fi sleep 0.2 NC " ----------------------------------------------------------- ${cyan}>> ${nc}Apply ${yellowl}'Smart Partitioning' ${nc}on disk ${bwhite}'${instl_drive}'${nc} ? ${cyan}[Y/n]${nc} ----------------------------------------------------------- " read -r -p " ==> " smartpart echo smartpart="${smartpart:-y}" smartpart="${smartpart,,}" if [[ "${smartpart}" == "y" ]]; then until smart_presets; do : ; done until set_partsize; do : ; done until partitioner; do : ; done elif [[ "${smartpart}" == "n" ]]; then alternatives until manual_presets; do : ; done until set_partsize; do : ; done until partitioner; do : ; done else y_n return 1 fi else YELLOW " > Select a disk for Auto-Partitioning: " NC " ${disks}" BLUE " Enter a disk number ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " sgdsk_nmbr echo if [[ -n "${sgdsk_nmbr}" ]]; then sgdrive="$(echo "${disks}" | awk "\$1 == ${sgdsk_nmbr} {print \$2}")" if [[ -e "${sgdrive}" ]]; then capacity="$(fdisk -l "${sgdrive}" | grep -E 'bytes' | grep -E 'Disk' | awk "{print \$5}")" cap_gib="$((capacity/1024000000))" rootsize="$((capacity*25/100/1024000000))" if [[ "${run_as}" != "root" ]]; then sleep 0.2 RED " ----------------------------------- ### ${yellow}Root Privileges Missing.. ${red}### -----------------------------------" reload until dsks_submn; do : ; done fi until manual_presets; do : ; done until set_partsize; do : ; done until partitioner; do : ; done else invalid return 1 fi else skip reload fi fi if [[ -z "${sanity}" ]]; then until dsks_submn; do : ; done fi } ################################################################################################### smart_presets() { if [[ "${fs}" == "1" ]] ; then if [[ "${sep_home}" == "y" && "${swapmode}" == "1" ]]; then preset="4" elif [[ "${sep_home}" == "y" && "${swapmode}" != "1" ]]; then preset="3" elif [[ "${sep_home}" == "n" && "${swapmode}" == "1" ]]; then preset="2" elif [[ "${sep_home}" == "n" && "${swapmode}" != "1" ]]; then preset="1" fi elif [[ "${fs}" == "2" ]]; then if [[ "${swapmode}" == "1" ]]; then preset="2" elif [[ "${swapmode}" != "1" ]]; then preset="1" fi fi } ################################################################################################### manual_presets() { preset="" sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Preset Selection${nc} ${magenta}]${nc}------------------------------------${magenta}### " sleep 0.2 line2 REDBG " ------------------------------------------------------------ " REDBG " [!] WARNING: All data on selected disk will be destroyed [!] " REDBG " ------------------------------------------------------------ " line2 YELLOW " > Select a Partition Layout Preset: " NC " ${cyan}* Ext4${nc} compatible Layout ${magenta}* Btrfs${nc} compatible Layout [1] Create '/ESP' & '/Root' (${cyan}Ext4${nc},${magenta}Btrfs${nc}) [2] Create '/ESP', '/Root' & '/Swap' (${cyan}Ext4${nc},${magenta}Btrfs${nc}) [3] Create '/ESP', '/Root' & '/Home' (${cyan}Ext4${nc}) [4] Create '/ESP', '/Root', '/Home' & '/Swap' (${cyan}Ext4${nc}) " BLUE " Enter a Preset number ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " preset echo if [[ "${preset}" =~ ^(1|2|3|4)$ ]]; then presetpart="y" elif [[ -z "${preset}" ]]; then skip else invalid return 1 fi } ################################################################################################### set_partsize() { if [[ "${preset}" =~ ^(3|4)$ ]]; then sleep 0.2 YELLOW " ### Total detected capacity of disk ${nc}${sgdrive} ${yellow}is ${nc}${cap_gib} GiB${yellow} ### Default ${nc}/Root${yellow} Partition's size is aprox. ${nc}25%${yellow} of total disk capacity ${nc}[${rootsize} GiB]${yellow} > Set /Root Partition's Percentage to a custom value ? " BLUE " Enter a Custom Percentage number ${nc}e.g. 30 ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " prcnt echo if [[ "${prcnt}" =~ [[:alpha:]] ]]; then sleep 0.2 RED " ------------------------------------------- ### ${yellow}Please use only digits as a value ${red}### -------------------------------------------" reload return 1 elif [[ -z "${prcnt}" ]]; then sleep 0.2 YELLOW " ### Default /Root Partition's size selected ${nc}[${rootsize} GiB] " elif [[ "${prcnt}" -gt "0" && "${prcnt}" -lt "100" ]]; then rootsize="$((capacity*"${prcnt}"/100/1024000000))" sleep 0.2 YELLOW " ### Custom /Root Partition's size selected ${nc}[${rootsize} GiB] " elif [[ "${prcnt}" == "100" ]]; then sleep 0.2 RED " ----------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}No space left for other partitions ${red}### -----------------------------------------------------" reload return 1 else invalid return 1 fi fi } ################################################################################################### partitioner() { if [[ "${partok}" == "y" ]]; then return 0 fi if [[ "${smartpart}" == "y" ]]; then local prompt="Disk ${sgdrive} Smart-Partitioned" elif [[ "${presetpart}" == "y" ]]; then local prompt="Disk ${sgdrive} Preset-Partitioned" fi if [[ "${preset}" == "1" ]]; then wipefs -af "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -o "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n2:0:0 -t2:8304 -c2:ROOT "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail partprobe -s "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail if [[ "${install}" == "yes" ]]; then until sanity_check; do : ; done else ok fi elif [[ "${preset}" == "2" ]]; then until set_swapsize; do : ; done wipefs -af "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -o "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n2:0:+"${swapsize}"G -t2:8200 -c2:SWAP "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n3:0:0 -t3:8304 -c3:ROOT "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail partprobe -s "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail if [[ "${install}" == "yes" ]]; then until sanity_check; do : ; done else ok fi elif [[ "${preset}" == "3" ]]; then wipefs -af "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -o "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n2:0:+"${rootsize}"G -t2:8304 -c2:ROOT "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n3:0:0 -t3:8302 -c3:HOME "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail partprobe -s "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail if [[ "${install}" == "yes" ]]; then until sanity_check; do : ; done else ok fi elif [[ "${preset}" == "4" ]]; then wipefs -af "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail until set_swapsize; do : ; done sgdisk -o "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n1:0:+512M -t1:ef00 -c1:ESP "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n2:0:+"${swapsize}"G -t2:8200 -c2:SWAP "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n3:0:+"${rootsize}"G -t3:8304 -c3:ROOT "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail sgdisk -I -n4:0:0 -t4:8302 -c4:HOME "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail partprobe -s "${sgdrive}" > /dev/null 2> amelia_log.txt || stage_fail if [[ "${install}" == "yes" ]]; then until sanity_check; do : ; done else ok fi fi } ################################################################################################### manual_part() { sleep 0.2 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Manual Partitioning${nc} ${magenta}]${nc}-----------------------------------${magenta}### " cgdsk_nmbr=" " while [[ -n "${cgdsk_nmbr}" ]]; do line3 NC " SUPPORTED PARTITION TYPES & MOUNTPOINTS: " line2 REDBG " ------------------------------------------------------------------------------------------- " REDBG " ### Linux Root x86-64 Partition [ GUID Code: 8304 ] Mountpoint: / ### " REDBG " ------------------------------------------------------------------------------------------- " echo BLUEBG " ------------------------------------------------------------------------------------------- " BLUEBG " ### EFI System Partition [ GUID Code: ef00 ] Mountpoint: /efi or /boot ### " BLUEBG " ------------------------------------------------------------------------------------------- " echo GREENBG " ------------------------------------------------------------------------------------------- " GREENBG " ### Linux Home Partition [ GUID Code: 8302 ] Mountpoint: /home ### " GREENBG " ------------------------------------------------------------------------------------------- " echo YELLOWBG " ------------------------------------------------------------------------------------------- " YELLOWBG " ### Linux Swap Partition [ GUID Code: 8200 ] Mountpoint: /swap ### " YELLOWBG " ------------------------------------------------------------------------------------------- " echo MAGENTABG " ------------------------------------------------------------------------------------------- " MAGENTABG " ### Linux Extended Boot Partition [ GUID Code: ea00 ] Mountpoint: /boot ### " MAGENTABG " ------------------------------------------------------------------------------------------- " YELLOW " > Select a disk to Manage: " NC " ${disks}" BLUE " Enter a disk number ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " cgdsk_nmbr if [[ -n "${cgdsk_nmbr}" ]]; then cgdrive="$(echo "${disks}" | awk "\$1 == ${cgdsk_nmbr} {print \$2}")" if [[ -e "${cgdrive}" ]]; then local prompt="Disk ${cgdrive}" if [[ "${run_as}" != "root" ]]; then sleep 0.2 RED " ----------------------------------- ### ${yellow}Root Privileges Missing.. ${red}### -----------------------------------" reload until dsks_submn; do : ; done fi cgdisk "${cgdrive}" clear ok partprobe -s "${cgdrive}" > /dev/null else invalid return 1 fi else skip if [[ -z "${sanity}" ]]; then until dsks_submn; do : ; done elif [[ "${sanity}" == "no" || "${partok}" == "n" ]]; then until sanity_check; do : ; done fi fi done } ################################################################################################### instl_dsk() { sleep 0.2 NC " ${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Installation Disk Selection${nc} ${magenta}]${nc}-------------------------------${magenta}### " YELLOW " > Select a disk to Install to: " NC " ${disks}" BLUE " Enter a disk number: " read -r -p " ==> " instl_dsk_nmbr echo if [[ -n "${instl_dsk_nmbr}" ]]; then instl_drive="$(echo "${disks}" | awk "\$1 == ${instl_dsk_nmbr} {print \$2}")" if [[ -e "${instl_drive}" ]]; then if [[ "${run_as}" != "root" ]]; then sleep 0.2 RED " ----------------------------------- ### ${yellow}Root Privileges Missing.. ${red}### -----------------------------------" reload until main_menu; do : ; done fi volumes="$(fdisk -l | grep '^/dev' | cat --number)" rota="$(lsblk "${instl_drive}" --nodeps --noheadings --output=rota | awk "{print \$1}")" if [[ "${rota}" == "0" ]]; then sbvl_mnt_opts="rw,noatime,compress=zstd:1" trim="fstrim.timer" else sbvl_mnt_opts="rw,compress=zstd" fi parttable="$(fdisk -l "${instl_drive}" | grep '^Disklabel type' | awk "{print \$3}")" if [[ "${parttable}" != "gpt" ]]; then sleep 0.2 RED " --------------------------------------- ### ${yellow}No GPT found on selected disk ${red}### ---------------------------------------" reload until gpt_mngr; do : ; done return 0 fi if [[ -z "${multibooting}" ]]; then until ask_multibooting; do : ; done fi until sanity_check; do : ; done else invalid return 1 fi else choice return 1 fi } ################################################################################################### sanity_check() { sleep 0.2 NC " ${magenta}###${nc}--------------------------------------${magenta}[ ${bwhite}Sanity Check${nc} ${magenta}]${nc}--------------------------------------${magenta}### " rootcount="$(fdisk -l "${instl_drive}" | grep -E -c 'root' | awk "{print \$1}")" root_dev="$(fdisk -l "${instl_drive}" | grep -E 'root' | awk "{print \$1}")" multi_root="$(fdisk -l "${instl_drive}" | grep -E 'root' | awk "{print \$1}" | cat --number)" root_comply="$(fdisk -l "${instl_drive}" | grep -E 'root' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")" espcount="$(fdisk -l "${instl_drive}" | grep -E -c 'EFI' | awk "{print \$1}")" esp_dev="$(fdisk -l "${instl_drive}" | grep -E 'EFI' | awk "{print \$1}")" multi_esp="$(fdisk -l "${instl_drive}" | grep -E 'EFI' | awk "{print \$1}" | cat --number)" esp_comply="$(fdisk -l "${instl_drive}" | grep -E 'EFI' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")" xbootcount="$(fdisk -l "${instl_drive}" | grep -E -c 'extended' | awk "{print \$1}")" xboot_dev="$(fdisk -l "${instl_drive}" | grep -E 'extended' | awk "{print \$1}")" multi_xboot="$(fdisk -l "${instl_drive}" | grep -E 'extended' | awk "{print \$1}" | cat --number)" xboot_comply="$(fdisk -l "${instl_drive}" | grep -E 'extended' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")" homecount="$(fdisk -l "${instl_drive}" | grep -E -c 'home' | awk "{print \$1}")" home_dev="$(fdisk -l "${instl_drive}" | grep -E 'home' | awk "{print \$1}")" multi_home="$(fdisk -l "${instl_drive}" | grep -E 'home' | awk "{print \$1}" | cat --number)" home_comply="$(fdisk -l "${instl_drive}" | grep -E 'home' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")" swapcount="$(fdisk -l "${instl_drive}" | grep -E -c 'swap' | awk "{print \$1}")" swap_dev="$(fdisk -l "${instl_drive}" | grep -E 'swap' | awk "{print \$1}")" multi_swap="$(fdisk -l "${instl_drive}" | grep -E 'swap' | awk "{print \$1}" | cat --number)" swap_comply="$(fdisk -l "${instl_drive}" | grep -E 'swap' | awk "{print \$1}" | cat --number | grep -E '1[[:blank:]]' | awk "{print \$2}")" if [[ "${rootcount}" -gt "1" ]]; then local stage_prompt="Selecting Partition" sleep 0.2 RED " ---------------------------------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}Multiple Linux x86-64 /Root Partitions have been detected ${red}### ---------------------------------------------------------------------------- " sleep 0.2 YELLOW " ###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------### " fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$' YELLOW " ###-----------------------------------------------------------------------------------------------------------------###" NC " Linux x86-64 /Root Partitions: ------------------------------ ${multi_root} ------------------------------ " YELLOW " ### Only the 1st Linux x86-64 /Root partition on a selected disk can be auto-assigned as a valid /Root partition ### Partition ${nc}${root_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!] " BLUE " > Proceed ? [Y/n]" read -r -p " ==> " autoroot autoroot="${autoroot:-y}" autoroot="${autoroot,,}" if [[ "${autoroot}" == "y" ]]; then root_dev="${root_comply}" multiroot_bootopts="root=PARTUUID=$(blkid -s PARTUUID -o value "${root_dev}")" elif [[ "${autoroot}" == "n" ]]; then stage_fail else y_n return 1 fi fi if [[ "${espcount}" -gt "1" ]]; then local stage_prompt="Selecting Partition" sleep 0.2 RED " -------------------------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}Multiple EFI System Partitions have been detected ${red}### -------------------------------------------------------------------- " sleep 0.2 YELLOW " ###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------### " fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$' YELLOW " ###-----------------------------------------------------------------------------------------------------------------###" NC " Linux EFI System Partitions: ---------------------------- ${multi_esp} ---------------------------- " YELLOW " ### Only the 1st EFI partition on a selected disk can be auto-assigned as a valid EFI partition " if [[ "${multibooting}" == "n" ]]; then YELLOW " ### Partition ${nc}${esp_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!] " elif [[ "${multibooting}" == "y" ]]; then YELLOW " ### Partition ${nc}${esp_comply} ${yellow}is auto-assigned as such " fi BLUE " > Proceed ? [Y/n]" read -r -p " ==> " autoesp autoesp="${autoesp:-y}" autoesp="${autoesp,,}" if [[ "${autoesp}" == "y" ]]; then esp_dev="${esp_comply}" elif [[ "${autoesp}" == "n" ]]; then stage_fail else y_n return 1 fi fi if [[ "${xbootcount}" -gt "1" ]]; then local stage_prompt="Selecting Partition" sleep 0.2 RED " ----------------------------------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}Multiple Linux Extended Boot Partitions have been detected ${red}### ----------------------------------------------------------------------------- " sleep 0.2 YELLOW " ###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------### " fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$' YELLOW " ###-----------------------------------------------------------------------------------------------------------------###" NC " Linux Extended Boot Partitions: ---------------------------- ${multi_xboot} ---------------------------- " YELLOW " ### Only the 1st Linux Extended Boot partition on a selected disk can be auto-assigned as a valid XBOOTLDR partition ### Partition ${nc}${xboot_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!] " BLUE " > Proceed ? [Y/n]" read -r -p " ==> " autoxboot autoxboot="${autoxboot:-y}" autoxboot="${autoxboot,,}" if [[ "${autoxboot}" == "y" ]]; then xboot_dev="${xboot_comply}" elif [[ "${autoxboot}" == "n" ]]; then stage_fail else y_n return 1 fi fi if [[ ${fs} == "1" && ${sep_home} == "y" && "${homecount}" -gt "1" ]]; then local stage_prompt="Selecting Partition" sleep 0.2 RED " --------------------------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}Multiple Linux /Home Partitions have been detected ${red}### --------------------------------------------------------------------- " sleep 0.2 YELLOW " ###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------### " fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$' YELLOW " ###-----------------------------------------------------------------------------------------------------------------###" NC " Linux /Home Partitions: ----------------------- ${multi_home} ----------------------- " YELLOW " ### Only the 1st Linux /Home partition on a selected disk can be auto-assigned as a valid /Home partition ### Partition ${nc}${home_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!] " BLUE " > Proceed ? [Y/n]" read -r -p " ==> " autohome autohome="${autohome:-y}" autohome="${autohome,,}" if [[ "${autohome}" == "y" ]]; then home_dev="${home_comply}" elif [[ "${autohome}" == "n" ]]; then stage_fail else y_n return 1 fi fi if [[ ${swapmode} == "1" && "${swapcount}" -gt "1" ]]; then local stage_prompt="Selecting Partition" sleep 0.2 RED " --------------------------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}Multiple Linux /Swap Partitions have been detected ${red}### --------------------------------------------------------------------- " sleep 0.2 YELLOW " ###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------### " fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$' YELLOW " ###-----------------------------------------------------------------------------------------------------------------###" NC " Linux /Swap Partitions: ------------------------ ${multi_swap} ------------------------ " YELLOW " ### Only the 1st Linux /Swap partition on a selected disk can be auto-assigned as a valid /Swap partition ### Partition ${nc}${swap_comply} ${yellow}is auto-assigned as such and will be ${red}[!] ${nc}FORMATTED ${red}[!] " BLUE " > Proceed ? [Y/n]" read -r -p " ==> " autoswap autoswap="${autoswap:-y}" autoswap="${autoswap,,}" if [[ "${autoswap}" == "y" ]]; then swap_dev="${swap_comply}" elif [[ "${autoswap}" == "n" ]]; then stage_fail else y_n return 1 fi fi #-------------------------------------------------------------------------------------------------- if [[ -e "${root_dev}" ]]; then rootpartsize="$(lsblk -dno SIZE --bytes "${root_dev}")" if [[ "${rootpartsize}" -ge "8589934592" ]]; then rootprt="ok" else rootprt="ok" sleep 0.2 RED " ----------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}/Root's size might not be adequate ${red}### -----------------------------------------------------" sleep 0.2 RED " ------------------------------------------------------------------------ ### ${yellow}Depending on the size of your setup, installation might fail ! ${red}### ------------------------------------------------------------------------" NC " ${bwhite}Press any key to continue${nc} " read -r -s -n 1 fi if [[ "${autoroot}" == "y" ]]; then if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then sleep 0.2 NC " ==> [Linux x86-64 /Root ${green}OK${nc}] " else local prompt="Confirmed /Root Partition" ok fi else sleep 0.2 NC " ==> [Linux x86-64 /Root ${green}OK${nc}] " fi else rootprt="fail" sleep 0.2 RED " --------------------------------------------------- ### ${yellow}Linux x86-64 /Root Partition not detected ${red}### ---------------------------------------------------" fi #.................................................................................................. if [[ ! -e "${esp_dev}" ]]; then espprt="fail" sleep 0.2 RED " ------------------------------------------- ### ${yellow}EFI System Partition not detected ${red}### -------------------------------------------" fi if [[ -e "${esp_dev}" ]]; then espsize="$(lsblk -dno SIZE --bytes "${esp_dev}")" fi if [[ "${espsize}" -ge "209715200" ]]; then espprt="ok" xbootloader="no" if [[ "${autoesp}" == "y" ]]; then if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then sleep 0.2 NC " ==> [EFI System Partition ${green}OK${nc}] " else local prompt="Confirmed /EFI System Partition" ok fi else sleep 0.2 NC " ==> [EFI System Partition ${green}OK${nc}] " fi fi if [[ -e "${esp_dev}" && "${espsize}" -lt "209715200" ]]; then if [[ "${bootloader}" == "1" ]]; then if [[ "${multibooting}" == "y" ]]; then xbootloader="yes" if [[ -e "${xboot_dev}" ]]; then xbootprt="ok" espprt="ok" if [[ "${autoesp}" == "y" ]]; then if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then sleep 0.2 NC " ==> [EFI System Partition ${green}OK${nc}] " else local prompt="Confirmed EFI System Partition" ok fi else sleep 0.2 NC " ==> [EFI System Partition ${green}OK${nc}] " fi if [[ "${autoxboot}" == "y" ]]; then if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then sleep 0.2 NC " ==> [Linux Extended Boot Partition ${green}OK${nc}] " else local prompt="Confirmed /XBOOTLDR Partition" ok fi else sleep 0.2 NC " ==> [Linux Extended Boot Partition ${green}OK${nc}] " fi else xbootprt="fail" espprt="fail" sleep 0.2 RED " --------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}ESP's size is not adequate ${red}### ---------------------------------------------" sleep 0.2 RED " ---------------------------------------------------- ### ${yellow}Linux Extended Boot Partition not detected ${red}### ----------------------------------------------------" fi elif [[ "${multibooting}" == "n" ]]; then espprt="fail" xbootloader="no" sleep 0.2 RED " --------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}ESP's size is not adequate ${red}### ---------------------------------------------" fi elif [[ "${bootloader}" == "2" ]]; then if [[ "${espmnt}" == "2" ]]; then espprt="fail" xbootloader="no" sleep 0.2 RED " --------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}ESP's size is not adequate ${red}### ---------------------------------------------" elif [[ "${espmnt}" == "1" ]]; then espprt="ok" xbootloader="no" if [[ "${autoesp}" == "y" ]]; then if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then sleep 0.2 NC " ==> [EFI System Partition ${green}OK${nc}] " else local prompt="Confirmed EFI System Partition" ok fi else sleep 0.2 NC " ==> [EFI System Partition ${green}OK${nc}] " fi fi fi fi #.................................................................................................. if [[ "${fs}" == "1" ]]; then if [[ "${sep_home}" == "y" ]]; then if [[ -e "${home_dev}" ]]; then homeprt="ok" if [[ "${autohome}" == "y" ]]; then if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then sleep 0.2 NC " ==> [Linux /Home ${green}OK${nc}] " else local prompt="Confirmed /Home Partition" ok fi else sleep 0.2 NC " ==> [Linux /Home ${green}OK${nc}] " fi else homeprt="fail" sleep 0.2 RED " -------------------------------------------- ### ${yellow}Linux /Home Partition not detected ${red}### --------------------------------------------" fi fi fi #.................................................................................................. if [[ "${swapmode}" == "1" ]]; then if [[ -e "${swap_dev}" ]]; then swapprt="ok" if [[ "${autoswap}" == "y" ]]; then if [[ "${presetpart}" == "y" || "${smartpart}" == "y" ]]; then sleep 0.2 NC " ==> [Linux /Swap ${green}OK${nc}] " else local prompt="Confirmed /Swap Partition" ok fi else sleep 0.2 NC " ==> [Linux /Swap ${green}OK${nc}] " fi else swapprt="fail" sleep 0.2 RED " -------------------------------------------- ### ${yellow}Linux /Swap Partition not detected ${red}### --------------------------------------------" fi fi #.................................................................................................. if [[ "${rootprt}" == "fail" || "${espprt}" == "fail" || "${xbootprt}" == "fail" || "${homeprt}" == "fail" || "${swapprt}" == "fail" ]]; then sanity="no" else sanity="ok" fi #-------------------------------------------------------------------------------------------------- if [[ "${sanity}" == "ok" ]]; then if [[ "${smartpart}" == "y" ]]; then sleep 0.2 NC " ==> [${green}Disk ${sgdrive} Smart-Partitioned OK${nc}] " elif [[ "${presetpart}" == "y" ]]; then sleep 0.2 NC " ==> [${green}Disk ${sgdrive} Preset-Partitioned OK${nc}] " fi sleep 0.2 NC " ----------------------- ### ${green}SANITY CHECK OK${nc} ### -----------------------" sleep 0.2 YELLOW " ###------------------------------------------------[ DISK OVERVIEW ]------------------------------------------------### " fdisk -l "${instl_drive}" | grep -E --color=no 'Dev|dev' |GREP_COLORS='mt=01;36' grep -E --color=always 'EFI System|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'Linux root|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'Linux home|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'Linux swap|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'Linux extended boot|$' YELLOW " ###-----------------------------------------------------------------------------------------------------------------### " BLUE " > Proceed using the ${nc}${cyan}current ${blue}partitioning layout ? [Y/n] " read -r -p " ==> " partok echo partok="${partok:-y}" partok="${partok,,}" local prompt="Disk Partitioning" local stage_prompt="Partitioning" if [[ "${partok}" == "y" ]]; then ok return 0 elif [[ "${partok}" == "n" ]]; then if [[ "${multibooting}" == "n" ]]; then reload until auto_part; do : ; done elif [[ "${multibooting}" == "y" ]]; then reload until manual_part; do : ; done fi else y_n return 1 fi #-------------------------------------------------------------------------------------------------- elif [[ "${sanity}" == "no" ]]; then sleep 0.2 RED " ----------------------------- ### ${yellow}SANITY CHECK FAILED${red} ### -----------------------------" NC " ${bwhite}Press any key to continue${nc} " read -r -s -n 1 if [[ "${multibooting}" == "y" ]]; then if [[ "${espprt}" == "fail" && -e "${esp_dev}" ]]; then sleep 0.2 CYAN " --------------------------------------------------- ### ${yellowl}/ESP: Not all prerequisites are satisfied ${nc}${cyan}### ---------------------------------------------------" if [[ "${espmnt}" == "2" ]]; then sleep 0.2 NC " ---------------------------------------------------- >>> ${cyan}Select ${yellowl}/mnt/efi ${nc}${cyan}as the mountpoint for your ${yellowl}/ESP ${nc}${nc} ----------------------------------------------------" fi if [[ "${xbootprt}" == "fail" ]]; then sleep 0.2 NC " ------------------------------------------------------------------------------------------ >>> ${cyan}Systemd-boot:${nc} >>> ${cyan}Create a ${yellowl}300M ${nc}${cyan}(at minimum) Linux Extended Boot Partition ${nc}(XBOOTLDR) ${yellowl}[GUID CODE: ea00] ${nc}${nc} ------------------------------------------------------------------------------------------" fi NC " ${bwhite}Press any key to continue${nc} " read -r -s -n 1 if [[ "${espmnt}" == "2" ]]; then until slct_espmnt; do : ; done fi if [[ "${xbootprt}" == "fail" ]]; then until manual_part; do : ; done fi elif [[ "${espprt}" == "fail" && ! -e "${esp_dev}" ]]; then reload until manual_part; do : ; done elif [[ "${homeprt}" == "fail" || "${swapprt}" == "fail" ]]; then reload until manual_part; do : ; done fi elif [[ "${multibooting}" == "n" ]]; then reload until auto_part; do : ; done fi fi } ################################################################################################### ask_crypt() { local prompt="Encryption Setup" sleep 0.2 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Encryption Setup${nc} ${magenta}]${nc}------------------------------------${magenta}### " BLUE " > Enable${nc} ${cyan}${roottype} ${blue}Encryption? [LUKS] " NC " * Type '${cyan}no${nc}' to proceed without encryption * Type '${cyan}yes${nc}' to encrypt your ${roottype} " read -r -p " ==> " encrypt echo if [[ "${encrypt}" == "no" ]]; then skip ok line2 return 0 elif [[ "${encrypt}" == "yes" ]]; then if [[ "${bootloader}" == "2" && "${espmnt}" == "1" ]]; then sleep 0.2 RED " ----------------------------------------- ### ${yellow}Incompatible Selection detected ${red}### -----------------------------------------" YELLOW " ### ESP cannot be mounted at ${nc}'/efi' ${yellow}when using Grub on a LUKS encrypted Root partition > Change ESP mountpoint to ${nc}'/boot' ${yellow}instead ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " cng_espmnt echo cng_espmnt="${cng_espmnt:-y}" cng_espmnt="${cng_espmnt,,}" if [[ "${cng_espmnt}" == "y" ]]; then espmnt="2" esp_mount="/mnt/boot" btldr_esp_mount="/boot" sleep 0.2 YELLOW " ### '/mnt/boot' mountpoint has been selected " elif [[ "${cng_espmnt}" == "n" ]]; then failure else y_n return 1 fi fi sleep 0.2 YELLOW " > Enter a name for your Encrypted ${roottype} Partition: " BLUE " Enter a name: " read -r -p " ==> " ENCROOT echo if [[ -z "${ENCROOT}" ]]; then sleep 0.2 RED " ----------------------------------------- ### ${yellow}Please enter a name to continue ${red}### -----------------------------------------" reload return 1 elif [[ "${ENCROOT}" =~ [[:upper:]] ]]; then sleep 0.2 RED " ------------------------------------------------------ ### ${yellow}Uppercase is not allowed. Please try again.. ${red}### ------------------------------------------------------" reload return 1 elif [[ -n "${ENCROOT}" ]]; then sleep 0.2 NC " ==> [${green}Encrypted ${roottype} Label OK${nc}] " fi if [[ -e "${home_dev}" ]]; then if [[ "${sep_home}" == "y" ]]; then sleep 0.2 YELLOW " ### A /Home Partition has been detected " sleep 0.2 BLUE " > Encrypt${nc} ${nc}/Home ${blue}partition? [LUKS] " NC " * Type '${cyan}no${nc}' to proceed without encryption * Type '${cyan}yes${nc}' to encrypt your /Home " read -r -p " ==> " homecrypt echo if [[ "${homecrypt}" == "no" ]]; then skip elif [[ "${homecrypt}" == "yes" ]]; then sleep 0.2 YELLOW " > Enter a name for your Encrypted /Home Partition: " BLUE " Enter a name: " read -r -p " ==> " ENCRHOME echo if [[ -z "${ENCRHOME}" ]]; then sleep 0.2 RED " ----------------------------------------- ### ${yellow}Please enter a name to continue ${red}### -----------------------------------------" reload return 1 elif [[ "${ENCRHOME}" =~ [[:upper:]] ]]; then sleep 0.2 RED " ------------------------------------------------------ ### ${yellow}Uppercase is not allowed. Please try again.. ${red}### ------------------------------------------------------" reload return 1 elif [[ -n "${ENCRHOME}" ]]; then sleep 0.2 NC " ==> [${green}Encrypted /Home Label OK${nc}] " fi else yes_no return 1 fi fi fi ok else yes_no return 1 fi } ################################################################################################### instl() { install="yes" if [[ -z "${lcl_slct}" ]]; then if [[ -e /usr/bin/pv ]]; then sleep 0.2 CYAN " (*) ${nc}Please complete ${yellowl}'Locale & Keyboard Layout Selection'${nc} to continue "| pv -qL 70 else sleep 0.2 CYAN " (*) ${nc}Please complete ${yellowl}'Locale & Keyboard Layout Selection'${nc} to continue " fi until slct_locale; do : ; done until slct_kbd; do : ; done fi if [[ -z "${USERNAME}" ]]; then local stage_prompt="User, Root User, Hostname & Shell Setup" completion_err until user_setup; do : ; done until rootuser_setup; do : ; done until slct_hostname; do : ; done until slct_shell; do : ; done fi if [[ -z "${kernelnmbr}" ]]; then local stage_prompt="Kernel, Secureboot Signing, Bootloader & ESP Mountpoint" completion_err until slct_krnl; do : ; done until ask_sign; do : ; done until slct_bootldr; do : ; done until slct_espmnt; do : ; done fi if [[ -z "${fs}" ]]; then local stage_prompt="Filesystem & Swap Setup" completion_err until slct_fs; do : ; done until slct_swap; do : ; done fi if [[ "${hypervisor}" == "none" && -z "${gfx_slct}" ]]; then local stage_prompt="Graphics Setup" completion_err until dtct_gfx; do : ; done fi if [[ -z "${desktop}" ]]; then local stage_prompt="Desktop Setup" completion_err until dsktp_slct; do : ; done fi if [[ -z "${dev}" ]]; then until base_devel; do : ; done fi if [[ -z "${web_slct}" ]]; then if [[ ! "${desktop}" =~ ^(11|12)$ ]]; then until web_browser; do : ; done fi fi if [[ "${hypervisor}" == "none" ]]; then if [[ -z "${printer}" ]]; then if [[ ! "${desktop}" =~ ^(11|12)$ ]]; then until print_scan; do : ; done fi fi if [[ -z "${efi_entr_del}" ]]; then local stage_prompt="EFI Boot Entries Deletion" completion_err until boot_entr; do : ; done fi fi if [[ -z "${set_optm_slct}" ]]; then local stage_prompt="Optimizations" completion_err until cust_kern_param; do : ; done until sys_watchdog; do : ; done until gen_optm; do : ; done if [[ "${hypervisor}" == "none" ]]; then until ask_wireless_regdom; do : ; done fi until systemd_oomd; do : ; done until irqbalance; do : ; done until thermald; do : ; done until rngd; do : ; done until rtkit; do : ; done until tlp; do : ; done fi until instl_dsk; do : ; done until ask_crypt; do : ; done if [[ "${swapmode}" == "1" ]]; then until "${swaptype}"; do : ; done fi if [[ "${encrypt}" == "no" ]]; then until set_mode; do : ; done until confirm_status; do : ; done elif [[ "${encrypt}" == "yes" ]]; then until sec_erase; do : ; done until luks; do : ; done until opt_pcmn; do : ; done until pacstrap_system; do : ; done if [[ "${swapmode}" == "2" ]]; then until "${swaptype}"; do : ; done fi if [[ -n "${REGDOM}" ]]; then until set_wireless_regdom; do : ; done fi set_vars chroot_conf fi } ################################################################################################### swappart() { local stage_prompt="Swap Partition Creation" sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Swap Partition Setup${nc} ${magenta}]${nc}----------------------------------${magenta}### " if mkswap "${swap_dev}" > /dev/null 2> amelia_log.txt ; then stage_ok else stage_fail fi } ################################################################################################### set_mode() { if [[ "${rootcount}" -gt "1" || "${espcount}" -gt "1" || "${xbootcount}" -gt "1" || "${homecount}" -gt "1" || "${swapcount}" -gt "1" ]]; then until auto_mode; do : ; done sleep 0.2 NC " ==> [${green}Filesystems OK${nc}] " sleep 0.2 YELLOW " ###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------### " lsblk -f|GREP_COLORS='mt=01;36' grep -E --color=always 'vfat|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'ext4|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'btrfs|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'ntfs|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'swap|$' YELLOW " ###-----------------------------------------------------------------------------------------------------------------###" echo sleep 0.2 return 0 fi if [[ "${swapmode}" != "1" ]]; then line2 fi sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Mode Selection${nc} ${magenta}]${nc}-------------------------------------${magenta}### " YELLOW " > Select a Mode to continue: " NC " [1] Auto (Automatically Format, Label & Mount partitions) [2] Manual (Manually Format, Label & Mount partitions) " BLUE " Enter a Mode number: " read -r -p " ==> " setmode echo case "${setmode}" in 1) until auto_mode; do : ; done ;; 2) until manual_mode; do : ; done ;; "") RED " ------------------------------------------ ### ${yellow}Please select a Mode to continue ${red}### ------------------------------------------" reload return 1 ;; *) invalid return 1 ;; esac sleep 0.2 NC " ==> [${green}Filesystems OK${nc}] " sleep 0.2 YELLOW " ###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------### " lsblk -f|GREP_COLORS='mt=01;36' grep -E --color=always 'vfat|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'ext4|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'btrfs|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'ntfs|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'swap|$' YELLOW " ###-----------------------------------------------------------------------------------------------------------------###" echo sleep 0.2 } ################################################################################################### auto_mode() { espfs="$(lsblk -dno FSTYPE "${esp_dev}")" sleep 0.2 NC " ${magenta}###${nc}----------------------------------------${magenta}[ ${bwhite}Auto Mode${nc} ${magenta}]${nc}----------------------------------------${magenta}### " sleep 0.2 YELLOW " > Auto Mode Selected " if [[ "${fs}" == "1" ]]; then if mkfs.ext4 -F -L Root "${root_dev}" > /dev/null 2> amelia_log.txt ; then tune2fs -O fast_commit "${root_dev}" > /dev/null 2> amelia_log.txt || err_abort mount "${root_dev}" /mnt > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/Root OK${nc}] " else umount_manual until form_root; do : ; done until mount_mnt; do : ; done fi #-------------------------------------------------------------------------------------------------- elif [[ "${fs}" == "2" ]]; then if mkfs.btrfs -f -L Root "${root_dev}" > /dev/null 2> amelia_log.txt ; then mount "${root_dev}" /mnt > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@ > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@home > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@cache > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@log > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@tmp > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@snapshots > /dev/null 2> amelia_log.txt || err_abort if [[ "${swapmode}" == "2" ]]; then btrfs subvolume create /mnt/@swap > /dev/null 2> amelia_log.txt || err_abort fi umount /mnt > /dev/null 2> amelia_log.txt || err_abort mount -o "${sbvl_mnt_opts}",subvol=@ "${root_dev}" /mnt > /dev/null 2> amelia_log.txt || err_abort if [[ "${swapmode}" == "2" ]]; then mount --mkdir -o rw,nodatacow,subvol=@swap "${root_dev}" /mnt/swap > /dev/null 2> amelia_log.txt || err_abort fi mount --mkdir -o "${sbvl_mnt_opts}",subvol=@cache "${root_dev}" /mnt/var/cache > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@home "${root_dev}" /mnt/home > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@log "${root_dev}" /mnt/var/log > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@snapshots "${root_dev}" /mnt/"${snapname}" > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@tmp "${root_dev}" /mnt/var/tmp > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/@ OK${nc}] " else umount_manual until form_root; do : ; done until mount_mnt; do : ; done fi fi sleep 0.2 #-------------------------------------------------------------------------------------------------- if [[ "${multibooting}" == "n" ]]; then if mkfs.fat -F 32 -n ESP "${esp_dev}" > /dev/null 2> amelia_log.txt ; then mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/ESP OK${nc}] " else umount_manual until form_esp; do : ; done until mount_mnt; do : ; done until mount_esp; do : ; done fi elif [[ "${multibooting}" == "y" && "${espfs}" == "vfat" ]]; then if mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2> amelia_log.txt ; then sleep 0.2 NC " ==> [${green}Unformatted /ESP OK${nc}] " else umount_manual until mount_mnt; do : ; done until mount_esp; do : ; done fi elif [[ "${multibooting}" == "y" && "${espfs}" != "vfat" ]]; then if mkfs.fat -F 32 -n ESP "${esp_dev}" > /dev/null 2> amelia_log.txt ; then mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/ESP OK${nc}] " else umount_manual until form_esp; do : ; done until mount_mnt; do : ; done until mount_esp; do : ; done fi fi sleep 0.2 #-------------------------------------------------------------------------------------------------- if [[ ${xbootloader} == "yes" ]]; then if mkfs.fat -F 32 -n XBOOTLDR "${xboot_dev}" > /dev/null 2> amelia_log.txt ; then mount --mkdir "${xboot_dev}" /mnt/boot > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/XBOOTLDR OK${nc}] " else umount_manual until form_xboot; do : ; done until mount_mnt; do : ; done until mount_esp; do : ; done until mount_xboot; do : ; done fi fi sleep 0.2 #-------------------------------------------------------------------------------------------------- if [[ ${fs} == "1" && -e "${home_dev}" && "${sep_home}" == "y" ]]; then if [[ "${smartpart}" == "y" ]]; then homeform="y" elif [[ "${preset}" =~ ^(3|4)$ ]]; then homeform="y" elif [[ -z "${smartpart}" || -z "${preset}" ]]; then BLUE " > A ${nc}/Home ${blue}partition has been detected. Format as ${nc}${fsname}${blue} ? [y/N] " read -r -p " ==> " homeform echo homeform="${homeform:-n}" homeform="${homeform,,}" fi if [[ "${homeform}" == "y" ]]; then if mkfs.ext4 -F -L Home "${home_dev}" > /dev/null 2> amelia_log.txt ; then tune2fs -O fast_commit "${home_dev}" > /dev/null 2> amelia_log.txt || err_abort mount --mkdir "${home_dev}" /mnt/home > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/Home OK${nc}] " else umount_manual until manual_part; do : ; done until form_home; do : ; done until mount_mnt; do : ; done until mount_esp; do : ; done if [[ "${xbootloader}" == "yes" ]]; then until mount_xboot; do : ; done fi until mount_home; do : ; done fi elif [[ "${homeform}" == "n" ]]; then skip else y_n until ask_homepart_form; do : ; done fi fi } ################################################################################################### manual_mode() { volumes="$(fdisk -l | grep '^/dev' | cat --number)" until form_esp; do : ; done if [[ "${xbootloader}" == "yes" ]]; then until form_xboot; do : ; done fi until form_root; do : ; done if [[ -e "${home_dev}" && "${sep_home}" == "y" ]]; then until form_home; do : ; done fi until mount_mnt; do : ; done until mount_esp; do : ; done if [[ "${xbootloader}" == "yes" ]]; then until mount_xboot; do : ; done fi if [[ -e "${home_dev}" && "${sep_home}" == "y" ]]; then until mount_home; do : ; done fi } ################################################################################################### form_esp() { sleep 0.2 NC " ${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Format EFI System Partition${nc} ${magenta}]${nc}-------------------------------${magenta}### " form_esp_nmbr=" " while [[ -n "${form_esp_nmbr}" ]]; do YELLOW " > Select an EFI System Partition to format as ${nc}vfat ${volumes}" BLUE " Enter a partition number ${bwhite}(empty to skip and proceed)${blue}: " read -r -p " ==> " form_esp_nmbr if [[ -n "${form_esp_nmbr}" ]]; then esppart="$(echo "${volumes}" | awk "\$1 == ${form_esp_nmbr} {print \$2}")" manespfs="$(lsblk -dno FSTYPE "${esppart}")" if [[ -e "${esppart}" ]]; then if [[ "${multibooting}" == "n" ]]; then if mkfs.fat -F 32 -n ESP "${esppart}" > /dev/null 2> amelia_log.txt ; then sleep 0.2 NC " ==> [${green}Format & Label /ESP OK${nc}] " return 0 else do_umount until manual_part; do : ; done until form_esp; do : ; done return 0 fi elif [[ "${multibooting}" == "y" && "${manespfs}" == "vfat" ]]; then sleep 0.2 NC " ==> [${green}/Unformatted ESP OK${nc}] " return 0 elif [[ "${multibooting}" == "y" && "${manespfs}" != "vfat" ]]; then if mkfs.fat -F 32 -n ESP "${esppart}" > /dev/null 2> amelia_log.txt ; then sleep 0.2 NC " ==> [${green}Format & Label /ESP OK${nc}] " return 0 else do_umount until manual_part; do : ; done until form_esp; do : ; done return 0 fi fi else invalid return 1 fi fi RED " --------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}PARTITION HAS NOT BEEN FORMATTED ${red}### ---------------------------------------------------" sleep 2 skip done } ################################################################################################### form_xboot() { sleep 0.2 NC " ${magenta}###${nc}--------------------------${magenta}[ ${bwhite}Format Linux Extended Boot Partition${nc} ${magenta}]${nc}--------------------------${magenta}### " form_xboot_nmbr=" " while [[ -n "${form_xboot_nmbr}" ]]; do YELLOW " > Select a Linux Extended Boot Partition to format as ${nc}vfat ${volumes}" BLUE " Enter a partition number ${bwhite}(empty to skip and proceed)${blue}: " read -r -p " ==> " form_xboot_nmbr if [[ -n "${form_xboot_nmbr}" ]]; then xbootpart="$(echo "${volumes}" | awk "\$1 == ${form_xboot_nmbr} {print \$2}")" if [[ -e "${xbootpart}" ]]; then if mkfs.fat -F 32 -n XBOOTLDR "${xbootpart}" > /dev/null 2> amelia_log.txt ; then sleep 0.2 NC " ==> [${green}Format & Label /XBOOTLDR OK${nc}] " return 0 else do_umount until manual_part; do : ; done until form_xboot; do : ; done return 0 fi else invalid return 1 fi fi RED " --------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}PARTITION HAS NOT BEEN FORMATTED ${red}### ---------------------------------------------------" sleep 2 skip done } ################################################################################################### form_root() { sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Format Root Partition${nc} ${magenta}]${nc}----------------------------------${magenta}### " form_root_nmbr=" " while [[ -n "${form_root_nmbr}" ]]; do YELLOW " > Select a ${roottype} Partition to format as ${nc}${fsname} ${volumes}" BLUE " Enter a partition number ${bwhite}(empty to skip and proceed)${blue}: " read -r -p " ==> " form_root_nmbr if [[ -n "${form_root_nmbr}" ]]; then rootpart="$(echo "${volumes}" | awk "\$1 == ${form_root_nmbr} {print \$2}")" if [[ -e "${rootpart}" ]]; then #-------------------------------------------------------------------------------------------------- if [[ "${fs}" == "1" ]]; then if mkfs.ext4 -F "${rootpart}" > /dev/null 2> amelia_log.txt ; then tune2fs -O fast_commit "${rootpart}" > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}Format ${roottype} OK${nc}] " else do_umount until manual_part; do : ; done until form_root; do : ; done return 0 fi #-------------------------------------------------------------------------------------------------- elif [[ "${fs}" == "2" ]]; then if mkfs.btrfs -f "${rootpart}" > /dev/null 2> amelia_log.txt ; then mount "${rootpart}" /mnt > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@ > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@home > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@cache > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@log > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@tmp > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@snapshots > /dev/null 2> amelia_log.txt || err_abort if [[ "${swapmode}" == "2" ]]; then btrfs subvolume create /mnt/@swap > /dev/null 2> amelia_log.txt || err_abort fi umount /mnt > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}Format ${roottype} OK${nc}] " else do_umount until manual_part; do : ; done until form_root; do : ; done return 0 fi fi else invalid return 1 fi YELLOW " > Label the ${roottype} Partition " BLUE " Enter a name ${bwhite}(empty to skip and proceed)${blue}: " read -r -p " ==> " rootpartname if [[ -n "${rootpartname}" ]]; then if [[ "${fs}" == "1" ]]; then if e2label "${rootpart}" "${rootpartname}" > /dev/null 2> amelia_log.txt ; then sleep 0.2 NC " ==> [${green}Label ${roottype} OK${nc}] " return 0 else err_try return 1 fi elif [[ "${fs}" == "2" ]]; then mount "${rootpart}" /mnt || err_abort btrfs filesystem label /mnt "${rootpartname}" > /dev/null 2> amelia_log.txt || err_abort umount /mnt || err_abort sleep 0.2 NC " ==> [${green}Label ${roottype} OK${nc}] " return 0 fi fi skip return 0 else RED " --------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}PARTITION HAS NOT BEEN FORMATTED ${red}### ---------------------------------------------------" sleep 2 skip return 0 fi done } ################################################################################################### ask_homepart_form() { if [[ ${fs} == "1" && -e "${home_dev}" && "${sep_home}" == "y" ]]; then if [[ "${smartpart}" == "y" ]]; then homeform="y" elif [[ "${preset}" =~ ^(3|4)$ ]]; then homeform="y" elif [[ -z "${smartpart}" || -z "${preset}" ]]; then BLUE " > A${nc} ${cyan}/Home ${blue}partition has been detected. Format as ${nc}${fsname}${blue} ? [y/N] " read -r -p " ==> " homeform echo homeform="${homeform:-n}" homeform="${homeform,,}" fi if [[ "${homeform}" == "y" ]]; then if mkfs.ext4 -F -L Home "${home_dev}" > /dev/null 2> amelia_log.txt ; then tune2fs -O fast_commit "${home_dev}" > /dev/null 2> amelia_log.txt || err_abort mount --mkdir "${home_dev}" /mnt/home > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/Home OK${nc}] " else umount_manual until manual_part; do : ; done until form_home; do : ; done until mount_mnt; do : ; done until mount_esp; do : ; done if [[ "${xbootloader}" == "yes" ]]; then until mount_xboot; do : ; done fi until mount_home; do : ; done fi elif [[ "${homeform}" == "n" ]]; then skip else y_n return 1 fi fi } ################################################################################################### form_home() { sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Format Home Partition${nc} ${magenta}]${nc}----------------------------------${magenta}### " form_home_nmbr=" " while [[ -n "${form_home_nmbr}" ]]; do YELLOW " > Select a /Home Partition to format as ${nc}Ext4 ${volumes} " BLUE " Enter a partition number ${bwhite}(empty to skip and proceed)${blue}: " read -r -p " ==> " form_home_nmbr if [[ -n "${form_home_nmbr}" ]]; then homepart="$(echo "${volumes}" | awk "\$1 == ${form_home_nmbr} {print \$2}")" if [[ -e "${homepart}" ]]; then if mkfs.ext4 -F "${homepart}" > /dev/null 2> amelia_log.txt ; then tune2fs -O fast_commit "${homepart}" > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}Format /Home OK${nc}] " else do_umount until manual_part; do : ; done until form_home; do : ; done return 0 fi else invalid return 1 fi YELLOW " > Label the /Home Partition " BLUE " Enter a name ${bwhite}(empty to skip and proceed)${blue}: " read -r -p " ==> " homepartname if [[ -n "${homepartname}" ]]; then if e2label "${homepart}" "${homepartname}" > /dev/null 2> amelia_log.txt ;then sleep 0.2 NC " ==> [${green}Label /Home OK${nc}] " return 0 else err_try return 1 fi fi skip return 0 else RED " --------------------------------------------------- ### ${yellowl}WARNING: ${nc}${yellow}PARTITION HAS NOT BEEN FORMATTED ${red}### ---------------------------------------------------" skip return 0 fi done } ################################################################################################### mount_mnt() { local prompt="Mount ${roottype}" sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Mount Root Partition${nc} ${magenta}]${nc}----------------------------------${magenta}### " YELLOW " > Select a ${roottype} Partition to mount to ${nc}/mnt ${volumes} " BLUE " Enter your${nc} ${cyan}${roottype} ${blue}partition number: " read -r -p " ==> " mntroot_nmbr echo if [[ -n "${mntroot_nmbr}" ]]; then rootpart="$(echo "${volumes}" | awk "\$1 == ${mntroot_nmbr} {print \$2}")" if [[ -e "${rootpart}" ]]; then #-------------------------------------------------------------------------------------------------- if [[ "${fs}" == "1" ]]; then if mount "${rootpart}" /mnt > /dev/null 2> amelia_log.txt ; then sleep 0.2 ok return 0 else do_umount until mount_mnt; do : ; done fi #-------------------------------------------------------------------------------------------------- elif [[ "${fs}" == "2" ]]; then if mount -o "${sbvl_mnt_opts}",subvol=@ "${rootpart}" /mnt > /dev/null 2> amelia_log.txt ; then if [[ "${swapmode}" == "2" ]]; then mount --mkdir -o rw,nodatacow,subvol=@swap "${rootpart}" /mnt/swap > /dev/null 2> amelia_log.txt || err_abort fi mount --mkdir -o "${sbvl_mnt_opts}",subvol=@cache "${rootpart}" /mnt/var/cache > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@home "${rootpart}" /mnt/home > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@log "${rootpart}" /mnt/var/log > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@snapshots "${rootpart}" /mnt/"${snapname}" > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@tmp "${rootpart}" /mnt/var/tmp > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 ok return 0 else do_umount until mount_mnt; do : ; done fi fi #-------------------------------------------------------------------------------------------------- else invalid return 1 fi else choice return 1 fi } ################################################################################################### mount_esp() { local prompt="Mount ESP" sleep 0.2 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Mount ESP Partition${nc} ${magenta}]${nc}-----------------------------------${magenta}### " YELLOW " > Select an EFI System Partition to mount to ${nc}${esp_mount} ${volumes}" BLUE " Enter your${nc} ${cyan}/ESP ${blue}partition number: " read -r -p " ==> " mntesp_nmbr echo if [[ -n "${mntesp_nmbr}" ]]; then esppart="$(echo "${volumes}" | awk "\$1 == ${mntesp_nmbr} {print \$2}")" if [[ -e "${esppart}" ]]; then if mount --mkdir "${esppart}" "${esp_mount}" > /dev/null 2> amelia_log.txt ; then ok return 0 else do_umount until mount_mnt; do : ; done until mount_esp; do : ; done fi else invalid return 1 fi else choice return 1 fi } ################################################################################################### mount_xboot() { local prompt="Mount XBOOTLDR" sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Mount XBOOTLDR Partition${nc} ${magenta}]${nc}--------------------------------${magenta}### " YELLOW " > Select a Linux Extended Boot Partition to mount to ${nc}/mnt/boot ${volumes}" BLUE " Enter your${nc} ${cyan}/XBOOTLDR ${blue}partition number: " read -r -p " ==> " mntxboot_nmbr echo if [[ -n "${mntxboot_nmbr}" ]]; then xbootpart="$(echo "${volumes}" | awk "\$1 == ${mntxboot_nmbr} {print \$2}")" if [[ -e "${xbootpart}" ]]; then if mount --mkdir "${xbootpart}" /mnt/boot > /dev/null 2> amelia_log.txt ; then ok return 0 else do_umount until mount_mnt; do : ; done until mount_esp; do : ; done until mount_xboot; do : ; done fi else invalid return 1 fi else choice return 1 fi } ################################################################################################### mount_home() { local prompt="Mount /Home" sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Mount Home Partition${nc} ${magenta}]${nc}----------------------------------${magenta}### " YELLOW " > Select a /Home Partition to mount to ${nc}/mnt/home ${volumes}" BLUE " Enter your${nc} ${cyan}/Home ${blue}partition number: " read -r -p " ==> " mnthome_nmbr echo if [[ -n "${mnthome_nmbr}" ]]; then homepart="$(echo "${volumes}" | awk "\$1 == ${mnthome_nmbr} {print \$2}")" if [[ -e "${homepart}" ]]; then if mount --mkdir "${homepart}" /mnt/home > /dev/null 2> amelia_log.txt ; then ok return 0 else do_umount until mount_mnt; do : ; done until mount_esp; do : ; done until mount_xboot; do : ; done until mount_home; do : ; done fi else invalid return 1 fi else choice return 1 fi } ################################################################################################### confirm_status() { local prompt="System Ready" sleep 0.2 NC " ${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Confirm Installation Status${nc} ${magenta}]${nc}-------------------------------${magenta}### " BLUE " > Proceed ? " NC " * Type '${cyan}yes${nc}' to continue installation * Type '${cyan}no${nc}' to revise installation " read -r -p " ==> " agree if [[ "${agree}" == "yes" ]]; then ok until opt_pcmn; do : ; done until pacstrap_system; do : ; done if [[ "${swapmode}" == "2" ]]; then until "${swaptype}"; do : ; done fi if [[ -n "${REGDOM}" ]]; then until set_wireless_regdom; do : ; done fi set_vars chroot_conf elif [[ "${agree}" == "no" ]]; then unmount until revise; do : ; done else yes_no return 1 fi } ################################################################################################### revise() { revision="yes" reset=(xbootloader="" gfxconf="" vendor_slct="" vendor="" desktop="" custompkgs="" customservices="" cust_bootopts="" REGDOM="" autoroot="" autoxboot="" autohome="" autoswap="" vendors="" lowlat="" nogsp="" sanity="" smartpart="" partok="" preset="" presetpart="" set_optm="" ask_param="" kill_watchdog="" genoptm="" desk_setup="" devel="" web="" web_browser="" web_slct="" set_optm_slct="" oomd="" irqbalance="" thermald="" rngd="" rtkit="" tlp="") export "${reset[@]}" gfxpkgs=() if [[ "${hypervisor}" != "none" ]]; then vendor="Virtual Machine" gfxconf="n" fi until slct_krnl; do : ; done until ask_sign; do : ; done until slct_bootldr; do : ; done until slct_espmnt; do : ; done until slct_fs; do : ; done until slct_swap; do : ; done if [[ "${hypervisor}" == "none" ]]; then until dtct_gfx; do : ; done fi until dsktp_slct; do : ; done until base_devel; do : ; done until web_browser; do : ; done if [[ "${hypervisor}" == "none" ]]; then until print_scan; do : ; done until boot_entr; do : ; done fi until cust_kern_param; do : ; done until sys_watchdog; do : ; done until gen_optm; do : ; done if [[ "${hypervisor}" == "none" ]]; then until ask_wireless_regdom; do : ; done fi until systemd_oomd; do : ; done until irqbalance; do : ; done until thermald; do : ; done until rngd; do : ; done until rtkit; do : ; done until tlp; do : ; done until instl_dsk; do : ; done until ask_crypt; do : ; done if [[ "${swapmode}" == "1" ]]; then until "${swaptype}"; do : ; done fi if [[ "${encrypt}" == "no" ]]; then until set_mode; do : ; done until confirm_status; do : ; done elif [[ "${encrypt}" == "yes" ]]; then until sec_erase; do : ; done until luks; do : ; done until opt_pcmn; do : ; done until pacstrap_system; do : ; done if [[ "${swapmode}" == "2" ]]; then until "${swaptype}"; do : ; done fi if [[ -n "${REGDOM}" ]]; then until set_wireless_regdom; do : ; done fi set_vars chroot_conf fi } ################################################################################################### sec_erase() { local prompt="Secure Erasure" sleep 0.2 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Secure Disk Erasure${nc} ${magenta}]${nc}-----------------------------------${magenta}### " erase_dsk_nmbr=" " while [[ -n "${erase_dsk_nmbr}" ]]; do YELLOW " > Select a disk for Secure Erasure ${red}[!] (CAUTION) [!]${yellow} " RED " -------------------------------------------------------------------------- ### ${yellow}A reboot is ${nc}mandatory ${yellow}and will take effect ${nc}immediately ${yellow}when done ${red}### --------------------------------------------------------------------------" NC " ${disks}" BLUE " Enter a disk number ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " erase_dsk_nmbr echo if [[ -n "${erase_dsk_nmbr}" ]]; then erasedrive="$(echo "${disks}" | awk "\$1 == ${erase_dsk_nmbr} {print \$2}")" if [[ -e "${erasedrive}" ]]; then cryptsetup open --type plain -d /dev/urandom "${erasedrive}" temp || err_abort dd if=/dev/zero of=/dev/mapper/temp status=progress bs=1M oflag=direct || err_abort cryptsetup close temp || err_abort sleep 0.2 NC " ==> [${green}Drive ${erasedrive} Erased OK${nc}] " sleep 0.2 NC " ==> [${green}Rebooting${nc}] " sleep 1 reboot else invalid return 1 fi else skip ok fi done } ################################################################################################### luks() { espfs="$(lsblk -f --noheadings "${esp_dev}" | awk "{print \$2}")" sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}LUKS Encryption${nc} ${magenta}]${nc}-------------------------------------${magenta}### " if cryptsetup -y -v luksFormat --label CRYPTROOT "${root_dev}"; then if [[ "${rota}" == "0" ]]; then cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent luksOpen "${root_dev}" "${ENCROOT}" || err_abort else cryptsetup luksOpen "${root_dev}" "${ENCROOT}" || err_abort fi #------------------------------------------------------------------------------------------ if [[ "${fs}" == "1" ]]; then mkfs.ext4 -F -L Root /dev/mapper/"${ENCROOT}" > /dev/null 2> amelia_log.txt || err_abort tune2fs -O fast_commit /dev/mapper/"${ENCROOT}" > /dev/null 2> amelia_log.txt || err_abort mount /dev/mapper/"${ENCROOT}" /mnt > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}Encrypted /Root OK${nc}] " luks_root="ok" #------------------------------------------------------------------------------------------ elif [[ "${fs}" == "2" ]]; then mkfs.btrfs -f -L Root /dev/mapper/"${ENCROOT}" > /dev/null 2> amelia_log.txt || err_abort mount /dev/mapper/"${ENCROOT}" /mnt > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@ > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@home > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@cache > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@log > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@snapshots > /dev/null 2> amelia_log.txt || err_abort btrfs subvolume create /mnt/@tmp > /dev/null 2> amelia_log.txt || err_abort if [[ "${swapmode}" == "2" ]]; then btrfs subvolume create /mnt/@swap > /dev/null 2> amelia_log.txt || err_abort fi umount /mnt > /dev/null 2> amelia_log.txt || err_abort mount -o "${sbvl_mnt_opts}",subvol=@ /dev/mapper/"${ENCROOT}" /mnt > /dev/null 2> amelia_log.txt || err_abort if [[ "${swapmode}" == "2" ]]; then mount --mkdir -o rw,nodatacow,subvol=@swap /dev/mapper/"${ENCROOT}" /mnt/swap > /dev/null 2> amelia_log.txt || err_abort fi mount --mkdir -o "${sbvl_mnt_opts}",subvol=@cache /dev/mapper/"${ENCROOT}" /mnt/var/cache > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@home /dev/mapper/"${ENCROOT}" /mnt/home > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@log /dev/mapper/"${ENCROOT}" /mnt/var/log > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@snapshots /dev/mapper/"${ENCROOT}" /mnt/"${snapname}" > /dev/null 2> amelia_log.txt || err_abort mount --mkdir -o "${sbvl_mnt_opts}",subvol=@tmp /dev/mapper/"${ENCROOT}" /mnt/var/tmp > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}Encrypted /@ OK${nc}] " luks_root="ok" fi else line2 err_try do_umount return 1 fi #-------------------------------------------------------------------------------------------------- if [[ -e "${swap_dev}" && "${swapmode}" == "1" ]]; then line2 if cryptsetup -y -v luksFormat --label CRYPTSWAP "${swap_dev}"; then if [[ "${rota}" == "0" ]]; then cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent luksOpen "${swap_dev}" swap || err_abort else cryptsetup luksOpen "${swap_dev}" swap || err_abort fi mkswap /dev/mapper/swap > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}Encrypted /Swap OK${nc}] " luks_swap="ok" else line2 err_try do_umount return 1 fi fi #-------------------------------------------------------------------------------------------------- if [[ "${homecrypt}" == "yes" ]]; then line2 if cryptsetup -y -v luksFormat --label CRYPTHOME "${home_dev}"; then if [[ "${rota}" == "0" ]]; then cryptsetup --perf-no_read_workqueue --perf-no_write_workqueue --persistent luksOpen "${home_dev}" "${ENCRHOME}" || err_abort else cryptsetup luksOpen "${home_dev}" "${ENCRHOME}" || err_abort fi mkfs.ext4 -F -L Home /dev/mapper/"${ENCRHOME}" > /dev/null 2> amelia_log.txt || err_abort tune2fs -O fast_commit /dev/mapper/"${ENCRHOME}" > /dev/null 2> amelia_log.txt || err_abort mount --mkdir /dev/mapper/"${ENCRHOME}" /mnt/home > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}Encrypted /Home OK${nc}] " luks_home="ok" else line2 err_try do_umount return 1 fi elif [[ "${homecrypt}" == "no" ]]; then BLUE " > A ${nc}/Home ${blue}partition has been detected. Format as${nc} ${fsname}${blue}? [y/N] " read -r -p " ==> " homeform echo homeform="${homeform:-n}" homeform="${homeform,,}" if [[ "${homeform}" == "y" ]]; then if mkfs.ext4 -F -L Home "${home_dev}" > /dev/null 2> amelia_log.txt ; then tune2fs -O fast_commit "${home_dev}" > /dev/null 2> amelia_log.txt || err_abort mount --mkdir "${home_dev}" /mnt/home > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/Home OK${nc}] " else line2 err_try do_umount return 1 fi elif [[ "${homeform}" == "n" ]]; then skip else y_n return 1 fi fi #-------------------------------------------------------------------------------------------------- if [[ "${multibooting}" == "n" ]]; then if mkfs.fat -F 32 -n ESP "${esp_dev}" > /dev/null 2> amelia_log.txt ; then mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/ESP OK${nc}] " else do_umount until luks; do : ; done fi elif [[ "${multibooting}" == "y" && "${espfs}" == "vfat" ]]; then if mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2> amelia_log.txt ; then sleep 0.2 NC " ==> [${green}Unformatted /ESP OK${nc}] " else line2 err_try do_umount return 1 fi elif [[ "${multibooting}" == "y" && "${espfs}" != "vfat" ]]; then if mkfs.fat -F 32 -n ESP "${esp_dev}" > /dev/null 2> amelia_log.txt ; then mount --mkdir "${esp_dev}" "${esp_mount}" > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/ESP OK${nc}] " else do_umount until luks; do : ; done fi fi #-------------------------------------------------------------------------------------------------- if [[ "${xbootloader}" == "yes" ]] ; then if mkfs.fat -F 32 -n XBOOTLDR "${xboot_dev}" > /dev/null 2> amelia_log.txt ; then mount --mkdir "${xboot_dev}" /mnt/boot > /dev/null 2> amelia_log.txt || err_abort sleep 0.2 NC " ==> [${green}/XBOOTLDR OK${nc}] " else line2 err_try do_umount return 1 fi fi #-------------------------------------------------------------------------------------------------- sleep 0.2 NC " ==> [${green}Encryption OK${nc}]" luks_encrypt="ok" sleep 0.2 NC " ==> [${green}Filesystems OK${nc}] " sleep 0.2 YELLOW " ###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------### " lsblk -f|GREP_COLORS='mt=01;36' grep -E --color=always 'vfat|$'|GREP_COLORS='mt=01;32' grep -E --color=always 'ext4|$'|GREP_COLORS='mt=01;35' grep -E --color=always 'btrfs|$'|GREP_COLORS='mt=01;31' grep -E --color=always 'ntfs|$'|GREP_COLORS='mt=01;33' grep -E --color=always 'swap|$' YELLOW " ###-----------------------------------------------------------------------------------------------------------------### " sleep 0.2 } ################################################################################################### opt_pcmn() { local prompt="PacMan" sleep 0.2 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Pacman Optimization${nc} ${magenta}]${nc}-----------------------------------${magenta}### " YELLOW " > Select a Country for your Arch Mirrors: ### [Enter ${nc}'l' ${yellow}to list Countries, then ${nc}'enter' ${yellow}to search or ${nc}'q' ${yellow}to quit] " BLUE " Enter country name or country code ${bwhite}(Empty for Defaults)${blue}: " read -r -p " ==> " COUNTRY echo if [[ -z "${COUNTRY}" ]] ; then sleep 0.2 NC " ==> [${green}Default Mirrors OK${nc}] " elif [[ "${COUNTRY}" == "l" ]]; then reflector --list-countries | less return 1 elif [[ -n "${COUNTRY}" ]]; then line2 if reflector --verbose -c "${COUNTRY}" -l 10 -p https -f 10 --sort rate --save /etc/pacman.d/mirrorlist ; then sleep 0.2 NC " ==> [${green}${COUNTRY}'s Mirrors OK${nc}] " else err_try return 1 fi fi YELLOW " > Enable Pacman's ${nc}'Multilib' ${yellow}repository in the installed system ? [Y/n] " BLUE " Enter [Y/n]: " read -r -p " ==> " multilib echo multilib="${multilib:-y}" multilib="${multilib,,}" if [[ "${multilib}" == "y" ]]; then sleep 0.2 NC " ==> [${green}Multilib repository OK${nc}]" elif [[ "${multilib}" == "n" ]]; then skip else y_n return 1 fi ok } ################################################################################################### pacstrap_system() { sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Pacstrap System${nc} ${magenta}]${nc}-------------------------------------${magenta}### " cnfg gfxpkgs_set if [[ "${bootloader}" == "2" ]]; then if [[ "${fs}" == "1" ]]; then bootldr_pkgs="grub os-prober" elif [[ "${fs}" == "2" ]]; then bootldr_pkgs="grub-btrfs os-prober" fi fi basepkgs=(base efibootmgr nano networkmanager pkgstats sudo vim "${bootldr_pkgs}" "${fstools}" "${kernel}" "${microcode}" "${shell_pkgs}") if [[ -n "${shell}" ]]; then basepkgs+=("${shell}") fi if [[ -n "${nrg_plc}" ]]; then basepkgs+=("${nrg_plc}") fi if [[ "${vendor}" == "Virtual Machine" ]]; then basepkgs+=("${vmpkgs}") else basepkgs+=(alsa-firmware linux-firmware sof-firmware) fi if [[ ! "${desktop}" =~ ^(11|12)$ ]]; then basepkgs+=(7zip alsa-utils exfatprogs git glibc-locales gst-libav gst-plugin-libcamera gst-plugin-pipewire gst-plugins-bad gst-plugins-good gst-plugins-ugly libfido2 man-db man-pages mesa-utils nano-syntax-highlighting pacman-contrib pipewire-libcamera pipewire-pulse pipewire-zeroconf reflector xdg-user-dirs) fi if [[ -n "${ukify}" ]]; then basepkgs+=("${ukify}") fi if [[ -n "${zram}" ]]; then basepkgs+=("${zram}") fi if [[ -n "${gfxpkgs[*]}" ]]; then basepkgs+=("${gfxpkgs[*]}") fi if [[ "${vendor}" == "Nvidia" ]]; then basepkgs+=("${kernel}-headers") fi if [[ -n "${devel}" ]]; then basepkgs+=("${devel}") fi if [[ -n "${wireless_reg}" ]]; then basepkgs+=("${wireless_reg}") fi if [[ -n "${print_pkgs}" ]]; then basepkgs+=("${print_pkgs}") fi if [[ -n "${web_browser}" ]]; then basepkgs+=("${web_browser}") fi case "${desktop}" in 1) # Plasma Desktop: deskpkgs="${basepkgs[*]} dolphin-plugins konsole plasma plasma-x11-session qt6-multimedia-gstreamer" displaymanager="sddm" ;; 2) # Plasma Light Desktop: deskpkgs="${basepkgs[*]} ark bluedevil breeze-gtk colord-kde dolphin-plugins flatpak-kcm freerdp kate kcalc kclock kde-gtk-config kdegraphics-mobipocket kdegraphics-thumbnailers kdenetwork-filesharing kdeplasma-addons kdf kdialog keditbookmarks kget kimageformats kio-admin kio-gdrive kio-zeroconf konsole krdc krfb kscreen kwayland-integration kwrited okular purpose ocean-sound-theme packagekit-qt6 partitionmanager plasma5-integration plasma-browser-integration plasma-desktop plasma-disks plasma-firewall plasma-nm plasma-pa plasma-systemmonitor plasma-wayland-protocols plasma-x11-session sddm-kcm spectacle appmenu-gtk-module arj bluez-obex dosfstools ffmpegthumbs icoutils kvantum libappimage lrzip lzop maliit-keyboard ntfs-3g power-profiles-daemon qt5-xmlpatterns qt6-connectivity qt6-multimedia-gstreamer unarchiver unrar xdg-desktop-portal-gtk" displaymanager="sddm" ;; 3) # Gnome Desktop: deskpkgs="${basepkgs[*]} gnome" displaymanager="gdm" ;; 4) # Gnome Light Desktop: deskpkgs="${basepkgs[*]} dconf-editor file-roller gdm gnome-browser-connector gnome-calculator gnome-clocks gnome-console gnome-control-center gnome-disk-utility gnome-keyring gnome-menus gnome-shell-extensions gnome-system-monitor gnome-text-editor gnome-tweaks gnome-user-share gvfs gvfs-afc gvfs-mtp gvfs-smb loupe papers sushi dosfstools glib2-devel gparted ntfs-3g power-profiles-daemon unrar unzip xorg-xhost zip" displaymanager="gdm" ;; 5) # Xfce Desktop: deskpkgs="${basepkgs[*]} blueman catfish ffmpegthumbnailer gvfs gvfs-afc gvfs-mtp gvfs-smb libgsf libopenraw lightdm-gtk-greeter mousepad mugshot network-manager-applet pavucontrol poppler-glib ristretto thunar-archive-plugin thunar-media-tags-plugin thunar-shares-plugin xfce4 xfce4-artwork xfce4-battery-plugin xfce4-clipman-plugin xfce4-datetime-plugin xfce4-indicator-plugin xfce4-mount-plugin xfce4-power-manager xfce4-pulseaudio-plugin xfce4-screensaver xfce4-screenshooter xfce4-taskmanager xfce4-whiskermenu-plugin xfce4-power-manager xiccd" displaymanager="lightdm" ;; 6) # Cinnamon Desktop: deskpkgs="${basepkgs[*]} blueman cinnamon ffmpegthumbnailer gnome-color-manager gnome-keyring lightdm-slick-greeter touchegg wget ${terminal}" displaymanager="lightdm" ;; 7) # Deepin Desktop: deskpkgs="${basepkgs[*]} adobe-source-han-sans-otc-fonts bluez deepin deepin-album deepin-calculator deepin-camera deepin-clipboard deepin-community-wallpapers deepin-compressor deepin-device-formatter deepin-editor deepin-font-manager deepin-grand-search deepin-kwin deepin-movie deepin-printer deepin-reader deepin-screensaver deepin-shortcut-viewer deepin-terminal gtk-engine-murrine iw proxychains-ng qt6-multimedia-gstreamer redshift zssh" displaymanager="lightdm" ;; 8) # Budgie Desktop: deskpkgs="${basepkgs[*]} blueman budgie gnome-user-share lightdm-gtk-greeter nautilus network-manager-applet openssh papirus-icon-theme power-profiles-daemon rygel ${terminal}" displaymanager="lightdm" ;; 9) # Lxqt Desktop: deskpkgs="${basepkgs[*]} blueman breeze-icons gvfs gvfs-mtp kimageformats libarchive lxqt network-manager-applet oxygen-icons python-pyxdg qt6-imageformats qt6-multimedia-gstreamer sddm xscreensaver xsettingsd" displaymanager="sddm" ;; 10) # Mate Desktop: deskpkgs="${basepkgs[*]} atril blueman caja-actions caja-audio-video-properties caja-open-terminal caja-sendto caja-share caja-wallpaper cpio engrampa eom gnome-keyring gtk-engine-murrine gtk-engines lightdm-gtk-greeter mate mate-applets mate-calc mate-icon-theme mate-icon-theme-faenza mate-media mate-netbook mate-power-manager mate-screensaver mate-system-monitor mate-terminal mate-user-share mate-utils mozo network-manager-applet pluma python-gobject unace unrar webp-pixbuf-loader xdg-user-dirs-gtk" displaymanager="lightdm" ;; 11) # Base System: deskpkgs="${basepkgs[*]}" ;; 12) # Custom System: custarray=(base sudo "${bootldr_pkgs}" "${custompkgs}" "${fstools}" "${kernel}" "${microcode}") if [[ -n "${shell}" ]]; then custarray+=("${shell}") fi if [[ "${vendor}" == "Virtual Machine" ]]; then custarray+=("${vmpkgs}") else custarray+=(linux-firmware) fi if [[ -n "${ukify}" ]]; then custarray+=("${ukify}") fi if [[ -n "${zram}" ]]; then custarray+=("${zram}") fi if [[ -n "${gfxpkgs[*]}" ]]; then custarray+=("${gfxpkgs[*]}") fi if [[ "${greeternmbr}" =~ ^(1|2|3)$ ]]; then custarray+=("${greeter}") fi if [[ -n "${wireless_reg}" ]]; then custarray+=("${wireless_reg}") fi if [[ -n "${print_pkgs}" ]]; then custarray+=("${print_pkgs}") fi if [[ -n "${web_browser}" ]]; then custarray+=("${web_browser}") fi deskpkgs="${custarray[*]}" ;; 13) # Cosmic Desktop: deskpkgs="${basepkgs[*]} cosmic cosmic-player dconf packagekit power-profiles-daemon pulseaudio-alsa" displaymanager="cosmic-greeter" ;; esac pkg_displ NC " ${bwhite}Press any key to continue${nc} " read -r -s -n 1 if pacstrap -K /mnt ${deskpkgs} ; then if [[ "${fs}" == "2" ]]; then genfstab -t PARTUUID /mnt >> /mnt/etc/fstab || err_abort sleep 0.2 NC " ==> [${green}Fstab OK${nc}] " fi local prompt="Pacstrap System" ok else failure fi if [[ "${swapmode}" != "2" ]]; then line2 fi } ################################################################################################### swapfile() { local stage_prompt="Swapfile Creation" sleep 0.2 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Swapfile Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}### " if arch-chroot /mnt <<-SWAPFILE > /dev/null 2>&1 2> amelia_log.txt ; then mkswap -U clear --size ${swapsize}G --file /swapfile || exit SWAPFILE cat >> /mnt/etc/fstab <<-FSTAB || err_abort /swapfile none swap defaults 0 0 FSTAB stage_ok else stage_fail fi } ################################################################################################### swapfile_btrfs() { local stage_prompt="Btrfs Swapfile Creation" sleep 0.2 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Btrfs Swapfile Setup${nc} ${magenta}]${nc}----------------------------------${magenta}### " if arch-chroot /mnt <<-SWAPFILE > /dev/null 2>&1 2> amelia_log.txt ; then btrfs filesystem mkswapfile --size ${swapsize}g --uuid clear /swap/swapfile || exit SWAPFILE cat >> /mnt/etc/fstab <<-FSTAB || err_abort /swap/swapfile none swap defaults 0 0 FSTAB stage_ok else stage_fail fi } ################################################################################################### set_wireless_regdom() { local stage_prompt="Wireless Regulatory Domain" sleep 0.2 NC " ${magenta}###${nc}--------------------------${magenta}[ ${bwhite}Setting Up Wireless Regulatory Domain${nc} ${magenta}]${nc}--------------------------${magenta}### " if sed -i "/^#WIRELESS_REGDOM=\"${REGDOM}\"/s/^#//" /mnt/etc/conf.d/wireless-regdom ; then stage_ok else stage_fail fi } ################################################################################################### main_chroot() { local stage_prompt="Base System Configuration" if arch-chroot /mnt <<-CONF > /dev/null 2>&1 2> amelia_log.txt ; then sed -i "/^#${SETLOCALE}/s/^#//" /etc/locale.gen || exit locale-gen || exit echo LANG=${SETLOCALE} > /etc/locale.conf || exit export LANG=${SETLOCALE} || exit echo KEYMAP=${SETKBD} > /etc/vconsole.conf || exit cat <<-MKINITCPIO > /etc/mkinitcpio.conf.d/mkinitcpiod.conf || exit ${mkinitcpio_mods} ${mkinitcpio_hooks} MKINITCPIO mkinitcpio -P || exit ln -sf /usr/share/zoneinfo/$(curl -s http://ip-api.com/line?fields=timezone) /etc/localtime || exit hwclock --systohc || exit echo ${HOSTNAME} > /etc/hostname || exit cat <<-HOSTS > /etc/hosts || exit 127.0.0.1 localhost ::1 localhost 127.0.1.1 ${HOSTNAME}.localdomain ${HOSTNAME} HOSTS echo root:${ROOTPASSWD2} | chpasswd || exit chsh -s /bin/${shellname} || exit useradd -m -G wheel -s /bin/${shellname} ${USERNAME} || exit echo ${USERNAME}:${USERPASSWD2} | chpasswd || exit echo "%wheel ALL=(ALL) ALL" | tee /etc/sudoers.d/sudoersd || exit visudo -c /etc/sudoers.d/sudoersd || exit CONF stage_ok else stage_fail fi } ################################################################################################### btldrcfg() { if [[ "${bootloader}" == "1" ]]; then local stage_prompt="Systemd-boot Configuration" if [[ "${xbootloader}" == "no" ]]; then if arch-chroot /mnt <<-BOOTCTL > /dev/null 2>&1 2> amelia_log.txt ; then bootctl install || exit sed -i "/^#timeout 3/s/^#//" ${btldr_esp_mount}/loader/loader.conf || exit systemctl enable systemd-boot-update || exit BOOTCTL stage_ok else stage_fail fi elif [[ "${xbootloader}" == "yes" ]]; then if arch-chroot /mnt <<-XBOOTCTL > /dev/null 2>&1 2> amelia_log.txt ; then bootctl --esp-path=/efi --boot-path=/boot install || exit sed -i "/^#timeout 3/s/^#//" ${btldr_esp_mount}/loader/loader.conf || exit systemctl enable systemd-boot-update || exit XBOOTCTL stage_ok else stage_fail fi fi elif [[ "${bootloader}" == "2" ]]; then local stage_prompt="Grub Configuration" if arch-chroot /mnt <<-GRUB > /dev/null 2>&1 2> amelia_log.txt ; then cp /etc/default/grub /etc/default/grub.bak || exit cat <<-CFG > /etc/default/grub || exit GRUB_DEFAULT=0 GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="Arch" GRUB_CMDLINE_LINUX_DEFAULT="${boot_opts[*]}" GRUB_CMDLINE_LINUX="" GRUB_PRELOAD_MODULES="part_gpt part_msdos" GRUB_TIMEOUT_STYLE=menu GRUB_TERMINAL_INPUT=console GRUB_GFXMODE=auto GRUB_GFXPAYLOAD_LINUX=keep GRUB_DISABLE_RECOVERY=true GRUB_DISABLE_OS_PROBER=false #GRUB_TERMINAL_OUTPUT=console CFG GRUB stage_ok else stage_fail fi local stage_prompt="Grub Installation" if [[ "${sb_sign}" == "y" ]]; then if arch-chroot /mnt <<-SBGRUBINST > /dev/null 2>&1 2> amelia_log.txt ; then grub-install --target=${uefimode} --efi-directory=${btldr_esp_mount} --bootloader-id=GRUB --modules="tpm" --disable-shim-lock --recheck || exit sed -i 's/SecureBoot/SecureB00t/' ${btldr_esp_mount}/EFI/GRUB/grubx64.efi || exit grub-mkconfig -o /boot/grub/grub.cfg || exit SBGRUBINST stage_ok else stage_fail fi elif [[ "${sb_sign}" == "n" ]]; then if arch-chroot /mnt <<-GRUBINST > /dev/null 2>&1 2> amelia_log.txt ; then grub-install --target=${uefimode} --efi-directory=${btldr_esp_mount} --bootloader-id=GRUB --recheck || exit grub-mkconfig -o /boot/grub/grub.cfg || exit GRUBINST stage_ok else stage_fail fi fi if [[ "${fs}" == "2" ]]; then local stage_prompt="Grub-Btrfsd Service Activation" if arch-chroot /mnt <<-GRUB_BTRFSD > /dev/null 2>&1 2> amelia_log.txt ; then systemctl enable grub-btrfsd || exit GRUB_BTRFSD stage_ok else stage_fail fi fi if [[ "${gfxconf}" == "y" && "${vendor}" == "Nvidia" ]]; then local stage_prompt="Grub/Nvidia Configuration" if arch-chroot /mnt <<-NVGRUB > /dev/null 2>&1 2> amelia_log.txt ; then sed -i "/^#GRUB_TERMINAL_OUTPUT=console/s/^#//" /etc/default/grub || exit grub-mkconfig -o /boot/grub/grub.cfg || exit NVGRUB stage_ok else stage_fail fi fi fi } ################################################################################################### trimcfg() { if [[ -n "${trim}" ]]; then local stage_prompt="Trim Service Activation" if arch-chroot /mnt <<-TRIM > /dev/null 2>&1 2> amelia_log.txt ; then systemctl enable ${trim} || exit TRIM stage_ok else stage_fail fi fi } ################################################################################################### vm_serv() { if [[ -n "${vm_services}" ]]; then local stage_prompt="VM Service(s) Activation" if arch-chroot /mnt <<-VM > /dev/null 2>&1 2> amelia_log.txt ; then systemctl enable ${vm_services} || exit VM stage_ok else stage_fail fi fi } ################################################################################################### zramcfg() { if [[ -n "${zram}" ]]; then local stage_prompt="Zram Swap Activation" zram_service="systemd-zram-setup@zram0.service" if arch-chroot /mnt <<-ZRAMCONF > /dev/null 2>&1 2> amelia_log.txt ; then mkdir -p /etc/systemd/zram-generator.conf.d || exit cat <<-ZCONF > /etc/systemd/zram-generator.conf.d/zram.conf || exit [zram0] zram-size = ram / 2 compression-algorithm = zstd ZCONF cat <<-VMZCONF > /etc/sysctl.d/99-vm-zram-parameters.conf || exit vm.swappiness = 180 vm.watermark_boost_factor = 0 vm.watermark_scale_factor = 125 vm.page-cluster = 0 VMZCONF systemctl daemon-reload || exit systemctl start ${zram_service} || exit ZRAMCONF stage_ok else stage_fail fi fi } ################################################################################################### nvidia_hook() { if [[ "${gfxconf}" == "y" && "${vendor}" == "Nvidia" ]] || [[ "${gfxconf}" == "y" && "${vendors}" =~ "Nvidia" ]]; then if [[ "${nvname}" =~ ^(nvidia-open|nvidia|nvidia-lts)$ ]]; then local stage_prompt="Nvidia Hook Creation" if arch-chroot /mnt <<-NVIDIAHOOK > /dev/null 2>&1 2> amelia_log.txt ; then mkdir -p /etc/pacman.d/hooks/ || exit cat <<-HOOK > /etc/pacman.d/hooks/nvidia.hook || exit [Trigger] Operation=Install Operation=Upgrade Operation=Remove Type=Package Target=${nvname} Target=${kernel} [Action] Description=Update NVIDIA module in initcpio Depends=mkinitcpio When=PostTransaction NeedsTargets Exec=/bin/sh -c 'while read -r trg; do case $trg in linux*) exit 0; esac; done; /usr/bin/mkinitcpio -P' HOOK NVIDIAHOOK stage_ok else stage_fail fi fi fi } ################################################################################################### mkinitcpio_preset() { local stage_prompt="Mkinitcpio Kernel Presets Configuration" if [[ "${uki}" == "y" ]]; then if [[ ! -e "${esp_mount}"/EFI/Linux ]]; then mkdir -p "${esp_mount}"/EFI/Linux || exit fi if arch-chroot /mnt <<-UKI > /dev/null 2>&1 2> amelia_log.txt ; then mkdir /etc/cmdline.d || exit echo "rw ${boot_opts[*]}" | tee /etc/cmdline.d/cmdlined.conf || exit cp /etc/mkinitcpio.d/${kernel}.preset /etc/mkinitcpio.d/${kernel}.preset.bak || exit cat <<-MKINITPRESET > /etc/mkinitcpio.d/${kernel}.preset || exit ALL_config="/etc/mkinitcpio.conf.d/mkinitcpiod.conf" ALL_kver="/boot/vmlinuz-${kernel}" PRESETS=('default') default_uki="${btldr_esp_mount}/EFI/Linux/arch-${kernel}.efi" MKINITPRESET mkinitcpio -P || exit UKI stage_ok else stage_fail fi if [[ -e /mnt/boot/initramfs-"${kernel}".img ]]; then rm /mnt/boot/initramfs-"${kernel}".img || exit fi if [[ -e /mnt/boot/initramfs-"${kernel}"-fallback.img ]]; then rm /mnt/boot/initramfs-"${kernel}"-fallback.img || exit fi elif [[ "${uki}" == "n" ]]; then if arch-chroot /mnt <<-NOUKI > /dev/null 2>&1 2> amelia_log.txt ; then cp /etc/mkinitcpio.d/${kernel}.preset /etc/mkinitcpio.d/${kernel}.preset.bak || exit cat <<-MKINITPRESET > /etc/mkinitcpio.d/${kernel}.preset || exit ALL_config="/etc/mkinitcpio.conf.d/mkinitcpiod.conf" ALL_kver="/boot/vmlinuz-${kernel}" PRESETS=('default') default_image="/boot/initramfs-${kernel}.img" MKINITPRESET mkinitcpio -P || exit NOUKI stage_ok else stage_fail fi fi } ################################################################################################### var_opts() { if [[ ${sb_sign} == "y" && "${setrescue}" == "y" ]]; then local stage_prompt="Rescue Entry Creation" if [[ "${bootloader}" == "1" ]]; then if arch-chroot /mnt <<-RESCUE > /dev/null 2>&1 2> amelia_log.txt ; then echo "systemd.unit=rescue.target rw ${boot_opts[*]}" | tee /etc/cmdline.d/rescue.conf || exit cat <<-PRESET > /etc/mkinitcpio.d/${kernel}.preset || exit ALL_config="/etc/mkinitcpio.conf.d/mkinitcpiod.conf" ALL_kver="/boot/vmlinuz-${kernel}" PRESETS=('default' 'rescue') default_uki="${btldr_esp_mount}/EFI/Linux/arch-${kernel}.efi" default_options="--cmdline /etc/cmdline.d/cmdlined.conf" rescue_uki="${btldr_esp_mount}/EFI/Linux/rescue.efi" rescue_options="--cmdline /etc/cmdline.d/rescue.conf" PRESET mkinitcpio -P || exit RESCUE stage_ok else stage_fail fi elif [[ "${bootloader}" == "2" ]]; then if arch-chroot /mnt <<-RESCUE > /dev/null 2>&1 2> amelia_log.txt ; then touch /boot/grub/custom.cfg grep -E -A 11 "'Arch Linux'" /boot/grub/grub.cfg > /boot/grub/custom.cfg || exit sed -i 's/Arch Linux/Rescue Environment/' /boot/grub/custom.cfg || exit sed -i '/vmlinuz/ s/$/ systemd.unit=rescue.target/' /boot/grub/custom.cfg || exit RESCUE stage_ok else stage_fail fi fi fi if [[ "${multilib}" == "y" ]]; then local stage_prompt="Multilib Configuration" if arch-chroot /mnt <<-MULTILIB > /dev/null 2>&1 2> amelia_log.txt ; then sed -i "/\[multilib\]/,/Include/"'s/^#//' /etc/pacman.conf || exit pacman -Syy || exit MULTILIB stage_ok else stage_fail fi fi if [[ "${CPU}" == *"GenuineIntel"* && "${kill_watchdog}" == "y" ]]; then local stage_prompt="Intel Watchdog Configuration" if arch-chroot /mnt <<-INTEL_WATCHDOG > /dev/null 2>&1 2> amelia_log.txt ; then echo "blacklist iTCO_wdt" | tee /etc/modprobe.d/blacklist.conf || exit INTEL_WATCHDOG stage_ok else stage_fail fi elif [[ "${CPU}" == *"AuthenticAMD"* && "${kill_watchdog}" == "y" ]]; then local stage_prompt="AMD Watchdog Configuration" if arch-chroot /mnt <<-AMD_WATCHDOG > /dev/null 2>&1 2> amelia_log.txt ; then echo "blacklist sp5100_tco" | tee /etc/modprobe.d/blacklist.conf || exit AMD_WATCHDOG stage_ok else stage_fail fi fi if [[ "${oomd}" == "y" ]]; then local stage_prompt="Systemd-oomd Service Activation" if arch-chroot /mnt <<-OOMD > /dev/null 2>&1 2> amelia_log.txt ; then mkdir -p /etc/systemd/system.conf.d > /dev/null 2>&1 || exit cat <<-OOMD_CONF > /etc/systemd/system.conf.d/00-oomd.conf || exit [Manager] DefaultMemoryAccounting=yes OOMD_CONF systemctl enable systemd-oomd || exit OOMD stage_ok else stage_fail fi fi if [[ "${irqbalance}" == "y" ]]; then local stage_prompt="Irqbalance Service Activation" if arch-chroot /mnt <<-IRQBALANCE > /dev/null 2>&1 2> amelia_log.txt ; then pacman -S --noconfirm irqbalance || exit systemctl enable irqbalance || exit IRQBALANCE stage_ok else stage_fail fi fi if [[ "${thermald}" == "y" ]]; then local stage_prompt="Thermald Service Activation" if arch-chroot /mnt <<-THERMALD > /dev/null 2>&1 2> amelia_log.txt ; then pacman -S --noconfirm thermald || exit systemctl enable thermald || exit THERMALD stage_ok else stage_fail fi fi if [[ "${rngd}" == "y" ]]; then local stage_prompt="Rngd Service Activation" if arch-chroot /mnt <<-RNGD > /dev/null 2>&1 2> amelia_log.txt ; then pacman -S --noconfirm rng-tools || exit systemctl enable rngd || exit RNGD stage_ok else stage_fail fi fi if [[ "${rtkit}" == "y" ]]; then local stage_prompt="Rtkit Service Activation" if arch-chroot /mnt <<-RTKIT > /dev/null 2>&1 2> amelia_log.txt ; then pacman -S --noconfirm realtime-privileges rtkit || exit systemctl enable rtkit-daemon || exit usermod -aG realtime ${USERNAME} RTKIT stage_ok else stage_fail fi fi if [[ "${tlp}" == "y" ]]; then local stage_prompt="Power-profiles-daemon Removal" if [[ -e usr/lib/power-profiles-daemon ]]; then if arch-chroot /mnt <<-PPD > /dev/null 2>&1 2> amelia_log.txt ; then pacman -Rns --noconfirm power-profiles-daemon || exit PPD stage_ok else stage_fail fi fi local stage_prompt="Tlp Service Activation" if arch-chroot /mnt <<-TLP > /dev/null 2>&1 2> amelia_log.txt ; then pacman -S --noconfirm tlp || exit systemctl enable tlp systemctl mask systemd-rfkill.service systemd-rfkill.socket || exit TLP stage_ok else stage_fail fi fi if [[ "${printer}" == "y" ]]; then local stage_prompt="Print & Scan Services Activation" if arch-chroot /mnt <<-PRINT_CONF > /dev/null 2>&1 2> amelia_log.txt ; then systemctl enable avahi-daemon.socket cups.socket cups-browsed ipp-usb || exit sed -i 's|^hosts.*|hosts: mymachines mdns_minimal resolve [!UNAVAIL=return] files myhostname dns|g' /etc/nsswitch.conf || exit sed -i 's/ interface = [^ ]*/ interface = all/g' /etc/ipp-usb/ipp-usb.conf || exit PRINT_CONF stage_ok else stage_fail fi fi } ################################################################################################### optimizations() { if [[ "${genoptm}" == "y" ]]; then local stage_prompt="General System Optimizations" if arch-chroot /mnt <<-GENOPTM > /dev/null 2>&1 2> amelia_log.txt ; then pacman -S --noconfirm ccache ntfs-3g pbzip2 pigz || exit sed -i 's/^#Color/Color\nILoveCandy/' /etc/pacman.conf || exit update-pciids || exit cat <<-MKINITCPIO >> /etc/mkinitcpio.conf.d/mkinitcpiod.conf || exit COMPRESSION="zstd" COMPRESSION_OPTIONS=(-c -T$(nproc) --auto-threads=logical -) MODULES_DECOMPRESS="yes" MKINITCPIO mkinitcpio -P || exit cat <<-MAKEPKG > /etc/makepkg.conf.d/makepkgd.conf || exit #!/hint/bash CFLAGS="-march=native -O2 -pipe -fno-plt -fexceptions \ -Wp,-D_FORTIFY_SOURCE=3 -Wformat -Werror=format-security \ -fstack-clash-protection -fcf-protection \ -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer" MAKEFLAGS="-j$(nproc)" BUILDENV=(!distcc color ccache check !sign) OPTIONS=(strip docs !libtool !staticlibs emptydirs zipman purge !debug lto) COMPRESSGZ=(pigz -c -f -n) COMPRESSBZ2=(pbzip2 -c -f) COMPRESSZST=(zstd -c -T0 --auto-threads=logical -) MAKEPKG cat <<-SYSCTL > /etc/sysctl.d/99-sysctld.conf || exit net.core.netdev_max_backlog = 16384 net.core.somaxconn = 8192 net.core.rmem_default = 1048576 net.core.rmem_max = 16777216 net.core.wmem_default = 1048576 net.core.wmem_max = 16777216 net.core.optmem_max = 65536 net.ipv4.tcp_rmem = 4096 1048576 2097152 net.ipv4.tcp_wmem = 4096 65536 16777216 net.ipv4.udp_rmem_min = 8192 net.ipv4.udp_wmem_min = 8192 net.ipv4.tcp_fastopen = 3 net.ipv4.tcp_max_syn_backlog = 8192 net.ipv4.tcp_max_tw_buckets = 2000000 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tcp_fin_timeout = 10 net.ipv4.tcp_slow_start_after_idle = 0 net.ipv4.tcp_keepalive_time = 60 net.ipv4.tcp_keepalive_intvl = 10 net.ipv4.tcp_keepalive_probes = 6 net.ipv4.tcp_mtu_probing = 1 net.ipv4.tcp_sack = 1 net.core.default_qdisc = cake net.ipv4.tcp_congestion_control = bbr net.ipv4.ip_local_port_range = 30000 65535 net.ipv4.conf.default.rp_filter = 1 net.ipv4.conf.all.rp_filter = 1 vm.vfs_cache_pressure = 50 vm.mmap_min_addr = 65536 vm.max_map_count = 1048576 kernel.printk = 0 0 0 0 ${perf_stream} SYSCTL cat <<-POLKIT > /etc/polkit-1/rules.d/99-udisks2.rules || exit // Original rules: https://github.com/coldfix/udiskie/wiki/Permissions // Changes: Added org.freedesktop.udisks2.filesystem-mount-system, as this is used by Dolphin. polkit.addRule(function(action, subject) { var YES = polkit.Result.YES; var permission = { // required for udisks1: "org.freedesktop.udisks.filesystem-mount": YES, "org.freedesktop.udisks.luks-unlock": YES, "org.freedesktop.udisks.drive-eject": YES, "org.freedesktop.udisks.drive-detach": YES, // required for udisks2: "org.freedesktop.udisks2.filesystem-mount": YES, "org.freedesktop.udisks2.encrypted-unlock": YES, "org.freedesktop.udisks2.eject-media": YES, "org.freedesktop.udisks2.power-off-drive": YES, // Dolphin specific: "org.freedesktop.udisks2.filesystem-mount-system": YES, // required for udisks2 if using udiskie from another seat (e.g. systemd): "org.freedesktop.udisks2.filesystem-mount-other-seat": YES, "org.freedesktop.udisks2.filesystem-unmount-others": YES, "org.freedesktop.udisks2.encrypted-unlock-other-seat": YES, "org.freedesktop.udisks2.encrypted-unlock-system": YES, "org.freedesktop.udisks2.eject-media-other-seat": YES, "org.freedesktop.udisks2.power-off-drive-other-seat": YES }; if (subject.isInGroup("wheel")) { return permission[action.id]; } }); POLKIT mkdir -p /etc/systemd/journald.conf.d > /dev/null 2>&1 || exit cat <<-JOURNAL > /etc/systemd/journald.conf.d/00-journald.conf || exit [Journal] SystemMaxUse=100M JOURNAL mkdir -p /etc/systemd/user.conf.d > /dev/null 2>&1 || exit cat <<-TIMEOUT > /etc/systemd/user.conf.d/00-timeout.conf || exit [Manager] DefaultTimeoutStopSec=5s DefaultTimeoutAbortSec=5s TIMEOUT sed -i "/# set linenumbers/"'s/^#//' /etc/nanorc || exit sed -i "/# set minibar/"'s/^#//' /etc/nanorc || exit sed -i "/# set mouse/"'s/^#//' /etc/nanorc || exit echo " include /usr/share/nano/*.nanorc" | tee -a /etc/nanorc || exit echo tcp_bbr | tee /etc/modules-load.d/modulesd.conf || exit cat <<-SUDOERS > /etc/sudoers.d/sudoersd || exit Defaults pwfeedback Defaults editor=/usr/bin/nano %wheel ALL=(ALL) ALL SUDOERS visudo -c /etc/sudoers.d/sudoersd || exit GENOPTM stage_ok else stage_fail fi if [[ -d /mnt/etc/udisks2 ]]; then local stage_prompt="Udisks2 Mount Options" if arch-chroot /mnt <<-UDISKS2 > /dev/null 2>&1 2> amelia_log.txt ; then cat <<-UDISKS_CONF > /etc/udisks2/mount_options.conf || exit [defaults] ntfs_drivers=ntfs3,ntfs ntfs:ntfs3_defaults=uid=*,gid=*,windows_names ntfs:ntfs_defaults=uid=*,gid=*,windows_names exfat_defaults=uid=*,gid=*,errors=remount-ro UDISKS_CONF UDISKS2 stage_ok else stage_fail fi fi if [[ -n ${REGDOM} ]]; then local stage_prompt="Wpa_Supplicant Configuration" if arch-chroot /mnt <<-WPA > /dev/null 2>&1 2> amelia_log.txt ; then cat <<-SUPPLICANT > /etc/wpa_supplicant/wpa_supplicant.conf || exit country=${REGDOM} wps_cred_add_sae=1 pmf=2 SUPPLICANT WPA stage_ok else stage_fail fi fi fi } ################################################################################################### view_optm() { if [[ "${genoptm}" == "v" ]]; then typeset -f optimizations |grep -E 'pacman|/pacman.conf|update-pciids|usermod|systemctl|/etc|/mkinitcpio.conf.d|/makepkg.conf.d|/sysctl.d|/polkit-1/rules.d|/systemd/journald.conf.d|/systemd/user.conf.d|/nanorc|/modules-load.d|/sudoers.d|/udisks2|/wpa_supplicant/'| less fi } ################################################################################################### secboot_sign() { if [[ ${sb_sign} == "y" ]]; then local stage_prompt="Secure-Boot Signing" if [[ ${bootloader} == "1" ]]; then if arch-chroot /mnt <<-SECSIGN > /dev/null 2>&1 2> amelia_log.txt ; then systemctl disable systemd-boot-update || exit pacman -S --noconfirm sbctl || exit sbctl create-keys || exit sbctl enroll-keys -m || exit sbctl sign -s /boot/vmlinuz-${kernel} || exit sbctl sign -s ${btldr_esp_mount}/EFI/BOOT/BOOTX64.EFI || exit sbctl sign -s ${btldr_esp_mount}/EFI/Linux/arch-${kernel}.efi || exit sbctl sign -s ${btldr_esp_mount}/EFI/systemd/systemd-bootx64.efi || exit sbctl sign -s -o /usr/lib/systemd/boot/efi/systemd-bootx64.efi.signed /usr/lib/systemd/boot/efi/systemd-bootx64.efi || exit SECSIGN stage_ok else stage_fail fi if [[ ${setrescue} == "y" ]]; then local stage_prompt="Rescue Entry Secure-Boot Signing" if arch-chroot /mnt <<-SECSIGN > /dev/null 2>&1 2> amelia_log.txt ; then sbctl sign -s ${btldr_esp_mount}/EFI/Linux/rescue.efi || exit SECSIGN stage_ok else stage_fail fi fi elif [[ ${bootloader} == "2" ]]; then if arch-chroot /mnt <<-SECSIGN > /dev/null 2>&1 2> amelia_log.txt ; then pacman -S --noconfirm sbctl || exit sbctl create-keys || exit sbctl enroll-keys -m || exit sbctl sign -s /boot/vmlinuz-${kernel} || exit sbctl sign -s ${btldr_esp_mount}/EFI/GRUB/grubx64.efi || exit SECSIGN stage_ok else stage_fail fi fi fi } ################################################################################################### set_vars() { # Main Kernel Parameters boot_opts=() # Graphics Kernel Parameters gfx_bootopts=() # Mkinitcpio Modules MODULES=() # Mkinitcpio Hooks HOOKS=() # Zram Swap if [[ "${swapmode}" == "3" ]]; then # Zram Swap Kernel Parameters zram_bootopts="zswap.enabled=0" fi #-------------------------------------------------------------------------------------------------- # ENCRYPTION = 'YES' if [[ "${encrypt}" == "yes" ]]; then # Mkinitcpio Modules (Encryption) MODULES+=("${fs_mod}") # Encrypted Root Device encr_root_dev="/dev/mapper/${ENCROOT}" # Encrypted Root Options encr_root_opts="rd.luks.name=$(blkid -s UUID -o value "${root_dev}")=${ENCROOT}" # Encryption Kernel Parameters encr_root_bootopts="${encr_root_opts} root=${encr_root_dev}" # SWAP SETUP (Encryption) # Encrypted Swap Partition if [[ "${swapmode}" == "1" ]]; then # Encrypted Swap Partition Options encr_swap_opts="rd.luks.name=$(blkid -s UUID -o value "${swap_dev}")=swap" # Encrypted Swap Kernel Parameters encr_swap_bootopts="resume=/dev/mapper/swap ${encr_swap_opts}" # Encrypted Swapfile elif [[ "${swapmode}" == "2" ]]; then # Ext4 Offset calculation if [[ "${fs}" == "1" ]]; then offst="$(filefrag -v /mnt/swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}')" # Btrfs Offset calculation elif [[ "${fs}" == "2" ]]; then offst="$(btrfs inspect-internal map-swapfile -r /mnt/swap/swapfile)" fi # Encrypted Swap Kernel Parameters encr_swap_bootopts="resume=${encr_root_dev} resume_offset=${offst}" fi # HOOKS SETUP (Encryption) # Nvidia Only Vendor if [[ "${vendor}" == "Nvidia" ]]; then HOOKS+=(systemd keyboard autodetect microcode modconf sd-vconsole block sd-encrypt filesystems fsck) # Other Vendors / Multi-Vendors else HOOKS+=(systemd keyboard autodetect microcode modconf kms sd-vconsole block sd-encrypt filesystems fsck) fi # MAIN KERNEL PARAMETERS (Encryption) # Encrypted Root Kernel Parameters boot_opts+=("${encr_root_bootopts}") # Encrypted Swap Kernel Parameters if [[ -n "${encr_swap_bootopts}" ]]; then boot_opts+=("${encr_swap_bootopts}") fi # ENCRYPTION = 'NO' elif [[ "${encrypt}" == "no" ]]; then # HOOKS SETUP # Nvidia Only Vendor if [[ "${vendor}" == "Nvidia" ]]; then HOOKS+=(systemd autodetect microcode modconf keyboard sd-vconsole block filesystems fsck) # Other Vendors / Multi-Vendors else HOOKS+=(systemd autodetect microcode modconf kms keyboard sd-vconsole block filesystems fsck) fi # MAIN KERNEL PARAMETERS if [[ "${autoroot}" == "y" ]]; then boot_opts+=("${multiroot_bootopts}") fi fi #-------------------------------------------------------------------------------------------------- # GFX CONFIGURATION = 'YES' if [[ "${gfxconf}" == "y" ]]; then # Nvidia if [[ "${vendor}" == "Nvidia" || "${vendors}" =~ "Nvidia" ]]; then MODULES+=(nvidia nvidia_modeset nvidia_uvm nvidia_drm) gfx_bootopts+=(nvidia.NVreg_UsePageAttributeTable=1) # Disable GSP Firmware if [[ "${nogsp}" == "y" ]]; then gfx_bootopts+=(nvidia.NVreg_EnableGpuFirmware=0) fi # Enable Experimental Low Latency Interrupts if [[ "${lowlat}" == "y" ]]; then gfx_bootopts+=(nvidia.NVreg_RegistryDwords=RMIntrLockingMode=1) fi fi # AMD if [[ "${vendor}" == "AMD" || "${vendors}" =~ "AMD" ]]; then if [[ -n "${islands}" ]]; then MODULES+=(amdgpu) fi # 'Southern Islands' support if [[ "${islands}" == "1" ]]; then gfx_bootopts+=(amdgpu.dc=1 radeon.si_support=0 amdgpu.si_support=1) # 'Sea Islands' support elif [[ "${islands}" == "2" ]]; then gfx_bootopts+=(amdgpu.dc=1 radeon.cik_support=0 amdgpu.cik_support=1) fi fi fi #-------------------------------------------------------------------------------------------------- # MAIN KERNEL PARAMETERS if [[ -n "${gfx_bootopts[*]}" ]]; then boot_opts+=("${gfx_bootopts[*]}") fi if [[ "${kill_watchdog}" == "y" ]]; then boot_opts+=(nowatchdog) fi if [[ -n "${cust_bootopts}" ]]; then boot_opts+=("${cust_bootopts}") fi if [[ -n "${btrfs_bootopts}" ]]; then boot_opts+=("${btrfs_bootopts}") fi if [[ -n "${zram_bootopts}" ]]; then boot_opts+=("${zram_bootopts}") fi # MAIN MKINITCPIO MODULES mkinitcpio_mods="MODULES=(${MODULES[*]})" # MAIN MKINITCPIO HOOKS mkinitcpio_hooks="HOOKS=(${HOOKS[*]})" } ################################################################################################### chroot_conf() { sleep 0.2 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Chroot & Configure System${nc} ${magenta}]${nc}--------------------------------${magenta}###${nc} " # All Desktop Configuration: if [[ "${desktop}" != "12" ]]; then cnfg main_chroot if [[ -f /mnt/etc/lightdm/lightdm.conf ]]; then if [[ "${desktop}" == "7" ]]; then local stage_prompt="Deepin Greeter Configuration" if arch-chroot /mnt <<-DEEPIN > /dev/null 2>&1 2> amelia_log.txt ; then sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-deepin-greeter|g' /etc/lightdm/lightdm.conf || exit DEEPIN stage_ok else stage_fail fi elif [[ "${desktop}" =~ ^(5|8|10)$ ]]; then local stage_prompt="GTK Greeter Configuration" if arch-chroot /mnt <<-GTK > /dev/null 2>&1 2> amelia_log.txt ; then sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-gtk-greeter|g' /etc/lightdm/lightdm.conf || exit GTK stage_ok else stage_fail fi elif [[ "${desktop}" == "6" ]]; then local stage_prompt="Slick Greeter Configuration" if arch-chroot /mnt <<-SLICK > /dev/null 2>&1 2> amelia_log.txt ; then sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-slick-greeter|g' /etc/lightdm/lightdm.conf || exit SLICK stage_ok else stage_fail fi fi fi if [[ "${vendor}" != "Virtual Machine" ]]; then if [[ ! "${desktop}" =~ ^(11|12|13)$ ]]; then local stage_prompt="Bluetooth Service Activation" if arch-chroot /mnt <<-BLUETOOTH > /dev/null 2>&1 2> amelia_log.txt ; then systemctl enable bluetooth || exit BLUETOOTH stage_ok else stage_fail fi fi fi if [[ -n "${displaymanager}" ]]; then local stage_prompt="Display Manager Service Activation" if arch-chroot /mnt <<-DMSERVICE > /dev/null 2>&1 2> amelia_log.txt ; then systemctl enable ${displaymanager} || exit DMSERVICE stage_ok else stage_fail fi fi if [[ "${desktop}" != "12" ]]; then local stage_prompt="Network Manager Service Activation" if arch-chroot /mnt <<-NETWORK > /dev/null 2>&1 2> amelia_log.txt ; then systemctl enable NetworkManager || exit NETWORK stage_ok else stage_fail fi fi fi #-------------------------------------------------------------------------------------------------- # Custom System Configuration: if [[ "${desktop}" == "12" ]]; then cnfg main_chroot if [[ -f /mnt/etc/lightdm/lightdm.conf ]]; then if [[ "${greeternmbr}" == "1" ]]; then local stage_prompt="GTK Greeter Configuration" if arch-chroot /mnt <<-GTK > /dev/null 2>&1 2> amelia_log.txt ; then sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-gtk-greeter|g' /etc/lightdm/lightdm.conf || exit GTK stage_ok else stage_fail fi elif [[ "${greeternmbr}" == "2" ]]; then local stage_prompt="Slick Greeter Configuration" if arch-chroot /mnt <<-SLICK > /dev/null 2>&1 2> amelia_log.txt ; then sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-slick-greeter|g' /etc/lightdm/lightdm.conf || exit SLICK stage_ok else stage_fail fi elif [[ "${greeternmbr}" == "3" ]]; then local stage_prompt="Deepin Greeter Configuration" if arch-chroot /mnt <<-DEEPIN > /dev/null 2>&1 2> amelia_log.txt ; then sed -i 's|^#greeter-session=example-gtk-gnome|greeter-session=lightdm-deepin-greeter|g' /etc/lightdm/lightdm.conf || exit DEEPIN stage_ok else stage_fail fi fi fi if [[ -n "${customservices}" ]]; then local stage_prompt="Custom Service(s) Activation" if arch-chroot /mnt <<-CUSTOMSERV > /dev/null 2>&1 2> amelia_log.txt ; then systemctl enable ${customservices} || exit CUSTOMSERV stage_ok else stage_fail fi fi fi btldrcfg trimcfg vm_serv zramcfg nvidia_hook mkinitcpio_preset var_opts optimizations secboot_sign completion installation="ok" umount -R /mnt reboot exit } # END FUNCTIONS ################################################################################################### run_as="$(whoami)" tty="$(tty)" disks="$(lsblk --nodeps --paths --noheadings --output=name,size,model | cat --number)" trg="" vars=(LOCALESET="" SETLOCALE="" lcl_slct="" USERNAME="" kernelnmbr="" fs="" gfxcount="" gfxcard="" intelcount="" intelcards="" nvidiacount="" nvidiacards="" amdcount="" amdcards="" gfxconf="" gfx_conf="" gfx_setup="" vendor="" vendor1="" vendor2="" vendor3="" vendor_slct="" desktop="" efi_entr_del="" sanity="" install="" bootldr_pkgs="" devel="" REGDOM="" gfx_bootopts="" btrfs_bootopts="" trim="" swapmode="" homecrypt="" greeter="" revision="" greeternmbr="" cust_bootopts="" vmpkgs="" vm_services="" perf_stream="" displaymanager="" wireless_reg="" bitness="" bootloader="" gfx_slct="" espsize="" autoroot="" autoesp="" autoxboot="" autohome="" autoswap="" rootprt="" espprt="" xbootprt="" homeprt="" swapprt="" partok="" instl_drive="" sgdsk_nmbr="" part_mode="" preset="" capacity="" cap_gib="" rootsize="" sgdrive="" cgdrive="" smartpart="" presetpart="" prcnt="" roottype="" stage_prompt="" zram="" zram_bootopts="" xbootloader="" multibooting="" hypervisor="" mkinitcpio_mods="" uki="" ukify="" cng_espmnt="" sep_home="" encr_swap_bootopts="" uefimode="" luks_encrypt="" nrg_plc="" multilib="" nvname="" nogsp="" luks_root="" luks_swap="" luks_home="" installation="" kill_watchdog="" oomd="" setrescue="" lowlat="" vendors="" dev="" web="" web_browser="" printer="" print_pkgs="" shellnmbr="" shell="" shellname="" shellname2="" shell_pkgs="" genoptm="" set_optm="" ask_param="" desk_setup="" web_slct="" set_optm_slct="" irqbalance="" thermald="" rngd="" rtkit="" tlp="") export "${vars[@]}" clear first_check sleep 0.2 line3 CYANBG "************************************************************************************************* " CYANBG " " CYANBG " ### Amelia Installer ### " CYANBG " " CYANBG "************************************************************************************************* " NC " ${bwhite}Press any key to start${nc} " read -r -s -n 1 clear arch uefi_check connection_check upd_clock machine_dtct until main_menu; do : ; done