Skip to content

Instantly share code, notes, and snippets.

@rasschaert
Last active July 27, 2022 12:43
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save rasschaert/0bb7ebc506e26daee585 to your computer and use it in GitHub Desktop.
Save rasschaert/0bb7ebc506e26daee585 to your computer and use it in GitHub Desktop.
Shell script that performs the installation of Arch Linux the way I like it.
#!/bin/bash
bootstrapper_dialog() {
DIALOG_RESULT=$(dialog --clear --stdout --backtitle "Arch bootstrapper" --no-shadow "$@" 2>/dev/null)
}
#################
#### Welcome ####
#################
bootstrapper_dialog --title "Welcome" --msgbox "Welcome to Kenny's Arch Linux bootstrapper.\n" 6 60
##############################
#### UEFI / BIOS detection ###
##############################
efivar -l >/dev/null 2>&1
if [[ $? -eq 0 ]]; then
UEFI_BIOS_text="UEFI detected."
UEFI_radio="on"
BIOS_radio="off"
else
UEFI_BIOS_text="BIOS detected."
UEFI_radio="off"
BIOS_radio="on"
fi
bootstrapper_dialog --title "UEFI or BIOS" --radiolist "${UEFI_BIOS_text}\nPress <Enter> to accept." 10 30 2 1 UEFI "$UEFI_radio" 2 BIOS "$BIOS_radio"
[[ $DIALOG_RESULT -eq 1 ]] && UEFI=1 || UEFI=0
#################
#### Prompts ####
#################
bootstrapper_dialog --title "Hostname" --inputbox "Please enter a name for this host.\n" 8 60
hostname="$DIALOG_RESULT"
##########################
#### Password prompts ####
##########################
bootstrapper_dialog --title "Disk encryption" --passwordbox "Please enter a strong passphrase for the full disk encryption.\n" 8 60
encryption_passphrase="$DIALOG_RESULT"
bootstrapper_dialog --title "Root password" --passwordbox "Please enter a strong password for the root user.\n" 8 60
root_password="$DIALOG_RESULT"
#################
#### Warning ####
#################
bootstrapper_dialog --title "WARNING" --msgbox "This script will NUKE /dev/sda from orbit.\nPress <Enter> to continue or <Esc> to cancel.\n" 6 60
[[ $? -ne 0 ]] && (bootstrapper_dialog --title "Cancelled" --msgbox "Script was cancelled at your request." 5 40; exit 0)
##########################
#### reset the screen ####
##########################
reset
#########################################
#### Nuke and set up disk partitions ####
#########################################
echo "Zapping disk"
sgdisk --zap-all /dev/sda
echo "Creating /dev/sda1"
if [[ $UEFI -eq 1 ]]; then
printf "n\n1\n\n+1G\nef00\nw\ny\n" | gdisk /dev/sda
yes | mkfs.fat -F32 /dev/sda1
else
printf "n\np\n1\n\n+200M\nw\n" | fdisk /dev/sda
yes | mkfs.xfs /dev/sda1
fi
echo "Creating /dev/sda2"
if [[ $UEFI -eq 1 ]]; then
printf "n\n2\n\n\n8e00\nw\ny\n"| gdisk /dev/sda
else
printf "n\np\n2\n\n\nt\n2\n8e\nw\n" | fdisk /dev/sda
fi
echo "Setting up encryption"
printf "%s" "$encryption_passphrase" | cryptsetup luksFormat /dev/sda2 -
printf "%s" "$encryption_passphrase" | cryptsetup open --type luks /dev/sda2 lvm -
echo "Setting up LVM"
pvcreate /dev/mapper/lvm
vgcreate vg00 /dev/mapper/lvm
lvcreate -L 20G vg00 -n lvroot
lvcreate -l +100%FREE vg00 -n lvhome
echo "Creating XFS file systems on top of logical volumes"
yes | mkfs.xfs /dev/mapper/vg00-lvroot
yes | mkfs.xfs /dev/mapper/vg00-lvhome
######################
#### Install Arch ####
######################
mount /dev/vg00/lvroot /mnt
mkdir /mnt/{boot,home}
mount /dev/sda1 /mnt/boot
mount /dev/vg00/lvhome /mnt/home
yes '' | pacstrap -i /mnt base base-devel
genfstab -U -p /mnt >> /mnt/etc/fstab
###############################
#### Configure base system ####
###############################
arch-chroot /mnt /bin/bash <<EOF
echo "Setting and generating locale"
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
locale-gen
export LANG=en_US.UTF-8
echo "LANG=en_US.UTF-8" >> /etc/locale.conf
echo "Setting time zone"
ln -s /usr/share/zoneinfo/Europe/Brussels /etc/localtime
echo "Setting hostname"
echo $hostname > /etc/hostname
sed -i "/localhost/s/$/ $hostname/" /etc/hosts
echo "Installing wifi packages"
pacman --noconfirm -S iw wpa_supplicant dialog wpa_actiond
echo "Generating initramfs"
sed -i 's/^HOOKS.*/HOOKS="base udev autodetect modconf block encrypt lvm2 filesystems keyboard fsck"/' /etc/mkinitcpio.conf
mkinitcpio -p linux
echo "Setting root password"
echo "root:${root_password}" | chpasswd
EOF
#############################
#### Install boot loader ####
#############################
if [[ $UEFI -eq 1 ]]; then
arch-chroot /mnt /bin/bash <<EOF
echo "Installing Gummiboot boot loader"
pacman --noconfirm -S gummiboot
gummiboot install
cat << GRUB > /boot/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /initramfs-linux.img
options cryptdevice=/dev/sda2:vg00 root=/dev/mapper/vg00-lvroot rw
GRUB
EOF
else
arch-chroot /mnt /bin/bash <<EOF
echo "Installing Grub boot loader"
pacman --noconfirm -S grub
grub-install --target=i386-pc --recheck /dev/sda
sed -i 's|^GRUB_CMDLINE_LINUX_DEFAULT.*|GRUB_CMDLINE_LINUX_DEFAULT="quiet cryptdevice=/dev/partition:MyStorage root=/dev/mapper/MyStorage-rootvol"|' /etc/default/grub
grub-mkconfig -o /boot/grub/grub.cfg
EOF
fi
#################
#### The end ####
#################
@osgyan
Copy link

osgyan commented Aug 12, 2019

I think I like your script, I have been working on my own, You saved me a tonne of work.

@rasschaert
Copy link
Author

I think I like your script, I have been working on my own, You saved me a tonne of work.

Hi Rajat, I'm glad you found it to be helpful!

@osgyan
Copy link

osgyan commented Aug 15, 2019

How would you be Interested in taking this and converting this into a Project. I have experience with a distro myself, I was a developer with Archlabs Linux when they started early on. You will find my mention on their about page.

I believe their installer code is very rough and complex we could together build something better than anything out there. I left the project on account of not being able to spend enough time on contribution to the project.

I am looking a a fresh start where a user can download ARCH ISO and git clone our script and do the install without having to call our script a distro. I am looking to build a mechanism for people to install Arch with the click of a button.. Let me know if you are interested.

@rasschaert
Copy link
Author

rasschaert commented Aug 21, 2019

I think it's an interesting idea, but I'm not currently using Arch Linux anymore. I've switched to Debian testing.

@osgyan
Copy link

osgyan commented Aug 21, 2019 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment