From bf23fa1e84dd26f6310d22adf5244cb12c20fc9d Mon Sep 17 00:00:00 2001 From: Pratham Patel Date: Sun, 20 Nov 2022 16:57:35 +0530 Subject: [PATCH] init commit --- install-archlinux.sh | 235 ++++++++++++++++++++++++++++++++++++ reflector | 9 ++ scripts/chroot-setup.sh | 119 ++++++++++++++++++ scripts/install-packages.sh | 96 +++++++++++++++ scripts/pratham-setup.sh | 131 ++++++++++++++++++++ 5 files changed, 590 insertions(+) create mode 100755 install-archlinux.sh create mode 100644 reflector create mode 100644 scripts/chroot-setup.sh create mode 100644 scripts/install-packages.sh create mode 100644 scripts/pratham-setup.sh diff --git a/install-archlinux.sh b/install-archlinux.sh new file mode 100755 index 0000000..54f91af --- /dev/null +++ b/install-archlinux.sh @@ -0,0 +1,235 @@ +#!/usr/bin/env bash + +#set -x + + +################################################################################ +# PRE-INSTALLATION +################################################################################ + +# check for internet connectivity +ping -c 1 google.com >/dev/null 2>&1 +if [[ ! $? -eq 0 ]]; then + echo "No internet access :(" + exit 1 +fi + +# check if the user is root +if [[ $EUID -ne 0 ]]; then + echo "This script needs to be run as the root user :(" + exit 1 +fi + +# detect if Arch Linux booted into Legacy BIOS or UEFI +if [[ ! "$(ls -A /sys/firmware/efi/efivars)" ]]; then + echo "This script was tailored for a system with UEFI." + echo "Please modify this script manually :(" + exit 1 +fi + + +################################################################################ +# SELECT THE FASTEST "HTTPS" MIRRORS +################################################################################ + +pacman -Sy --noconfirm reflector +MIRRORLIST_FILE="/etc/pacman.d/mirrorlist" + +# check if reflector is already running +pgrep reflector >/dev/null +if [[ $? -eq 0 ]]; then + IS_REFLECTOR_RUNNING=y +else + IS_REFLECTOR_RUNNING=n +fi + +# remove $MIRRORLIST_FILE if file modification time is more than 10 days +if [[ ! $(find "$MIRRORLIST_FILE" -mtime +10) && $IS_REFLECTOR_RUNNING == "n" ]]; then + rm -f "$MIRRORLIST_FILE" +fi + +# pacman config +sed -i "s/#ParallelDownloads = 5/ParallelDownloads = 10/" /etc/pacman.conf || echo "ParallelDownloads = 10" | tee -a /etc/pacman.conf + +# start finding the best mirrors in the background +if [[ ! -f "$MIRRORLIST_FILE" && $IS_REFLECTOR_RUNNING == "n" ]]; then + reflector \ + --connection-timeout 2 \ + --latest 100 \ + --sort rate \ + --fastest 10 \ + --protocol https \ + --save /etc/pacman.d/mirrorlist >/dev/null 2>&1 & +fi + +################################################################################ +# SET THINGS UP FOR INSTALLATION +################################################################################ + +# set some global variables +FONT_BOLD=$(tput bold) +FONT_NORM=$(tput sgr0) +YES_NO_OPTION="$FONT_BOLD(y/n)$FONT_NORM" + +# update system clock +timedatectl set-ntp true + + +################################################################################ +# CHOOSE A DRIVE ON WHICH ARCH LINUX WILL BE INSTALLED +################################################################################ + +# choose the drive to install Arch Linux on +OS_DRIVE=empty +CORRECTLY_CHOSEN=n +VM_SYS_NAME=$(dmidecode -s system-manufacturer) + +if [[ $(grep 'AuthenticAMD' /proc/cpuinfo) ]]; then + CPU_VENDOR_NAME="amd" +elif [[ $(grep 'GenuineIntel' /proc/cpuinfo) ]]; then + CPU_VENDOR_NAME="intel" +else + CPU_VENDOR_NAME="nanyabusiness" +fi + +while [[ $CORRECTLY_CHOSEN == "n" || $CORRECTLY_CHOSEN == "N" ]]; do + tput -x clear + fdisk -l + + echo -e "\n\nPlease input the full path of the storage device onto which Arch Linux should be installed: (eg: $FONT_BOLD/dev/sda$FONT_NORM)" + read OS_DRIVE + + tput -x clear + fdisk -l "$OS_DRIVE" + + echo -e "\n\nIs this the drive you want to install Arch Linux on? $YES_NO_OPTION" + read CORRECTLY_CHOSEN +done + + +################################################################################ +# FORMAT THE DRIVE ON WHICH ARCH LINUX WILL BE INSTALLED +################################################################################ + +# partition the drive +FORMAT_YES=no +SEPARATE_HOME_ROOT=no +TOTAL_DEV_SIZE_IN_BYTES=$(blockdev --getsize64 ${OS_DRIVE}) + +UEFI_PART_SIZE=513MiB +ROOT_PART_SIZE=10GiB + +tput -x clear + +echo "Do you want a separate \`home\` and \`root\` partition? $YES_NO_OPTION" +read SEPARATE_HOME_ROOT + +if [[ $SEPARATE_HOME_ROOT == "Y" || $SEPARATE_HOME_ROOT == "y" ]]; then + tput -x clear + + echo "You chose that you want separate home and root partitions." + echo "You will$FONT_BOLD not$FONT_NORM be asked for the Home partition's size. It will occupy the remaining space.\n" + echo "Please enter the size of root partition in GiB (without the unit)." + echo -e "10% or 12GB (whichever is greater) of the total drive space is usually a good idea.\n" + read ROOT_PART_SIZE + + ROOT_PART_SIZE="$ROOT_PART_SIZE""GiB" +fi + + +################################################################################ +# CREATE PARTITIONS +################################################################################ + +# create the disk partitions +tput -x clear + +echo -e "Your drive will be split into 3 partitions:\n\n" +echo -e " mount point | filesystem | size " +echo -e "-------------|------------|----------" +echo -e " /boot/ | EFI | 512Mib " +echo -e " / | ext4 | $ROOT_PART_SIZE" +echo -e " /home | ext4 | " + +echo -e "\n\nDoes the above look good to you? $YES_NO_OPTION\n" +read FORMAT_YES + +if [[ $FORMAT_YES == "y" || $FORMAT_YES == "Y" ]]; then + parted -s "$OS_DRIVE" mklabel gpt + parted -s "$OS_DRIVE" mkpart primary fat32 1 513MiB + parted -s "$OS_DRIVE" mkpart logical ext4 514MiB $ROOT_PART_SIZE + parted -s "$OS_DRIVE" mkpart logical ext4 $ROOT_PART_SIZE 100% + parted -s "$OS_DRIVE" set 1 boot on +else + exit 1 +fi + + +################################################################################ +# MOUNT PARTITIONS +################################################################################ + +# check what kind of storage device $OS_DRIVE is +if [[ "$OS_DRIVE" =~ "sd" || "$OS_DRIVE" =~ "vd" ]]; then + UEFI_PARTITION="$OS_DRIVE""1" + ROOT_PARTITION="$OS_DRIVE""2" + HOME_PARTITION="$OS_DRIVE""3" +elif [[ "$OS_DRIVE" =~ "nvme" ]]; then + UEFI_PARTITION="$OS_DRIVE""p1" + ROOT_PARTITION="$OS_DRIVE""p2" + HOME_PARTITION="$OS_DRIVE""p3" +fi + +# format partitions +mkfs.fat -F32 "$UEFI_PARTITION" +mkfs.ext4 -F "$HOME_PARTITION" +mkfs.ext4 -F "$ROOT_PARTITION" + +# mount the partitions +mount ${ROOT_PARTITION} /mnt +mount --mkdir ${UEFI_PARTITION} /mnt/boot +mount --mkdir ${HOME_PARTITION} /mnt/home + + +################################################################################ +# INITIATE PACKAGE INSTALLATION +################################################################################ + +# check and copy mirrorlist +while [[ ! -f "$MIRRORLIST_FILE" ]]; do + tput -x clear + echo "$(date +'%Y/%m/%d %H:%M:%S') => Waiting for the mirrorlist to be generated. Please be patient." + sleep 10 +done +mkdir -p /mnt/etc/pacman.d/ +cp ${MIRRORLIST_FILE} /mnt"$MIRRORLIST_FILE" + +# update pacman db +pacman --sync --refresh --refresh + +# install packages +bash scripts/install-packages.sh "$CPU_VENDOR_NAME" + +# generate fstab +genfstab -U /mnt >> /mnt/etc/fstab + +# chroot setup +mkdir -p /mnt/chroot-scripts +cp scripts/chroot-setup.sh /mnt/chroot-scripts/ +arch-chroot /mnt bash /chroot-scripts/chroot-setup.sh "$CPU_VENDOR_NAME" "$ROOT_PARTITION" +if [[ $? -ne 0 ]]; then + exit 1 +fi + +# copy the setup script that can only be done after pratham logs in +cp scripts/pratham-setup.sh /mnt/home/pratham/pratham-setup.sh +arch-chroot /mnt chmod +x /home/pratham/pratham-setup.sh +arch-chroot /mnt chown -v pratham:pratham /home/pratham/pratham-setup.sh + + +################################################################################ +# POST-INSTALL PROCEDURE +################################################################################ + +# unmount filesystems +umount -R /mnt diff --git a/reflector b/reflector new file mode 100644 index 0000000..d8b6fa5 --- /dev/null +++ b/reflector @@ -0,0 +1,9 @@ +#!/usr/bin/env bash + +reflector \ + --connection-timeout 2 \ + --latest 100 \ + --sort rate \ + --fastest 10 \ + --protocol https \ + --save /etc/pacman.d/mirrorlist diff --git a/scripts/chroot-setup.sh b/scripts/chroot-setup.sh new file mode 100644 index 0000000..379515e --- /dev/null +++ b/scripts/chroot-setup.sh @@ -0,0 +1,119 @@ +#!/usr/bin/env bash + +# $1: CPU Vendor (AMD/Intel) +# $2: Device that is mounted at "$ESP_PATH" + + +################################################################################ +ROOT_CRONTAB="# remove cache every 2 hours and update local db +0 */2 * * * paccache -r >/dev/null 2>&1 +0 * * * * pacman --sync --refresh >/dev/null 2>&1 + +# update the on-disk database every 6 hours +0 */6 * * * updatedb >/dev/null 2>&1 +" +################################################################################ + +tput -x clear + +################################################################################ +# BASIC CHROOT SETUP +################################################################################ + +# exit early if mirrorlist does not exist +if [[ ! -f "/etc/pacman.d/mirrorlist" ]]; then + echo "A mirrorlist does not exist :(" + exit 1 +fi + +# exit early if $1 is an unknown vendor +if [[ "$1" == "nanyabusiness" ]]; then + echo "CPU Vendor is not AMD nor Intel. This will interfere with generating \"\$ESP_PATH\"/loader/entries/arch.conf" + exit 1 +fi + +# set timezone +ln -sf /usr/share/zoneinfo/Asia/Kolkata /etc/localtime +hwclock --systohc + +# generate locale +echo "en_IN UTF-8" > /etc/locale.gen +locale-gen + +# set the machine hostname +echo "vasudev" > /etc/hostname + +# create a new initramfs just to be safe +mkinitcpio -P +echo "initramfs successfully created" + + +################################################################################ +# BASIC CHROOT SETUP +################################################################################ + +# pacman config +sed -i "s/#ParallelDownloads = 5/ParallelDownloads = 10/" /etc/pacman.conf || echo "ParallelDownloads = 10" | tee -a /etc/pacman.conf + +# update pacman db +pacman --sync --refresh --refresh --sysupgrade + +################################################################################ +# USER SETUP +################################################################################ + +# setup the user pratham +useradd -m -G adm,ftp,games,http,log,rfkill,sys,systemd-journal,uucp,wheel -s /bin/zsh pratham +usermod --password $(echo pratham | openssl passwd -1 -stdin) pratham +passwd -e pratham + +# setup the root user +usermod --password $(echo root | openssl passwd -1 -stdin) root + +# setup doas for pratham +echo "permit persist keepenv pratham" | tee -a /etc/doas.conf + +# setup root user's cron jobs +echo "${ROOT_CRONTAB}" | crontab - + + +################################################################################ +# BOOT MANAGER +################################################################################ + +ESP_PATH="/boot" + +# install a boot manager +bootctl --esp-path="$ESP_PATH" --path="$ESP_PATH" install + +# configure systemd-boot +mkdir -p "$ESP_PATH"/loader/entries + +cat < "$ESP_PATH"/loader/loader.conf +default arch.conf +timeout 0 +console-mode auto +editor no +auto-firmware no +EOF + +cat < "$ESP_PATH"/loader/entries/arch.conf +title Arch Linux btw +linux /vmlinuz-linux +initrd /$1-ucode.img +initrd /initramfs-linux.img +options root=UUID=$(blkid $2 -s UUID -o value) rw systemd.show_status=false mem_sleep_default=deep splash +EOF + +# enable services +systemctl enable systemd-boot-update.service +systemctl enable sddm.service +systemctl enable NetworkManager.service +systemctl enable sshd.service + +# update bootloader +bootctl update + +# check bootloader config +bootctl list +read wait_until_input diff --git a/scripts/install-packages.sh b/scripts/install-packages.sh new file mode 100644 index 0000000..65aed02 --- /dev/null +++ b/scripts/install-packages.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + + +################################################################################ +# install packages +################################################################################ + +# update pacman db +pacman --sync --refresh --refresh + + +# absolutely necessary for _MY_ experience +PKGS_TO_INSTALL=(base bash cron curl dhcpcd dnsutils doas efibootmgr findutils grub iputils less libdrm linux linux-firmware lsb-release lsof man man-db man-pages nano neovim openssh openssl os-prober pacman-contrib reflector rsync tmux wireguard-tools zsh zsh-completions zsh-syntax-highlighting) + +# power management +PKGS_TO_INSTALL+=(acpi_call iasl) + +# add-on +PKGS_TO_INSTALL+=(flatpak ffmpeg light) + +# monitoring +PKGS_TO_INSTALL+=(btop htop iotop iperf iperf3 nload) + +# containersation stuff +#PKGS_TO_INSTALL+=(aardvark-dns bridge-utils fuse-overlayfs podman podman-compose podman-dnsname slirp4netns) + +# download clients +PKGS_TO_INSTALL+=(aria2 wget yt-dlp) + +# android-stuff +PKGS_TO_INSTALL+=(android-tools) + +# *utils-rust +PKGS_TO_INSTALL+=(bat fd ripgrep tre) + +# system utilities +PKGS_TO_INSTALL+=(hd-idle hdparm tldr smartmontools wol) + +# compression +PKGS_TO_INSTALL+=(tar unrar unzip xz zip) + +# software devel + + +# kernel devel +PKGS_TO_INSTALL+=(base-devel bc cpio gcc git graphviz imagemagick inetutils kmod libelf linux-headers pahole perl python-sphinx python-sphinx_rtd_theme tar texlive-latexextra xmlto xz) + +# virtualisation + + +# network filesystems +PKGS_TO_INSTALL+=(avahi nfs-utils samba smbclient) +PKGS_TO_INSTALL+=(kdenetwork-filesharing) +#PKGS_TO_INSTALL+=(gvfs-smb + +# zfs + + +# GPU +PKGS_TO_INSTALL+=(mesa qemu-hw-display-virtio-gpu qemu-hw-display-virtio-gpu-gl qemu-hw-display-virtio-gpu-pci qemu-hw-display-virtio-gpu-pci-gl qemu-hw-s390x-virtio-gpu-ccw) +#PKGS_TO_INSTALL+=(libva-mesa-driver mesa radeontop vulkan-radeon) +#PKGS_TO_INSTALL+=(intel-media-driver libva-intel-driver mesa vulkan-intel) + +# Display Server (Wayland) +PKGS_TO_INSTALL+=(libdrm wayland) + +# Window Manager (Wayland) + + +# Desktop Environment (Wayland) +PKGS_TO_INSTALL+=(kcalc kcharselect kdf kdialog ktimer print-manager plasma plasma-meta kde-system-meta plasma-wayland-session) + +# GUI +PKGS_TO_INSTALL+=(alacritty firefox meld mpv slurp) + +# Sound +PKGS_TO_INSTALL+=(pipewire pipewire-pulse) +#PKGS_TO_INSTALL+=(alsa-firmware alsa-lib alsa-utils gst-plugins-good gstreamer libao libcanberra-gstreamer libcanberra-pulse pulseaudio pulseaudio-alsa) + +# ??? +#PKGS_TO_INSTALL+=(exfatprogs netcfg otf-overpass) + +# xorg +#PKGS_TO_INSTALL+=(libdrm libva-mesa-driver qemu-hw-display-virtio-gpu qemu-hw-display-virtio-gpu-gl qemu-hw-display-virtio-gpu-pci qemu-hw-display-virtio-gpu-pci-gl qemu-hw-s390x-virtio-gpu-ccw xf86-input-libinput xf86-input-synaptics xf86-input-wacom xf86-video-qxl xf86-video-vmware xorg xorg-apps xorg-fonts-alias xorg-fonts-encodings xorg-fonts-misc xorg-server xorg-xauth xorg-xinit xorg-xkbutils) +#PKGS_TO_INSTALL+=(intel-media-driver libva-intel-driver vulkan-intel) +#PKGS_TO_INSTALL+=(xf86-video-amdgpu radeontop vulkan-radeon) + + +# install x86 microcode +if [[ "$1" == "amd" ]]; then + PKGS_TO_INSTALL+=(amd-ucode) +elif [[ "$1" == "intel" ]]; then + PKGS_TO_INSTALL+=(intel-ucode) +fi + +pacstrap -K /mnt "${PKGS_TO_INSTALL[@]}" diff --git a/scripts/pratham-setup.sh b/scripts/pratham-setup.sh new file mode 100644 index 0000000..0495c51 --- /dev/null +++ b/scripts/pratham-setup.sh @@ -0,0 +1,131 @@ +#!/usr/bin/env bash + +################################################################################ +# INITIAL SETUP +################################################################################ + +# set hostname +WHAT_IS_MY_HOSTNAME=$(cat /etc/hostname) +if [[ $WHAT_IS_MY_HOSTNAME != "vasudev" ]]; then + hostnamectl set-hostname vasudev + WHAT_IS_MY_HOSTNAME=whoopsie +fi + +# set timezone +WHAT_IS_MY_TZ=$(readlink /etc/localtime) +if [[ ! $WHAT_IS_MY_TZ =~ "Asia/Kolkata" ]]; then + timedatectl set-timezone Asia/Kolkata + WHAT_IS_MY_TZ=whoopsie +fi + +# reboot to bring hostname in effect +if [[ $WHAT_IS_MY_TZ == "whoopsie" || $WHAT_IS_MY_HOSTNAME == "whoopsie" ]]; then + systemctl reboot +fi + + +################################################################################ +# SETUP DEV ENVIRONMENT +################################################################################ + +# rust-lang +curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh +rustup default stable +rustup component add rust-src rust-analyzer +rustup component add rust-analysis +cargo install cargo-outdated cargo-tree + + +# neovim (vim-plug) +sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim' + +# create ssh keys +if [[ ! -d $HOME/.ssh ]]; then + mkdir $HOME/.ssh + chmod 700 $HOME/.ssh +fi +pushd $HOME/.ssh +ssh-keygen -t ed25519 -f bluefeds +ssh-keygen -t ed25519 -f flameboi +ssh-keygen -t ed25519 -f gitea +ssh-keygen -t ed25519 -f github +ssh-keygen -t ed25519 -f gitlab +ssh-keygen -t ed25519 -f sentinel +popd + +# IP address for server is hidden behind cloudflare proxy +tput -x clear +cat < $HOME/.ssh/config +Host git.thefossguy.com + Hostname ::? + User git + IdentityFile ~/.ssh/gitea + Port 22 +EOF +echo "Populate Hostname (IP addr) for \"git.thefossguy.com\" in ~/.ssh/config" +bash + +# get dotfiles +cat $HOME/.ssh/gitea.pub +echo -ne "\n\n\n\n" + +pushd $HOME +git clone git@git.thefossguy.com:thefossguy/dotfiles-priv.git +git clone git@git.thefossguy.com:thefossguy/dotfiles.git +popd + +rsync \ + --verbose --recursive --size-only --human-readable \ + --progress --stats \ + --itemize-changes --checksum \ + --exclude=".git" --exclude=".gitignore" --exclude="README.md" \ + ~/dotfiles/ ~/ + +rsync \ + --verbose --recursive --size-only --human-readable \ + --progress --stats \ + --itemize-changes --checksum \ + --exclude=".git" --exclude=".gitignore" \ + ~/dotfiles-priv/ ~/ + +# podman? +#grep net.ipv4.ping_group_range /etc/sysctl.conf || echo "net.ipv4.ping_group_range=0 $(grep pratham /etc/subuid | awk -F ":" '{print $2 + $3}')" | doas tee -a /etc/sysctl.conf + + +################################################################################ +# AUR-RELATED +################################################################################ + +# install necessary packages for installing \`paru\` +doas pacman -S --needed base-devel + +# build paru +mkdir /tmp/parutemp-PARU +pushd /temp/parutemp-PARU + +git clone --depth 1 https://aur.archlinux.org/paru.git +makepkg -si +if [[ $? -ne 0 ]]; then + tput -x clear + echo "paru wasn't installed successfully :(" + exit 1 +fi +popd + +# AUR pkgs +paru -S qomui noisetorch ssmtp +paru -S zfs-dkms + +# wayland-WM +#paru -S hyperland + +# intel +#paru -S libva-intel-driver-g45-h264 intel-hybrid-codec-driver + + +################################################################################ +# WRAP UP +################################################################################ + +tput -x clear +echo "vim-plug for nvim has been installed, please fetch the plugins using the \'`:PlugInstall\` command"