#!/bin/bash # Amelia Installer # Version: 5.9 set -euo pipefail trap 's=$?; echo "$0: Error on line "$LINENO": $BASH_COMMAND"; exit $s' ERR ################################################################################################### # COLOR FUNCTIONS redbgbl="\e[5;1;41m" #blink bg redbg="\e[1;41m" #bg red="\e[31m" greenbgbl="\e[5;1;42m" #blink bg greenbg="\e[1;42m" #bg green="\e[32m" yellowbgbl="\e[5;1;43m" #blink bg yellowbg="\e[1;43m" #bg yellow="\e[33m" bluebgbl="\e[5;1;44m" #blink bg bluebg="\e[1;44m" #bg blue="\e[94m" magentabgbl="\e[5;1;45m" #blink bg magentabg="\e[1;45m" #bg magenta="\e[35m" cyanbgbl="\e[5;1;46m" #blink bg cyanbg="\e[1;46m" #bg cyan="\e[36m" bwhite="\e[0;97m" #bright nc="\e[0m" REDBGBL (){ echo -e "${redbgbl} $1${nc}" } REDBG (){ echo -e "${redbg} $1${nc}" } RED (){ echo -e "${red} $1${nc}" } GREENBGBL (){ echo -e "${greenbgbl} $1${nc}" } GREENBG (){ echo -e "${greenbg} $1${nc}" } GREEN (){ echo -e "${green} $1${nc}" } YELLOWBGBL (){ echo -e "${yellowbgbl} $1${nc}" } YELLOWBG (){ echo -e "${yellowbg} $1${nc}" } YELLOW (){ echo -e "${yellow} $1${nc}" } BLUEBGBL (){ echo -e "${bluebgbl} $1${nc}" } BLUEBG (){ echo -e "${bluebg} $1${nc}" } BLUE (){ echo -e "${blue} $1${nc}" } MAGENTABGBL (){ echo -e "${magentabgbl} $1${nc}" } MAGENTABG (){ echo -e "${magentabg} $1${nc}" } MAGENTA (){ echo -e "${magenta} $1${nc}" } CYANBGBL (){ echo -e "${cyanbgbl} $1${nc}" } CYANBG (){ echo -e "${cyanbg} $1${nc}" } CYAN (){ echo -e "${cyan} $1${nc}" } NC (){ echo -e "${nc} $1${nc}" } WHITEB (){ echo -e "${bwhite} $1${nc}" } # END COLOR FUNCTIONS ################################################################################################### # PROMPT FUNCTIONS skip (){ sleep 0.3 YELLOW " --> Skipping.. " } reload (){ sleep 0.3 NC " --> [${green}Reloading${nc}] " } invalid (){ sleep 0.3 RED " [!] Invalid response " reload } err_try (){ sleep 0.3 RED " [!] Errors occured. Please try again.. " reload } err_abort (){ sleep 0.3 RED " [!] Errors occured " failure } vm_skip (){ sleep 0.3 YELLOW " ### Virtual Machine detected " skip } line2 (){ printf '\n\n' } line3 (){ printf '\n\n\n' } unmount (){ sleep 0.3 RED " [!] Unmounting and Retrying.. " reload sleep 0.3 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Unmount Filesystems${nc} ${magenta}]${nc}-----------------------------------${magenta}###${nc} " if umount -R /mnt > /dev/null 2>&1 ; then sleep 0.3 NC " ==> [${green}Unmount OK${nc}]" else sleep 0.3 RED " [!] Unmounting failed " failure fi } umount_abort (){ unmount reload } umount_manual (){ unmount sleep 0.3 NC " --> [Switching to ${green}Manual Mode${nc}]" } choice (){ sleep 0.3 RED " [!] Please make a choice to continue " reload } ok (){ sleep 0.3 NC " ==> [${green}${prompt} OK${nc}] " } stage_ok (){ sleep 0.3 NC " ==> [${green}${stage_prompt} configuration OK${nc}] " sleep 2 } stage_fail (){ sleep 0.3 RED " [!] ${stage_prompt} configuration FAILED " failure } completion_err (){ sleep 0.3 CYAN " [!] Please complete '${stage_prompt}' to continue " } intel (){ line2 BLUEBG " --------------------------------- " BLUEBG " ### INTEL Graphics detected ### " BLUEBG " --------------------------------- " NC " * ${vgacard} " } nvidia (){ line2 GREENBG " ---------------------------------- " GREENBG " ### NVIDIA Graphics detected ### " GREENBG " ---------------------------------- " NC " * ${vgacard} " } amd (){ line2 REDBG " ------------------------------- " REDBG " ### AMD Graphics detected ### " REDBG " ------------------------------- " NC " * ${vgacard} " } arch (){ sleep 0.3 line3 BLUEBG "************************************************************************************************* " BLUEBG " " BLUEBG " ##### Arch Linux Installation ##### " BLUEBG " " BLUEBG "************************************************************************************************* " line2 } cnfg (){ line3 YELLOWBGBL "------------------------------------------------------------------------------------------------- " YELLOWBGBL " ### Configuring... ### " YELLOWBGBL "------------------------------------------------------------------------------------------------- " echo sleep 0.3 } completion (){ sleep 0.3 line3 GREENBGBL "************************************************************************************************* " GREENBGBL " " GREENBGBL " ### Installation Completed ### " GREENBGBL " " GREENBGBL "************************************************************************************************* " line3 } failure (){ sleep 0.3 line3 REDBGBL "************************************************************************************************* " REDBGBL " " REDBGBL " ### Installation Failed ### " REDBGBL " " REDBGBL "************************************************************************************************* " line3 exit } # END PROMPT FUNCTIONS ################################################################################################### # FUNCTIONS first_check (){ if [[ "${tty}" == *"tty"* && -f /usr/share/kbd/consolefonts/ter-v18b.psf.gz && -f /usr/share/kbd/consolefonts/ter-v32b.psf.gz ]]; then until slct_font; do : ; done elif [[ "${tty}" == *"pts"* && -f /usr/share/kbd/consolefonts/ter-v18b.psf.gz && -f /usr/share/kbd/consolefonts/ter-v32b.psf.gz ]]; then MAGENTABG " 'Terminus Font' detected. Switch to console (tty) and re-run the installer to activate " echo fi if [[ "${run_as}" == "root" ]]; then REDBGBL " ---------------------------------------- " REDBGBL " ### The Installer Runs In ROOT Mode ### " REDBGBL " ---------------------------------------- " else YELLOWBGBL " ---------------------------------------- " YELLOWBGBL " ### The Installer Runs In DEMO Mode ### " YELLOWBGBL " ---------------------------------------- " fi } ################################################################################################### slct_font (){ sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Font Selection${nc} ${magenta}]${nc}--------------------------------------${magenta}###${nc} " YELLOW " > Select a Font: " NC " [1] Terminus Font [2] HiDPI Terminus Font " BLUE " Enter a number: " read -r -p " ==> " fontselect if [[ "${fontselect}" == "1" ]]; then setfont ter-v18b elif [[ "${fontselect}" == "2" ]]; then setfont ter-v32b else invalid return 1 fi clear } ################################################################################################### uefi_check (){ bootmode=$(cat /sys/firmware/efi/fw_platform_size) local prompt="UEFI ${bootmode}-bit Mode" sleep 0.3 NC " ${magenta}###${nc}---------------------------------${magenta}[ ${bwhite}UEFI Mode Verification${nc} ${magenta}]${nc}---------------------------------${magenta}###${nc} " if [[ "${bootmode}" == "64" || "${bootmode}" == "32" ]]; then ok else RED " [!] Not in UEFI Mode " failure fi } ################################################################################################### connection_check (){ local prompt="Internet Connection" sleep 0.3 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Internet Connection Check${nc} ${magenta}]${nc}--------------------------------${magenta}###${nc} " if ping -c 3 archlinux.org > /dev/null 2>&1; then ok else RED " [!] An active internet connection is mandatory to continue " failure fi } ################################################################################################### upd_clock (){ local prompt="System Clock" sleep 0.3 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}System Clock Update${nc} ${magenta}]${nc}-----------------------------------${magenta}###${nc} " sleep 0.3 timedatectl ok } ################################################################################################### dtct_microcode (){ local prompt="Microcode" sleep 0.3 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Microcode Detection${nc} ${magenta}]${nc}-----------------------------------${magenta}###${nc} " CPU="$(grep -E 'vendor_id' /proc/cpuinfo)" if [[ "${CPU}" == *"GenuineIntel"* ]]; then microcode="intel-ucode" nrg_plc="x86_energy_perf_policy" microname="Intel" else microcode="amd-ucode" microname="AMD" fi sleep 0.3 YELLOW " ### Detection completed, the ${microname} microcode will be installed " ok } ################################################################################################### main_menu (){ sleep 0.3 NC " ${magenta}###${nc}----------------------------------------${magenta}[ ${bwhite}Main Menu${nc} ${magenta}]${nc}----------------------------------------${magenta}###${nc} " YELLOW " > Make a selection: ### Select ${nc}[4] ${yellow}for guided navigation " NC " [1] Personalization [2] System Configuration [3] Disk Management [4] Start Installation " BLUE " Enter a number: " read -r -p " ==> " menu 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.3 RED " [!] Please select a Submenu " reload return 1 ;; *) invalid return 1 ;; esac } ################################################################################################### persnl_submn (){ sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Personalization${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " YELLOW " > Select a Submenu: " NC " [1] Locale & Keyboard Layout Setup [2] User, Root User & Hostname Setup [ ] Return to Main Menu " BLUE " Enter a number: " read -r -p " ==> " persmenu 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 ;; "") until main_menu; do : ; done ;; *) invalid return 1 ;; esac } ################################################################################################### slct_locale (){ local prompt="Locale" sleep 0.3 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Locale Selection${nc} ${magenta}]${nc}------------------------------------${magenta}###${nc} " YELLOW " > Select your Locale ### [Hit ${nc}'l'${yellow} to list locales, then ${nc}'enter'${yellow} to search or ${nc}'q'${yellow} to quit] ### Exclude '.UTF_8' suffix " BLUE " Enter your Locale ${bwhite}(empty for 'en_US')${blue}: " read -r -p " ==> " LOCALESET if [[ -z "${LOCALESET}" ]]; then SETLOCALE="en_US.UTF-8" sleep 0.3 YELLOW " ### en_US.UTF-8 Locale has been selected " elif [[ "${LOCALESET}" == "l" ]]; then grep -E 'UTF-8' /usr/share/i18n/SUPPORTED | more return 1 elif ! grep -q "^#\?$(sed 's/[].*[]/\\&/g' <<< "${LOCALESET}") " /usr/share/i18n/SUPPORTED; then invalid return 1 else SETLOCALE="${LOCALESET}.UTF-8" sleep 0.3 YELLOW " ### ${SETLOCALE} Locale has been selected " fi ok lcl_slct="yes" } ################################################################################################### slct_kbd (){ local prompt="Keyboard Layout" sleep 0.3 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Keyboard Layout Selection${nc} ${magenta}]${nc}--------------------------------${magenta}###${nc} " YELLOW " > Select your Keyboard Layout ### [Hit ${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 if [[ -z "${SETKBD}" ]]; then SETKBD="us" sleep 0.3 YELLOW " ### us Keyboard Layout has been selected " elif [[ "${SETKBD}" == "l" ]]; then localectl list-keymaps | more return 1 elif ! localectl list-keymaps | grep -Fxq "${SETKBD}"; then invalid return 1 else sleep 0.3 YELLOW " ### ${SETKBD} Keyboard Layout has been selected " loadkeys "${SETKBD}" > /dev/null 2>&1 fi ok } ################################################################################################### user_setup (){ local prompt="User" sleep 0.3 NC " ${magenta}###${nc}---------------------------------------${magenta}[ ${bwhite}User Setup${nc} ${magenta}]${nc}---------------------------------------${magenta}###${nc} " BLUE " Enter a username: " read -r -p " ==> " USERNAME echo if [[ -z "${USERNAME}" ]]; then sleep 0.3 RED " [!] Please enter a username to continue " reload return 1 elif [[ "${USERNAME}" =~ [[:upper:]] ]]; then sleep 0.3 RED " [!] Uppercase is not allowed. Please try again.. " reload return 1 fi BLUE " Enter a password for${nc} ${cyan}${USERNAME}${blue}: " read -r -p " ==> " USERPASSWD echo if [[ -z "${USERPASSWD}" ]]; then sleep 0.3 RED " [!] Please enter a password for ${USERNAME} to continue " reload return 1 fi BLUE " Re-enter${nc} ${cyan}${USERNAME}'s ${blue}password: " read -r -p " ==> " USERPASSWD2 echo if [[ "${USERPASSWD}" != "${USERPASSWD2}" ]]; then sleep 0.3 RED " [!] Passwords don't match. Please try again.. " reload return 1 fi ok } ################################################################################################### rootuser_setup (){ local prompt="Root User" sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Root User Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " BLUE " Enter a password for the${nc}${cyan} Root ${blue}user: " read -r -p " ==> " ROOTPASSWD if [[ -z "${ROOTPASSWD}" ]]; then sleep 0.3 RED " [!] Please enter a password for the Root user to continue " 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.3 RED " [!] Passwords don't match. Please try again.. " reload return 1 fi ok } ################################################################################################### slct_hostname (){ local prompt="Hostname" sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Hostname Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " BLUE " Enter a hostname: " read -r -p " ==> " HOSTNAME echo if [[ -z "${HOSTNAME}" ]]; then sleep 0.3 RED " [!] Please enter a hostname to continue " reload return 1 elif [[ "${HOSTNAME}" =~ [[:upper:]] ]]; then sleep 0.3 RED " [!] Lowercase is preferred. Please try again.. " reload return 1 fi ok } ################################################################################################### sys_submn (){ sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}System Configuration${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " YELLOW " > Select a Submenu: " NC " [1] Kernel & Bootloader Setup [2] Filesystem & Swap Setup [3] Graphics Setup [4] Desktop Setup [5] EFI Boot Entries Deletion [6] Wireless Regulatory Domain Setup [ ] Return to Main Menu " BLUE " Enter a number: " read -r -p " ==> " sysmenu case "${sysmenu}" in 1) until slct_krnl; do : ; done until ask_bootldr; do : ; done return 1 ;; 2) until ask_fs; do : ; done until ask_swap; do : ; done return 1 ;; 3) until dtct_vga; do : ; done return 1 ;; 4) until slct_dsktp; do : ; done return 1 ;; 5) until boot_entr; do : ; done return 1 ;; 6) until wireless_rgd; do : ; done return 1 ;; "") until main_menu; do : ; done ;; *) invalid return 1 ;; esac } ################################################################################################### slct_krnl (){ local prompt="Kernel" sleep 0.3 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Kernel Selection${nc} ${magenta}]${nc}------------------------------------${magenta}###${nc} " YELLOW " > Select a Kernel: " NC " [1] Linux [2] Linux LTS [3] Linux Hardened [4] Linux Zen " BLUE " Enter a number: " read -r -p " ==> " kernelnmbr case "${kernelnmbr}" in 1) kernel="linux" kernelname="Linux" entrname="Arch Linux" ;; 2) kernel="linux-lts" kernelname="Linux LTS" entrname="Arch Linux LTS" ;; 3) kernel="linux-hardened" kernelname="Linux Hardened" entrname="Arch Linux Hardened" ;; 4) kernel="linux-zen" kernelname="Linux Zen" entrname="Arch Linux Zen" ;; "") sleep 0.3 RED " [!] Please select a Kernel " reload return 1 ;; *) invalid return 1 ;; esac sleep 0.3 YELLOW " ### The ${kernelname} kernel has been selected " if [[ "${kernelnmbr}" == "3" ]]; then CYAN " [!] Swapping is not supported [!] " fi ok if [[ "${vga_slct}" == "yes" ]]; then local stage_prompt="Graphics Setup" completion_err until dtct_vga; do : ; done fi } ################################################################################################### ask_bootldr (){ local prompt="Bootloader" sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Bootloader Selection${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " YELLOW " > Select a Bootloader: " NC " [1] Systemd-boot [2] Grub " BLUE " Enter a number: " read -r -p " ==> " bootloader case "${bootloader}" in 1) sleep 0.3 YELLOW " ### Systemd-boot has been selected " ;; 2) sleep 0.3 YELLOW " ### Grub has been selected " ;; "") sleep 0.3 RED " [!] Please select a Bootloader " reload return 1 ;; *) invalid return 1 ;; esac ok } ################################################################################################### ask_fs (){ local prompt="Filesystem Setup" sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Filesystem Selection${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " 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.3 YELLOW " ### ${fsname} has been selected " ;; 2) fsname="Btrfs" fs_mod="btrfs" fstools="btrfs-progs" roottype="/@" btrfs_bootopts="rootflags=subvol=@ " sleep 0.3 YELLOW " ### ${fsname} has been selected " sleep 0.3 YELLOW " > Label your Btrfs snapshot directory: " BLUE " Enter a name: " read -r -p " ==> " snapname if [[ -z "${snapname}" ]]; then invalid return 1 fi ;; "") sleep 0.3 RED " [!] Please select a Filesystem " reload return 1 ;; *) invalid return 1 ;; esac ok } ################################################################################################### ask_swap (){ local prompt="Swap Setup" sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Swap Selection${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " YELLOW " > Select Swap type: " NC " [1] Swap Partition [2] Swapfile [3] None " BLUE " Enter a number: " read -r -p " ==> " swapmode case "${swapmode}" in 1) if [[ "${kernelnmbr}" == "3" ]]; then sleep 0.3 RED " [!] Incompatible Kernel has been detected [!] " CYAN " [!] Swap type will default to 'None' [!] " sleep 3 swapmode="3" skip ok if [[ "${vga_slct}" == "yes" ]]; then local stage_prompt="Graphics Setup" completion_err until dtct_vga; do : ; done fi return 0 fi swaptype="swappart" sleep 0.3 YELLOW " ### Swap Partition has been selected " ;; 2) if [[ "${kernelnmbr}" == "3" ]]; then sleep 0.3 RED " [!] Incompatible Kernel has been detected [!] " CYAN " [!] Swap type will default to 'None' [!] " sleep 4 swapmode="3" skip ok if [[ "${vga_slct}" == "yes" ]]; then local stage_prompt="Graphics Setup" completion_err until dtct_vga; do : ; done fi return 0 fi if [[ "${fs}" == "1" ]]; then swaptype="swapfile" elif [[ "${fs}" == "2" ]]; then swaptype="swapfile_btrfs" fi sleep 0.3 YELLOW " ### Swapfile has been selected " until set_swapsize; do : ; done ;; 3) sleep 0.3 YELLOW " ### No Swap will be used " skip ;; "") sleep 0.3 RED " [!] Please make a selection to continue " reload return 1 ;; *) invalid return 1 ;; esac ok if [[ "${vga_slct}" == "yes" ]]; then local stage_prompt="Graphics Setup" completion_err until dtct_vga; do : ; done fi } ################################################################################################### set_swapsize (){ local prompt="Swapsize" BLUE " Enter Swap size ${bwhite}(in GB)${blue}: " read -r -p " ==> " swapsize echo if [[ -z "${swapsize}" ]]; then sleep 0.3 RED " [!] Please enter a value to continue " reload line2 return 1 elif [[ "${swapsize}" =~ [[:digit:]] ]]; then ok else sleep 0.3 RED " [!] Please use only digits as a value " reload line2 return 1 fi } ################################################################################################### dtct_vga (){ if [[ -z "${kernelnmbr}" ]]; then local stage_prompt="Kernel & Bootloader Setup" completion_err until slct_krnl; do : ; done until ask_bootldr; do : ; done return 1 fi if [[ -z "${fs}" ]]; then local stage_prompt="Filesystem & Swap Setup" completion_err until ask_fs; do : ; done until ask_swap; do : ; done return 1 fi sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Graphics Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " vgacount="$(lspci | grep -E -c 'VGA|Display|3D')" vgacard="$(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]//')" hypervisor="$(systemd-detect-virt)" if [[ "${vgacount}" == "1" ]]; then dtct_single_vga else dtct_multi_vga fi } ################################################################################################### dtct_single_vga (){ local prompt="Graphics Setup" if [[ "${intelcount}" -eq "1" ]]; then vendor="Intel" sourcetype="Open-source" sleep 0.3 intel elif [[ "${amdcount}" -eq "1" ]]; then vendor="AMD" sourcetype="Open-source" sleep 0.3 amd elif [[ "${nvidiacount}" -eq "1" ]]; then vendor="Nvidia" sourcetype="Proprietary" nvidia elif [[ "${hypervisor}" != "none" ]]; then vendor="Virtual Machine" vgaconf="n" vgapkgs="" case "${hypervisor}" in kvm) vmpkgs="spice spice-vdagent spice-protocol spice-gtk qemu-guest-agent" vm_services="qemu-guest-agent" ;; vmware) vmpkgs="open-vm-tools" vm_services="vmtoolsd vmware-vmblock-fuse" ;; oracle) vmpkgs="virtualbox-guest-utils" vm_services="vboxservice" ;; microsoft) vmpkgs="hyperv" vm_services="hv_fcopy_daemon hv_kvp_daemon hv_vss_daemon" ;; esac vm_skip ok return 0 fi YELLOW " ### ${sourcetype} drivers will be used " if [[ "${vendor}" == "Nvidia" ]]; then RED " [!] Only for NV110 (Maxwell) Graphics or newer [!]" fi YELLOW " > Configure the Graphics subsystem and enable HW acceleration ? [y/n] " if [[ "${vendor}" == "Nvidia" ]]; then YELLOW " ### Selecting 'n' defaults to the Open-source 'nouveau' driver" fi BLUE " Enter [y/n]: " read -r -p " ==> " vgaconf vga_conf } ################################################################################################### dtct_multi_vga (){ local prompt="Graphics Setup" if [[ "${vgacount}" == "2" ]]; then vga_setup="Dual" elif [[ "${vgacount}" == "3" ]]; then vga_setup="Triple" fi sleep 0.3 YELLOW " ### ${vga_setup} Graphics setup detected, consisting of: " NC " ____________________________________________________________________" if [[ "${intelcount}" -ge "1" ]]; then vendor1="Intel" NC " [${intelcount}] Intel Graphics device(s) ${intelcards} ____________________________________________________________________" fi if [[ "${amdcount}" -ge "1" ]]; then vendor2="AMD" NC " [${amdcount}] AMD Graphics device(s) ${amdcards} ____________________________________________________________________" fi if [[ "${nvidiacount}" -ge "1" ]]; then vendor3="Nvidia" NC " [${nvidiacount}] Nvidia Graphics device(s) ${nvidiacards} ____________________________________________________________________" fi YELLOW " > Configure the Graphics subsystem and enable HW acceleration for : " if [[ -n "${vendor1}" && -n "${vendor2}" ]]; then NC " [1] Intel [2] AMD [3] None " BLUE " Enter a number: " read -r -p " ==> " vendor_slct if [[ "${vendor_slct}" == "1" ]]; then vendor="Intel" elif [[ "${vendor_slct}" == "2" ]]; then vendor="AMD" else vendor="none" fi elif [[ -n "${vendor1}" && -n "${vendor3}" ]]; then NC " [1] Intel [2] Nvidia ${red}[!] Only for NV110 (Maxwell) Graphics or newer [!]${nc} [3] None " BLUE " Enter a number: " read -r -p " ==> " vendor_slct if [[ "${vendor_slct}" == "1" ]]; then vendor="Intel" elif [[ "${vendor_slct}" == "2" ]]; then vendor="Nvidia" else vendor="none" fi elif [[ -n "${vendor2}" && -n "${vendor3}" ]]; then NC " [1] Amd [2] Nvidia ${red}[!] Only for NV110 (Maxwell) Graphics or newer [!]${nc} [3] None " BLUE " Enter a number: " read -r -p " ==> " vendor_slct if [[ "${vendor_slct}" == "1" ]]; then vendor="AMD" elif [[ "${vendor_slct}" == "2" ]]; then vendor="Nvidia" else vendor="none" fi fi if [[ "${vendor}" == "Intel" || "${vendor}" == "AMD" ]]; then sourcetype="Open-source" vgaconf="y" elif [[ "${vendor}" == "Nvidia" ]]; then sourcetype="Proprietary" vgaconf="y" elif [[ "${vendor}" == "none" ]]; then sourcetype="" vgaconf="n" vgapkgs="" echo skip ok return 0 fi sleep 0.3 YELLOW " ### ${sourcetype} drivers will be used " vga_conf } ################################################################################################### vga_conf (){ local prompt="Graphics Setup" if [[ "${vgaconf}" == "y" ]]; then if [[ "${vendor}" == "Intel" ]]; then perf_stream="dev.i915.perf_stream_paranoid = 0" vgapkgs="intel-media-driver intel-media-sdk libva-intel-driver vpl-gpu-rt vulkan-intel vulkan-mesa-layers" elif [[ "${vendor}" == "AMD" ]]; then vgapkgs="libva-mesa-driver mesa-vdpau vulkan-mesa-layers vulkan-radeon" sleep 0.3 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 if [[ -z "${islands}" ]]; then skip echo elif [[ "${islands}" == "1" ]]; then NC " ==> [${green}Southern Islands OK${nc}] " elif [[ "${islands}" == "2" ]]; then NC " ==> [${green}Sea Islands OK${nc}] " else invalid return 1 fi elif [[ "${vendor}" == "Nvidia" ]]; then sleep 0.3 YELLOW " > Select Nvidia architecture: " NC " [1] NV110 (Maxwell) Graphics or newer [2] NV160 (Turing) Graphics or newer " BLUE " Enter a number: " read -r -p " ==> " family if [[ "${family}" == "1" ]]; then sleep 0.3 NC " ==> [${green}Maxwell+ OK${nc}] " elif [[ "${family}" == "2" ]]; then sleep 0.3 YELLOW " > Select Nvidia driver: " NC " [1] 'Nvidia-Open' driver [2] 'Nvidia' driver " BLUE " Enter a number: " read -r -p " ==> " nvdriver if [[ "${nvdriver}" == "1" ]]; then if [[ -n "${vendor2}" ]]; then sleep 0.3 YELLOW " ### AMD Graphics have also been detected " RED " [!] There may be incompatibilities with the 'Nvidia-Open' driver [!]" YELLOW " > Please confirm your selection: " NC " [1] 'Nvidia-Open' driver [2] 'Nvidia' driver " BLUE " Enter a number: " read -r -p " ==> " nvdriver if [[ "${nvdriver}" == "1" || "${nvdriver}" == "2" ]]; then sleep 0.3 NC " ==> [${green}Driver Confirmed OK${nc}] " else echo invalid return 1 fi fi sleep 0.3 NC " ==> [${green}Turing+ OK${nc}] " elif [[ "${nvdriver}" == "2" ]]; then sleep 0.3 NC " ==> [${green}Turing+ OK${nc}] " else echo invalid return 1 fi else echo invalid return 1 fi if [[ "${kernelnmbr}" == "1" ]]; then if [[ "${family}" == "1" ]]; then vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia nvidia-settings nvidia-utils opencl-nvidia" nvname="nvidia" elif [[ "${family}" == "2" ]]; then if [[ "${nvdriver}" == "1" ]]; then vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-open nvidia-settings nvidia-utils opencl-nvidia" nvname="nvidia-open" elif [[ "${nvdriver}" == "2" ]]; then vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia nvidia-settings nvidia-utils opencl-nvidia" nvname="nvidia" fi fi elif [[ "${kernelnmbr}" == "2" ]]; then if [[ "${family}" == "1" ]]; then vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-lts nvidia-settings nvidia-utils opencl-nvidia" nvname="nvidia-lts" elif [[ "${family}" == "2" ]]; then if [[ "${nvdriver}" == "1" ]]; then vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-open-dkms nvidia-settings nvidia-utils opencl-nvidia" elif [[ "${nvdriver}" == "2" ]]; then vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-lts nvidia-settings nvidia-utils opencl-nvidia" nvname="nvidia-lts" fi fi else if [[ "${family}" == "1" ]]; then vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-dkms nvidia-settings nvidia-utils opencl-nvidia" elif [[ "${family}" == "2" ]]; then if [[ "${nvdriver}" == "1" ]]; then vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-open-dkms nvidia-settings nvidia-utils opencl-nvidia" elif [[ "${nvdriver}" == "2" ]]; then vgapkgs="libva-nvidia-driver libvdpau-va-gl nvidia-dkms nvidia-settings nvidia-utils opencl-nvidia" fi fi fi sleep 0.3 YELLOW " > Enable Nvidia's 'Suspend-Hibernate-Resume' Video Memory Preserving feature ? [y/n] " BLUE " Enter [y/n]: " read -r -p " ==> " nvidia_suspend if [[ "${nvidia_suspend}" == "n" ]]; then skip elif [[ "${nvidia_suspend}" == "y" && "${swapmode}" == "3" ]]; then sleep 0.3 RED " [!] Incompatible 'No Swap' Setting has been detected " CYAN " [!] Nvidia's Video Memory Preserving feature will NOT be enabled [!] " sleep 3 nvidia_suspend="n" skip elif [[ "${nvidia_suspend}" == "y" ]]; then sleep 0.3 YELLOW " ### Nvidia's 'Suspend-Hibernate-Resume' Video Memory Preserving feature will be enabled " else echo invalid return 1 fi fi sleep 0.3 YELLOW " ### ${vendor} Graphics will be automatically configured " elif [[ "${vgaconf}" == "n" ]]; then vgapkgs="" echo skip else invalid return 1 fi vga_slct="yes" ok } ################################################################################################### slct_dsktp (){ local prompt="Desktop Setup" custompkgs="" sleep 0.3 NC " ${magenta}###${nc}--------------------------------------${magenta}[ ${bwhite}Desktop Setup${nc} ${magenta}]${nc}--------------------------------------${magenta}###${nc} " YELLOW " > Make a selection: " NC " [1] Plasma [2] Custom Plasma & Systemd-boot & System Optimizations [3] Gnome [4] Custom Gnome & Systemd-boot & System Optimizations [5] Xfce [6] Cinnamon [7] Deepin [8] Budgie [9] Lxqt [10] Mate [11] Basic Arch Linux (No GUI) [12] Custom Arch Linux ${red}[!] EXPERTS ONLY [!] " BLUE " Enter a number: " read -r -p " ==> " packages case "${packages}" in 1) desktopname="Plasma" ;; 2) desktopname="Custom Plasma (System Optimized)" ;; 3) desktopname="Gnome" ;; 4) desktopname="Custom Gnome (System Optimized)" ;; 5) desktopname="Xfce" ;; 6) desktopname="Cinnamon" sleep 0.3 YELLOW " ### NOTE: Cinnamon desktop lacks a native Terminal emulator by design ### You can use linux console (ctrl+alt+F3) for shell access > Install ${nc}'gnome-terminal' ${yellow}for convenience ? [y/n] " BLUE " Enter [y/n]: " read -r -p " ==> " console case "${console}" in y) terminal="gnome-terminal" sleep 0.3 NC " ==> [${green}Terminal OK${nc}] " ;; n) echo skip ;; "") sleep 0.3 echo RED " [!] Please type 'y' or 'n' to continue.. " reload return 1 ;; *) invalid return 1 ;; esac ;; 7) desktopname="Deepin" ;; 8) desktopname="Budgie" sleep 0.3 YELLOW " ### NOTE: Budgie desktop lacks a native Terminal emulator by design ### You can use linux console (ctrl+alt+F3) for shell access > Install ${nc}'gnome-terminal' ${yellow}for convenience ? [y/n] " BLUE " Enter [y/n]: " read -r -p " ==> " console case "${console}" in y) terminal="gnome-terminal" sleep 0.3 NC " ==> [${green}Terminal OK${nc}] " ;; n) echo skip ;; "") sleep 0.3 echo RED " [!] Please type 'y' or 'n' to continue.. " reload return 1 ;; *) invalid return 1 ;; esac ;; 9) desktopname="Lxqt" ;; 10) desktopname="Mate" ;; 11) desktopname="Basic Arch Linux" ;; 12) desktopname="Custom Arch Linux" until cust_sys; do :; done return 0 ;; "") sleep 0.3 RED " [!] Please make a selection.. " reload return 1 ;; *) invalid return 1 ;; esac sleep 0.3 YELLOW " ### ${desktopname} has been selected ### NOTE: 'base' 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 case "${dev}" in y) devel="base-devel" sleep 0.3 NC " ==> [${green}base-devel OK${nc}] " ;; n) echo skip ;; "") sleep 0.3 echo RED " [!] Please type 'y' or 'n' to continue.. " reload return 1 ;; *) invalid return 1 ;; esac sleep 0.3 YELLOW " ### NOTE: Custom Kernel Parameters can be set at boot time > Enter your own Kernel Parameters ? [y/n] " BLUE " Enter [y/n]: " read -r -p " ==> " ask_param case "${ask_param}" in y) add_prmtrs ;; n) echo skip ;; "") sleep 0.3 echo RED " [!] Please type 'y' or 'n' to continue.. " reload return 1 ;; *) invalid return 1 ;; esac ok } ################################################################################################### cust_sys (){ local prompt="Custom Arch Linux" until add_pkgs; do : ; done until add_services; do : ; done until add_prmtrs; do : ; done echo ok } ################################################################################################### add_pkgs (){ local prompt="Add Packages" sleep 0.3 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Add Your Packages${nc} ${magenta}]${nc}------------------------------------${magenta}###${nc} " 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.3 RED " [!] Please enter package(s) to continue " reload return 1 elif [[ "${custompkgs}" =~ "lightdm" ]]; then echo sleep 0.3 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}LightDM Greeter Selection${nc} ${magenta}]${nc}--------------------------------${magenta}###${nc} " YELLOW " > Select a Greeter: " NC " [1] Gtk [2] Slick " BLUE " Enter a number: " read -r -p " ==> " greeternmbr case "${greeternmbr}" in 1) greeter="lightdm-gtk-greeter" sleep 0.3 NC " ==> [${green}Lightdm Gtk Greeter OK${nc}] " ;; 2) greeter="lightdm-slick-greeter" sleep 0.3 NC " ==> [${green}Lightdm Slick Greeter OK${nc}] " ;; "") sleep 0.3 echo RED " [!] Please make a selection.. " reload return 1 ;; *) invalid return 1 ;; esac else ok fi } ################################################################################################### add_services (){ local prompt="Add Services" sleep 0.3 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Add Your Services${nc} ${magenta}]${nc}------------------------------------${magenta}###${nc} " YELLOW " ### Empty to skip " BLUE " Enter services to be enabled ${bwhite}(space-seperated)${blue}: " read -r -p " ==> " customservices if [[ -z "${customservices}" ]]; then echo skip else ok fi } ################################################################################################### add_prmtrs (){ local prompt="Kernel Parameters" sleep 0.3 NC " ${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Add Your Kernel Parameters${nc} ${magenta}]${nc}-------------------------------${magenta}###${nc} " YELLOW " ### Empty to skip " BLUE " Enter your Kernel parameters to be set at boot ${bwhite}(space-seperated)${blue}: " read -r -p " ==> " cust_bootopts if [[ -z "${cust_bootopts}" ]]; then echo skip else ok fi } ################################################################################################### boot_entr (){ local prompt="Boot Entries" hypervisor="$(systemd-detect-virt)" sleep 0.3 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}EFI Boot Entries Deletion${nc} ${magenta}]${nc}--------------------------------${magenta}###${nc} " if [[ "${hypervisor}" != "none" ]]; then efi_entr_del="yes" vm_skip ok return 0 fi YELLOW " > Select an EFI Boot Entry to Delete ${red}[!] (CAUTION) [!] " sleep 0.3 efibootmgr boot_entry=" " while [[ -n "${boot_entry}" ]]; do BLUE " Enter a${nc} ${cyan}BootOrder${blue} number for Deletion ${bwhite}(empty to skip)${blue}: " read -r -p " ==> " boot_entry echo if [[ -n "${boot_entry}" ]]; then if [[ "${run_as}" != "root" ]]; then sleep 0.3 RED " [!] Root Privileges Missing.. " reload until sys_submn; do : ; done fi if efibootmgr -b "${boot_entry}" -B; then sleep 0.3 NC " ==> [${green}Entry ${boot_entry} Deleted${nc}] " else err_try return 1 fi else skip ok fi done efi_entr_del="yes" } ################################################################################################### wireless_rgd (){ local prompt="Wireless Regdom Setup" hypervisor="$(systemd-detect-virt)" sleep 0.3 NC " ${magenta}###${nc}----------------------------${magenta}[ ${bwhite}Wireless Regulatory Domain Setup${nc} ${magenta}]${nc}----------------------------${magenta}###${nc} " if [[ "${hypervisor}" != "none" ]]; then wrlss_rgd="yes" vm_skip ok return 0 fi YELLOW " > Select your Country Code (e.g. US) ### [Hit ${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 echo skip elif [[ "${REGDOM}" == "l" ]]; then sed 's|^#WIRELESS_REGDOM=||g' /etc/conf.d/wireless-regdom |sed 's|"||g'| more return 1 elif [[ "${REGDOM}" =~ [[:lower:]] ]]; then sleep 0.3 RED " [!] Lowercase is not allowed. Please try again.. " 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.3 YELLOW " ### ${REGDOM} Country Code has been selected " fi ok wrlss_rgd="yes" } ################################################################################################### dsks_submn (){ sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Disk Management${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " YELLOW " > Select a Submenu: " NC " [1] Disk GPT Manager [2] Partition Manager [ ] Return to Main Menu " BLUE " Enter a number: " read -r -p " ==> " diskmenu 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.3 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Disk GPT Manager${nc} ${magenta}]${nc}------------------------------------${magenta}###${nc} " gpt_dsk_nmbr=" " while [[ -n "${gpt_dsk_nmbr}" ]]; do YELLOW " > Select a disk to manage its GPT: ### [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 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.3 RED " [!] Root Privileges Missing.. " reload until dsks_submn; do : ; done fi NC " ______________________________________________ " gdisk "${gptdrive}" sleep 0.3 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 } ################################################################################################### disk_mngr (){ sleep 0.3 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Partition Manager${nc} ${magenta}]${nc}------------------------------------${magenta}###${nc} " 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.3 RED " [!] Please select a Mode " reload return 1 ;; *) invalid return 1 ;; esac } ################################################################################################### auto_part(){ local prompt="Disks" local stage_prompt="Auto-Partitioning" sleep 0.3 NC " ${magenta}###${nc}---------------------------------${magenta}[ ${bwhite}Automatic Partitioning${nc} ${magenta}]${nc}---------------------------------${magenta}###${nc} " YELLOW " > Select a disk for Auto-Partitioning: " RED " [!] WARNING: All data on selected disk will be destroyed [!] " 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 partsize="$(fdisk -l "${sgdrive}" | grep -E 'bytes'| grep -E 'Disk'| awk "{print \$5}")" rootsize="$((partsize*25/100/1024000000))" if [[ "${run_as}" != "root" ]]; then sleep 0.3 RED " [!] Root Privileges Missing.. " reload until dsks_submn; do : ; done fi if [[ "${fs}" == "2" && "${swapmode}" == "1" ]] ; then preset="2" elif [[ "${fs}" == "2" && "${swapmode}" == "2" ]] ; then preset="1" elif [[ "${fs}" == "1" ]] ; then sleep 0.3 YELLOW " ### NOTE: Creation of a separate /Home Partition is supported > Create a separate /Home Partition ? [y/n] " BLUE " Enter [y/n]: " read -r -p " ==> " sep_home case "${sep_home}" in y) sleep 0.3 YELLOW " ### A separate /Home Partition will be created ";; n) echo skip ;; "") sleep 0.3 echo RED " [!] Please type 'y' or 'n' to continue.. " reload return 1 ;; *) invalid return 1 ;; esac if [[ "${sep_home}" == "y" && "${swapmode}" == "1" ]] ; then preset="4" elif [[ "${sep_home}" == "y" && "${swapmode}" == "2" ]] ; then preset="3" elif [[ "${sep_home}" == "n" && "${swapmode}" == "1" ]] ; then preset="2" elif [[ "${sep_home}" == "n" && "${swapmode}" == "2" ]] ; then preset="1" fi else YELLOW " > Select a Partition Layout Preset: " NC " * [${cyan}Ext4${nc}] filesystem support Layout * [${magenta}Btrfs${nc}] filesystem support Layout [1] Create 'ESP' and '/Root' [${cyan}Ext4${nc},${magenta}Btrfs${nc}] [2] Create 'ESP', '/Root' and '/Swap' [${cyan}Ext4${nc},${magenta}Btrfs${nc}] [3] Create 'ESP', '/Root' and '/Home' [${cyan}Ext4${nc}] [4] Create 'ESP', '/Root', '/Home' and '/Swap' [${cyan}Ext4${nc}]" BLUE " Enter a Preset number: " read -r -p " ==> " preset fi case "${preset}" in 1) sgdisk -o "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 1:0:+512M -t 1:ef00 -c 1:ESP "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 2:0:0 -t 2:8304 -c 2:Root "${sgdrive}" > /dev/null 2>&1 || stage_fail ;; 2) until set_swapsize; do : ; done sgdisk -o "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 1:0:+512M -t 1:ef00 -c 1:ESP "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 2:0:+"${swapsize}"G -t 2:8200 -c 2:Swap "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 3:0:0 -t 3:8304 -c 3:Root "${sgdrive}" > /dev/null 2>&1 || stage_fail ;; 3) sgdisk -o "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 1:0:+512M -t 1:ef00 -c 1:ESP "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 2:0:+"${rootsize}"G -t 2:8304 -c 2:Root "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 3:0:0 -t 3:8302 -c 3:Home "${sgdrive}" > /dev/null 2>&1 || stage_fail ;; 4) until set_swapsize; do : ; done sgdisk -o "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 1:0:+512M -t 1:ef00 -c 1:ESP "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 2:0:+"${swapsize}"G -t 2:8200 -c 2:Swap "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 3:0:+"${rootsize}"G -t 3:8304 -c 3:Root "${sgdrive}" > /dev/null 2>&1 || stage_fail sgdisk -n 4:0:0 -t 4:8302 -c 4:Home "${sgdrive}" > /dev/null 2>&1 || stage_fail ;; "") sleep 0.3 RED " [!] Please select a Preset " reload return 1 ;; *) invalid return 1 ;; esac sleep 0.3 NC " ==> [${green}Disk ${sgdrive} OK${nc}] " if [[ "${install}" == "yes" ]]; then return 0 fi until dsks_submn; do : ; done else invalid return 1 fi else skip ok if [[ -z "${sanity}" ]]; then until dsks_submn; do : ; done elif [[ "${sanity}" == "no" ]]; then until instl_dsk; do : ; done elif [[ "${revision}" == "yes" ]]; then return 0 elif [[ "${sanity}" == "ok" ]]; then if [[ "${install}" == "yes" ]]; then return 0 fi until dsks_submn; do : ; done fi fi } ################################################################################################### manual_part(){ local prompt="Disks" sleep 0.3 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Manual Partitioning${nc} ${magenta}]${nc}-----------------------------------${magenta}###${nc} " 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: /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 " ------------------------------------------------------------------------------------------- " 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 if [[ "${run_as}" != "root" ]]; then sleep 0.3 RED " [!] Root Privileges Missing.. " reload until dsks_submn; do : ; done fi cgdisk "${cgdrive}" clear sleep 0.3 NC " ==> [${green}Disk ${cgdrive} OK${nc}] " return 1 else invalid return 1 fi else skip ok if [[ -z "${sanity}" ]]; then until dsks_submn; do : ; done elif [[ "${sanity}" == "no" ]]; then until instl_dsk; do : ; done elif [[ "${revision}" == "yes" ]]; then return 0 elif [[ "${sanity}" == "ok" ]]; then if [[ "${install}" == "yes" ]]; then return 0 fi until dsks_submn; do : ; done fi fi done } ################################################################################################### instl_dsk (){ sleep 0.3 NC " ${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Installation Disk Selection${nc} ${magenta}]${nc}-------------------------------${magenta}###${nc} " 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.3 RED " [!] Root Privileges Missing.. " reload until dsks_submn; 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.3 RED " [!] No GPT found on selected disk " reload until gpt_mngr; do : ; done return 0 fi until sanity_check; do : ; done else invalid return 1 fi else choice return 1 fi } ################################################################################################### sanity_check (){ local prompt="Installation Disk" sleep 0.3 NC " ${magenta}###${nc}--------------------------------------${magenta}[ ${bwhite}Sanity Check${nc} ${magenta}]${nc}--------------------------------------${magenta}###${nc} " 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}")" bootcount="$(fdisk -l "${instl_drive}" | grep -E -c 'EFI' | awk "{print \$1}")" boot_dev="$(fdisk -l "${instl_drive}" | grep -E 'EFI' | awk "{print \$1}")" multi_boot="$(fdisk -l "${instl_drive}" | grep -E 'EFI' | awk "{print \$1}" | cat --number)" boot_comply="$(fdisk -l "${instl_drive}" | grep -E 'EFI' | 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 prompt="Confirm /Root Partition" local stage_prompt="Partition" sleep 0.3 RED " [!] WARNING: Multiple Linux x86-64 /Root Partitions have been detected " sleep 0.3 YELLOW " ###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------### " lsblk -f "${instl_drive}"|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 " ###-----------------------------------------------------------------------------------------------------------------###" 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}[!] FORMATTED [!] " BLUE " > Proceed ? [y/n]" read -r -p " ==> " autoroot if [[ "${autoroot}" == "y" ]]; then root_dev="${root_comply}" multiroot_opts="root=PARTUUID=$(blkid -s PARTUUID -o value "${root_dev}") " ok line2 elif [[ "${autoroot}" == "n" ]]; then stage_fail else invalid echo return 1 fi fi if [[ "${bootcount}" -gt "1" ]]; then local prompt="Confirm /Boot Partition" local stage_prompt="Partition" sleep 0.3 RED " [!] WARNING: Multiple EFI Partitions have been detected " sleep 0.3 YELLOW " ###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------### " lsblk -f "${instl_drive}"|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 " ###-----------------------------------------------------------------------------------------------------------------###" NC " Linux EFI System Partitions: ---------------------------- ${multi_boot} ---------------------------- " YELLOW " ### Only the 1st EFI partition on a selected disk can be auto-assigned as a valid EFI partition ### Partition ${nc}${boot_comply} ${yellow}is auto-assigned as such and will be ${red}[!] FORMATTED [!] " BLUE " > Proceed ? [y/n]" read -r -p " ==> " autoboot if [[ "${autoboot}" == "y" ]]; then boot_dev="${boot_comply}" bootsize="$(lsblk -b "${boot_dev}" --noheadings --output=size)" if [[ "${bootsize}" -lt "209715200" ]]; then sanity="no" sleep 0.3 RED " [!] WARNING: EFI Partition's size is not adequate. Create a ${nc}200M ${red}EFI Partition at minimum " sleep 3 RED " [!] Sanity Check Failed [!] " sleep 2 reload until disk_mngr; do : ; done retry_boot="yes" return 0 else ok line2 fi elif [[ "${autoboot}" == "n" ]]; then stage_fail else invalid echo return 1 fi fi if [[ ${fs} == "1" && "${homecount}" -gt "1" ]]; then local prompt="Confirm /Home Partition" local stage_prompt="Partition" sleep 0.3 RED " [!] WARNING: Multiple Linux /Home Partitions have been detected " sleep 0.3 YELLOW " ###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------### " lsblk -f "${instl_drive}"|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 " ###-----------------------------------------------------------------------------------------------------------------###" 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}[!] FORMATTED [!] " BLUE " > Proceed ? [y/n]" read -r -p " ==> " autohome if [[ "${autohome}" == "y" ]]; then home_dev="${home_comply}" ok line2 elif [[ "${autohome}" == "n" ]]; then stage_fail else invalid echo return 1 fi fi if [[ ${swapmode} == "1" && "${swapcount}" -gt "1" ]]; then local prompt="Confirm /Swap Partition" local stage_prompt="Partition" sleep 0.3 RED " [!] WARNING: Multiple Linux /Swap Partitions have been detected " sleep 0.3 YELLOW " ###---------------------------------------------[ FILESYSTEM OVERVIEW ]---------------------------------------------### " lsblk -f "${instl_drive}"|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 " ###-----------------------------------------------------------------------------------------------------------------###" 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}[!] FORMATTED [!] " BLUE " > Proceed ? [y/n]" read -r -p " ==> " autoswap if [[ "${autoswap}" == "y" ]]; then swap_dev="${swap_comply}" ok line2 echo elif [[ "${autoswap}" == "n" ]]; then stage_fail else invalid echo return 1 fi fi local prompt="Installation Disk" if [[ -e "${boot_dev}" ]]; then bootsize="$(lsblk -b "${boot_dev}" --noheadings --output=size)" fi if [[ ! -e "${root_dev}" && ! -e "${boot_dev}" ]]; then sanity="no" sleep 0.3 RED " [!] Linux x86-64 /Root Partition not detected " sleep 0.3 RED " [!] EFI System Partition not detected " sleep 0.3 YELLOW " --> Please comply with the Discoverable Partitions Specification to continue.. ### Ensure that a Linux x86-64 /Root Partition with a valid GUID code ${nc}(8304)${yellow} is present on disk ### Ensure that an EFI System Partition with a valid GUID code ${nc}(ef00)${yellow} is present on disk " sleep 0.3 RED " [!] Sanity Check Failed [!] " sleep 2 reload until disk_mngr; do : ; done return 0 elif [[ ! -e "${root_dev}" && -e "${boot_dev}" ]]; then if [[ "${bootsize}" -lt "209715200" ]]; then sanity="no" sleep 0.3 RED " [!] WARNING: EFI Partition's size is not adequate. Create a ${nc}200M ${red}EFI Partition at minimum " sleep 3 RED " [!] Sanity Check Failed [!] " sleep 2 reload until disk_mngr; do : ; done return 0 else sanity="no" sleep 0.3 NC " ==> [EFI System Partition ${green}OK${nc}] " sleep 0.3 RED " [!] Linux x86-64 /Root Partition not detected " sleep 0.3 YELLOW " --> Please comply with the Discoverable Partitions Specification to continue.. ### Ensure that a Linux x86-64 /Root Partition with a valid GUID code ${nc}(8304)${yellow} is present on disk " sleep 0.3 RED " [!] Sanity Check Failed [!] " sleep 2 reload until disk_mngr; do : ; done return 0 fi elif [[ -e "${root_dev}" && ! -e "${boot_dev}" ]]; then sanity="no" sleep 0.3 NC " ==> [Linux x86-64 /Root ${green}OK${nc}] " sleep 0.3 RED " [!] EFI Partition not detected " sleep 0.3 YELLOW " --> Please comply with the Discoverable Partitions Specification to continue.. ### Ensure that an EFI System Partition with a valid GUID code ${nc}(ef00)${yellow} is present on disk " sleep 0.3 RED " [!] Sanity Check Failed [!] " sleep 2 reload until disk_mngr; do : ; done return 0 elif [[ -e "${root_dev}" && -e "${boot_dev}" ]]; then if [[ "${bootsize}" -lt "209715200" ]]; then sanity="no" sleep 0.3 RED " [!] WARNING: EFI Partition's size is not adequate. Create a ${nc}200M ${red}EFI Partition at minimum " sleep 3 RED " [!] Sanity Check Failed [!] " sleep 2 reload until disk_mngr; do : ; done return 0 fi sanity="ok" if [[ "${autoroot}" != "y" ]]; then sleep 0.3 NC " ==> [Linux x86-64 /Root ${green}OK${nc}] " fi if [[ "${autoboot}" != "y" ]]; then sleep 0.3 NC " ==> [EFI System Partition ${green}OK${nc}] " elif [[ "${autoboot}" == "y" && "${retry_boot}" == "yes" ]]; then sleep 0.3 NC " ==> [EFI System Partition ${green}OK${nc}] " fi if [[ -e "${home_dev}" ]]; then if [[ "${autohome}" != "y" ]]; then sleep 0.3 NC " ==> [Linux /Home ${green}OK${nc}] " fi fi if [[ "${swapmode}" == "1" ]]; then if [[ -e "${swap_dev}" ]]; then if [[ "${autoswap}" != "y" ]]; then sanity="ok" sleep 0.3 NC " ==> [Linux /Swap ${green}OK${nc}] " fi else sanity="no" sleep 0.3 RED " [!] Linux /Swap Partition not detected " sleep 0.3 YELLOW " --> Please comply with the Discoverable Partitions Specification to continue.. ### Ensure that a Linux /Swap Partition with a valid GUID code ${nc}(8200)${yellow} is present on disk " sleep 0.3 RED " [!] Sanity Check Failed [!] " sleep 2 reload until disk_mngr; do : ; done return 0 fi fi fi if [[ "${sanity}" == "ok" ]]; then ok fi } ################################################################################################### ask_crypt (){ local prompt="Encryption Setup" sleep 0.3 NC " ${magenta}###${nc}------------------------------------${magenta}[ ${bwhite}Encryption Setup${nc} ${magenta}]${nc}------------------------------------${magenta}###${nc} " 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 return 0 elif [[ "${encrypt}" == "yes" ]]; then sleep 0.3 YELLOW " > Enter a name for your Encrypted ${roottype} Partition: " BLUE " Enter a name: " read -r -p " ==> " ENCROOT echo if [[ -z "${ENCROOT}" ]]; then sleep 0.3 RED " [!] Please enter a name to continue " reload return 1 elif [[ "${ENCROOT}" =~ [[:upper:]] ]]; then sleep 0.3 RED " [!] Uppercase is not allowed. Please try again.. " reload return 1 elif [[ -n "${ENCROOT}" ]]; then sleep 0.3 NC " ==> [${green}Encrypted ${roottype} Label OK${nc}] " fi if [[ -e "${home_dev}" ]]; then if [[ "${fs}" == "1" ]]; then sleep 0.3 YELLOW " ### A /Home Partition has been detected " sleep 0.3 BLUE " > Encrypt${nc} ${cyan}/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 ok elif [[ "${homecrypt}" == "yes" ]]; then sleep 0.3 YELLOW " > Enter a name for your Encrypted /Home Partition: " BLUE " Enter a name: " read -r -p " ==> " ENCRHOME echo if [[ -z "${ENCRHOME}" ]]; then sleep 0.3 RED " [!] Please enter a name to continue " reload return 1 elif [[ "${ENCRHOME}" =~ [[:upper:]] ]]; then sleep 0.3 RED " [!] Uppercase is not allowed. Please try again.. " reload return 1 elif [[ -n "${ENCRHOME}" ]]; then sleep 0.3 NC " ==> [${green}Encrypted /Home Label OK${nc}] " fi else sleep 0.3 RED " [!] Please type 'yes' or 'no' to continue.. " reload return 1 fi fi fi ok else sleep 0.3 RED " [!] Please type 'yes' or 'no' to continue.. " reload return 1 fi } ################################################################################################### instl (){ install="yes" if [[ -z "${lcl_slct}" ]]; then sleep 0.3 CYAN " [!] Please complete 'Locale & Keyboard Layout Selection' to continue " until slct_locale; do : ; done until slct_kbd; do : ; done fi if [[ -z "${USERNAME}" ]]; then local stage_prompt="User, Root User & Hostname Setup" completion_err until user_setup; do : ; done until rootuser_setup; do : ; done until slct_hostname; do : ; done fi if [[ -z "${kernelnmbr}" ]]; then local stage_prompt="Kernel & Bootloader Setup" completion_err until slct_krnl; do : ; done until ask_bootldr; do : ; done fi if [[ -z "${fs}" ]]; then local stage_prompt="Filesystem & Swap Setup" completion_err until ask_fs; do : ; done until ask_swap; do : ; done fi if [[ -z "${vgaconf}" ]]; then local stage_prompt="Graphics Setup" completion_err until dtct_vga; do : ; done fi if [[ -z "${packages}" ]]; then local stage_prompt="Desktop Setup" completion_err until slct_dsktp; do : ; done fi if [[ -z "${efi_entr_del}" ]]; then local stage_prompt="EFI Boot Entries Deletion" completion_err until boot_entr; do : ; done fi if [[ -z "${wrlss_rgd}" ]]; then local stage_prompt="Wireless Regulatory Domain Setup" completion_err until wireless_rgd; 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 wireless_regdom; do : ; done fi chroot_conf fi } ################################################################################################### swappart (){ local stage_prompt="Swap Partition" sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Swap Partition Setup${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " if mkswap "${swap_dev}" > /dev/null 2>&1 ; then stage_ok else stage_fail fi } ################################################################################################### set_mode (){ if [[ "${rootcount}" -gt "1" || "${bootcount}" -gt "1" || "${homecount}" -gt "1" || "${swapcount}" -gt "1" ]]; then line2 until auto_mode; do : ; done sleep 0.3 NC " ==> [${green}Filesystems OK${nc}] " sleep 0.3 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 1 return 0 fi sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Mode Selection${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " 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 " [!] Please select a Mode to continue " reload return 1 ;; *) invalid return 1 ;; esac sleep 0.3 NC " ==> [${green}Filesystems OK${nc}] " sleep 0.3 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 1 } ################################################################################################### auto_mode (){ sleep 0.3 NC " ${magenta}###${nc}----------------------------------------${magenta}[ ${bwhite}Auto Mode${nc} ${magenta}]${nc}----------------------------------------${magenta}###${nc} " sleep 0.3 YELLOW " > Auto Mode Selected " sleep 1 if [[ "${fs}" == "1" ]]; then if mkfs.ext4 -F -L Root "${root_dev}" > /dev/null 2>&1 ; then mount "${root_dev}" /mnt > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}/Root OK${nc}] " else umount_manual until disk_mngr; do : ; done 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>&1 ; then mount "${root_dev}" /mnt > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@ > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@home > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@cache > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@log > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@tmp > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@snapshots > /dev/null 2>&1 || err_abort if [[ "${swapmode}" == "2" ]]; then btrfs subvolume create /mnt/@swap > /dev/null 2>&1 || err_abort fi umount /mnt > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@ "${root_dev}" /mnt > /dev/null 2>&1 || err_abort if [[ "${swapmode}" == "2" ]]; then mkdir -p /mnt/swap > /dev/null 2>&1 || err_abort mount -o rw,nodatacow,subvol=@swap "${root_dev}" /mnt/swap > /dev/null 2>&1 || err_abort fi mkdir -p /mnt/{var/cache,home,var/log,var/tmp,"${snapname}"} > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@cache "${root_dev}" /mnt/var/cache > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@home "${root_dev}" /mnt/home > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@log "${root_dev}" /mnt/var/log > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@snapshots "${root_dev}" /mnt/"${snapname}" > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@tmp "${root_dev}" /mnt/var/tmp > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}/@ OK${nc}] " else umount_manual until disk_mngr; do : ; done until form_root; do : ; done until mount_mnt; do : ; done fi fi sleep 0.3 #-------------------------------------------------------------------------------------------------- mkdir -pv /mnt/boot > /dev/null 2>&1 || err_abort if mkfs.fat -F 32 -n Boot "${boot_dev}" > /dev/null 2>&1 ; then mount "${boot_dev}" /mnt/boot > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}/Boot OK${nc}] " else umount_manual until disk_mngr; do : ; done until form_efi; do : ; done until mount_mnt; do : ; done until mount_boot; do : ; done fi sleep 0.3 #-------------------------------------------------------------------------------------------------- if [[ -e "${home_dev}" && "${fs}" == "1" ]]; then BLUE " > A${nc} ${cyan}/Home ${blue}partition has been detected. Format as${nc} ${cyan}${fsname}${blue}? [y/n] " read -r -p " ==> " homeform if [[ "${homeform}" == "y" ]]; then mkdir -pv /mnt/home > /dev/null 2>&1 || err_abort if mkfs.ext4 -F -L Home "${home_dev}" > /dev/null 2>&1 ; then mount "${home_dev}" /mnt/home > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}/Home OK${nc}] " else umount_manual until disk_mngr; do : ; done until form_home; do : ; done until mount_mnt; do : ; done until mount_boot; do : ; done until mount_home; do : ; done fi elif [[ "${homeform}" == "n" ]]; then skip else invalid until ask_homepart_form; do : ; done fi fi } ################################################################################################### manual_mode (){ if [[ -e "${home_dev}" ]]; then if [[ "${fs}" == "1" ]]; then until form_efi; do : ; done until form_root; do : ; done until form_home; do : ; done until mount_mnt; do : ; done mkdir -pv /mnt/{boot,home} > /dev/null 2>&1 || err_abort until mount_boot; do : ; done until mount_home; do : ; done elif [[ "${fs}" == "2" ]]; then until form_efi; do : ; done until form_root; do : ; done until mount_mnt; do : ; done mkdir -pv /mnt/boot > /dev/null 2>&1 || err_abort until mount_boot; do : ; done fi else until form_efi; do : ; done until form_root; do : ; done until mount_mnt; do : ; done mkdir -pv /mnt/boot > /dev/null 2>&1 || err_abort until mount_boot; do : ; done fi } ################################################################################################### form_efi (){ sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Format Boot Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " form_boot_nmbr=" " while [[ -n "${form_boot_nmbr}" ]]; do YELLOW " > Select a partition to format as EFI [/Boot] " NC " ${volumes}" BLUE " Enter a partition number ${bwhite}(empty to skip and proceed)${blue}: " read -r -p " ==> " form_boot_nmbr if [[ -n "${form_boot_nmbr}" ]]; then bootpart="$(echo "${volumes}" | awk "\$1 == ${form_boot_nmbr} { print \$2}")" if [[ -e "${bootpart}" ]]; then if mkfs.fat -F 32 -n Boot "${bootpart}" > /dev/null 2>&1 ; then sleep 0.3 NC " ==> [${green}Format & Label /Boot OK${nc}] " return 0 else umount_abort until disk_mngr; do : ; done until form_efi; do : ; done return 0 fi else invalid return 1 fi fi RED " [!] WARNING: PARTITION HAS NOT BEEN FORMATTED [!] " sleep 2 skip done } ################################################################################################### form_root (){ sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Format Root Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " form_root_nmbr=" " while [[ -n "${form_root_nmbr}" ]]; do YELLOW " > Select a partition to format as ${fsname} [${roottype}] " NC " ${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>&1 ; then sleep 0.3 NC " ==> [${green}Format ${roottype} OK${nc}] " else umount_abort until disk_mngr; do : ; done until form_root; do : ; done return 0 fi #-------------------------------------------------------------------------------------------------- elif [[ "${fs}" == "2" ]]; then if mkfs.btrfs -f "${rootpart}" > /dev/null 2>&1 ; then mount "${rootpart}" /mnt > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@ > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@home > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@cache > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@log > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@tmp > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@snapshots > /dev/null 2>&1 || err_abort if [[ "${swapmode}" == "2" ]]; then btrfs subvolume create /mnt/@swap > /dev/null 2>&1 || err_abort fi umount /mnt > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}Format ${roottype} OK${nc}] " else umount_abort until disk_mngr; 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>&1 ; then sleep 0.3 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>&1 || err_abort umount /mnt || err_abort sleep 0.3 NC " ==> [${green}Label ${roottype} OK${nc}] " return 0 fi fi skip return 0 else RED " [!] WARNING: PARTITION HAS NOT BEEN FORMATTED [!] " sleep 2 skip return 0 fi done } ################################################################################################### ask_homepart_form (){ if [[ -e "${home_dev}" && "${fs}" == "1" ]]; then BLUE " > A${nc} ${cyan}/Home ${blue}partition has been detected. Format as${nc} ${cyan}${fsname}${blue}? [y/n] " read -r -p " ==> " homeform echo if [[ "${homeform}" == "y" ]]; then mkdir -pv /mnt/home > /dev/null 2>&1 || err_abort if mkfs.ext4 -F -L Home "${home_dev}" > /dev/null 2>&1 ; then mount "${home_dev}" /mnt/home > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}/Home OK${nc}] " else umount_manual until disk_mngr; do : ; done until form_home; do : ; done until mount_mnt; do : ; done until mount_boot; do : ; done until mount_home; do : ; done fi elif [[ "${homeform}" == "n" ]]; then skip return 0 else invalid until ask_homepart_form; do : ; done fi fi } ################################################################################################### form_home (){ sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Format Home Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " form_home_nmbr=" " while [[ -n "${form_home_nmbr}" ]]; do YELLOW " > Select a partition to format as Ext4 [/Home] " NC " ${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>&1 ; then sleep 0.3 NC " ==> [${green}Format /Home OK${nc}] " else umount_abort until disk_mngr; 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>&1 ;then sleep 0.3 NC " ==> [${green}Label /Home OK${nc}] " return 0 else err_try return 1 fi fi skip return 0 else skip return 0 fi done } ################################################################################################### mount_mnt (){ local prompt="Mount ${roottype}" sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Mount Root Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " YELLOW " > Select a partition to mount to ${nc}/mnt " NC " ${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>&1 ; then sleep 0.3 ok return 0 else umount_abort until mount_mnt; do : ; done fi #-------------------------------------------------------------------------------------------------- elif [[ "${fs}" == "2" ]]; then if mount -o "${sbvl_mnt_opts}",subvol=@ "${rootpart}" /mnt > /dev/null 2>&1 ; then if [[ "${swapmode}" == "2" ]]; then mkdir -p /mnt/swap > /dev/null 2>&1 || err_abort mount -o rw,nodatacow,subvol=@swap "${rootpart}" /mnt/swap > /dev/null 2>&1 || err_abort fi mkdir -p /mnt/{var/cache,home,var/log,var/tmp,"${snapname}"} > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@cache "${rootpart}" /mnt/var/cache > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@home "${rootpart}" /mnt/home > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@log "${rootpart}" /mnt/var/log > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@snapshots "${rootpart}" /mnt/"${snapname}" > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@tmp "${rootpart}" /mnt/var/tmp > /dev/null 2>&1 || err_abort sleep 0.3 ok return 0 else umount_abort until mount_mnt; do : ; done fi fi #-------------------------------------------------------------------------------------------------- else invalid return 1 fi else choice return 1 fi } ################################################################################################### mount_boot (){ local prompt="Mount /Boot" sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Mount Boot Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " YELLOW " > Select a partition to mount to ${nc}/mnt/boot " NC " ${volumes}" BLUE " Enter your${nc} ${cyan}/Boot ${blue}partition number: " read -r -p " ==> " mntboot_nmbr echo if [[ -n "${mntboot_nmbr}" ]]; then bootpart="$(echo "${volumes}" | awk "\$1 == ${mntboot_nmbr} { print \$2}")" if [[ -e "${bootpart}" ]]; then if mount "${bootpart}" /mnt/boot > /dev/null 2>&1 ; then ok return 0 else umount_abort until mount_mnt; do : ; done until mount_boot; do : ; done fi else invalid return 1 fi else choice return 1 fi } ################################################################################################### mount_home (){ local prompt="Mount /Home" sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Mount Home Partition${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " YELLOW " > Select a partition to mount to ${nc}/mnt/home " NC " ${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 "${homepart}" /mnt/home > /dev/null 2>&1 ; then ok return 0 else umount_abort until mount_mnt; do : ; done until mount_boot; 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.3 NC " ${magenta}###${nc}-------------------------------${magenta}[ ${bwhite}Confirm Installation Status${nc} ${magenta}]${nc}-------------------------------${magenta}###${nc} " 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 wireless_regdom; do : ; done fi chroot_conf elif [[ "${agree}" == "no" ]]; then unmount until revise; do : ; done else sleep 0.3 RED " [!] Please type 'yes' or 'no' to continue.. " reload return 1 fi } ################################################################################################### revise (){ revision="yes" until slct_krnl; do : ; done until ask_bootldr; do : ; done until ask_fs; do : ; done until ask_swap; do : ; done until dtct_vga; do : ; done until slct_dsktp; do : ; done until boot_entr; do : ; done until wireless_rgd; do : ; done until disk_mngr; 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 wireless_regdom; do : ; done fi chroot_conf fi } ################################################################################################### sec_erase (){ local prompt="Secure Erasure" sleep 0.3 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Secure Disk Erasure${nc} ${magenta}]${nc}-----------------------------------${magenta}###${nc} " erase_dsk_nmbr=" " while [[ -n "${erase_dsk_nmbr}" ]]; do YELLOW " > Select a disk for Secure Erasure ${red}[!] (CAUTION) [!]${yellow} ### A reboot is mandatory and will take effect immediately when done " 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.3 NC " ==> [${green}Drive ${erasedrive} Erased OK${nc}] " sleep 1 NC " ==> [${green}Rebooting${nc}] " sleep 1 reboot else invalid return 1 fi else skip ok fi done } ################################################################################################### luks (){ sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}LUKS Encryption${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " 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>&1 || err_abort mount /dev/mapper/"${ENCROOT}" /mnt > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}Encrypted /Root OK${nc}] " #------------------------------------------------------------------------------------------ elif [[ "${fs}" == "2" ]]; then mkfs.btrfs -L Root /dev/mapper/"${ENCROOT}" > /dev/null 2>&1 || err_abort mount /dev/mapper/"${ENCROOT}" /mnt > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@ > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@home > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@cache > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@log > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@snapshots > /dev/null 2>&1 || err_abort btrfs subvolume create /mnt/@tmp > /dev/null 2>&1 || err_abort if [[ "${swapmode}" == "2" ]]; then btrfs subvolume create /mnt/@swap > /dev/null 2>&1 || err_abort fi umount /mnt > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@ /dev/mapper/"${ENCROOT}" /mnt > /dev/null 2>&1 || err_abort if [[ "${swapmode}" == "2" ]]; then mkdir -p /mnt/swap > /dev/null 2>&1 || err_abort mount -o rw,nodatacow,subvol=@swap /dev/mapper/"${ENCROOT}" /mnt/swap > /dev/null 2>&1 || err_abort fi mkdir -p /mnt/{var/cache,home,var/log,var/tmp,"${snapname}"} > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@cache /dev/mapper/"${ENCROOT}" /mnt/var/cache > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@home /dev/mapper/"${ENCROOT}" /mnt/home > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@log /dev/mapper/"${ENCROOT}" /mnt/var/log > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@snapshots /dev/mapper/"${ENCROOT}" /mnt/"${snapname}" > /dev/null 2>&1 || err_abort mount -o "${sbvl_mnt_opts}",subvol=@tmp /dev/mapper/"${ENCROOT}" /mnt/var/tmp > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}Encrypted /@ OK${nc}] " fi else umount_abort until luks; do : ; done fi #-------------------------------------------------------------------------------------------------- line3 if [[ -e "${swap_dev}" ]]; then 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>&1 || err_abort sleep 0.3 NC " ==> [${green}Encrypted /Swap OK${nc}] " else umount_abort until luks; do : ; done fi fi #-------------------------------------------------------------------------------------------------- line3 if [[ "${homecrypt}" == "yes" ]]; then 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>&1 || err_abort mkdir -p /mnt/home > /dev/null 2>&1 || err_abort mount /dev/mapper/"${ENCRHOME}" /mnt/home > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}Encrypted /Home OK${nc}] " else umount_abort until luks; do : ; done fi elif [[ "${homecrypt}" == "no" ]]; then BLUE " > A${nc} ${cyan}/Home ${blue}partition has been detected. Format as${nc} ${cyan}${fsname}${blue}? [y/n] " read -r -p " ==> " homeform echo if [[ "${homeform}" == "y" ]]; then if mkfs.ext4 -F -L Home "${home_dev}" > /dev/null 2>&1 ; then mkdir -p /mnt/home > /dev/null 2>&1 || err_abort mount "${home_dev}" /mnt/home > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}/Home OK${nc}] " else umount_abort until luks; do : ; done fi elif [[ "${homeform}" == "n" ]]; then skip else invalid return 1 fi fi #-------------------------------------------------------------------------------------------------- if mkfs.fat -F 32 -n Boot "${boot_dev}" > /dev/null 2>&1 ; then mkdir -pv /mnt/boot > /dev/null 2>&1 || err_abort mount "${boot_dev}" /mnt/boot > /dev/null 2>&1 || err_abort sleep 0.3 NC " ==> [${green}/Boot OK${nc}] " else umount_abort until luks; do : ; done fi sleep 0.3 NC " ==> [${green}Encryption OK${nc}]" sleep 0.3 NC " ==> [${green}Filesystems OK${nc}] " sleep 0.3 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 1 } ################################################################################################### opt_pcmn (){ local prompt="PacMan" sleep 0.3 NC " ${magenta}###${nc}-----------------------------------${magenta}[ ${bwhite}Pacman Optimization${nc} ${magenta}]${nc}-----------------------------------${magenta}###${nc} " YELLOW " > Select a Country for your Arch Mirrors: ### [Hit ${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.3 NC " ==> [${green}Default Mirrors OK${nc}] " elif [[ "${COUNTRY}" == "l" ]]; then reflector --list-countries | more 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.3 NC " ==> [${green}${COUNTRY}'s Mirrors OK${nc}] " else err_try return 1 fi fi YELLOW " > Enable Pacman's 'Parallel Downloads' feature? [y/n] " BLUE " Enter [y/n]: " read -r -p " ==> " parallel echo if [[ "${parallel}" == "y" ]]; then sleep 0.3 YELLOW " > Select number of Parallel Downloads [2-5] " NC " ${green}**${nc} [2] ${cyan}***${nc} [3] ${yellow}****${nc} [4] ${red}*****${nc} [5] " BLUE " Enter a number: " read -r -p " ==> " parallelnmbr echo if [[ "${parallelnmbr}" =~ ^(2|3|4|5)$ ]]; then sed -i "s|#ParallelDownloads = 5|ParallelDownloads = ${parallelnmbr}|g" /etc/pacman.conf > /dev/null 2>&1 || err_abort else invalid return 1 fi sleep 0.3 NC " ==> [${green}${parallelnmbr} Parallel Downloads OK${nc}]" elif [[ "${parallel}" == "n" ]]; then skip elif [[ -z "${parallel}" ]]; then sleep 0.3 RED " [!] Please make a selection to continue " reload return 1 else invalid return 1 fi ok } ################################################################################################### pacstrap_system (){ local prompt="Pacstrap System" sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Pacstrap System${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " cnfg if [[ "${bootloader}" == "2" ]]; then if [[ "${fs}" == "1" ]]; then bootldr_pkgs="efibootmgr grub os-prober" elif [[ "${fs}" == "2" ]]; then bootldr_pkgs="efibootmgr grub-btrfs os-prober" fi fi if [[ "${vendor}" == "Virtual Machine" ]]; then basepkgs="base pkgstats nano sudo vim ${bootldr_pkgs} ${fstools} ${kernel} ${microcode} ${vmpkgs} ${devel}" elif [[ "${vendor}" == "Nvidia" ]]; then basepkgs="base linux-firmware pkgstats nano sudo vim ${bootldr_pkgs} ${fstools} ${kernel} ${kernel}-headers ${microcode} ${vgapkgs} ${wireless_reg} ${devel}" else basepkgs="base linux-firmware pkgstats nano sudo vim ${bootldr_pkgs} ${fstools} ${kernel} ${microcode} ${vgapkgs} ${wireless_reg} ${devel}" fi case "${packages}" in 1) # NOTE: Plasma Desktop: deskpkgs="${basepkgs} plasma konsole" displaymanager="sddm" bluetooth="bluetooth" network="NetworkManager" ;; 2) # NOTE: Custom Plasma & Systemd-boot & Optimized System: deskpkgs="${basepkgs} alsa-firmware alsa-utils arj ark bluedevil breeze-gtk ccache cups-pdf cups-pk-helper dolphin-plugins e2fsprogs efibootmgr exfatprogs fdkaac ffmpegthumbs firefox git glibc-locales gst-libav gst-plugin-libcamera gst-plugin-msdk gst-plugin-opencv gst-plugin-pipewire gst-plugin-qmlgl gst-plugin-va gst-plugin-wpe gst-plugins-ugly gstreamer-vaapi htop icoutils ipp-usb irqbalance kamera kamoso kate kcalc kde-gtk-config kdegraphics-mobipocket kdegraphics-thumbnailers kdenetwork-filesharing kdeplasma-addons kdesdk-kio kdesdk-thumbnailers kdialog keditbookmarks kget kimageformats kinit kio-admin kio-gdrive kio-zeroconf kompare konsole kscreen kvantum kwrited libappimage libfido2 libktorrent libmms libnfs libva-utils lirc lrzip lua52-socket lzop mac man-db man-pages mesa-demos mesa-utils mold nano-syntax-highlighting nss-mdns ntfs-3g okular opus-tools p7zip packagekit-qt6 pacman-contrib partitionmanager pbzip2 pdfmixtool pigz pipewire-alsa pipewire-pulse plasma-browser-integration plasma-desktop plasma-disks plasma-firewall plasma-nm plasma-pa plasma-wayland-protocols power-profiles-daemon powerdevil powerline powerline-fonts print-manager python-pyqt6 python-reportlab qbittorrent qt6-imageformats qt6-scxml qt6-virtualkeyboard realtime-privileges reflector rng-tools sddm-kcm skanlite sof-firmware sox spectacle sshfs system-config-printer terminus-font timidity++ ttf-ubuntu-font-family unarchiver unrar unzip usb_modeswitch usbutils vdpauinfo vlc vorbis-tools vorbisgain wget xdg-desktop-portal xdg-desktop-portal-gtk xdg-desktop-portal-kde xsane zip zsh zsh-autosuggestions zsh-completions zsh-syntax-highlighting ${nrg_plc}" ;; 3) # NOTE: Gnome Desktop: deskpkgs="${basepkgs} gnome networkmanager" displaymanager="gdm" bluetooth="bluetooth" network="NetworkManager" ;; 4) # NOTE: Custom Gnome & Systemd-boot & Optimized System: deskpkgs="${basepkgs} evince file-roller gdm gnome-calculator gnome-clocks gnome-console gnome-control-center gnome-disk-utility gnome-keyring gnome-menus gnome-session gnome-shell-extensions gnome-shell-extension-appindicator gnome-system-monitor gnome-text-editor gnome-tweaks gvfs gvfs-afc gvfs-mtp loupe malcontent nautilus networkmanager power-profiles-daemon simple-scan sushi system-config-printer xdg-desktop-portal-gnome xdg-user-dirs-gtk alsa-firmware alsa-utils ccache cups-pdf e2fsprogs efibootmgr exfatprogs fdkaac git glib2-devel glibc-locales gnome-browser-connector gparted gst-libav gst-plugin-libcamera gst-plugin-msdk gst-plugin-opencv gst-plugin-pipewire gst-plugin-qmlgl gst-plugin-va gst-plugin-wpe gst-plugins-ugly gstreamer-vaapi htop icoutils ipp-usb irqbalance libfido2 libva-utils lrzip mac man-db man-pages meld mesa-utils mold nano-syntax-highlighting nss-mdns ntfs-3g p7zip pacman-contrib pbzip2 pdfmixtool pigz pipewire-alsa pipewire-pulse powerline powerline-fonts qbittorrent realtime-privileges reflector rng-tools sof-firmware terminus-font ttf-ubuntu-font-family unrar unzip usb_modeswitch usbutils vdpauinfo vlc wget zip zsh zsh-autosuggestions zsh-completions zsh-syntax-highlighting ${nrg_plc}" ;; 5) # NOTE: Xfce Desktop: deskpkgs="${basepkgs} xfce4 lightdm-slick-greeter network-manager-applet" displaymanager="lightdm" network="NetworkManager" ;; 6) # NOTE: Cinnamon Desktop: deskpkgs="${basepkgs} cinnamon blueberry lightdm-slick-greeter system-config-printer gnome-keyring ${terminal}" displaymanager="lightdm" bluetooth="bluetooth" network="NetworkManager" ;; 7) # NOTE: Deepin Desktop: deskpkgs="${basepkgs} deepin deepin-terminal deepin-kwin networkmanager" displaymanager="lightdm" network="NetworkManager" ;; 8) # NOTE: Budgie Desktop: deskpkgs="${basepkgs} budgie lightdm-gtk-greeter arc-gtk-theme papirus-icon-theme network-manager-applet ${terminal}" displaymanager="lightdm" network="NetworkManager" ;; 9) # NOTE: Lxqt Desktop: deskpkgs="${basepkgs} lxqt breeze-icons network-manager-applet sddm xscreensaver" displaymanager="sddm" network="NetworkManager" ;; 10) # NOTE: Mate Desktop: deskpkgs="${basepkgs} mate mate-terminal mate-media blueman network-manager-applet mate-power-manager system-config-printer lightdm-slick-greeter" displaymanager="lightdm" bluetooth="bluetooth" network="NetworkManager" ;; 11) # NOTE: Base System: deskpkgs="${basepkgs} networkmanager" network="NetworkManager" ;; 12) # NOTE: Custom System: if [[ "${vendor}" == "Virtual Machine" ]]; then deskpkgs="base sudo ${bootldr_pkgs} ${custompkgs} ${fstools} ${kernel} ${microcode} ${vmpkgs} ${greeter}" else deskpkgs="base linux-firmware sudo ${bootldr_pkgs} ${custompkgs} ${fstools} ${kernel} ${microcode} ${vgapkgs} ${wireless_reg} ${greeter}" fi ;; esac if pacstrap -K -i /mnt ${deskpkgs} ; then if [[ "${fs}" == "2" ]]; then genfstab -t PARTUUID /mnt >> /mnt/etc/fstab || err_abort sleep 0.3 NC " ==> [${green}Fstab OK${nc}] " fi ok else failure fi } ################################################################################################### swapfile (){ local stage_prompt="Swapfile" sleep 0.3 NC " ${magenta}###${nc}-------------------------------------${magenta}[ ${bwhite}Swapfile Setup${nc} ${magenta}]${nc}-------------------------------------${magenta}###${nc} " if arch-chroot /mnt <<-SWAP > /dev/null 2>&1 ; then mkswap -U clear --size ${swapsize}G --file /swapfile > /dev/null 2>&1 || exit SWAP 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="Btfrs Swapfile" sleep 0.3 NC " ${magenta}###${nc}----------------------------------${magenta}[ ${bwhite}Btrfs Swapfile Setup${nc} ${magenta}]${nc}----------------------------------${magenta}###${nc} " if arch-chroot /mnt <<-SWAP > /dev/null 2>&1 ; then btrfs filesystem mkswapfile --size ${swapsize}g --uuid clear /swap/swapfile > /dev/null 2>&1 || exit SWAP cat >> /mnt/etc/fstab <<-FSTAB || err_abort /swap/swapfile none swap defaults 0 0 FSTAB stage_ok else stage_fail fi } ################################################################################################### wireless_regdom (){ local stage_prompt="Wireless Regdom" sleep 0.3 NC " ${magenta}###${nc}--------------------------${magenta}[ ${bwhite}Setting Up Wireless Regulatory Domain${nc} ${magenta}]${nc}--------------------------${magenta}###${nc} " if sed -i "/^#WIRELESS_REGDOM=\"${REGDOM}\"/s/^#//" /mnt/etc/conf.d/wireless-regdom ; then stage_ok else stage_fail fi } ################################################################################################### chroot_conf (){ sleep 0.3 NC " ${magenta}###${nc}--------------------------------${magenta}[ ${bwhite}Chroot & Configure System${nc} ${magenta}]${nc}--------------------------------${magenta}###${nc} " # Linux-Hardened = No Swap if [[ "${kernelnmbr}" == "3" ]]; then swapmode="3" fi #### Encrypted Setup Vars if [[ "${encrypt}" == "yes" ]]; then # 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}" # Encrypted Kernel Boot Options encr_root_bootopts="root=${encr_root_dev} ${encr_root_opts} " ### Encrypted Swap Setup ## 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 Partition Kernel Main Boot Options encr_swap_bootopts="resume=/dev/mapper/swap ${encr_swap_opts} " ## Encrypted Swapfile elif [[ "${swapmode}" == "2" ]]; then # Ext4 Offset if [[ "${fs}" == "1" ]]; then offst="$(filefrag -v /mnt/swapfile | awk '$1=="0:" {print substr($4, 1, length($4)-2)}')" # Btrfs Offset elif [[ "${fs}" == "2" ]]; then offst="$(btrfs inspect-internal map-swapfile -r /mnt/swap/swapfile)" fi # Encrypted Swapfile Kernel Boot Options encr_swap_bootopts="resume=${encr_root_dev} resume_offset=${offst} " ## No Swap elif [[ "${swapmode}" == "3" ]]; then # No Swap Kernel Boot Options encr_swap_bootopts="" fi ### Graphics Setup (Encryption) ## Configuration = 'Yes' if [[ "${vgaconf}" == "y" ]]; then # Intel if [[ "${vendor}" == "Intel" ]]; then # Mkinitcpio Modules (Encryption) mkinitcpio_mods="MODULES=(i915 ${fs_mod})" # Mkinitcpio Hooks (Encryption) mkinitcpio_hooks="HOOKS=(systemd keyboard autodetect microcode modconf kms keymap consolefont block sd-encrypt filesystems fsck)" # Nvidia elif [[ "${vendor}" == "Nvidia" ]]; then # Mkinitcpio Hooks (Encryption) mkinitcpio_hooks="HOOKS=(systemd keyboard autodetect microcode modconf keymap consolefont block sd-encrypt filesystems fsck)" # Preserve-Nvidia-Video-Memory after suspend/hibernate/resume if [[ ${nvidia_suspend} == "y" ]]; then # Mkinitcpio Modules (Encryption) [No Early Nvidia KMS] mkinitcpio_mods="MODULES=(nvidia_modeset nvidia_uvm nvidia_drm ${fs_mod})" # Nvidia Services nvidia_services="nvidia-suspend nvidia-hibernate nvidia-resume" if [[ ${fs} == "1" ]]; then # Set Custom '/Temp' path vga_bootopts="nvidia_drm.modeset=1 nvidia_drm.fbdev=1 nvidia.NVreg_UsePageAttributeTable=1 nvidia.NVreg_PreserveVideoMemoryAllocations=1 nvidia.NVreg_TemporaryFilePath=/var/tmp " else # Set Default '/Temp' path vga_bootopts="nvidia_drm.modeset=1 nvidia_drm.fbdev=1 nvidia.NVreg_UsePageAttributeTable=1 nvidia.NVreg_PreserveVideoMemoryAllocations=1 " fi # No Preserve-Nvidia-Video-Memory after suspend/hibernate/resume else # Mkinitcpio Modules (Encryption) [Early Nvidia KMS] mkinitcpio_mods="MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm ${fs_mod})" # Graphics Kernel Boot Options vga_bootopts="nvidia_drm.modeset=1 nvidia_drm.fbdev=1 nvidia.NVreg_UsePageAttributeTable=1 " fi # Amd elif [[ "${vendor}" == "AMD" ]]; then # Mkinitcpio Modules (Encryption) mkinitcpio_mods="MODULES=(amdgpu radeon ${fs_mod})" # Mkinitcpio Hooks (Encryption) mkinitcpio_hooks="HOOKS=(systemd keyboard autodetect microcode modconf kms keymap consolefont block sd-encrypt filesystems fsck)" # 'Southern Islands' support if [[ "${islands}" == "1" ]]; then # Graphics Kernel Boot Options vga_bootopts="radeon.si_support=0 amdgpu.si_support=1 amdgpu.dc=1 " # 'Sea Islands' support elif [[ "${islands}" == "2" ]]; then # Graphics Kernel Boot Options vga_bootopts="radeon.cik_support=0 amdgpu.cik_support=1 amdgpu.dc=1 " elif [[ -z "${islands}" ]]; then # Graphics Kernel Boot Options vga_bootopts="amdgpu.dc=1 " fi fi ## Configuration = 'No' elif [[ "${vgaconf}" == "n" ]]; then # Mkinitcpio Hooks (Encryption) mkinitcpio_hooks="HOOKS=(systemd keyboard autodetect microcode modconf kms keymap consolefont block sd-encrypt filesystems fsck)" # Nvidia if [[ "${vendor}" == "Nvidia" ]]; then # Mkinitcpio Modules (Encryption) mkinitcpio_mods="MODULES=(${fs_mod} nouveau)" # Other Vendors else # Mkinitcpio Modules (Encryption) mkinitcpio_mods="MODULES=(${fs_mod})" fi fi ### Kernel Boot Options (Encryption) boot_opts="${encr_root_bootopts}${encr_swap_bootopts}${vga_bootopts}${cust_bootopts}${btrfs_bootopts}" #------------------------------------------------------------------------------------------------------------- #### Unencrypted Setup Vars elif [[ "${encrypt}" == "no" ]]; then ### Graphics Setup ## Configuration = 'Yes' if [[ "${vgaconf}" == "y" ]]; then # Intel if [[ "${vendor}" == "Intel" ]]; then # Mkinitcpio Modules mkinitcpio_mods="MODULES=(i915)" # Mkinitcpio Hooks mkinitcpio_hooks="HOOKS=(systemd autodetect microcode modconf kms keyboard keymap consolefont block filesystems fsck)" # Nvidia elif [[ "${vendor}" == "Nvidia" ]]; then # Mkinitcpio Hooks mkinitcpio_hooks="HOOKS=(systemd autodetect microcode modconf keyboard keymap consolefont block filesystems fsck)" # Preserve-Nvidia-Video-Memory after suspend/hibernate/resume if [[ ${nvidia_suspend} == "y" ]]; then # Mkinitcpio Modules [No Early Nvidia KMS] mkinitcpio_mods="MODULES=(nvidia_modeset nvidia_uvm nvidia_drm)" # Nvidia Services nvidia_services="nvidia-suspend nvidia-hibernate nvidia-resume" if [[ ${fs} == "1" ]]; then # Set Custom '/Temp' path vga_bootopts="nvidia_drm.modeset=1 nvidia_drm.fbdev=1 nvidia.NVreg_UsePageAttributeTable=1 nvidia.NVreg_PreserveVideoMemoryAllocations=1 nvidia.NVreg_TemporaryFilePath=/var/tmp " else # Set Default '/Temp' path vga_bootopts="nvidia_drm.modeset=1 nvidia_drm.fbdev=1 nvidia.NVreg_UsePageAttributeTable=1 nvidia.NVreg_PreserveVideoMemoryAllocations=1 " fi # NO Preserve-Nvidia-Video-Memory after suspend/hibernate/resume else # Mkinitcpio Modules [Early Nvidia KMS] mkinitcpio_mods="MODULES=(nvidia nvidia_modeset nvidia_uvm nvidia_drm)" # Graphics Kernel Boot Options vga_bootopts="nvidia_drm.modeset=1 nvidia_drm.fbdev=1 nvidia.NVreg_UsePageAttributeTable=1 " fi # Amd elif [[ "${vendor}" == "AMD" ]]; then # Mkinitcpio Modules mkinitcpio_mods="MODULES=(amdgpu radeon)" # Mkinitcpio Hooks mkinitcpio_hooks="HOOKS=(systemd autodetect microcode modconf kms keyboard keymap consolefont block filesystems fsck)" # 'Southern Islands' support if [[ "${islands}" == "1" ]]; then # Graphics Kernel Boot Options vga_bootopts="radeon.si_support=0 amdgpu.si_support=1 amdgpu.dc=1 " # 'Sea Islands' support elif [[ "${islands}" == "2" ]]; then # Graphics Kernel Boot Options vga_bootopts="radeon.cik_support=0 amdgpu.cik_support=1 amdgpu.dc=1 " elif [[ -z "${islands}" ]]; then # Graphics Kernel Boot Options vga_bootopts="amdgpu.dc=1 " fi fi ## Configuration = 'No' elif [[ "${vgaconf}" == "n" ]]; then # Mkinitcpio Hooks mkinitcpio_hooks="HOOKS=(systemd autodetect microcode modconf kms keyboard keymap consolefont block filesystems fsck)" # Nvidia if [[ "${vendor}" == "Nvidia" ]]; then # Mkinitcpio Modules mkinitcpio_mods="MODULES=(nouveau)" # Other Vendors else # Mkinitcpio Modules mkinitcpio_mods="MODULES=()" fi fi if [[ "${autoroot}" == "y" ]]; then ### Kernel Boot Options [Multi-Root Disk] (No Encryption) boot_opts="${multiroot_opts}${vga_bootopts}${cust_bootopts}${btrfs_bootopts}" else ### Kernel Boot Options [Single Root Disk] (No Encryption) boot_opts="${vga_bootopts}${cust_bootopts}${btrfs_bootopts}" fi fi #-------------------------------------------------------------------------------------------------- # NOTE: All Vanilla Desktops Basic Configuration: if [[ "${packages}" =~ ^(1|3|5|6|7|8|9|10|11)$ ]]; then cnfg stage_prompt="Basic System" if arch-chroot /mnt <<-VANILLA_CONF > /dev/null 2>&1 ; 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 echo " ${mkinitcpio_mods} ${mkinitcpio_hooks}" | tee /etc/mkinitcpio.conf.d/mkinitcpiod.conf || exit 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 echo " 127.0.0.1 localhost ::1 localhost 127.0.1.1 ${HOSTNAME}.localdomain ${HOSTNAME}" >> /etc/hosts || exit echo root:${ROOTPASSWD2} | chpasswd || exit useradd -m -G wheel -s /bin/bash ${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 VANILLA_CONF stage_ok else stage_fail fi if [[ -f /mnt/etc/lightdm/lightdm.conf ]]; then cnfg if [[ "${packages}" == "7" ]]; then stage_prompt="Deepin Greeter" if arch-chroot /mnt <<-DEEPIN > /dev/null 2>&1 ; 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 [[ "${packages}" == "8" ]]; then stage_prompt="GTK Greeter" if arch-chroot /mnt <<-GTK > /dev/null 2>&1 ; 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 else stage_prompt="Slick Greeter" if arch-chroot /mnt <<-SLICK > /dev/null 2>&1 ; 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 [[ "${bootloader}" == "1" ]]; then cnfg stage_prompt="Systemd-boot" if arch-chroot /mnt <<-BOOTCTL > /dev/null 2>&1 ; then bootctl install --graceful || exit echo "default arch.conf" > /boot/loader/loader.conf || exit echo " title ${entrname} linux /vmlinuz-${kernel} initrd /initramfs-${kernel}.img options rw ${boot_opts}" | tee /boot/loader/entries/arch.conf || exit systemctl enable systemd-boot-update || exit BOOTCTL stage_ok else stage_fail fi elif [[ "${bootloader}" == "2" ]]; then cnfg stage_prompt="Grub" if arch-chroot /mnt <<-GRUB > /dev/null 2>&1 ; then grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB || exit sed -i \ -e 's|^GRUB_CMDLINE_LINUX_DEFAULT.*|GRUB_CMDLINE_LINUX_DEFAULT="${boot_opts}"|g' \ -e "/^#GRUB_DISABLE_OS_PROBER=false/s/^#//" \ /etc/default/grub || exit grub-mkconfig -o /boot/grub/grub.cfg || exit GRUB stage_ok else stage_fail fi if [[ "${fs}" == "2" ]]; then cnfg stage_prompt="Grub-Btrfsd" if arch-chroot /mnt <<-GRUB_BTRFSD > /dev/null 2>&1 ; then systemctl enable grub-btrfsd || exit GRUB_BTRFSD stage_ok else stage_fail fi fi if [[ "${vgaconf}" == "y" && "${vendor}" == "Nvidia" ]]; then cnfg stage_prompt="Grub-Nvidia" if arch-chroot /mnt <<-NVIDIA_GRUB > /dev/null 2>&1 ; then sed -i "/^#GRUB_TERMINAL_OUTPUT=console/s/^#//" /etc/default/grub || exit grub-mkconfig -o /boot/grub/grub.cfg || exit NVIDIA_GRUB stage_ok else stage_fail fi fi fi if [[ -n "${bluetooth}" ]]; then cnfg stage_prompt="Bluetooth Service" if arch-chroot /mnt <<-BLUETOOTH > /dev/null 2>&1 ; then systemctl enable ${bluetooth} || exit BLUETOOTH stage_ok else stage_fail fi fi if [[ -n "${displaymanager}" ]]; then cnfg stage_prompt="Display Manager Service" if arch-chroot /mnt <<-DM_SERVICE > /dev/null 2>&1 ; then systemctl enable ${displaymanager} || exit DM_SERVICE stage_ok else stage_fail fi fi if [[ -n "${network}" ]]; then cnfg stage_prompt="Network Manager Service" if arch-chroot /mnt <<-NETWORK > /dev/null 2>&1 ; then systemctl enable ${network} || exit NETWORK stage_ok else stage_fail fi fi if [[ -n "${trim}" ]]; then cnfg stage_prompt="Trim Service" if arch-chroot /mnt <<-TRIM > /dev/null 2>&1 ; then systemctl enable ${trim} || exit TRIM stage_ok else stage_fail fi fi if [[ -n "${vm_services}" ]]; then cnfg stage_prompt="VM Service(s)" if arch-chroot /mnt <<-VM > /dev/null 2>&1 ; then systemctl enable ${vm_services} || exit VM stage_ok else stage_fail fi fi if [[ -n "${nvidia_services}" ]]; then cnfg stage_prompt="Nvidia Services" if arch-chroot /mnt <<-NVIDIA_SERV > /dev/null 2>&1 ; then systemctl enable ${nvidia_services} || exit NVIDIA_SERV stage_ok else stage_fail fi fi if [[ "${vgaconf}" == "y" && "${vendor}" == "Nvidia" ]]; then if [[ "${kernelnmbr}" == "1" ]] || [[ "${kernelnmbr}" == "2" && "${family}" == "1" ]] || [[ "${kernelnmbr}" == "2" && "${family}" == "2" && "${nvdriver}" == "2" ]]; then cnfg stage_prompt="Nvidia-Hook" if arch-chroot /mnt <<-NVIDIA_HOOK > /dev/null 2>&1 ; then mkdir -p /etc/pacman.d/hooks/ || exit echo " [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' " | tee /etc/pacman.d/hooks/nvidia.hook || exit NVIDIA_HOOK stage_ok else stage_fail fi fi fi completion fi #-------------------------------------------------------------------------------------------------- # NOTE: Plasma / Gnome & Systemd-boot Optimized-System Configuration: if [[ "${packages}" == "2" ]] || [[ "${packages}" == "4" ]]; then stage_prompt="Custom System" cnfg if [[ "${packages}" == "2" ]]; then displaymanager="sddm" elif [[ "${packages}" == "4" ]]; then displaymanager="gdm" fi if [[ -n "${nrg_plc}" ]]; then arch-chroot /mnt <<-NRG > /dev/null 2>&1 ${nrg_plc} performance NRG fi if arch-chroot /mnt <<-OPTIMIZED_CONF > /dev/null 2>&1 ; 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 sed -i "/^#Color/s/^#//" /etc/pacman.conf || exit update-pciids || exit echo ' ${mkinitcpio_mods} ${mkinitcpio_hooks} COMPRESSION="zstd" COMPRESSION_OPTIONS=(-c -T$(nproc) --auto-threads=logical -) MODULES_DECOMPRESS="yes"' | tee /etc/mkinitcpio.conf.d/mkinitcpiod.conf || exit mkinitcpio -P || exit echo ' 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" LDFLAGS="-Wl,-O1 -Wl,--sort-common -Wl,--as-needed -Wl,-z,relro -Wl,-z,now -Wl,-z,pack-relative-relocs,-fuse-ld=mold" RUSTFLAGS="-C force-frame-pointers=yes -C opt-level=3 -C target-cpu=native -C link-arg=-fuse-ld=mold" 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 -)' | tee /etc/makepkg.conf.d/makepkgd.conf || 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 echo " 127.0.0.1 localhost ::1 localhost 127.0.1.1 ${HOSTNAME}.localdomain ${HOSTNAME}" >> /etc/hosts || exit echo " 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 kernel.printk = 0 0 0 0 ${perf_stream}" | tee /etc/sysctl.d/99-sysctld.conf || exit echo " [defaults] ntfs:ntfs3_defaults=uid=1000,gid=1000,windows_names ntfs:ntfs3_allow=uid=1000,gid=1000,umask,dmask,fmask,iocharset,discard,nodiscard,sparse,nosparse,hidden,nohidden,sys_immutable,nosys_immutable,showmeta,noshowmeta,prealloc,noprealloc,hide_dot_files,nohide_dot_files,windows_names,nocase,case" | tee /etc/udisks2/mount_options.conf || exit echo ' // 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]; } });' | tee /etc/polkit-1/rules.d/99-udisks2.rules || exit mkdir -p /etc/systemd/journald.conf.d > /dev/null 2>&1 || exit echo " [Journal] SystemMaxUse=100M" | tee /etc/systemd/journald.conf.d/00-journald.conf || exit mkdir -p /etc/systemd/user.conf.d > /dev/null 2>&1 || exit echo " [Manager] DefaultTimeoutStopSec=5s DefaultTimeoutAbortSec=5s" | tee /etc/systemd/user.conf.d/00-userd.conf || 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 sed -i "/# set linenumbers/"'s/^#//' /etc/nanorc || exit echo tcp_bbr | tee /etc/modules-load.d/modulesd.conf || exit echo " country=${REGDOM} wps_cred_add_sae=1 pmf=2" | tee /etc/wpa_supplicant/wpa_supplicant.conf || exit bootctl install --graceful || exit echo "default arch.conf" > /boot/loader/loader.conf || exit echo " title ${entrname} linux /vmlinuz-${kernel} initrd /initramfs-${kernel}.img options rw ${boot_opts}" | tee /boot/loader/entries/arch.conf || exit echo root:${ROOTPASSWD2} | chpasswd || exit chsh -s /bin/zsh || exit useradd -m -G wheel,realtime -s /bin/zsh ${USERNAME} || exit echo ${USERNAME}:${USERPASSWD2} | chpasswd || exit echo " Defaults pwfeedback Defaults editor=/usr/bin/nano %wheel ALL=(ALL) ALL" | tee /etc/sudoers.d/sudoersd || exit visudo -c /etc/sudoers.d/sudoersd || exit systemctl enable avahi-daemon bluetooth cups ipp-usb NetworkManager rngd systemd-boot-update irqbalance ${displaymanager} ${trim} ${vm_services} ${nvidia_services} || exit OPTIMIZED_CONF stage_ok else stage_fail fi if [[ "${vgaconf}" == "y" && "${vendor}" == "Nvidia" ]]; then if [[ "${kernelnmbr}" == "1" ]] || [[ "${kernelnmbr}" == "2" && "${family}" == "1" ]] || [[ "${kernelnmbr}" == "2" && "${family}" == "2" && "${nvdriver}" == "2" ]]; then cnfg stage_prompt="Nvidia-Hook" if arch-chroot /mnt <<-NVIDIAHOOK > /dev/null 2>&1 ; then mkdir -p /etc/pacman.d/hooks/ || exit echo " [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' " | tee /etc/pacman.d/hooks/nvidia.hook || exit NVIDIAHOOK stage_ok else stage_fail fi fi fi completion fi #-------------------------------------------------------------------------------------------------- # NOTE: Custom System Configuration (Add any extra configuration below): if [[ "${packages}" == "12" ]]; then cnfg stage_prompt="Basic System" if arch-chroot /mnt <<-CUSTOM_CONF > /dev/null 2>&1 ; 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 echo " ${mkinitcpio_mods} ${mkinitcpio_hooks}" | tee /etc/mkinitcpio.conf.d/mkinitcpiod.conf || exit 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 echo " 127.0.0.1 localhost ::1 localhost 127.0.1.1 ${HOSTNAME}.localdomain ${HOSTNAME}" >> /etc/hosts || exit echo root:${ROOTPASSWD2} | chpasswd || exit useradd -m -G wheel -s /bin/bash ${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 CUSTOM_CONF stage_ok else stage_fail fi if [[ -f /mnt/etc/lightdm/lightdm.conf ]]; then cnfg if [[ "${greeternmbr}" == "1" ]]; then stage_prompt="GTK Greeter" if arch-chroot /mnt <<-GTK > /dev/null 2>&1 ; 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 stage_prompt="Slick Greeter" if arch-chroot /mnt <<-SLICK > /dev/null 2>&1 ; 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 [[ "${bootloader}" == "1" ]]; then cnfg stage_prompt="Systemd-boot" if arch-chroot /mnt <<-BOOTCTL > /dev/null 2>&1 ; then bootctl install --graceful || exit echo "default arch.conf" > /boot/loader/loader.conf || exit echo " title ${entrname} linux /vmlinuz-${kernel} initrd /initramfs-${kernel}.img options rw ${boot_opts}" | tee /boot/loader/entries/arch.conf || exit systemctl enable systemd-boot-update || exit BOOTCTL stage_ok else stage_fail fi elif [[ "${bootloader}" == "2" ]]; then cnfg stage_prompt="Grub" if arch-chroot /mnt <<-GRUB > /dev/null 2>&1 ; then grub-install --target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB || exit sed -i \ -e 's|^GRUB_CMDLINE_LINUX_DEFAULT.*|GRUB_CMDLINE_LINUX_DEFAULT="${boot_opts}"|g' \ -e "/^#GRUB_DISABLE_OS_PROBER=false/s/^#//" \ /etc/default/grub || exit grub-mkconfig -o /boot/grub/grub.cfg || exit GRUB stage_ok else stage_fail fi if [[ "${fs}" == "2" ]]; then cnfg stage_prompt="Grub-Btrfsd" if arch-chroot /mnt <<-GRUB_BTRFSD > /dev/null 2>&1 ; then systemctl enable grub-btrfsd || exit GRUB_BTRFSD stage_ok else stage_fail fi fi if [[ "${vgaconf}" == "y" && "${vendor}" == "Nvidia" ]]; then cnfg stage_prompt="Grub-Nvidia" if arch-chroot /mnt <<-NVIDIA_GRUB > /dev/null 2>&1 ; then sed -i "/^#GRUB_TERMINAL_OUTPUT=console/s/^#//" /etc/default/grub || exit grub-mkconfig -o /boot/grub/grub.cfg || exit NVIDIA_GRUB stage_ok else stage_fail fi fi fi if [[ -n "${customservices}" ]]; then cnfg stage_prompt="Custom Service(s)" if arch-chroot /mnt <<-CUSTOM_SERV > /dev/null 2>&1 ; then systemctl enable ${customservices} || exit CUSTOM_SERV stage_ok else stage_fail fi fi if [[ -n "${trim}" ]]; then cnfg stage_prompt="Trim Service" if arch-chroot /mnt <<-TRIM > /dev/null 2>&1 ; then systemctl enable ${trim} || exit TRIM stage_ok else stage_fail fi fi if [[ -n "${vm_services}" ]]; then cnfg stage_prompt="VM Service(s)" if arch-chroot /mnt <<-VM > /dev/null 2>&1 ; then systemctl enable ${vm_services} || exit VM stage_ok else stage_fail fi fi if [[ -n "${nvidia_services}" ]]; then cnfg stage_prompt="Nvidia Services" if arch-chroot /mnt <<-NVIDIA_SERV > /dev/null 2>&1 ; then systemctl enable ${nvidia_services} || exit NVIDIA_SERV stage_ok else stage_fail fi fi if [[ "${vgaconf}" == "y" && "${vendor}" == "Nvidia" ]]; then if [[ "${kernelnmbr}" == "1" ]] || [[ "${kernelnmbr}" == "2" && "${family}" == "1" ]] || [[ "${kernelnmbr}" == "2" && "${family}" == "2" && "${nvdriver}" == "2" ]]; then cnfg stage_prompt="Nvidia-Hook" if arch-chroot /mnt <<-NVIDIA_HOOK > /dev/null 2>&1 ; then mkdir -p /etc/pacman.d/hooks/ || exit echo " [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' " | tee /etc/pacman.d/hooks/nvidia.hook || exit NVIDIA_HOOK stage_ok else stage_fail fi fi fi completion fi umount -R /mnt exit } # END FUNCTIONS ################################################################################################### run_as="$(whoami)" tty="$(tty)" disks="$(lsblk --nodeps --paths --noheadings --output=name,size,model | cat --number)" LOCALESET="" SETLOCALE="" lcl_slct="" USERNAME="" kernelnmbr="" fs="" vgaconf="" vga_setup="" vendor1="" vendor2="" vendor3="" vendor_slct="" packages="" efi_entr_del="" wrlss_rgd="" sanity="" install="" bootldr_pkgs="" devel="" REGDOM="" vga_bootopts="" btrfs_bootopts="" trim="" swapmode="" homecrypt="" greeter="" revision="" greeternmbr="" cust_bootopts="" bluetooth="" vmpkgs="" vm_services="" perf_stream="" displaymanager="" wireless_reg="" bootmode="" trg="" s="" bootloader="" vga_slct="" nvidia_services="" nvidia_suspend="" autoroot="" autoboot="" autohome="" autoswap="" bootsize="" retry_boot="" sgdsk_nmbr="" part_mode="" preset="" partsize="" rootsize="" sgdrive="" cgdrive="" sep_home="" clear first_check sleep 1 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 dtct_microcode until main_menu; do : ; done