install-arch/install.sh

286 lines
6.4 KiB
Bash
Raw Normal View History

2021-05-14 14:06:20 -04:00
#!/bin/sh
2021-08-10 09:40:45 -04:00
shopt -s expand_aliases
2021-05-14 14:06:20 -04:00
set -e
2021-08-09 14:48:22 -04:00
qpushd() {
pushd $@ > /dev/null
}
qpopd() {
popd $@ > /dev/null
2021-05-14 14:06:20 -04:00
}
2021-08-09 10:44:29 -04:00
quiet() {
local DUMMY
2021-08-10 09:29:03 -04:00
set +e
2021-08-09 10:44:29 -04:00
DUMMY=$($@ 2>&1 > /dev/null)
2021-08-10 09:29:03 -04:00
if [ $? -ne 0 ]; then
echo "$DUMMY"
set -e
return 1
fi
set -e
2021-05-14 14:06:20 -04:00
}
2021-08-10 09:08:34 -04:00
testif() {
2021-08-10 09:29:03 -04:00
local DUMMY
2021-08-10 09:31:04 -04:00
set +e
2021-08-10 09:29:03 -04:00
DUMMY=$($@ 2>&1 > /dev/null)
2021-08-10 09:31:04 -04:00
set -e
2021-08-10 09:08:34 -04:00
}
2021-08-09 14:48:22 -04:00
2021-08-09 19:53:23 -04:00
### FORCE ROOT ###
2021-08-09 14:48:22 -04:00
[ $(whoami) != "root" ] && echo "Please run as root" && exit 1
2021-08-09 19:53:23 -04:00
### URLs ###
FZF_DOWNLOAD="$(curl -s https://api.github.com/repos/junegunn/fzf/releases/latest | grep linux_amd64 | sed -nE 's/^\s*"browser_download_url":\s*"(.*)"\s*$/\1/p')"
2021-08-10 08:35:59 -04:00
PARTED_DOWNLOAD="https://archlinux.org/packages/extra/x86_64/parted/download"
2021-08-09 19:53:23 -04:00
2021-08-09 14:48:22 -04:00
### COLORS ###
RED='\033[0;31m'
LGREEN='\033[1;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
BOLD=$(tput bold)
NORM=$(tput sgr0)
readonly RED
readonly LGREEN
readonly YELLOW
readonly NC
readonly BOLD
readonly NORM
### VARS ###
CUR_PHASE=1
MAX_PHASE=3
### INFO ###
2021-08-10 09:17:16 -04:00
AVAILABLE_PLATFORMS='Both BIOS and UEFI systems\nOnly x86_64 systems\nDistros:\nArch\nArtix (OpenRC)\n'
2021-08-09 14:48:22 -04:00
readonly AVAILABLE_PLATFORMS
echo "This script can only be run interactively. Make sure you are in a supported platform and have an Internet connection. Available platforms:"
echo -e "$AVAILABLE_PLATFORMS"
2021-05-14 14:06:20 -04:00
2021-08-09 14:48:22 -04:00
### SYSTEM ###
2021-08-09 18:36:39 -04:00
DISTRO=$(cat /etc/os-release | sed -nE 's/^ID=(.*)/\1/p')
2021-08-09 10:44:29 -04:00
INIT_SYS=$(basename $(readlink /bin/init))
2021-08-10 09:08:34 -04:00
testif ls /sys/firmware/efi/efivars
2021-08-09 10:44:29 -04:00
[ $? -eq 0 ] && UEFI=1 || UEFI=0
2021-08-09 14:48:22 -04:00
readonly DISTRO
readonly INIT_SYS
readonly UEFI
2021-08-10 09:17:16 -04:00
if [ "$DISTRO" = "arch" ]; then
alias chroot="arch-chroot"
alias fstabgen="genfstab"
2021-08-10 09:40:45 -04:00
alias basestrap="pacstrap"
2021-08-10 09:17:16 -04:00
fi
2021-05-15 17:55:45 -04:00
2021-08-09 14:48:22 -04:00
print_phase() {
echo -e "${BOLD}${YELLOW}[$CUR_PHASE/$MAX_PHASE] $1 phase${NC}${NORM}"
CUR_PHASE=$((CUR_PHASE+1))
}
2021-05-15 17:55:45 -04:00
2021-08-09 19:53:23 -04:00
download_fzf() {
2021-08-10 08:35:59 -04:00
echo -n "Downloading fzf (for script use only)..."
2021-08-09 19:53:23 -04:00
curl -sL "$FZF_DOWNLOAD" -o fzf.tar.gz
tar -xf fzf.tar.gz
2021-08-10 08:39:15 -04:00
mv ./fzf /usr/bin/fzf
2021-08-10 08:49:42 -04:00
rm fzf.tar.gz
2021-08-10 08:35:59 -04:00
echo "done"
}
download_parted() {
echo -n "Downloading parted (for script use only)..."
2021-08-10 08:49:42 -04:00
curl -sL "$PARTED_DOWNLOAD" -o parted.tar.zst
tar -xf parted.tar.zst
2021-08-10 08:53:35 -04:00
cp -r ./usr /
rm -r ./usr
2021-08-10 08:49:42 -04:00
rm parted.tar.zst
2021-08-10 08:35:59 -04:00
echo "done"
2021-05-15 17:55:45 -04:00
}
prompt() {
2021-08-09 10:44:29 -04:00
echo -n "$1 [Y/n] "
[ $NO_CONFIRM ] && echo "y" && return 1
2021-05-15 17:55:45 -04:00
read ans
case $ans in
2021-08-09 10:44:29 -04:00
n|N) return 0 ;;
*) return 1 ;;
2021-05-15 17:55:45 -04:00
esac
}
2021-08-09 10:44:29 -04:00
prompt_drive() {
local DRIVES="$(lsblk -pno NAME,TYPE,MODEL | awk 'BEGIN {count=1} $1 ~ /^\// {
if ($2 == "disk") {printf("%i'")"' %s \"", count, $1); for(i=3;i<NF;i++) printf("%s ", $i); printf("%s\"\n", $NF); count++ } }')"
echo "Available drives:"
printf " %-12s %s\n" "DISK" "IDENTIFIER"
echo -e "$DRIVES"
echo -n "Choose drive to install $DISTRO into (WARNING: it will be repartitioned and wiped out) (default=1): "
local drive
read drive
[ -z "$drive" ] && drive=1
DRIVE_TARGET=$(echo -e "$DRIVES" | awk '$1 ~ /^'$drive'\)$/ { print $2 }')
if [ -z "$DRIVE_TARGET" ]; then
echo "Invalid target"
exit 1
2021-05-15 19:25:56 -04:00
fi
2021-08-05 21:29:58 -04:00
2021-08-09 10:44:29 -04:00
set +e
2021-08-09 14:48:22 -04:00
prompt "Installing to $DRIVE_TARGET. Confirm?"
2021-08-09 10:44:29 -04:00
[ $? -eq 0 ] && exit 0
2021-08-05 21:29:58 -04:00
set -e
}
2021-08-09 10:44:29 -04:00
partition() {
2021-08-09 14:48:22 -04:00
print_phase "Disk partitioning"
2021-08-10 08:35:59 -04:00
[ -e /bin/parted ] || download_parted
2021-08-09 10:44:29 -04:00
prompt_drive
2021-08-05 21:29:58 -04:00
2021-08-09 10:44:29 -04:00
echo -n "Partitioning drive..."
parted --script "$DRIVE_TARGET" \
mklabel gpt \
2021-08-09 14:51:18 -04:00
mkpart swap ext4 1MiB 4GiB \
2021-08-09 10:44:29 -04:00
mkpart boot ext4 4GiB 5Gib \
mkpart root ext4 5GiB 100%
2021-08-05 21:29:58 -04:00
echo "done"
2021-08-09 10:44:29 -04:00
echo -n "Configuring SWAP partition..."
quiet mkswap -L SWAP "$DRIVE_TARGET"1
quiet swapon "$DRIVE_TARGET"1
2021-05-15 19:25:56 -04:00
echo "done"
2021-08-09 10:44:29 -04:00
echo -n "Configuring ROOT partition..."
quiet mkfs.ext4 -L ROOT "$DRIVE_TARGET"3
quiet mount "$DRIVE_TARGET"3 /mnt
2021-05-15 19:25:56 -04:00
echo "done"
2021-08-09 10:44:29 -04:00
echo -n "Configuring BOOT partition..."
if [ $UEFI -eq 1 ]; then
2021-08-09 14:56:57 -04:00
quiet mkfs.fat -F 32 "$DRIVE_TARGET"2
2021-08-09 10:44:29 -04:00
fatlabel "$DRIVE_TARGET"2 BOOT
else
quiet mkfs.ext4 -L BOOT "$DRIVE_TARGET"2
fi
mkdir /mnt/boot
mount "$DRIVE_TARGET"2 /mnt/boot
2021-05-15 17:55:45 -04:00
echo "done"
2021-05-14 14:06:20 -04:00
}
2021-08-09 14:48:22 -04:00
install_base() {
print_phase "System installation"
echo -n "Installing base system, kernel, bootloader and vi..."
2021-08-10 09:17:16 -04:00
quiet basestrap /mnt base base-devel linux linux-firmware grub vi
echo "done"
2021-08-09 14:48:22 -04:00
2021-08-09 18:33:49 -04:00
if [ "$DISTRO" = "artix" ]; then
2021-08-09 14:48:22 -04:00
if [ "$INIT_SYS" = "openrc-init" ]; then
echo -n "Installing openrc..."
quiet basestrap /mnt openrc elogind-openrc
echo "done"
else
echo
echo "Error: Unsupported init system \"$INIT_SYS\""
exit 1
fi
2021-08-10 09:17:16 -04:00
elif [ "$DISTRO" != "arch" ]; then
echo "Error: Unsupported distro \"$DISTRO\""
2021-08-09 14:48:22 -04:00
fi
2021-08-10 09:17:16 -04:00
echo -n "Generating fstab..."
fstabgen -U /mnt >> /mnt/etc/fstab
echo "done"
2021-08-09 14:48:22 -04:00
}
2021-08-09 19:53:23 -04:00
set_timezone() {
2021-08-09 14:48:22 -04:00
echo "Choose timezone:"
qpushd /mnt/usr/share/zoneinfo
ln -sf "/mnt/usr/share/zoneinfo/$(fzf --layout=reverse --height=20)" /mnt/etc/localtime
qpopd
quiet chroot /mnt hwclock --systohc
2021-08-09 19:53:23 -04:00
}
2021-08-09 14:48:22 -04:00
2021-08-09 19:53:23 -04:00
set_locale() {
2021-08-09 14:48:22 -04:00
echo "Choose locale:"
local LOCALE=$(cat /mnt/etc/locale.gen | sed '/^#\s/D' | sed '/^#$/D' | sed 's/^#//' | fzf --layout=reverse --height=20)
2021-08-09 17:58:15 -04:00
echo -n "Configuring locale..."
2021-08-09 14:48:22 -04:00
cat /mnt/etc/locale.gen | sed "s/^#$LOCALE/$LOCALE/" > /tmp/locale.gen
mv /tmp/locale.gen /mnt/etc/locale.gen
quiet chroot /mnt locale-gen
echo "export LANG=\"en_US.UTF-8\"" > /mnt/etc/locale.conf
echo "export LC_COLLATE=\"C\"" >> /mnt/etc/locale.conf
2021-08-09 17:58:15 -04:00
echo "done"
2021-08-09 19:53:23 -04:00
}
2021-08-09 14:48:22 -04:00
2021-08-09 19:53:23 -04:00
setup_grub() {
2021-08-09 14:48:22 -04:00
echo -n "Configuring boot loader..."
if [ $UEFI -eq 1 ]; then
quiet chroot /mnt grub-install --target=x86_64-efi --efi-directory=/boot --botloader-id=grub
else
quiet chroot /mnt grub-install "$DRIVE_TARGET"
fi
quiet chroot grub-mkconfig -o /boot/grub/grub.cfg
echo "done"
2021-08-09 19:53:23 -04:00
}
2021-08-09 14:48:22 -04:00
2021-08-09 19:53:23 -04:00
setup_users() {
2021-08-09 14:48:22 -04:00
echo "Type root password:"
2021-08-09 17:58:15 -04:00
chroot /mnt passwd -q
2021-08-09 14:48:22 -04:00
echo -n "Type your personal username: "
local user
read user
chroot /mnt useradd -m "$user"
2021-08-09 17:58:15 -04:00
echo "Type your password:"
chroot /mnt passwd -q "$user"
2021-08-09 19:53:23 -04:00
}
2021-08-09 14:48:22 -04:00
2021-08-09 19:53:23 -04:00
setup_network() {
2021-08-09 14:48:22 -04:00
echo -n "Type the machine hostname: "
local hostname
read hostname
2021-08-09 17:58:15 -04:00
echo -n "Configuring hostname and network..."
2021-08-09 14:48:22 -04:00
echo "$hostname" > /mnt/etc/hostname
echo "127.0.0.1 localhost" > /mnt/etc/hosts
echo "::1 localhost" >> /mnt/etc/hosts
echo "127.0.1.1 $hostname.localdomain $hostname" >> /mnt/etc/hosts
2021-08-09 18:33:49 -04:00
if [ "$DISTRO" = "artix" ]; then
2021-08-09 14:48:22 -04:00
if [ "$INIT_SYS" = "openrc-init" ]; then
echo "hostname=\"$hostname\"" > /mnt/etc/conf.d/hostname
quiet chroot pacman -S connman-openrc
quiet chroot rc-update add connmand
fi
quiet chroot pacman -S dhcpcd wpa_supplicant
fi
2021-08-09 17:58:15 -04:00
echo "done"
2021-08-09 19:53:23 -04:00
}
configure() {
print_phase "System configuration"
download_fzf
set_timezone
set_locale
setup_grub
setup_users
setup_network
2021-08-09 14:48:22 -04:00
umount -R /mnt
echo -n "Ready to reboot. Press any key to continue..."
read dummy
reboot
}
2021-08-09 10:44:29 -04:00
main() {
2021-08-09 14:48:22 -04:00
partition
install_base
configure
2021-08-09 10:44:29 -04:00
}
2021-05-15 17:55:45 -04:00
2021-08-09 10:44:29 -04:00
main