Initial commit
This commit is contained in:
commit
5e87ec8e8f
17
README.md
Normal file
17
README.md
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
# About
|
||||||
|
|
||||||
|
Scripts to install my system setup.
|
||||||
|
|
||||||
|
Installation is done in 3 steps:
|
||||||
|
- Install arch based system
|
||||||
|
- Install packages from AR, AUR or source
|
||||||
|
- Deploy configuration based on my dotfiles repository
|
||||||
|
|
||||||
|
# Commands
|
||||||
|
|
||||||
|
```
|
||||||
|
# loadkeys fr
|
||||||
|
# iwctl --passphrase "[WIFI_KEY]" station [WIFI_INTERFACE] connect "[WIFI_ESSID]"
|
||||||
|
# git clone https://gitea.cebe.one/cb/system-setup
|
||||||
|
# sh install.sh
|
||||||
|
```
|
||||||
21
install.sh
Normal file
21
install.sh
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
|
||||||
|
echo "------------------------------------"
|
||||||
|
echo "------------------------------------"
|
||||||
|
echo "--- Install Script for Arch Base ---"
|
||||||
|
echo "------------------------------------"
|
||||||
|
echo "------------------------------------"
|
||||||
|
echo "BEWARE, disk will be formatted. ALL DATA will be LOST"
|
||||||
|
echo "Press <Ctrl> <C> now to stop"
|
||||||
|
|
||||||
|
echo "Start in 5"
|
||||||
|
sleep 1
|
||||||
|
echo "Start in 4"
|
||||||
|
sleep 1
|
||||||
|
echo "Start in 3"
|
||||||
|
sleep 1
|
||||||
|
echo "Start in 2"
|
||||||
|
sleep 1
|
||||||
|
echo "Start in 1"
|
||||||
|
sleep 1
|
||||||
|
sh setup-arch/alis.sh
|
||||||
53
setup-arch/alis-commons.conf
Normal file
53
setup-arch/alis-commons.conf
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# Arch Linux Install Script (alis) installs unattended, automated
|
||||||
|
# and customized Arch Linux system.
|
||||||
|
# Copyright (C) 2022 picodotdev
|
||||||
|
|
||||||
|
# Common configuration.
|
||||||
|
|
||||||
|
WARNING_CONFIRM="true"
|
||||||
|
|
||||||
|
COMMOMS_LOADED="true"
|
||||||
|
PARTITION_BOOT=""
|
||||||
|
PARTITION_ROOT=""
|
||||||
|
PARTITION_BOOT_NUMBER=""
|
||||||
|
PARTITION_ROOT_NUMBER=""
|
||||||
|
DEVICE_ROOT=""
|
||||||
|
DEVICE_LVM=""
|
||||||
|
LUKS_DEVICE_NAME="cryptroot"
|
||||||
|
LVM_VOLUME_GROUP="vg"
|
||||||
|
LVM_VOLUME_LOGICAL="root"
|
||||||
|
SWAPFILE="/swapfile"
|
||||||
|
BOOT_DIRECTORY=""
|
||||||
|
ESP_DIRECTORY=""
|
||||||
|
UUID_BOOT=""
|
||||||
|
UUID_ROOT=""
|
||||||
|
PARTUUID_BOOT=""
|
||||||
|
PARTUUID_ROOT=""
|
||||||
|
CMDLINE_LINUX_ROOT=""
|
||||||
|
CMDLINE_LINUX=""
|
||||||
|
BTRFS_SUBVOLUME_ROOT=()
|
||||||
|
BTRFS_SUBVOLUME_SWAP=()
|
||||||
|
USER_NAME_INSTALL="root"
|
||||||
|
|
||||||
|
AUR_PACKAGE="paru-bin"
|
||||||
|
AUR_COMMAND="paru"
|
||||||
|
|
||||||
|
BIOS_TYPE=""
|
||||||
|
ASCIINEMA=""
|
||||||
|
DEVICE_SATA="false"
|
||||||
|
DEVICE_NVME="false"
|
||||||
|
DEVICE_MMC="false"
|
||||||
|
CPU_VENDOR=""
|
||||||
|
GPU_VENDOR=""
|
||||||
|
VIRTUALBOX=""
|
||||||
|
VMWARE=""
|
||||||
|
SYSTEM_INSTALLATION=""
|
||||||
|
|
||||||
|
LOG_TRACE="true"
|
||||||
|
LOG_FILE="false"
|
||||||
|
USER_NAME="picodotdev"
|
||||||
|
USER_PASSWORD="ask"
|
||||||
|
PACKAGES_PIPEWIRE="false"
|
||||||
447
setup-arch/alis-commons.sh
Executable file
447
setup-arch/alis-commons.sh
Executable file
@ -0,0 +1,447 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# Arch Linux Install Script (alis) installs unattended, automated
|
||||||
|
# and customized Arch Linux system.
|
||||||
|
# Copyright (C) 2022 picodotdev
|
||||||
|
|
||||||
|
# Common functions and definitions.
|
||||||
|
|
||||||
|
# common static variables
|
||||||
|
ALIS_CONF_FILE="alis.conf"
|
||||||
|
ALIS_LOG_FILE="alis.log"
|
||||||
|
ALIS_ASCIINEMA_FILE="alis.asciinema"
|
||||||
|
RECOVERY_CONF_FILE="alis-recovery.conf"
|
||||||
|
RECOVERY_LOG_FILE="alis-recovery.log"
|
||||||
|
RECOVERY_ASCIINEMA_FILE="alis-recovery.asciinema"
|
||||||
|
PACKAGES_CONF_FILE="alis-packages.conf"
|
||||||
|
PACKAGES_LOG_FILE="alis-packages.log"
|
||||||
|
COMMONS_CONF_FILE="alis-commons.conf"
|
||||||
|
PROVISION_DIRECTORY="files/"
|
||||||
|
|
||||||
|
RED='\033[0;91m'
|
||||||
|
GREEN='\033[0;92m'
|
||||||
|
BLUE='\033[0;96m'
|
||||||
|
WHITE='\033[0;97m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
function sanitize_variable() {
|
||||||
|
local VARIABLE="$1"
|
||||||
|
local VARIABLE=$(echo "$VARIABLE" | sed "s/![^ ]*//g") # remove disabled
|
||||||
|
local VARIABLE=$(echo "$VARIABLE" | sed -r "s/ {2,}/ /g") # remove unnecessary white spaces
|
||||||
|
local VARIABLE=$(echo "$VARIABLE" | sed 's/^[[:space:]]*//') # trim leading
|
||||||
|
local VARIABLE=$(echo "$VARIABLE" | sed 's/[[:space:]]*$//') # trim trailing
|
||||||
|
echo "$VARIABLE"
|
||||||
|
}
|
||||||
|
|
||||||
|
function trim_variable() {
|
||||||
|
local VARIABLE="$1"
|
||||||
|
local VARIABLE=$(echo "$VARIABLE" | sed 's/^[[:space:]]*//') # trim leading
|
||||||
|
local VARIABLE=$(echo "$VARIABLE" | sed 's/[[:space:]]*$//') # trim trailing
|
||||||
|
echo "$VARIABLE"
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_variables_value() {
|
||||||
|
local NAME="$1"
|
||||||
|
local VALUE="$2"
|
||||||
|
if [ -z "$VALUE" ]; then
|
||||||
|
echo "$NAME environment variable must have a value."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_variables_boolean() {
|
||||||
|
local NAME="$1"
|
||||||
|
local VALUE="$2"
|
||||||
|
check_variables_list "$NAME" "$VALUE" "true false" "true" "true"
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_variables_list() {
|
||||||
|
local NAME="$1"
|
||||||
|
local VALUE="$2"
|
||||||
|
local VALUES="$3"
|
||||||
|
local REQUIRED="$4"
|
||||||
|
local SINGLE="$5"
|
||||||
|
|
||||||
|
if [ "$REQUIRED" == "" -o "$REQUIRED" == "true" ]; then
|
||||||
|
check_variables_value "$NAME" "$VALUE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ ("$SINGLE" == "" || "$SINGLE" == "true") && "$VALUE" != "" && "$VALUE" =~ " " ]]; then
|
||||||
|
echo "$NAME environment variable value [$VALUE] must be a single value of [$VALUES]."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$VALUE" != "" -a -z "$(echo "$VALUES" | grep -F -w "$VALUE")" ]; then
|
||||||
|
echo "$NAME environment variable value [$VALUE] must be in [$VALUES]."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_variables_equals() {
|
||||||
|
local NAME1="$1"
|
||||||
|
local NAME2="$2"
|
||||||
|
local VALUE1="$3"
|
||||||
|
local VALUE2="$4"
|
||||||
|
if [ "$VALUE1" != "$VALUE2" ]; then
|
||||||
|
echo "$NAME1 and $NAME2 must be equal [$VALUE1, $VALUE2]."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function check_variables_size() {
|
||||||
|
local NAME="$1"
|
||||||
|
local SIZE_EXPECT="$2"
|
||||||
|
local SIZE="$3"
|
||||||
|
if [ "$SIZE_EXPECT" != "$SIZE" ]; then
|
||||||
|
echo "$NAME array size [$SIZE] must be [$SIZE_EXPECT]."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function configure_network() {
|
||||||
|
if [ -n "$WIFI_INTERFACE" ]; then
|
||||||
|
iwctl --passphrase "$WIFI_KEY" station $WIFI_INTERFACE connect "$WIFI_ESSID"
|
||||||
|
sleep 10
|
||||||
|
fi
|
||||||
|
|
||||||
|
# only one ping -c 1, ping 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 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function facts_commons() {
|
||||||
|
if [ -d /sys/firmware/efi ]; then
|
||||||
|
BIOS_TYPE="uefi"
|
||||||
|
else
|
||||||
|
BIOS_TYPE="bios"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -f "$ALIS_ASCIINEMA_FILE" -o -f "$RECOVERY_ASCIINEMA_FILE" ]; then
|
||||||
|
ASCIINEMA="true"
|
||||||
|
else
|
||||||
|
ASCIINEMA="false"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$(lscpu | grep GenuineIntel)" ]; then
|
||||||
|
CPU_VENDOR="intel"
|
||||||
|
elif [ -n "$(lscpu | grep AuthenticAMD)" ]; then
|
||||||
|
CPU_VENDOR="amd"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$(lspci -nn | grep "\[03" | grep -i intel)" ]; then
|
||||||
|
GPU_VENDOR="intel"
|
||||||
|
elif [ -n "$(lspci -nn | grep "\[03" | grep -i amd)" ]; then
|
||||||
|
GPU_VENDOR="amd"
|
||||||
|
elif [ -n "$(lspci -nn | grep "\[03" | grep -i nvidia)" ]; then
|
||||||
|
GPU_VENDOR="nvidia"
|
||||||
|
elif [ -n "$(lspci -nn | grep "\[03" | grep -i vmware)" ]; then
|
||||||
|
GPU_VENDOR="vmware"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$(systemd-detect-virt | grep -i oracle)" ]; then
|
||||||
|
VIRTUALBOX="true"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$(systemd-detect-virt | grep -i vmware)" ]; then
|
||||||
|
VMWARE="true"
|
||||||
|
fi
|
||||||
|
|
||||||
|
USER_NAME_INSTALL="$(whoami)"
|
||||||
|
if [ "$USER_NAME_INSTALL" == "root" ]; then
|
||||||
|
SYSTEM_INSTALLATION="true"
|
||||||
|
else
|
||||||
|
SYSTEM_INSTALLATION="false"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function init_log_trace() {
|
||||||
|
local ENABLE="$1"
|
||||||
|
if [ "$ENABLE" == "true" ]; then
|
||||||
|
set -o xtrace
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function init_log_file() {
|
||||||
|
local ENABLE="$1"
|
||||||
|
local FILE="$2"
|
||||||
|
if [ "$ENABLE" == "true" ]; then
|
||||||
|
exec &> >(tee -a $FILE)
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function pacman_uninstall() {
|
||||||
|
local ERROR="true"
|
||||||
|
set +e
|
||||||
|
IFS=' ' local PACKAGES=($1)
|
||||||
|
local PACKAGES_UNINSTALL=()
|
||||||
|
for PACKAGE in "${PACKAGES[@]}"
|
||||||
|
do
|
||||||
|
execute_sudo "pacman -Qi $PACKAGE > /dev/null 2>&1"
|
||||||
|
local PACKAGE_INSTALLED=$?
|
||||||
|
if [ $PACKAGE_INSTALLED == 0 ]; then
|
||||||
|
local PACKAGES_UNINSTALL+=("$PACKAGE")
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
if [ -z "${PACKAGES_UNINSTALL[@]}" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
local COMMAND="pacman -Rdd --noconfirm ${PACKAGES_UNINSTALL[@]}"
|
||||||
|
execute_sudo "$COMMAND"
|
||||||
|
if [ $? == 0 ]; then
|
||||||
|
local ERROR="false"
|
||||||
|
fi
|
||||||
|
set -e
|
||||||
|
if [ "$ERROR" == "true" ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function pacman_install() {
|
||||||
|
local ERROR="true"
|
||||||
|
set +e
|
||||||
|
IFS=' ' local PACKAGES=($1)
|
||||||
|
for VARIABLE in {1..5}
|
||||||
|
do
|
||||||
|
local COMMAND="pacman -Syu --noconfirm --needed ${PACKAGES[@]}"
|
||||||
|
execute_sudo "$COMMAND"
|
||||||
|
if [ $? == 0 ]; then
|
||||||
|
local ERROR="false"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
sleep 10
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
set -e
|
||||||
|
if [ "$ERROR" == "true" ]; then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function aur_install() {
|
||||||
|
local ERROR="true"
|
||||||
|
set +e
|
||||||
|
which "$AUR_COMMAND"
|
||||||
|
if [ "$AUR_COMMAND" != "0" ]; then
|
||||||
|
aur_command_install "$USER_NAME" "$AUR_PACKAGE"
|
||||||
|
fi
|
||||||
|
IFS=' ' local PACKAGES=($1)
|
||||||
|
for VARIABLE in {1..5}
|
||||||
|
do
|
||||||
|
local COMMAND="$AUR_COMMAND -Syu --noconfirm --needed ${PACKAGES[@]}"
|
||||||
|
execute_aur "$COMMAND"
|
||||||
|
if [ $? == 0 ]; then
|
||||||
|
local ERROR="false"
|
||||||
|
break
|
||||||
|
else
|
||||||
|
sleep 10
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
set -e
|
||||||
|
if [ "$ERROR" == "true" ]; then
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function aur_command_install() {
|
||||||
|
pacman_install "git"
|
||||||
|
local USER_NAME="$1"
|
||||||
|
local COMMAND="$2"
|
||||||
|
execute_aur "rm -rf /home/$USER_NAME/.alis && mkdir -p /home/$USER_NAME/.alis/aur && cd /home/$USER_NAME/.alis/aur && git clone https://aur.archlinux.org/$COMMAND.git && (cd $COMMAND && makepkg -si --noconfirm) && rm -rf /home/$USER_NAME/.alis"
|
||||||
|
}
|
||||||
|
|
||||||
|
function systemd_units() {
|
||||||
|
IFS=' ' local UNITS=($SYSTEMD_UNITS)
|
||||||
|
for U in ${UNITS[@]}; do
|
||||||
|
local ACTION=""
|
||||||
|
local UNIT=${U}
|
||||||
|
if [[ $UNIT == -* ]]; then
|
||||||
|
local ACTION="disable"
|
||||||
|
local UNIT=$(echo $UNIT | sed "s/^-//g")
|
||||||
|
elif [[ $UNIT == +* ]]; then
|
||||||
|
local ACTION="enable"
|
||||||
|
local UNIT=$(echo $UNIT | sed "s/^+//g")
|
||||||
|
elif [[ $UNIT =~ ^[a-zA-Z0-9]+ ]]; then
|
||||||
|
local ACTION="enable"
|
||||||
|
local UNIT=$UNIT
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -n "$ACTION" ]; then
|
||||||
|
execute_sudo "systemctl $ACTION $UNIT"
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
}
|
||||||
|
|
||||||
|
function execute_flatpak() {
|
||||||
|
local COMMAND="$1"
|
||||||
|
if [ "$SYSTEM_INSTALLATION" == "true" ]; then
|
||||||
|
arch-chroot /mnt bash -c "$COMMAND"
|
||||||
|
else
|
||||||
|
bash -c "$COMMAND"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function execute_aur() {
|
||||||
|
local COMMAND="$1"
|
||||||
|
if [ "$SYSTEM_INSTALLATION" == "true" ]; then
|
||||||
|
arch-chroot /mnt sed -i 's/^%wheel ALL=(ALL:ALL) ALL$/%wheel ALL=(ALL:ALL) NOPASSWD: ALL/' /etc/sudoers
|
||||||
|
arch-chroot /mnt bash -c "echo -e \"$USER_PASSWORD\n$USER_PASSWORD\n$USER_PASSWORD\n$USER_PASSWORD\n\" | su $USER_NAME -s /usr/bin/bash -c \"$COMMAND\""
|
||||||
|
arch-chroot /mnt sed -i 's/^%wheel ALL=(ALL:ALL) NOPASSWD: ALL$/%wheel ALL=(ALL:ALL) ALL/' /etc/sudoers
|
||||||
|
else
|
||||||
|
bash -c "$COMMAND"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function execute_sudo() {
|
||||||
|
local COMMAND="$1"
|
||||||
|
if [ "$SYSTEM_INSTALLATION" == "true" ]; then
|
||||||
|
arch-chroot /mnt bash -c "$COMMAND"
|
||||||
|
else
|
||||||
|
sudo bash -c "$COMMAND"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function execute_user() {
|
||||||
|
local USER_NAME="$1"
|
||||||
|
local COMMAND="$2"
|
||||||
|
if [ "$SYSTEM_INSTALLATION" == "true" ]; then
|
||||||
|
arch-chroot /mnt bash -c "su $USER_NAME -s /usr/bin/bash -c \"$COMMAND\""
|
||||||
|
else
|
||||||
|
bash -c "$COMMAND"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function do_reboot() {
|
||||||
|
umount -R /mnt/boot
|
||||||
|
umount -R /mnt
|
||||||
|
reboot
|
||||||
|
}
|
||||||
|
|
||||||
|
function print_step() {
|
||||||
|
STEP="$1"
|
||||||
|
echo ""
|
||||||
|
echo -e "${BLUE}# ${STEP} step${NC}"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
function execute_step() {
|
||||||
|
local STEP="$1"
|
||||||
|
eval "$STEP"
|
||||||
|
}
|
||||||
|
|
||||||
|
function partition_setup() {
|
||||||
|
# setup
|
||||||
|
if [ "$PARTITION_MODE" == "auto" ]; then
|
||||||
|
PARTITION_PARTED_FILE_SYSTEM_TYPE="$FILE_SYSTEM_TYPE"
|
||||||
|
if [ "$PARTITION_PARTED_FILE_SYSTEM_TYPE" == "f2fs" ]; then
|
||||||
|
PARTITION_PARTED_FILE_SYSTEM_TYPE=""
|
||||||
|
fi
|
||||||
|
PARTITION_PARTED_UEFI="mklabel gpt mkpart ESP fat32 1MiB 2048MiB mkpart root $PARTITION_PARTED_FILE_SYSTEM_TYPE 2048MiB 100% set 1 esp on"
|
||||||
|
PARTITION_PARTED_BIOS="mklabel msdos mkpart primary ext4 4MiB 2048MiB mkpart primary $PARTITION_PARTED_FILE_SYSTEM_TYPE 2048MiB 100% set 1 boot on"
|
||||||
|
|
||||||
|
if [ "$BIOS_TYPE" == "uefi" ]; then
|
||||||
|
if [ "$DEVICE_SATA" == "true" ]; then
|
||||||
|
PARTITION_BOOT="${DEVICE}1"
|
||||||
|
PARTITION_ROOT="${DEVICE}2"
|
||||||
|
DEVICE_ROOT="${DEVICE}2"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$DEVICE_NVME" == "true" ]; then
|
||||||
|
PARTITION_BOOT="${DEVICE}p1"
|
||||||
|
PARTITION_ROOT="${DEVICE}p2"
|
||||||
|
DEVICE_ROOT="${DEVICE}p2"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$DEVICE_MMC" == "true" ]; then
|
||||||
|
PARTITION_BOOT="${DEVICE}p1"
|
||||||
|
PARTITION_ROOT="${DEVICE}p2"
|
||||||
|
DEVICE_ROOT="${DEVICE}p2"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$BIOS_TYPE" == "bios" ]; then
|
||||||
|
if [ "$DEVICE_SATA" == "true" ]; then
|
||||||
|
PARTITION_BOOT="${DEVICE}1"
|
||||||
|
PARTITION_ROOT="${DEVICE}2"
|
||||||
|
DEVICE_ROOT="${DEVICE}2"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$DEVICE_NVME" == "true" ]; then
|
||||||
|
PARTITION_BOOT="${DEVICE}p1"
|
||||||
|
PARTITION_ROOT="${DEVICE}p2"
|
||||||
|
DEVICE_ROOT="${DEVICE}p2"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$DEVICE_MMC" == "true" ]; then
|
||||||
|
PARTITION_BOOT="${DEVICE}p1"
|
||||||
|
PARTITION_ROOT="${DEVICE}p2"
|
||||||
|
DEVICE_ROOT="${DEVICE}p2"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
elif [ "$PARTITION_MODE" == "custom" ]; then
|
||||||
|
PARTITION_PARTED_UEFI="$PARTITION_CUSTOM_PARTED_UEFI"
|
||||||
|
PARTITION_PARTED_BIOS="$PARTITION_CUSTOM_PARTED_BIOS"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$PARTITION_MODE" == "custom" -o "$PARTITION_MODE" == "manual" ]; then
|
||||||
|
PARTITION_BOOT="$PARTITION_CUSTOMMANUAL_BOOT"
|
||||||
|
PARTITION_ROOT="$PARTITION_CUSTOMMANUAL_ROOT"
|
||||||
|
DEVICE_ROOT="${PARTITION_ROOT}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
PARTITION_BOOT_NUMBER="$PARTITION_BOOT"
|
||||||
|
PARTITION_ROOT_NUMBER="$PARTITION_ROOT"
|
||||||
|
PARTITION_BOOT_NUMBER="${PARTITION_BOOT_NUMBER//\/dev\/sda/}"
|
||||||
|
PARTITION_BOOT_NUMBER="${PARTITION_BOOT_NUMBER//\/dev\/nvme0n1p/}"
|
||||||
|
PARTITION_BOOT_NUMBER="${PARTITION_BOOT_NUMBER//\/dev\/vda/}"
|
||||||
|
PARTITION_BOOT_NUMBER="${PARTITION_BOOT_NUMBER//\/dev\/mmcblk0p/}"
|
||||||
|
PARTITION_ROOT_NUMBER="${PARTITION_ROOT_NUMBER//\/dev\/sda/}"
|
||||||
|
PARTITION_ROOT_NUMBER="${PARTITION_ROOT_NUMBER//\/dev\/nvme0n1p/}"
|
||||||
|
PARTITION_ROOT_NUMBER="${PARTITION_ROOT_NUMBER//\/dev\/vda/}"
|
||||||
|
PARTITION_ROOT_NUMBER="${PARTITION_ROOT_NUMBER//\/dev\/mmcblk0p/}"
|
||||||
|
}
|
||||||
|
|
||||||
|
function partition_options() {
|
||||||
|
PARTITION_OPTIONS_BOOT="defaults"
|
||||||
|
PARTITION_OPTIONS="defaults"
|
||||||
|
|
||||||
|
if [ "$DEVICE_TRIM" == "true" ]; then
|
||||||
|
PARTITION_OPTIONS_BOOT="$PARTITION_OPTIONS_BOOT,noatime"
|
||||||
|
PARTITION_OPTIONS="$PARTITION_OPTIONS,noatime"
|
||||||
|
if [ "$FILE_SYSTEM_TYPE" == "f2fs" ]; then
|
||||||
|
PARTITION_OPTIONS="$PARTITION_OPTIONS,nodiscard"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function partition_mount() {
|
||||||
|
if [ "$FILE_SYSTEM_TYPE" == "btrfs" ]; then
|
||||||
|
# mount subvolumes
|
||||||
|
mount -o "subvol=${BTRFS_SUBVOLUME_ROOT[1]},$PARTITION_OPTIONS,compress=zstd" "$DEVICE_ROOT" /mnt
|
||||||
|
mkdir -p /mnt/boot
|
||||||
|
mount -o "$PARTITION_OPTIONS_BOOT" "$PARTITION_BOOT" /mnt/boot
|
||||||
|
for I in "${BTRFS_SUBVOLUMES_MOUNTPOINTS[@]}"; do
|
||||||
|
IFS=',' SUBVOLUME=($I)
|
||||||
|
if [ ${SUBVOLUME[0]} == "root" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [ ${SUBVOLUME[0]} == "swap" -a -z "$SWAP_SIZE" ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [ ${SUBVOLUME[0]} == "swap" ]; then
|
||||||
|
mkdir -p -m 0755 "/mnt${SUBVOLUME[2]}"
|
||||||
|
else
|
||||||
|
mkdir -p "/mnt${SUBVOLUME[2]}"
|
||||||
|
fi
|
||||||
|
mount -o "subvol=${SUBVOLUME[1]},$PARTITION_OPTIONS,compress=zstd" "$DEVICE_ROOT" "/mnt${SUBVOLUME[2]}"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
mount -o "$PARTITION_OPTIONS" "$DEVICE_ROOT" /mnt
|
||||||
|
|
||||||
|
mkdir -p /mnt/boot
|
||||||
|
mount -o "$PARTITION_OPTIONS_BOOT" "$PARTITION_BOOT" /mnt/boot
|
||||||
|
fi
|
||||||
|
}
|
||||||
11
setup-arch/alis-reboot.sh
Executable file
11
setup-arch/alis-reboot.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -eu
|
||||||
|
|
||||||
|
# Arch Linux Install Script (alis) installs unattended, automated
|
||||||
|
# and customized Arch Linux system.
|
||||||
|
# Copyright (C) 2022 picodotdev
|
||||||
|
|
||||||
|
source "alis-commons.sh"
|
||||||
|
|
||||||
|
do_reboot
|
||||||
|
|
||||||
179
setup-arch/alis.conf
Normal file
179
setup-arch/alis.conf
Normal file
@ -0,0 +1,179 @@
|
|||||||
|
# Arch Linux Install Script (alis) configuration file
|
||||||
|
#
|
||||||
|
# Some variables values are preceded by a ! character, this means that the value is ignored.
|
||||||
|
# Some variables accept a single value others accept multiple values as annotated in the comments.
|
||||||
|
# Some variables are boolean with a value of true or false.
|
||||||
|
#
|
||||||
|
# Read the Arch Linux wiki pages to learn more about the variables values.
|
||||||
|
# https://github.com/picodotdev/alis/blob/master/README.md
|
||||||
|
|
||||||
|
# init
|
||||||
|
## KEYS sets keyboard layout.
|
||||||
|
## LOG_TRACE outputs the comands executed.
|
||||||
|
## LOG_FILE generates a log file with the commands executed and output generated during installation.
|
||||||
|
### The log file is saved to /var/log/alis.log.
|
||||||
|
KEYS="fr"
|
||||||
|
LOG_TRACE="true"
|
||||||
|
LOG_FILE="false"
|
||||||
|
|
||||||
|
# partition
|
||||||
|
## DEVICE sets which is the device for the installation.
|
||||||
|
## DEVICE_TRIM sets if the DEVICE device supports TRIM feature.
|
||||||
|
## LVM sets if the DEVICE is partitioned with LVM partition scheme.
|
||||||
|
## LUKS_PASSWORD and LUKS_PASSWORD_RETYPE if set is the password for encrypt the device. With LVM, LVM on LUKS is used. If "ask" password alis asks for a secure password.
|
||||||
|
## FILE_SYSTEM_TYPE root device is formatted with this file system type.
|
||||||
|
## BTRFS_SUBVOLUMES_MOUNTPOINTS allows to customize btrfs file system subvolumes mountpoints. swap sobvolume is created only if swap file is created (only if there is SWAP_SIZE value).
|
||||||
|
### Format ("name,subvolume,mount_point")
|
||||||
|
## SWAP_SIZE swap file size with a size of the value in megabytes. If no value no swap file is created.
|
||||||
|
## PARTITION_MODE how partition is performed on DEVICE.
|
||||||
|
### "auto" value deletes all existing partitions and creates a boot partition and a root partition using disk full size.
|
||||||
|
### Warning! all disk data will be lost, so backup existing data before.
|
||||||
|
### "custom" value allows to use a custom parted partition script.
|
||||||
|
### "manual" allows to specify which existing partitions are used for boot partition and root partition.
|
||||||
|
DEVICE="/dev/sda !/dev/nvme0n1 !/dev/vda !/dev/mmcblk0" # sata nvme mmc (single)
|
||||||
|
DEVICE_TRIM="true"
|
||||||
|
LVM="false"
|
||||||
|
LUKS_PASSWORD="ask"
|
||||||
|
LUKS_PASSWORD_RETYPE="ask"
|
||||||
|
FILE_SYSTEM_TYPE="ext4 !btrfs !xfs !f2fs !reiserfs" # (single)
|
||||||
|
BTRFS_SUBVOLUMES_MOUNTPOINTS=("root,root,/" "home,home,/home" "var,var,/var" "snapshots,snapshots,/snapshots" "swap,swap,/swap")
|
||||||
|
#BTRFS_SUBVOLUMES_MOUNTPOINTS=("root,@,/" "home,@home,/home" "var,@var_log,/var/log" "snapshots,@snapshots,/.snapshots" "swap,@swap,/swap")
|
||||||
|
SWAP_SIZE="!2048 !4096 8192" # (single)
|
||||||
|
PARTITION_MODE="auto !custom !manual"
|
||||||
|
PARTITION_CUSTOM_PARTED_UEFI="mklabel gpt mkpart ESP fat32 1MiB 2048MiB mkpart root $FILE_SYSTEM_TYPE 2048MiB 100% set 1 esp on"
|
||||||
|
PARTITION_CUSTOM_PARTED_BIOS="mklabel msdos mkpart primary ext4 4MiB 2048MiB mkpart primary $FILE_SYSTEM_TYPE 2048MiB 100% set 1 boot on"
|
||||||
|
PARTITION_CUSTOMMANUAL_BOOT="!/dev/sda1 !/dev/nvme0n1p1 !/dev/vda1 !/dev/mmcblk0p1"
|
||||||
|
PARTITION_CUSTOMMANUAL_ROOT="!/dev/sda2 !/dev/nvme0n1p2 !/dev/vda2 !/dev/mmcblk0p2"
|
||||||
|
|
||||||
|
# network_install
|
||||||
|
## Variables to setup the WIFI connection to internet.
|
||||||
|
## The WIFI interface, WIFI ESSID identifier and WIFI password must be specified. If "ask" password alis asks for a secure password.
|
||||||
|
## PING_HOSTNAME is the host to check the internet connection.
|
||||||
|
WIFI_INTERFACE=""
|
||||||
|
WIFI_ESSID=""
|
||||||
|
WIFI_KEY="ask"
|
||||||
|
WIFI_KEY_RETYPE="ask"
|
||||||
|
PING_HOSTNAME="mirrors.kernel.org"
|
||||||
|
|
||||||
|
# install
|
||||||
|
## REFLECTOR allows to use reflector utility to use the best mirrors for packages download.
|
||||||
|
## REFLECTOR_COUNTRIES is an array of countries to select mirrors from.
|
||||||
|
## PACMAN_MIRROR if reflector is not used this specific mirror is used.
|
||||||
|
## PACMAN_PARALLEL_DOWNLOADS configures pacman to use parallel downloads, set to false on slow internet connections and disable timeouts.
|
||||||
|
## KERNELS additional kernels and headers to install.
|
||||||
|
## KERNELS_COMPRESSION selects the algorithm for kernel compression.
|
||||||
|
## KERNELS_PARAMETERS specific kernel parameters to set on boot. eg. iommu=soft
|
||||||
|
REFLECTOR="false"
|
||||||
|
REFLECTOR_COUNTRIES=("Spain")
|
||||||
|
PACMAN_MIRROR="https://mirrors.kernel.org/archlinux/\$repo/os/\$arch"
|
||||||
|
PACMAN_PARALLEL_DOWNLOADS="true"
|
||||||
|
KERNELS="linux-lts !linux-lts-headers !linux-hardened !linux-hardened-headers !linux-zen !linux-zen-headers" # (multiple)
|
||||||
|
KERNELS_COMPRESSION="!gzip !bzip2 !lzma !xz !lzop !lz4 zstd"
|
||||||
|
KERNELS_PARAMETERS="!iommu=soft nvme_load=YES"
|
||||||
|
|
||||||
|
# aur
|
||||||
|
## AUR_PACKAGE the AUR command to install in case some package requires it, only is installed if necessary.
|
||||||
|
AUR_PACKAGE="paru-bin !yay-bin !paru !yay !aurman" # (single)
|
||||||
|
|
||||||
|
# display driver
|
||||||
|
## DISPLAY_DRIVER installs a specific display driver, you must know which brand is the graphics hardware.
|
||||||
|
### With auto value intel driver is used for Intel brand, amdgpu driver for AMD brand and nvidia driver for NVIDIA brand.
|
||||||
|
### Other variables activates some features if are supported for the DISPLAY_DRIVER.
|
||||||
|
## KMS add support for kernel mode setting
|
||||||
|
## FASTBOOT, FRAMEBUFFER_COMPRESSION for intel graphics.
|
||||||
|
## DISPLAY_DRIVER_DDX add DDX driver which provides 2D acceleration in Xorg.
|
||||||
|
## VULKAN add support for Vulkan.
|
||||||
|
## DISPLAY_DRIVER_HARDWARE_VIDEO_ACCELERATION, DISPLAY_DRIVER_HARDWARE_VIDEO_ACCELERATION_INTEL add support for hardware video acceleration
|
||||||
|
DISPLAY_DRIVER="auto !intel !amdgpu !ati !nvidia !nvidia-lts !nvidia-dkms !nvidia-470xx-dkms !nvidia-390xx-dkms !nvidia-340xx-dkms !nouveau" # (single)
|
||||||
|
KMS="true"
|
||||||
|
FASTBOOT="true"
|
||||||
|
FRAMEBUFFER_COMPRESSION="true"
|
||||||
|
DISPLAY_DRIVER_DDX="false"
|
||||||
|
VULKAN="true"
|
||||||
|
DISPLAY_DRIVER_HARDWARE_VIDEO_ACCELERATION="true"
|
||||||
|
DISPLAY_DRIVER_HARDWARE_VIDEO_ACCELERATION_INTEL="intel-media-driver !libva-intel-driver" # (single)
|
||||||
|
|
||||||
|
# config
|
||||||
|
## Some variables for system configuration, from timezone, locale and keyboard to the root password.
|
||||||
|
## KEYLAYOUT, KEYMODEL, KEYVARIANT, KEYOPTIONS see https://wiki.archlinux.org/title/X_keyboard_extension#Preset_configuration
|
||||||
|
## KEYMAP, FONT, FONT_MAP see https://man.archlinux.org/man/vconsole.conf.5
|
||||||
|
## ROOT_PASSWORD root user password. If "ask" password alis asks for a secure password.
|
||||||
|
TIMEZONE="/usr/share/zoneinfo/Europe/Paris"
|
||||||
|
LOCALES=("fr_FR.UTF-8 UTF-8" "en_US.UTF-8 UTF-8")
|
||||||
|
LOCALE_CONF=("LANG=fr_FR.UTF-8" "LANGUAGE=es_ES:es:en_US:en")
|
||||||
|
KEYLAYOUT="fr"
|
||||||
|
KEYMODEL=""
|
||||||
|
KEYVARIANT=""
|
||||||
|
KEYOPTIONS=""
|
||||||
|
KEYMAP="KEYMAP=fr"
|
||||||
|
FONT=""
|
||||||
|
FONT_MAP=""
|
||||||
|
HOSTNAME="cbsystem"
|
||||||
|
ROOT_PASSWORD="ask"
|
||||||
|
ROOT_PASSWORD_RETYPE="ask"
|
||||||
|
|
||||||
|
# user
|
||||||
|
## USER_NAME, USER_PASSWORD Regular user to create in the system. A password must be specified, if "ask" password alis asks for a secure password.
|
||||||
|
## ADDITIONAL_USERS is an array of additional users to create in the system, if "ask" password alis asks for a secure password.
|
||||||
|
USER_NAME="cb"
|
||||||
|
USER_PASSWORD="ask"
|
||||||
|
USER_PASSWORD_RETYPE="ask"
|
||||||
|
ADDITIONAL_USERS=() # eg. ("user1=password1" "user2=password2")
|
||||||
|
|
||||||
|
## systemd-homed
|
||||||
|
### SYSTEMD_HOMED "true" value requires interactivity to set user password
|
||||||
|
SYSTEMD_HOMED="false"
|
||||||
|
SYSTEMD_HOMED_STORAGE="!auto !luks !subvolume directory !fscrypt !cifs"
|
||||||
|
SYSTEMD_HOMED_STORAGE_LUKS_TYPE="auto !ext4 !btrfs !xfs"
|
||||||
|
SYSTEMD_HOMED_STORAGE_CIFS_DOMAIN=""
|
||||||
|
SYSTEMD_HOMED_STORAGE_CIFS_SERVICE=""
|
||||||
|
|
||||||
|
# mkinitcpio
|
||||||
|
## HOOKS are the system hooks to execute to build the initial ramdisk.
|
||||||
|
## MODULES are used to specify the modules to load before anything to execute to build the initial ramdisk.
|
||||||
|
### Generally, it is not necessary to modify, alis enables or disables some hooks
|
||||||
|
### taking in account other variables values like bootloader or device encryption.
|
||||||
|
HOOKS="base !udev !usr !resume !systemd !btrfs autodetect keyboard !keymap !consolefont !sd-vconsole modconf block !net !dmraid !mdadm !mdadm_udev !encrypt !sd-encrypt !lvm2 fsck filesystems"
|
||||||
|
MODULES="!vmd"
|
||||||
|
|
||||||
|
# bootloader
|
||||||
|
## BOOTLOADER system boot loader.
|
||||||
|
### With auto value grub is used for BIOS system, systemd for UEFI system.
|
||||||
|
BOOTLOADER="auto !grub !refind !systemd" # (single)
|
||||||
|
|
||||||
|
# shell
|
||||||
|
## CUSTOM_SHELL configures an alternative custom shell interpreter.
|
||||||
|
CUSTOM_SHELL="bash !zsh !dash !fish" # (single)
|
||||||
|
|
||||||
|
# desktop
|
||||||
|
## DESKTOP_ENVIRONMENT installs a desktop environment.
|
||||||
|
DESKTOP_ENVIRONMENT="!gnome !kde !xfce !mate !cinnamon !lxde !i3-wm !i3-gaps !deepin !budgie !bspwm !awesome !qtile !openbox !leftwm !dusk" # (single)
|
||||||
|
|
||||||
|
# packages
|
||||||
|
## PACKAGES_MULTILIB configures multilib repository for pacman and install multilib packages for display driver.
|
||||||
|
## PACKAGES_INSTALL installs packages on system installation, edit alis-packages.conf to select packages.
|
||||||
|
## PACKAGES_PIPEWIRE installs PipeWire replacing PulseAudio, requires PACKAGES_INSTALL="true".
|
||||||
|
### It is recommended to install packages after base installation and reboot.
|
||||||
|
PACKAGES_MULTILIB="true"
|
||||||
|
PACKAGES_INSTALL="false"
|
||||||
|
PACKAGES_PIPEWIRE="false"
|
||||||
|
|
||||||
|
# provision
|
||||||
|
## PROVISION_DIRECTORY directory files to provision, preserving directories. This is useful to copy some configuration files.
|
||||||
|
## PROVISION provisions the files placed in PROVISION_DIRECTORY
|
||||||
|
PROVISION="false"
|
||||||
|
|
||||||
|
# misc
|
||||||
|
## VAGRANT for build a VirtualBox OVA with Packer
|
||||||
|
VAGRANT="false"
|
||||||
|
|
||||||
|
# systemd
|
||||||
|
## SYSTEMD_UNITS systemd units to enable or disable.
|
||||||
|
### If preceded with a "+" unit is enabled, if preceded with "-" unit is disabled, if preceded with "!" unit is ignored (no action is performed).
|
||||||
|
### eg. "+ufw.service" to enable, "-ufw.service" to disable, "!ufw.service" to ignore
|
||||||
|
SYSTEMD_UNITS=""
|
||||||
|
|
||||||
|
# reboot
|
||||||
|
## REBOOT on installation end reboots the system automatically. If "false" no reboot is performed and the user must do it explicitly.
|
||||||
|
REBOOT="true"
|
||||||
|
|
||||||
1797
setup-arch/alis.sh
Executable file
1797
setup-arch/alis.sh
Executable file
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user