Skip to content

Instantly share code, notes, and snippets.

@gazorby
Last active March 8, 2020 20:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save gazorby/b7622a0723a62f97f1955bbad674903f to your computer and use it in GitHub Desktop.
Save gazorby/b7622a0723a62f97f1955bbad674903f to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -e
# Arch Linux Install Script (alis) installs unattended, automated
# and customized Arch Linux system.
# Copyright (C) 2018 picodotdev
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
# This script is hosted at https://github.com/picodotdev/alis. For new features,
# improvements and bugs fill an issue in GitHub or make a pull request.
# Pull Request are welcome!
#
# If you test it in real hardware please send me an email to pico.dev@gmail.com with
# the machine description and tell me if somethig goes wrong or all works fine.
#
# Please, don't ask for support for this script in Arch Linux forums, first read
# the Arch Linux wiki [1], the Installation Guide [2] and the General
# Recomendations [3], later compare the commands with those of this script.
#
# [1] https://wiki.archlinux.org
# [2] https://wiki.archlinux.org/index.php/Installation_guide
# [3] https://wiki.archlinux.org/index.php/General_recommendations
# Usage:
# # loadkeys es
# # curl https://raw.githubusercontent.com/picodotdev/alis/master/download.sh | bash, or with URL shortener curl -sL https://bit.ly/2F3CATp | bash
# # vim alis.conf
# # ./alis.sh
# global variables (no configuration, don't edit)
ASCIINEMA=""
BIOS_TYPE=""
PARTITION_BIOS=""
PARTITION_BOOT=""
PARTITION_ROOT=""
PARTITION_ROOT_LABEL="system"
CRYPT_ROOT="cryptsystem"
DEVICE_ROOT=""
MAPPED_DEVICE=""
LVM_VOLUME_PHISICAL="lvm"
LVM_VOLUME_GROUP="vg"
LVM_VOLUME_LOGICAL="root"
SWAPFILE=""
BOOT_DIRECTORY=""
ESP_DIRECTORY=""
#PARTITION_BOOT_NUMBER=0
UUID_BOOT=""
UUID_ROOT=""
PARTUUID_BOOT=""
PARTUUID_ROOT=""
DEVICE_SATA=""
DEVICE_NVME=""
DEVICE_MMC=""
CPU_VENDOR=""
VIRTUALBOX=""
CMDLINE_LINUX_ROOT=""
CMDLINE_LINUX=""
ADDITIONAL_USER_NAMES_ARRAY=()
ADDITIONAL_USER_PASSWORDS_ARRAY=()
CONF_FILE="alis.conf"
LOG_FILE="alis.log"
ASCIINEMA_FILE="alis.asciinema"
RED='\033[0;31m'
GREEN='\033[0;32m'
LIGHT_BLUE='\033[1;34m'
NC='\033[0m'
function configuration_install() {
source alis.conf
ADDITIONAL_USER_NAMES_ARRAY=($ADDITIONAL_USER_NAMES)
ADDITIONAL_USER_PASSWORDS_ARRAY=($ADDITIONAL_USER_PASSWORDS)
}
function sanitize_variables() {
DEVICE=$(sanitize_variable "$DEVICE")
FILE_SYSTEM_TYPE=$(sanitize_variable "$FILE_SYSTEM_TYPE")
SWAP_SIZE=$(sanitize_variable "$SWAP_SIZE")
KERNELS=$(sanitize_variable "$KERNELS")
KERNELS_COMPRESSION=$(sanitize_variable "$KERNELS_COMPRESSION")
BOOTLOADER=$(sanitize_variable "$BOOTLOADER")
DESKTOP_ENVIRONMENT=$(sanitize_variable "$DESKTOP_ENVIRONMENT")
DISPLAY_DRIVER=$(sanitize_variable "$DISPLAY_DRIVER")
DISPLAY_DRIVER_HARDWARE_ACCELERATION_INTEL=$(sanitize_variable "$DISPLAY_DRIVER_HARDWARE_ACCELERATION_INTEL")
PACKAGES_PACMAN=$(sanitize_variable "$PACKAGES_PACMAN")
AUR=$(sanitize_variable "$AUR")
PACKAGES_AUR=$(sanitize_variable "$PACKAGES_AUR")
}
function sanitize_variable() {
VARIABLE=$1
VARIABLE=$(echo $VARIABLE | sed "s/![^ ]*//g") # remove disabled
VARIABLE=$(echo $VARIABLE | sed "s/ {2,}/ /g") # remove unnecessary white spaces
VARIABLE=$(echo $VARIABLE | sed 's/^[[:space:]]*//') # trim leading
VARIABLE=$(echo $VARIABLE | sed 's/[[:space:]]*$//') # trim trailing
echo "$VARIABLE"
}
function check_variables() {
check_variables_value "KEYS" "$KEYS"
check_variables_boolean "LOG" "$LOG"
check_variables_boolean "LVM" "$LVM"
check_variables_equals "PARTITION_ROOT_ENCRYPTION_PASSWORD" "PARTITION_ROOT_ENCRYPTION_PASSWORD_RETYPE" "$PARTITION_ROOT_ENCRYPTION_PASSWORD" "$PARTITION_ROOT_ENCRYPTION_PASSWORD_RETYPE"
check_variables_list "FILE_SYSTEM_TYPE" "$FILE_SYSTEM_TYPE" "ext4 btrfs xfs"
check_variables_value "PING_HOSTNAME" "$PING_HOSTNAME"
check_variables_value "PACMAN_MIRROR" "$PACMAN_MIRROR"
check_variables_list "KERNELS" "$KERNELS" "linux-lts linux-lts-headers linux-hardened linux-hardened-headers linux-zen linux-zen-headers" "false"
check_variables_list "KERNELS_COMPRESSION" "$KERNELS_COMPRESSION" "gzip bzip2 lzma xz lzop lz4" "false"
check_variables_value "TIMEZONE" "$TIMEZONE"
check_variables_value "LOCALES" "$LOCALES"
check_variables_value "LANG" "$LANG"
check_variables_value "KEYMAP" "$KEYMAP"
check_variables_value "HOSTNAME" "$HOSTNAME"
check_variables_value "USER_NAME" "$USER_NAME"
check_variables_value "USER_PASSWORD" "$USER_PASSWORD"
check_variables_equals "ROOT_PASSWORD" "ROOT_PASSWORD_RETYPE" "$ROOT_PASSWORD" "$ROOT_PASSWORD_RETYPE"
check_variables_equals "USER_PASSWORD" "USER_PASSWORD_RETYPE" "$USER_PASSWORD" "$USER_PASSWORD_RETYPE"
check_variables_size "ADDITIONAL_USER_PASSWORDS" "${#ADDITIONAL_USER_NAMES_ARRAY[@]}" "${#ADDITIONAL_USER_PASSWORDS_ARRAY[@]}"
check_variables_value "HOOKS" "$HOOKS"
check_variables_list "BOOTLOADER" "$BOOTLOADER" "grub refind systemd"
check_variables_list "AUR" "$AUR" "aurman yay" "false"
check_variables_list "DESKTOP_ENVIRONMENT" "$DESKTOP_ENVIRONMENT" "gnome kde xfce mate cinnamon lxde" "false"
check_variables_list "DISPLAY_DRIVER" "$DISPLAY_DRIVER" "intel amdgpu ati nvidia nvidia-lts nvidia-dkms nvidia-390xx nvidia-390xx-lts nvidia-390xx-dkms nouveau" "false"
check_variables_boolean "KMS" "$KMS"
check_variables_boolean "DISPLAY_DRIVER_DDX" "$DISPLAY_DRIVER_DDX"
check_variables_boolean "DISPLAY_DRIVER_HARDWARE_ACCELERATION" "$DISPLAY_DRIVER_HARDWARE_ACCELERATION"
check_variables_list "DISPLAY_DRIVER_HARDWARE_ACCELERATION_INTEL" "$DISPLAY_DRIVER_HARDWARE_ACCELERATION_INTEL" "intel-media-driver libva-intel-driver" "false"
check_variables_boolean "REBOOT" "$REBOOT"
if [[ $ERASE = false ]]; then
check_variables_value "PARTITION_BOOT" "$PARTITION_BOOT"
check_variables_value "PARTITION_ROOT" "$PARTITION_ROOT"
if [[ $BIOS_TYPE = bios ]]; then
check_variables_value "PARTITION_BIOS" "$PARTITION_BIOS"
fi
else
check_variables_value "DEVICE" "$DEVICE"
fi
}
function check_variables_value() {
NAME=$1
VALUE=$2
if [ -z "$VALUE" ]; then
echo "$NAME environment variable must have a value."
exit
fi
}
function check_variables_boolean() {
NAME=$1
VALUE=$2
check_variables_list "$NAME" "$VALUE" "true false"
}
function check_variables_list() {
NAME=$1
VALUE=$2
VALUES=$3
REQUIRED=$4
if [ "$REQUIRED" == "" -o "$REQUIRED" == "true" ]; then
check_variables_value "$NAME" "$VALUE"
fi
if [ "$VALUE" != "" -a -z "$(echo "$VALUES" | grep -F -w "$VALUE")" ]; then
echo "$NAME environment variable value [$VALUE] must be in [$VALUES]."
exit
fi
}
function check_variables_equals() {
NAME1=$1
NAME2=$2
VALUE1=$3
VALUE2=$4
if [ "$VALUE1" != "$VALUE2" ]; then
echo "$NAME1 and $NAME2 must be equal [$VALUE1, $VALUE2]."
exit
fi
}
function check_variables_size() {
NAME=$1
SIZE_EXPECT=$2
SIZE=$3
if [ "$SIZE_EXPECT" != "$SIZE" ]; then
echo "$NAME array size [$SIZE] must be [$SIZE_EXPECT]."
exit
fi
}
function warning() {
echo -e "${LIGHT_BLUE}Welcome to Arch Linux Install Script${NC}"
echo ""
echo -e "${RED}Warning"'!'"${NC}"
echo -e "${RED}This script deletes all partitions of the persistent${NC}"
echo -e "${RED}storage and continuing all your data in it will be lost.${NC}"
echo ""
read -p "Do you want to continue? [y/N] " yn
case $yn in
[Yy]* )
;;
[Nn]* )
exit
;;
* )
exit
;;
esac
}
function init() {
print_step "init()"
init_log
loadkeys $KEYS
}
function init_log() {
if [ "$LOG" == "true" ]; then
exec > >(tee -a $LOG_FILE)
exec 2> >(tee -a $LOG_FILE >&2)
fi
set -o xtrace
}
function facts() {
print_step "facts()"
if [ -d /sys/firmware/efi ]; then
BIOS_TYPE="uefi"
else
BIOS_TYPE="bios"
fi
if [ -f "$ASCIINEMA_FILE" ]; then
ASCIINEMA="true"
else
ASCIINEMA="false"
fi
DEVICE_SATA="false"
DEVICE_NVME="false"
DEVICE_MMC="false"
if [ -n "$(echo $DEVICE | grep "^/dev/[a-z]d[a-z]")" ]; then
DEVICE_SATA="true"
elif [ -n "$(echo $DEVICE | grep "^/dev/nvme")" ]; then
DEVICE_NVME="true"
elif [ -n "$(echo $DEVICE | grep "^/dev/mmc")" ]; then
DEVICE_MMC="true"
fi
if [ -n "$(lscpu | grep GenuineIntel)" ]; then
CPU_VENDOR="intel"
elif [ -n "$(lscpu | grep AuthenticAMD)" ]; then
CPU_VENDOR="amd"
fi
if [ -n "$(lspci | grep -i virtualbox)" ]; then
VIRTUALBOX="true"
fi
}
function check_facts() {
if [ "$BOOTLOADER" == "refind" ]; then
check_variables_list "BIOS_TYPE" "$BIOS_TYPE" "uefi"
fi
if [ "$BOOTLOADER" == "systemd" ]; then
check_variables_list "BIOS_TYPE" "$BIOS_TYPE" "uefi"
fi
}
function prepare() {
print_step "prepare()"
configure_time
prepare_partition
configure_network
}
function configure_time() {
timedatectl set-ntp true
}
function prepare_partition() {
if [ -d /mnt/boot ]; then
umount /mnt/boot
umount /mnt
fi
if [ -e "/dev/mapper/$LVM_VOLUME_LOGICAL" ]; then
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
cryptsetup close $LVM_VOLUME_LOGICAL
fi
fi
if [ -e "/dev/mapper/$LVM_VOLUME_PHISICAL" ]; then
lvremove --force "$LVM_VOLUME_GROUP-$LVM_VOLUME_LOGICAL"
vgremove --force "/dev/mapper/$LVM_VOLUME_GROUP"
pvremove "/dev/mapper/$LVM_VOLUME_PHISICAL"
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
cryptsetup close $LVM_VOLUME_PHISICAL
fi
fi
partprobe $DEVICE
}
function configure_network() {
if [ -n "$WIFI_INTERFACE" ]; then
cp /etc/netctl/examples/wireless-wpa /etc/netctl
chmod 600 /etc/netctl/wireless-wpa
sed -i 's/^Interface=.*/Interface='"$WIFI_INTERFACE"'/' /etc/netctl/wireless-wpa
sed -i 's/^ESSID=.*/ESSID='"$WIFI_ESSID"'/' /etc/netctl/wireless-wpa
sed -i 's/^Key=.*/Key='"$WIFI_KEY"'/' /etc/netctl/wireless-wpa
if [ "$WIFI_HIDDEN" == "true" ]; then
sed -i 's/^#Hidden=.*/Hidden=yes/' /etc/netctl/wireless-wpa
fi
netctl stop-all
netctl start wireless-wpa
sleep 10
fi
# only on ping -c 1, packer gets stuck if -c 5
ping -c 1 -i 2 -W 5 -w 30 $PING_HOSTNAME
if [ $? -ne 0 ]; then
echo "Network ping check failed. Cannot continue."
exit
fi
}
function partition_create() {
print_step "partition_create()"
if [[ $ERASE = true ]]; then
# clean
sgdisk --zap-all $DEVICE
wipefs -a $DEVICE
# partition
if [ "$BIOS_TYPE" == "uefi" ]; then
if [ "$DEVICE_SATA" == "true" ]; then
PARTITION_BOOT="${DEVICE}1"
PARTITION_ROOT="${DEVICE}2"
#PARTITION_BOOT_NUMBER=1
DEVICE_ROOT="${DEVICE}2"
fi
if [ "$DEVICE_NVME" == "true" ]; then
PARTITION_BOOT="${DEVICE}p1"
PARTITION_ROOT="${DEVICE}p2"
#PARTITION_BOOT_NUMBER=1
DEVICE_ROOT="${DEVICE}p2"
fi
if [ "$DEVICE_MMC" == "true" ]; then
PARTITION_BOOT="${DEVICE}p1"
PARTITION_ROOT="${DEVICE}p2"
#PARTITION_BOOT_NUMBER=1
DEVICE_ROOT="${DEVICE}p2"
fi
parted -s $DEVICE mklabel gpt mkpart primary fat32 1MiB 512MiB mkpart primary $FILE_SYSTEM_TYPE 512MiB 100% name $PARTITION_ROOT_LABEL set 1 boot on
sgdisk -t=1:ef00 $DEVICE
if [ "$LVM" == "true" ]; then
sgdisk -t=2:8e00 $DEVICE --change-name=2:"$PARTITION_ROOT_LABEL"
fi
fi
if [ "$BIOS_TYPE" == "bios" ]; then
if [ "$DEVICE_SATA" == "true" ]; then
PARTITION_BIOS="${DEVICE}1"
PARTITION_BOOT="${DEVICE}2"
PARTITION_ROOT="${DEVICE}3"
#PARTITION_BOOT_NUMBER=2
DEVICE_ROOT="${DEVICE}3"
fi
if [ "$DEVICE_NVME" == "true" ]; then
PARTITION_BIOS="${DEVICE}p1"
PARTITION_BOOT="${DEVICE}p2"
PARTITION_ROOT="${DEVICE}p3"
#PARTITION_BOOT_NUMBER=2
DEVICE_ROOT="${DEVICE}p3"
fi
if [ "$DEVICE_MMC" == "true" ]; then
PARTITION_BIOS="${DEVICE}p1"
PARTITION_BOOT="${DEVICE}p2"
PARTITION_ROOT="${DEVICE}p3"
#PARTITION_BOOT_NUMBER=2
DEVICE_ROOT="${DEVICE}p3"
fi
parted -s $DEVICE mklabel gpt mkpart primary fat32 1MiB 128MiB mkpart primary $FILE_SYSTEM_TYPE 128MiB 512MiB mkpart primary $FILE_SYSTEM_TYPE 512MiB 100% name $PARTITION_ROOT_LABEL set 1 boot on
sgdisk -t=1:ef02 $DEVICE
if [ "$LVM" == "true" ]; then
sgdisk -t=3:8e00 $DEVICE --change-name=3:"$PARTITION_ROOT_LABEL"
fi
fi
else
DEVICE_ROOT="${PARTITION_ROOT}"
wipefs -a $DEVICE_ROOT
sgdisk --change-name=${PARTITION_ROOT: -1}:"${PARTITION_ROOT_LABEL}"
fi
}
function partition_format() {
print_step "partition_format()"
if [[ $ERASE = true ]]; then
if [ "$BIOS_TYPE" == "uefi" ]; then
wipefs -a $PARTITION_BOOT
wipefs -a $DEVICE_ROOT
mkfs.fat -n ESP -F32 $PARTITION_BOOT
fi
if [ "$BIOS_TYPE" == "bios" ]; then
wipefs -a $PARTITION_BIOS
wipefs -a $PARTITION_BOOT
mkfs.fat -n BIOS -F32 $PARTITION_BIOS
mkfs."$FILE_SYSTEM_TYPE" -L boot $PARTITION_BOOT
fi
fi
if [[ "$FILE_SYSTEM_TYPE" == "btrfs" ]]; then
mkfs."$FILE_SYSTEM_TYPE" -f --label "$PARTITION_ROOT_LABEL" $DEVICE_ROOT
else
mkfs."$FILE_SYSTEM_TYPE" --label "$PARTITION_ROOT_LABEL" $DEVICE_ROOT
fi
}
function partition_mount() {
print_step "partition_mount()"
if [ "$FILE_SYSTEM_TYPE" == "btrfs" ]; then
mount -t btrfs -o "$PARTITION_OPTIONS" LABEL="$PARTITION_ROOT_LABEL" /mnt
btrfs subvolume create /mnt/root
btrfs subvolume create /mnt/home
btrfs subvolume create /mnt/var
btrfs subvolume create /mnt/snapshots
umount /mnt
mount -o "subvol=root,$PARTITION_OPTIONS,compress=lzo" LABEL="$PARTITION_ROOT_LABEL" /mnt
mkdir /mnt/{boot,home,var,snapshots}
mount -o "$PARTITION_OPTIONS" "$PARTITION_BOOT" /mnt/boot
mount -o "subvol=home,$PARTITION_OPTIONS,compress=lzo" LABEL="$PARTITION_ROOT_LABEL" /mnt/home
mount -o "subvol=var,$PARTITION_OPTIONS,compress=lzo" LABEL="$PARTITION_ROOT_LABEL" /mnt/var
mount -o "subvol=snapshots,$PARTITION_OPTIONS,compress=lzo" LABEL="$PARTITION_ROOT_LABEL" /mnt/snapshots
else
mount -o "$PARTITION_OPTIONS" LABEL="$PARTITION_ROOT_LABEL" /mnt
mkdir /mnt/boot
mount -o "$PARTITION_OPTIONS" "$PARTITION_BOOT" /mnt/boot
fi
}
function partition_swap() {
print_step "partition_swap()"
# swap
# btrfs: https://btrfs.wiki.kernel.org/index.php/FAQ#Does_btrfs_support_swap_files.3F
# btrfs: https://wiki.archlinux.org/index.php/Btrfs#Disabling_CoW
# btrfs: https://jlk.fjfi.cvut.cz/arch/manpages/man/btrfs.5#MOUNT_OPTIONS
if [ -n "$SWAP_SIZE" -a "$FILE_SYSTEM_TYPE" != "btrfs" ]; then
fallocate -l $SWAP_SIZE "/mnt/swapfile"
chmod 600 "/mnt/swapfile"
mkswap "/mnt/swapfile"
fi
}
function partition() {
partition_create
# luks and lvm
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
# MAPPED_DEVICE="/dev/mapper/$CRYPT_ROOT"
DEVICE_ROOT="/dev/mapper/$CRYPT_ROOT"
else
MAPPED_DEVICE="$PARTITION_ROOT"
fi
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
echo -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" | cryptsetup --key-size=512 --key-file=- --align-payload=8192 -s 256 -c aes-xts-plain64 luksFormat --type luks2 /dev/disk/by-partlabel/"$PARTITION_ROOT_LABEL"
echo -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" | cryptsetup --key-file=- open /dev/disk/by-partlabel/"$PARTITION_ROOT_LABEL" $CRYPT_ROOT
sleep 5
fi
if [ "$LVM" == "true" ]; then
pvcreate $DEVICE_ROOT
vgcreate $LVM_VOLUME_GROUP $DEVICE_ROOT
lvcreate -l 100%FREE -n $LVM_VOLUME_LOGICAL $LVM_VOLUME_GROUP
DEVICE_ROOT="/dev/mapper/$LVM_VOLUME_GROUP-$LVM_VOLUME_LOGICAL"
fi
partition_format
PARTITION_OPTIONS="defaults"
if [ "$DEVICE_TRIM" == "true" ]; then
PARTITION_OPTIONS="$PARTITION_OPTIONS,noatime"
fi
partition_mount
partition_swap
# set variables
BOOT_DIRECTORY=/boot
ESP_DIRECTORY=/boot
UUID_BOOT=$(blkid -s UUID -o value $PARTITION_BOOT)
UUID_ROOT=$(blkid -s UUID -o value $PARTITION_ROOT)
PARTUUID_BOOT=$(blkid -s PARTUUID -o value $PARTITION_BOOT)
PARTUUID_ROOT=$(blkid -s PARTUUID -o value $PARTITION_ROOT)
if [[ -n $PARTITION_ROOT_ENCRYPTION_PASSWORD ]]; then
UUID_DECRYPTED_ROOT=$(blkid -s UUID -o value /dev/mapper/"$CRYPT_ROOT")
fi
}
function install() {
print_step "install()"
if [ -n "$PACMAN_MIRROR" ]; then
echo "Server=$PACMAN_MIRROR" > /etc/pacman.d/mirrorlist
fi
sed -i 's/#Color/Color/' /etc/pacman.conf
sed -i 's/#TotalDownload/TotalDownload/' /etc/pacman.conf
pacstrap /mnt base base-devel linux
sed -i 's/#Color/Color/' /mnt/etc/pacman.conf
sed -i 's/#TotalDownload/TotalDownload/' /mnt/etc/pacman.conf
}
function configuration() {
print_step "configuration()"
genfstab -L -p /mnt >> /mnt/etc/fstab
if [ -n "$SWAP_SIZE" -a "$FILE_SYSTEM_TYPE" != "btrfs" ]; then
echo "# swap" >> /mnt/etc/fstab
echo "/swapfile none swap defaults 0 0" >> /mnt/etc/fstab
echo "" >> /mnt/etc/fstab
fi
if [ "$DEVICE_TRIM" == "true" ]; then
sed -i 's/relatime/noatime/' /mnt/etc/fstab
arch-chroot /mnt systemctl enable fstrim.timer
fi
arch-chroot /mnt ln -s -f $TIMEZONE /etc/localtime
arch-chroot /mnt hwclock --systohc
for LOCALE in "${LOCALES[@]}"; do
sed -i "s/#$LOCALE/$LOCALE/" /mnt/etc/locale.gen
done
arch-chroot /mnt locale-gen
for VARIABLE in "${LOCALE_CONF[@]}"; do
echo -e "$VARIABLE" >> /mnt/etc/locale.conf
done
echo -e "$KEYMAP\n$FONT\n$FONT_MAP" > /mnt/etc/vconsole.conf
echo $HOSTNAME > /mnt/etc/hostname
if [ -n "$SWAP_SIZE" ]; then
echo "vm.swappiness=10" > /mnt/etc/sysctl.d/99-sysctl.conf
fi
printf "$ROOT_PASSWORD\n$ROOT_PASSWORD" | arch-chroot /mnt passwd
}
function mkinitcpio_configuration() {
print_step "mkinitcpio_configuration()"
if [ "$KMS" == "true" ]; then
MODULES=""
case "$DISPLAY_DRIVER" in
"intel" )
MODULES="i915"
;;
"nvidia" | "nvidia-lts" | "nvidia-dkms" | "nvidia-390xx" | "nvidia-390xx-lts" | "nvidia-390xx-dkms" )
MODULES="nvidia nvidia_modeset nvidia_uvm nvidia_drm"
;;
"amdgpu" )
MODULES="amdgpu"
;;
"ati" )
MODULES="radeon"
;;
"nouveau" )
MODULES="nouveau"
;;
esac
arch-chroot /mnt sed -i "s/^MODULES=()/MODULES=($MODULES)/" /etc/mkinitcpio.conf
fi
if [ "$LVM" == "true" ]; then
pacman_install "lvm2"
fi
if [ "$FILE_SYSTEM_TYPE" == "btrfs" ]; then
pacman_install "btrfs-progs"
fi
if [ "$BOOTLOADER" == "systemd" ]; then
HOOKS=$(echo $HOOKS | sed 's/!systemd/systemd/')
if [ "$LVM" == "true" ]; then
HOOKS=$(echo $HOOKS | sed 's/!sd-lvm2/sd-lvm2/')
fi
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
HOOKS=$(echo $HOOKS | sed 's/!sd-encrypt/sd-encrypt/')
fi
else
HOOKS=$(echo $HOOKS | sed 's/!udev/udev/')
HOOKS=$(echo $HOOKS | sed 's/!usr/usr/')
if [ "$LVM" == "true" ]; then
HOOKS=$(echo $HOOKS | sed 's/!lvm2/lvm2/')
fi
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
HOOKS=$(echo $HOOKS | sed 's/!encrypt/encrypt/')
fi
fi
HOOKS=$(sanitize_variable "$HOOKS")
arch-chroot /mnt sed -i "s/^HOOKS=(.*)$/HOOKS=($HOOKS)/" /etc/mkinitcpio.conf
if [ "$KERNELS_COMPRESSION" != "" ]; then
arch-chroot /mnt sed -i 's/^#COMPRESSION="'"$KERNELS_COMPRESSION"'"/COMPRESSION="'"$KERNELS_COMPRESSION"'"/' /etc/mkinitcpio.conf
fi
}
function kernels() {
print_step "kernels()"
pacman_install "linux-headers"
if [ -n "$KERNELS" ]; then
pacman_install "$KERNELS"
fi
}
function mkinitcpio() {
print_step "mkinitcpio()"
arch-chroot /mnt mkinitcpio -P
}
function network() {
print_step "network()"
pacman_install "networkmanager"
arch-chroot /mnt systemctl enable NetworkManager.service
}
function virtualbox() {
print_step "virtualbox()"
if [ -z "$KERNELS" ]; then
pacman_install "virtualbox-guest-utils virtualbox-guest-modules-arch"
else
pacman_install "virtualbox-guest-utils virtualbox-guest-dkms"
fi
}
function bootloader() {
print_step "bootloader()"
BOOTLOADER_ALLOW_DISCARDS=""
if [ "$VIRTUALBOX" != "true" ]; then
if [ "$CPU_VENDOR" == "intel" ]; then
pacman_install "intel-ucode"
fi
if [ "$CPU_VENDOR" == "amd" ]; then
pacman_install "amd-ucode"
fi
fi
if [ "$LVM" == "true" ]; then
CMDLINE_LINUX_ROOT="root=$DEVICE_ROOT"
elif [[ -n $PARTITION_ROOT_ENCRYPTION_PASSWORD ]]; then
CMDLINE_LINUX_ROOT="root=UUID=$UUID_DECRYPTED_ROOT"
else
CMDLINE_LINUX_ROOT="root=UUID=$UUID_ROOT"
fi
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
if [ "$DEVICE_TRIM" == "true" ]; then
BOOTLOADER_ALLOW_DISCARDS=":allow-discards"
fi
if [[ $BOOTLOADER =~ systemd ]]; then
CMDLINE_LINUX="rd.luks.name=$UUID_ROOT=$CRYPT_ROOT"
else
CMDLINE_LINUX="cryptdevice=PARTUUID=$PARTUUID_ROOT:$CRYPT_ROOT$BOOTLOADER_ALLOW_DISCARDS"
fi
fi
if [ "$FILE_SYSTEM_TYPE" == "btrfs" ]; then
CMDLINE_LINUX="$CMDLINE_LINUX rootflags=subvol=root"
fi
if [ "$KMS" == "true" ]; then
case "$DISPLAY_DRIVER" in
"nvidia" | "nvidia-390xx" | "nvidia-390xx-lts" )
CMDLINE_LINUX="$CMDLINE_LINUX nvidia-drm.modeset=1"
;;
esac
fi
case "$BOOTLOADER" in
"grub" )
grub
;;
"refind" )
refind
;;
"systemd" )
systemd
;;
esac
}
function grub() {
pacman_install "grub dosfstools"
arch-chroot /mnt sed -i 's/GRUB_DEFAULT=0/GRUB_DEFAULT=saved/' /etc/default/grub
arch-chroot /mnt sed -i 's/#GRUB_SAVEDEFAULT="true"/GRUB_SAVEDEFAULT="true"/' /etc/default/grub
arch-chroot /mnt sed -i -E 's/GRUB_CMDLINE_LINUX_DEFAULT="(.*) quiet"/GRUB_CMDLINE_LINUX_DEFAULT="\1"/' /etc/default/grub
arch-chroot /mnt sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="'"$CMDLINE_LINUX"'"/' /etc/default/grub
echo "" >> /mnt/etc/default/grub
echo "# alis" >> /mnt/etc/default/grub
echo "GRUB_DISABLE_SUBMENU=y" >> /mnt/etc/default/grub
if [ "$BIOS_TYPE" == "uefi" ]; then
pacman_install "efibootmgr"
arch-chroot /mnt grub-install --target=x86_64-efi --bootloader-id=grub --efi-directory=$ESP_DIRECTORY --recheck
#arch-chroot /mnt efibootmgr --create --disk $DEVICE --part $PARTITION_BOOT_NUMBER --loader /EFI/grub/grubx64.efi --label "GRUB Boot Manager"
fi
if [ "$BIOS_TYPE" == "bios" ]; then
arch-chroot /mnt grub-install --target=i386-pc --recheck $DEVICE
fi
arch-chroot /mnt grub-mkconfig -o "$BOOT_DIRECTORY/grub/grub.cfg"
if [ "$VIRTUALBOX" == "true" ]; then
echo -n "\EFI\grub\grubx64.efi" > "/mnt$ESP_DIRECTORY/startup.nsh"
fi
}
function refind() {
pacman_install "refind-efi"
arch-chroot /mnt refind-install
arch-chroot /mnt rm /boot/refind_linux.conf
arch-chroot /mnt sed -i 's/^timeout.*/timeout 5/' "$ESP_DIRECTORY/EFI/refind/refind.conf"
arch-chroot /mnt sed -i 's/^#scan_all_linux_kernels.*/scan_all_linux_kernels false/' "$ESP_DIRECTORY/EFI/refind/refind.conf"
#arch-chroot /mnt sed -i 's/^#default_selection "+,bzImage,vmlinuz"/default_selection "+,bzImage,vmlinuz"/' "$ESP_DIRECTORY/EFI/refind/refind.conf"
REFIND_MICROCODE=""
if [ "$VIRTUALBOX" != "true" ]; then
if [ "$CPU_VENDOR" == "intel" ]; then
REFIND_MICROCODE="initrd=/intel-ucode.img"
fi
if [ "$CPU_VENDOR" == "amd" ]; then
REFIND_MICROCODE="initrd=/amd-ucode.img"
fi
fi
echo "" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "# alis" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "menuentry \"Arch Linux\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " volume $PARTUUID_BOOT" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " loader /vmlinuz-linux" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " initrd /initramfs-linux.img" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " icon /EFI/refind/icons/os_arch.png" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " options \"$REFIND_MICROCODE $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX\"" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " submenuentry \"Boot using fallback initramfs\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " initrd /initramfs-linux-fallback.img" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " }" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " submenuentry \"Boot to terminal\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " add_options \"systemd.unit=multi-user.target\"" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " }" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "}" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
if [[ $KERNELS =~ .*linux-lts.* ]]; then
echo "menuentry \"Arch Linux (lts)\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " volume $PARTUUID_BOOT" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " loader /vmlinuz-linux-lts" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " initrd /initramfs-linux-lts.img" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " icon /EFI/refind/icons/os_arch.png" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " options \"$REFIND_MICROCODE $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX\"" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " submenuentry \"Boot using fallback initramfs\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " initrd /initramfs-linux-lts-fallback.img" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " }" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " submenuentry \"Boot to terminal\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " add_options \"systemd.unit=multi-user.target\"" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " }" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "}" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
fi
if [[ $KERNELS =~ .*linux-hardened.* ]]; then
echo "menuentry \"Arch Linux (hardened)\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " volume $PARTUUID_BOOT" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " loader /vmlinuz-linux-hardened" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " initrd /initramfs-linux-hardened.img" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " icon /EFI/refind/icons/os_arch.png" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " options \"$REFIND_MICROCODE $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX\"" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " submenuentry \"Boot using fallback initramfs\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " initrd /initramfs-linux-hardened-fallback.img" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " }" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " submenuentry \"Boot to terminal\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " add_options \"systemd.unit=multi-user.target\"" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " }" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "}" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
fi
if [[ $KERNELS =~ .*linux-zen.* ]]; then
echo "menuentry \"Arch Linux (zen)\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " volume $PARTUUID_BOOT" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " loader /vmlinuz-linux-zen" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " initrd /initramfs-linux-zen.img" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " icon /EFI/refind/icons/os_arch.png" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " options \"$REFIND_MICROCODE $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX\"" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " submenuentry \"Boot using fallback initramfs\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " initrd /initramfs-linux-zen-fallback.img" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " }" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " submenuentry \"Boot to terminal\" {" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " add_options \"systemd.unit=multi-user.target\"" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo " }" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "}" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
echo "" >> "/mnt$ESP_DIRECTORY/EFI/refind/refind.conf"
fi
if [ "$VIRTUALBOX" == "true" ]; then
echo -n "\EFI\refind\refind_x64.efi" > "/mnt$ESP_DIRECTORY/startup.nsh"
fi
}
function systemd() {
arch-chroot /mnt bootctl --path="$ESP_DIRECTORY" install
arch-chroot /mnt mkdir -p "$ESP_DIRECTORY/loader/"
arch-chroot /mnt mkdir -p "$ESP_DIRECTORY/loader/entries/"
echo "# alis" > "/mnt$ESP_DIRECTORY/loader/loader.conf"
echo "timeout 5" >> "/mnt$ESP_DIRECTORY/loader/loader.conf"
echo "default archlinux" >> "/mnt$ESP_DIRECTORY/loader/loader.conf"
echo "editor 0" >> "/mnt$ESP_DIRECTORY/loader/loader.conf"
arch-chroot /mnt mkdir -p "/etc/pacman.d/hooks/"
echo "[Trigger]" >> /mnt/etc/pacman.d/hooks/systemd-boot.hook
echo "Type = Package" >> /mnt/etc/pacman.d/hooks/systemd-boot.hook
echo "Operation = Upgrade" >> /mnt/etc/pacman.d/hooks/systemd-boot.hook
echo "Target = systemd" >> /mnt/etc/pacman.d/hooks/systemd-boot.hook
echo "" >> /mnt/etc/pacman.d/hooks/systemd-boot.hook
echo "[Action]" >> /mnt/etc/pacman.d/hooks/systemd-boot.hook
echo "Description = Updating systemd-boot..." >> /mnt/etc/pacman.d/hooks/systemd-boot.hook
echo "When = PostTransaction" >> /mnt/etc/pacman.d/hooks/systemd-boot.hook
echo "Exec = /usr/bin/bootctl update" >> /mnt/etc/pacman.d/hooks/systemd-boot.hook
SYSTEMD_MICROCODE=""
SYSTEMD_OPTIONS=""
if [ "$VIRTUALBOX" != "true" ]; then
if [ "$CPU_VENDOR" == "intel" ]; then
SYSTEMD_MICROCODE="/intel-ucode.img"
fi
if [ "$CPU_VENDOR" == "amd" ]; then
SYSTEMD_MICROCODE="/amd-ucode.img"
fi
fi
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
SYSTEMD_OPTIONS="rd.luks.options=discard"
fi
echo "title Arch Linux" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux.conf"
echo "efi /vmlinuz-linux" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux.conf"
if [ -n "$SYSTEMD_MICROCODE" ]; then
echo "initrd $SYSTEMD_MICROCODE" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux.conf"
fi
echo "initrd /initramfs-linux.img" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux.conf"
echo "options initrd=initramfs-linux.img $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX $SYSTEMD_OPTIONS" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux.conf"
echo "title Arch Linux (fallback)" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-fallback.conf"
echo "efi /vmlinuz-linux" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-fallback.conf"
if [ -n "$SYSTEMD_MICROCODE" ]; then
echo "initrd $SYSTEMD_MICROCODE" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-fallback.conf"
fi
echo "initrd /initramfs-linux-fallback.img" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-fallback.conf"
echo "options initrd=initramfs-linux-fallback.img $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX $SYSTEMD_OPTIONS" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-fallback.conf"
if [[ $KERNELS =~ .*linux-lts.* ]]; then
echo "title Arch Linux (lts)" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-lts.conf"
echo "efi /vmlinuz-linux-lts" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-lts.conf"
if [ -n "$SYSTEMD_MICROCODE" ]; then
echo "initrd $SYSTEMD_MICROCODE" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux.conf"
fi
echo "initrd /initramfs-linux-lts.img" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-lts.conf"
echo "options initrd=initramfs-linux-lts.img $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX $SYSTEMD_OPTIONS" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-lts.conf"
echo "title Arch Linux (lts-fallback)" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-lts-fallback.conf"
echo "efi /vmlinuz-linux-lts" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-lts-fallback.conf"
if [ "$CPU_INTEL" == "true" -a "$VIRTUALBOX" != "true" ]; then
echo "initrd $SYSTEMD_MICROCODE" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-lts-fallback.conf"
fi
echo "initrd /initramfs-linux-lts-fallback.img" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-lts-fallback.conf"
echo "options initrd=initramfs-linux-lts-fallback.img $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX $SYSTEMD_OPTIONS" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-lts-fallback.conf"
fi
if [[ $KERNELS =~ .*linux-hardened.* ]]; then
echo "title Arch Linux (hardened)" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-hardened.conf"
echo "efi /vmlinuz-linux-hardened" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-hardened.conf"
if [ -n "$SYSTEMD_MICROCODE" ]; then
echo "initrd $SYSTEMD_MICROCODE" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux.conf"
fi
echo "initrd /initramfs-linux-hardened.img" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-hardened.conf"
echo "options initrd=initramfs-linux-hardened.img $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX $SYSTEMD_OPTIONS" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-hardened.conf"
echo "title Arch Linux (hardened-fallback)" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-hardened-fallback.conf"
echo "efi /vmlinuz-linux-hardened" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-hardened-fallback.conf"
if [ -n "$SYSTEMD_MICROCODE" ]; then
echo "initrd $SYSTEMD_MICROCODE" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-hardened-fallback.conf"
fi
echo "initrd /initramfs-linux-hardened-fallback.img" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-hardened-fallback.conf"
echo "options initrd=initramfs-linux-hardened-fallback.img $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX $SYSTEMD_OPTIONS" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-hardened-fallback.conf"
fi
if [[ $KERNELS =~ .*linux-zen.* ]]; then
echo "title Arch Linux (zen)" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-zen.conf"
echo "efi /vmlinuz-linux-zen" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-zen.conf"
if [ -n "$SYSTEMD_MICROCODE" ]; then
echo "initrd $SYSTEMD_MICROCODE" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux.conf"
fi
echo "initrd /initramfs-linux-zen.img" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-zen.conf"
echo "options initrd=initramfs-linux-zen.img $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX $SYSTEMD_OPTIONS" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-zen.conf"
echo "title Arch Linux (zen-fallback)" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-zen-fallback.conf"
echo "efi /vmlinuz-linux-zen" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-zen-fallback.conf"
if [ -n "$SYSTEMD_MICROCODE" ]; then
echo "initrd $SYSTEMD_MICROCODE" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-zen-fallback.conf"
fi
echo "initrd /initramfs-linux-zen-fallback.img" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-zen-fallback.conf"
echo "options initrd=initramfs-linux-zen-fallback.img $CMDLINE_LINUX_ROOT rw $CMDLINE_LINUX $SYSTEMD_OPTIONS" >> "/mnt$ESP_DIRECTORY/loader/entries/archlinux-zen-fallback.conf"
fi
if [ "$VIRTUALBOX" == "true" ]; then
echo -n "\EFI\systemd\systemd-bootx64.efi" > "/mnt$ESP_DIRECTORY/startup.nsh"
fi
}
function users() {
create_user $USER_NAME $USER_PASSWORD
for i in ${!ADDITIONAL_USER_NAMES_ARRAY[@]}; do
create_user ${ADDITIONAL_USER_NAMES_ARRAY[$i]} ${ADDITIONAL_USER_PASSWORDS_ARRAY[$i]}
done
arch-chroot /mnt sed -i 's/# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/' /etc/sudoers
}
function create_user() {
print_step "create_user()"
USER_NAME=$1
USER_PASSWORD=$2
arch-chroot /mnt useradd -m -G wheel,storage,optical -s /bin/bash $USER_NAME
printf "$USER_PASSWORD\n$USER_PASSWORD" | arch-chroot /mnt passwd $USER_NAME
pacman_install "xdg-user-dirs"
}
function desktop_environment() {
print_step "desktop_environment()"
PACKAGES_DRIVER=""
PACKAGES_DDX=""
PACKAGES_VULKAN=""
PACKAGES_HARDWARE_ACCELERATION=""
case "$DISPLAY_DRIVER" in
"nvidia" )
PACKAGES_DRIVER="nvidia"
;;
"nvidia-lts" )
PACKAGES_DRIVER="nvidia-lts"
;;
"nvidia-dkms" )
PACKAGES_DRIVER="nvidia-dkms"
;;
"nvidia-390xx" )
PACKAGES_DRIVER="nvidia-390xx"
;;
"nvidia-390xx-lts" )
PACKAGES_DRIVER="nvidia-390xx-lts"
;;
"nvidia-390xx-dkms" )
PACKAGES_DRIVER="nvidia-390xx-dkms"
;;
esac
if [ "$DISPLAY_DRIVER_DDX" == "true" ]; then
case "$DISPLAY_DRIVER" in
"intel" )
PACKAGES_DDX="xf86-video-intel"
;;
"amdgpu" )
PACKAGES_DDX="xf86-video-amdgpu"
;;
"ati" )
PACKAGES_DDX="xf86-video-ati"
;;
"nouveau" )
PACKAGES_DDX="xf86-video-nouveau"
;;
esac
fi
if [ "$VULKAN" == "true" ]; then
case "$DISPLAY_DRIVER" in
"intel" )
PACKAGES_VULKAN="vulkan-icd-loader vulkan-intel"
;;
"amdgpu" )
PACKAGES_VULKAN="vulkan-icd-loader vulkan-radeon"
;;
"ati" )
PACKAGES_VULKAN=""
;;
"nouveau" )
PACKAGES_VULKAN=""
;;
esac
fi
if [ "$DISPLAY_DRIVER_HARDWARE_ACCELERATION" == "true" ]; then
case "$DISPLAY_DRIVER" in
"intel" )
PACKAGES_HARDWARE_ACCELERATION="intel-media-driver"
if [ -n "$DISPLAY_DRIVER_HARDWARE_ACCELERATION_INTEL" ]; then
PACKAGES_HARDWARE_ACCELERATION=$DISPLAY_DRIVER_HARDWARE_ACCELERATION_INTEL
fi
;;
"amdgpu" )
PACKAGES_HARDWARE_ACCELERATION="libva-mesa-driver"
;;
"ati" )
PACKAGES_HARDWARE_ACCELERATION="mesa-vdpau"
;;
"nouveau" )
PACKAGES_HARDWARE_ACCELERATION="libva-mesa-driver"
;;
esac
fi
pacman_install "mesa $PACKAGES_DRIVER $PACKAGES_DDX $PACKAGES_VULKAN $PACKAGES_HARDWARE_ACCELERATION"
case "$DESKTOP_ENVIRONMENT" in
"gnome" )
desktop_environment_gnome
;;
"kde" )
desktop_environment_kde
;;
"xfce" )
desktop_environment_xfce
;;
"mate" )
desktop_environment_mate
;;
"cinnamon" )
desktop_environment_cinnamon
;;
"lxde" )
desktop_environment_lxde
;;
esac
}
function desktop_environment_gnome() {
pacman_install "gnome gnome-extra"
arch-chroot /mnt systemctl enable gdm.service
}
function desktop_environment_kde() {
pacman_install "plasma-meta plasma-wayland-session kde-applications-meta"
arch-chroot /mnt systemctl enable sddm.service
}
function desktop_environment_xfce() {
pacman_install "xfce4 xfce4-goodies lightdm lightdm-gtk-greeter xorg-server"
arch-chroot /mnt systemctl enable lightdm.service
}
function desktop_environment_mate() {
pacman_install "mate mate-extra lightdm lightdm-gtk-greeter xorg-server"
arch-chroot /mnt systemctl enable lightdm.service
}
function desktop_environment_cinnamon() {
pacman_install "cinnamon lightdm lightdm-gtk-greeter xorg-server"
arch-chroot /mnt systemctl enable lightdm.service
}
function desktop_environment_lxde() {
pacman_install "lxde lxdm"
arch-chroot /mnt systemctl enable lxdm.service
}
function packages() {
print_step "packages()"
if [ -n "$PACKAGES_PACMAN" ]; then
pacman_install "$PACKAGES_PACMAN"
fi
packages_aur
}
function packages_aur() {
if [ -n "$AUR" -o -n "$PACKAGES_AUR" ]; then
pacman_install "git"
arch-chroot /mnt sed -i 's/%wheel ALL=(ALL) ALL/%wheel ALL=(ALL) NOPASSWD: ALL/' /etc/sudoers
case "$AUR" in
"aurman" )
arch-chroot /mnt bash -c "echo -e \"$USER_PASSWORD\n$USER_PASSWORD\n$USER_PASSWORD\n$USER_PASSWORD\n\" | su $USER_NAME -c \"cd /home/$USER_NAME && git clone https://aur.archlinux.org/$AUR.git && gpg --recv-key 465022E743D71E39 && (cd $AUR && makepkg -si --noconfirm) && rm -rf $AUR\""
;;
"yay" | *)
arch-chroot /mnt bash -c "echo -e \"$USER_PASSWORD\n$USER_PASSWORD\n$USER_PASSWORD\n$USER_PASSWORD\n\" | su $USER_NAME -c \"cd /home/$USER_NAME && git clone https://aur.archlinux.org/$AUR.git && (cd $AUR && makepkg -si --noconfirm) && rm -rf $AUR\""
;;
esac
arch-chroot /mnt sed -i 's/%wheel ALL=(ALL) NOPASSWD: ALL/%wheel ALL=(ALL) ALL/' /etc/sudoers
fi
if [ -n "$PACKAGES_AUR" ]; then
aur_install "$PACKAGES_AUR"
fi
}
function terminate() {
cp "$CONF_FILE" "/mnt/etc/$CONF_FILE"
if [ "$LOG" == "true" ]; then
mkdir -p /mnt/var/log
cp "$LOG_FILE" "/mnt/var/log/$LOG_FILE"
fi
if [ "$ASCIINEMA" == "true" ]; then
mkdir -p /mnt/var/log
cp "$ASCIINEMA_FILE" "/mnt/var/log/$ASCIINEMA_FILE"
fi
}
function end() {
if [ "$REBOOT" == "true" ]; then
echo ""
echo -e "${GREEN}Arch Linux installed successfully"'!'"${NC}"
echo ""
REBOOT="true"
if [ "$ASCIINEMA" == "false" ]; then
set +e
for (( i = 15; i >= 1; i-- )); do
read -r -s -n 1 -t 1 -p "Rebooting in $i seconds... Press any key to abort."$'\n' KEY
if [ $? -eq 0 ]; then
echo ""
echo "Restart aborted. You will must do a explicit reboot (./alis-reboot.sh)."
echo ""
REBOOT="false"
break
fi
done
set -e
else
echo ""
echo "Restart aborted. You will must terminate asciinema recording and do a explicit reboot (exit, ./alis-reboot.sh)."
echo ""
REBOOT="false"
fi
if [ "$REBOOT" == 'true' ]; then
umount -R /mnt/boot
umount -R /mnt
reboot
fi
else
echo ""
echo -e "${GREEN}Arch Linux installed successfully"'!'"${NC}"
if [ "$ASCIINEMA" == "false" ]; then
echo ""
echo "You will must do a explicit reboot (./alis-reboot.sh)."
echo ""
else
echo ""
echo "You will must terminate asciinema recording and do a explicit reboot (exit, ./alis-reboot.sh)."
echo ""
fi
fi
}
function pacman_install() {
PACKAGES=$1
for VARIABLE in {1..5}
do
arch-chroot /mnt pacman -Syu --noconfirm --needed $PACKAGES
if [ $? == 0 ]; then
break
else
sleep 10
fi
done
}
function aur_install() {
PACKAGES=$1
for VARIABLE in {1..5}
do
arch-chroot /mnt bash -c "echo -e \"$USER_PASSWORD\n$USER_PASSWORD\n$USER_PASSWORD\n$USER_PASSWORD\n\" | su $USER_NAME -c \"$AUR -Syu --noconfirm --needed $PACKAGES\""
if [ $? == 0 ]; then
break
else
sleep 10
fi
done
}
function print_step() {
STEP=$1
echo ""
echo -e "${LIGHT_BLUE}# ${STEP} step${NC}"
echo ""
}
function main() {
configuration_install
sanitize_variables
facts
check_variables
warning
init
check_facts
prepare
partition
install
configuration
mkinitcpio_configuration
kernels
mkinitcpio
network
if [ "$VIRTUALBOX" == "true" ]; then
virtualbox
fi
users
bootloader
if [ "$DESKTOP_ENVIRONMENT" != "" ]; then
desktop_environment
fi
packages
terminate
end
}
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment