Skip to content

Instantly share code, notes, and snippets.

@0rbadvent
Created January 5, 2018 01:06
Show Gist options
  • Save 0rbadvent/2092c3ebd1a9479a88a467e15faeb34c to your computer and use it in GitHub Desktop.
Save 0rbadvent/2092c3ebd1a9479a88a467e15faeb34c to your computer and use it in GitHub Desktop.
Arch Linux Install Script
# loadkeys es
# wget -O alis.conf https://raw.githubusercontent.com/picodotdev/alis/master/alis.conf
# nano alis.conf
# wget -O alis.sh https://raw.githubusercontent.com/picodotdev/alis/master/alis.sh
# chmod +x alis.sh
# ./alis.sh
# init
KEYS="es"
# partition
DEVICE="/dev/sda"
LVM="true"
PARTITION_ROOT_ENCRYPTION_PASSWORD="archlinux"
FILE_SYSTEM_TYPE="ext4" # ext4 btrfs xfs
SWAP_SIZE="" # 2GiB (not supported in btrfs)
# network_install
WIFI_INTERFACE=""
WIFI_ESSID=""
WIFI_KEY=""
WIFI_HIDDEN=""
PING_HOSTNAME="mirrors.kernel.org"
# install
PACMAN_MIRROR="Server=http://mirrors.kernel.org/archlinux/\$repo/os/\$arch"
KERNELS="" # linux-lts linux-lts-headers linux-grsec linux-grsec-headers linux-zen linux-zen-headers
# config
TIMEZONE="/usr/share/zoneinfo/Europe/Madrid"
LOCALE="es_ES.UTF-8 UTF-8"
LANG="LANG=es_ES.UTF-8"
KEYMAP="KEYMAP=es"
HOSTNAME="archlinux"
ROOT_PASSWORD="archlinux"
# user
USER_NAME="picodotdev"
USER_PASSWORD="archlinux"
# packages
PACKAGES_PACMAN="" #firefox firefox-i18n-es-es ntfs-3g gimp libreoffice libreoffice-fresh libreoffice-fresh-es vlc gstreamer0.10-plugins gstreamer0.10-good-plugins gstreamer0.10-bad-plugins gstreamer0.10-ugly-plugins
PACKAGES_YAOURT=""
YAOURT="true"
# desktop
DESKTOP_ENVIRONMENT="gnome" #gnome kde xfce mate cinnamon lxde
DISPLAY_DRIVER="" #xf86-video-intel xf86-video-amdgpu xf86-video-ati nvidia nvidia-340xx nvidia-304xx xf86-video-nouveau
#reboot
REBOOT="true"
#!/usr/bin/env bash
set -e
# Arch Linux Install Script (alis) installs unnatended, automated
# and customized Arch Linux system.
# Copyright (C) 2017 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 in https://github.com/picodotdev/alis. For new features,
# improvements and bugs fill an issue in GitHub or make a pull request.
#
# 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
# # wget -O alis.conf https://raw.githubusercontent.com/picodotdev/alis/master/alis.conf
# # vim alis.conf
# # wget -O alis.sh https://raw.githubusercontent.com/picodotdev/alis/master/alis.sh
# # chmod +x alis.sh
# # ./alis.sh
# alis variables (no configuration, don't edit)
BIOS_TYPE=""
PARTITION_BIOS=""
PARTITION_BOOT=""
PARTITION_ROOT=""
DEVICE_ROOT=""
DEVICE_ROOT_MAPPER=""
PARTITION_BOOT_NUMBER=0
UUID_BOOT=""
UUID_ROOT=""
DEVICE_TRIM=""
ALLOW_DISCARDS=""
CPU_INTEL=""
VIRTUALBOX=""
GRUB_CMDLINE_LINUX=""
RED='\033[0;31m'
NC='\033[0m'
function configuration_install() {
source alis.conf
}
function check_variables() {
check_variables_value "KEYS" "$KEYS"
check_variables_value "DEVICE" "$DEVICE"
check_variables_boolean "LVM" "$LVM"
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_value "TIMEZONE" "$TIMEZONE"
check_variables_value "LOCALE" "$LOCALE"
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_boolean "YAOURT" "$YAOURT"
check_variables_list "DESKTOP_ENVIRONMENT" "$DESKTOP_ENVIRONMENT" "gnome kde xfce mate cinnamon lxde" "false"
check_variables_list "DISPLAY_DRIVER" "$DISPLAY_DRIVER" "xf86-video-intel xf86-video-amdgpu xf86-video-ati nvidia nvidia-340xx nvidia-304xx xf86-video-nouveau" "false"
check_variables_boolean "REBOOT" "$REBOOT"
}
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 warning() {
echo "Welcome to Arch Linux Install Script"
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() {
loadkeys $KEYS
}
function facts() {
if [ -d /sys/firmware/efi ]; then
BIOS_TYPE="uefi"
else
BIOS_TYPE="bios"
fi
if [ -n "$(hdparm -I $DEVICE | grep TRIM)" ]; then
DEVICE_TRIM="true"
else
DEVICE_TRIM="false"
fi
if [ -n "$(lscpu | grep GenuineIntel)" ]; then
CPU_INTEL="true"
fi
if [ -n "$(lspci | grep -i virtualbox)" ]; then
VIRTUALBOX="true"
fi
}
function network_install() {
if [ -n "$WIFI_INTERFACE" ]; then
cp /etc/netctl/examples/wireless-wpa /etc/netctl
chmod 600 /etc/netctl
sed -i 's/^Interface=.*/Interface='"$WIFI_INTERFACE"'/' /etc/netctl
sed -i 's/^ESSID=.*/ESSID='"$WIFI_ESSID"'/' /etc/netctl
sed -i 's/^Key=.*/Key='\''$WIFI_KEY'\''/' /etc/netctl
if [ "$WIFI_HIDDEN" == "true" ]; then
sed -i 's/^#Hidden=.*/Hidden=yes/' /etc/netctl
fi
netctl start wireless-wpa
fi
ping -c 5 $PING_HOSTNAME
if [ $? -ne 0 ]; then
echo "Network ping check failed. Cannot continue."
exit
fi
}
function partition() {
sgdisk --zap-all $DEVICE
wipefs -a $DEVICE
if [ "$BIOS_TYPE" == "uefi" ]; then
PARTITION_BOOT="/dev/sda1"
PARTITION_ROOT="/dev/sda2"
PARTITION_BOOT_NUMBER=1
DEVICE_ROOT="/dev/sda2"
DEVICE_ROOT_MAPPER="root"
parted -s $DEVICE mklabel gpt mkpart primary fat32 1MiB 512MiB mkpart primary $FILE_SYSTEM_TYPE 512MiB 100% set 1 boot on
sgdisk -t=1:ef00 $DEVICE
fi
if [ "$BIOS_TYPE" == "bios" ]; then
PARTITION_BIOS="/dev/sda1"
PARTITION_BOOT="/dev/sda2"
PARTITION_ROOT="/dev/sda3"
PARTITION_BOOT_NUMBER=2
DEVICE_ROOT="/dev/sda3"
DEVICE_ROOT_MAPPER="root"
parted -s $DEVICE mklabel gpt mkpart primary fat32 1MiB 128MiB mkpart primary $FILE_SYSTEM_TYPE 128MiB 512MiB mkpart primary $FILE_SYSTEM_TYPE 512MiB 100% set 1 boot on
sgdisk -t=1:ef02 $DEVICE
fi
if [ "$LVM" == "true" ]; then
DEVICE_ROOT_MAPPER="lvm"
fi
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
echo -n $PARTITION_ROOT_ENCRYPTION_PASSWORD | cryptsetup --key-size=512 --key-file=- luksFormat $PARTITION_ROOT
echo -n $PARTITION_ROOT_ENCRYPTION_PASSWORD | cryptsetup --key-file=- open $PARTITION_ROOT $DEVICE_ROOT_MAPPER
DEVICE_ROOT="/dev/mapper/$DEVICE_ROOT_MAPPER"
fi
if [ "$LVM" == "true" ]; then
pvcreate /dev/mapper/$DEVICE_ROOT_MAPPER
vgcreate lvm /dev/mapper/$DEVICE_ROOT_MAPPER
lvcreate -l 100%FREE -n lvroot $DEVICE_ROOT_MAPPER
DEVICE_ROOT_MAPPER="lvm-lvroot"
DEVICE_ROOT="/dev/mapper/$DEVICE_ROOT_MAPPER"
fi
if [ "$BIOS_TYPE" == "uefi" ]; then
wipefs -a $PARTITION_BOOT
mkfs.fat -n ESP -F32 $PARTITION_BOOT
if [ "$FILE_SYSTEM_TYPE" == "ext4" ]; then
wipefs -a $DEVICE_ROOT
mkfs."$FILE_SYSTEM_TYPE" -L root -E discard $DEVICE_ROOT
else
wipefs -a $DEVICE_ROOT
mkfs."$FILE_SYSTEM_TYPE" -L root $DEVICE_ROOT
fi
fi
if [ "$BIOS_TYPE" == "bios" ]; then
wipefs -a $PARTITION_BIOS
mkfs.fat -n BIOS -F32 $PARTITION_BIOS
if [ "$FILE_SYSTEM_TYPE" == "ext4" ]; then
wipefs -a $PARTITION_BOOT
wipefs -a $DEVICE_ROOT
mkfs."$FILE_SYSTEM_TYPE" -L boot -E discard $PARTITION_BOOT
mkfs."$FILE_SYSTEM_TYPE" -L root -E discard $DEVICE_ROOT
elif [ "$FILE_SYSTEM_TYPE" == "xfs" ]; then
wipefs -a $PARTITION_BOOT
wipefs -a $DEVICE_ROOT
mkfs."$FILE_SYSTEM_TYPE" -L boot -f $PARTITION_BOOT
mkfs."$FILE_SYSTEM_TYPE" -L root -f $DEVICE_ROOT
else
wipefs -a $PARTITION_BOOT
wipefs -a $DEVICE_ROOT
mkfs."$FILE_SYSTEM_TYPE" -L boot $PARTITION_BOOT
mkfs."$FILE_SYSTEM_TYPE" -L root $DEVICE_ROOT
fi
fi
mount $DEVICE_ROOT /mnt
mkdir /mnt/boot
mount $PARTITION_BOOT /mnt/boot
if [ -n "$SWAP_SIZE" -a "$FILE_SYSTEM_TYPE" != "btrfs" ]; then
fallocate -l $SWAP_SIZE /mnt/swap
chmod 600 /mnt/swap
mkswap /mnt/swap
fi
UUID_BOOT=$(blkid -s UUID -o value $PARTITION_BOOT)
UUID_ROOT=$(blkid -s UUID -o value $PARTITION_ROOT)
}
function install() {
echo $PACMAN_MIRROR >> /etc/pacman.d/mirrrorlist
pacstrap /mnt base base-devel
}
function kernels() {
arch-chroot /mnt pacman -Sy --noconfirm linux-headers
if [ -n "$KERNELS" ]; then
arch-chroot /mnt pacman -Sy --noconfirm $KERNELS
fi
}
function configuration() {
genfstab -U /mnt >> /mnt/etc/fstab
if [ "$DEVICE_TRIM" == "true" ]; then
sed -i 's/relatime/noatime,discard/' /mnt/etc/fstab
sed -i 's/issue_discards = 0/issue_discards = 1/' /mnt/etc/lvm/lvm.conf
fi
if [ -n "$SWAP_SIZE" -a "$FILE_SYSTEM_TYPE" != "btrfs" ]; then
echo "# swap" >> /mnt/etc/fstab
echo "/swap none swap defaults 0 0" >> /mnt/etc/fstab
echo "" >> /mnt/etc/fstab
fi
arch-chroot /mnt ln -s -f $TIMEZONE /etc/localtime
arch-chroot /mnt hwclock --systohc
sed -i "s/#$LOCALE/$LOCALE/" /mnt/etc/locale.gen
arch-chroot /mnt locale-gen
echo $LANG > /mnt/etc/locale.conf
echo $KEYMAP > /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 network() {
arch-chroot /mnt pacman -Sy --noconfirm networkmanager
arch-chroot /mnt systemctl enable NetworkManager.service
}
function virtualbox() {
if [ -z "$KERNELS" ]; then
arch-chroot /mnt pacman -Sy --noconfirm virtualbox-guest-utils virtualbox-guest-modules-arch
else
arch-chroot /mnt pacman -Sy --noconfirm virtualbox-guest-utils virtualbox-guest-dkms
fi
}
function packages() {
if [ "$FILE_SYSTEM_TYPE" == "btrfs" ]; then
arch-chroot /mnt pacman -Sy --noconfirm btrfs-progs
fi
if [ "$YAOURT" == "true" -o -n "$PACKAGES_YAOURT" ]; then
echo "" >> /mnt/etc/pacman.conf
echo "[archlinuxfr]" >> /mnt/etc/pacman.conf
echo "SigLevel=Optional TrustAll" >> /mnt/etc/pacman.conf
echo "Server=http://repo.archlinux.fr/\$arch" >> /mnt/etc/pacman.conf
arch-chroot /mnt pacman -Sy --noconfirm yaourt
fi
if [ -n "$PACKAGES_PACMAN" ]; then
arch-chroot /mnt pacman -Sy --noconfirm --needed $PACKAGES_PACMAN
fi
if [ -n "$PACKAGES_YAOURT" ]; then
arch-chroot /mnt yaourt -S --noconfirm --needed $PACKAGES_YAOURT
fi
}
function mkinitcpio() {
if [ "$LVM" == "true" -a -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
arch-chroot /mnt sed -i 's/ filesystems / lvm2 encrypt keymap filesystems /' /etc/mkinitcpio.conf
elif [ "$LVM" == "true" ]; then
arch-chroot /mnt sed -i 's/ filesystems / lvm2 filesystems /' /etc/mkinitcpio.conf
elif [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
arch-chroot /mnt sed -i 's/ filesystems / encrypt keymap filesystems /' /etc/mkinitcpio.conf
fi
arch-chroot /mnt sed -i 's/#COMPRESSION="gzip"/COMPRESSION="gzip"/' /etc/mkinitcpio.conf
arch-chroot /mnt mkinitcpio -P
}
function bootloader() {
if [ "$CPU_INTEL" == "true" -a "$VIRTUALBOX" != "true" ]; then
arch-chroot /mnt pacman -Sy --noconfirm intel-ucode
fi
if [ -n "$PARTITION_ROOT_ENCRYPTION_PASSWORD" ]; then
if [ "$DEVICE_TRIM" == "true" ]; then
ALLOW_DISCARDS=":allow-discards"
fi
GRUB_CMDLINE_LINUX="cryptdevice=UUID='"$UUID_ROOT"':lvm'"$ALLOW_DISCARDS"'"
fi
arch-chroot /mnt pacman -Sy --noconfirm grub dosfstools
arch-chroot /mnt sed -i 's/GRUB_CMDLINE_LINUX_DEFAULT="quiet"/GRUB_CMDLINE_LINUX_DEFAULT=""/' /etc/default/grub
arch-chroot /mnt sed -i 's/GRUB_CMDLINE_LINUX=""/GRUB_CMDLINE_LINUX="'$GRUB_CMDLINE_LINUX'"/' /etc/default/grub
if [ "$BIOS_TYPE" == "uefi" ]; then
arch-chroot /mnt pacman -Sy --noconfirm efibootmgr
arch-chroot /mnt grub-install --target=x86_64-efi --bootloader-id=grub --efi-directory=/boot --recheck
#arch-chroot /mnt efibootmgr --create --disk $DEVICE --part $PARTITION_BOOT_NUMBER --loader /EFI/grub/grubx64.efi --label "GRUB"
fi
if [ "$BIOS_TYPE" == "bios" ]; then
arch-chroot /mnt grub-install --target=i386-pc --recheck $DEVICE
fi
if [ "$VIRTUALBOX" == "true" ]; then
echo -n "\EFI\grub\grubx64.efi" > /mnt/boot/startup.nsh
fi
arch-chroot /mnt grub-mkconfig -o /boot/grub/grub.cfg
}
function user() {
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
}
function desktop_environment() {
case "$DISPLAY_DRIVER" in
"xf86-video-intel" )
MESA_LIBGL="mesa-libgl"
;;
"xf86-video-ati" )
MESA_LIBGL="mesa-libgl"
;;
"xf86-video-amdgpu" )
MESA_LIBGL="mesa-libgl"
;;
"xf86-video-nouveau" )
MESA_LIBGL="mesa-libgl"
;;
"nvidia" )
MESA_LIBGL="nvidia-libgl"
;;
"nvidia-340xx" )
MESA_LIBGL="nvidia-340xx-libgl"
;;
"nvidia-304xx" )
MESA_LIBGL="nvidia-304xx-libgl"
;;
* )
MESA_LIBGL="mesa-libgl"
;;
esac
arch-chroot /mnt pacman -Sy --noconfirm xorg-server xorg-server-utils xorg-apps $DISPLAY_DRIVER mesa $MESA_LIBGL
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() {
arch-chroot /mnt pacman -Sy --noconfirm gnome gnome-extra
arch-chroot /mnt systemctl enable gdm.service
}
function desktop_environment_kde() {
arch-chroot /mnt pacman -Sy --noconfirm plasma-meta kde-applications-meta
arch-chroot /mnt sed -i 's/Current=.*/Current=breeze/' /etc/sddm.conf
arch-chroot /mnt systemctl enable sddm.service
}
function desktop_environment_xfce() {
arch-chroot /mnt pacman -Sy --noconfirm xfce4 xfce4-goodies lightdm lightdm-gtk-greeter
arch-chroot /mnt systemctl enable lightdm.service
}
function desktop_environment_mate() {
arch-chroot /mnt pacman -Sy --noconfirm mate mate-extra lightdm lightdm-gtk-greeter
arch-chroot /mnt systemctl enable lightdm.service
}
function desktop_environment_cinnamon() {
arch-chroot /mnt pacman -Sy --noconfirm cinnamon lightdm lightdm-gtk-greeter
arch-chroot /mnt systemctl enable lightdm.service
}
function desktop_environment_lxde() {
arch-chroot /mnt pacman -Sy --noconfirm lxde lxdm
arch-chroot /mnt systemctl enable lxdm.service
}
function end() {
umount -R /mnt
reboot
}
function main() {
configuration_install
check_variables
warning
init
facts
network_install
partition
install
kernels
configuration
network
if [ "$VIRTUALBOX" == "true" ]; then
virtualbox
fi
packages
user
mkinitcpio
bootloader
if [ "$DESKTOP_ENVIRONMENT" != "" ]; then
desktop_environment
fi
if [ "$REBOOT" == "true" ]; then
end
fi
}
main
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment