From 7a4c72fb50c2864e37818880a7cf7b223290da5b Mon Sep 17 00:00:00 2001 From: Blake Romero Date: Tue, 16 Apr 2024 18:29:05 +0100 Subject: Add minimal install script --- min.sh | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 min.sh diff --git a/min.sh b/min.sh new file mode 100644 index 0000000..90cf60b --- /dev/null +++ b/min.sh @@ -0,0 +1,173 @@ +#!/bin/bash + +# CONFIG +# ====================================================== +# Drive +drive="/dev/DRIVE" +root="/dev/DRIVE1" +boot="/dev/DRIVE2" + +# System +timezone=Europe/London +locale=en_GB +user=blake +user_groups=wheel,video,audio,input,seat +hostname=ArtixPC + +# INSTALLATION +# ====================================================== + +# Ensure nothing mounted +umount -R /mnt &> /dev/null + +# Init shell environment +set -e + +# Checks +[[ "${drive}" == "/dev/DRIVE" ]] \ + && { echo "You forgot to set the DRIVE option!"; exit; } + +echo "Checking for internet connection..." +ping -c 3 artixlinux.org 2>&1 /dev/null \ + || { echo "No internet connection found"; exit; } + +# Enable ntpd to update time +dinitctl start ntpd + +# Calculate SWAP size +pacman --needed --noconfirm -Sy bc +ram_kB=$(awk 'FNR==1 {print $2}' /proc/meminfo) +ram_gb=$(bc <<< "${ram_kB} / 1000^2") +[[ "${ram_gb}" -lt 1 ]] && { echo "Not enough ram for SWAP"; exit; } +[[ -z "${swap_size}" || "${swap_size}" == auto ]] \ + && swap_size="$(bc <<< "sqrt(${ram_gb}) * 4")G" + +# Request confirmation +drive_bytes=$(blockdev --getsize64 "${drive}") +drive_size="$(bc <<< "${drive_bytes} / 1000000000")G" +echo " +================ CONFIRM INSTALLATION ================ +DRIVE: ${drive} (size: ${drive_size}) +ROOT: ${root} +BOOT: ${boot} +------------------------------------------------------ +!!! CAUTION: ALL data from ${drive} will be erased !!! +------------------------------------------------------ +Are you sure you want install? +" +unset input +read -rp "Type YES (in uppercase letters) to begin installation: " input +[[ "${input}" != "YES" ]] && exit + +# Create partitions +wipefs -a "${drive}" +layout=',+,L\n' +[[ -d /sys/firmware/efi/efivars/ ]] && layout=",1G,U,*\n${layout}" +printf "%s" "$layout" | sfdisk -qf -X gpt ${drive} + +# Make file-systems +[[ -d /sys/firmware/efi/efivars/ ]] && mkfs.fat -n BOOT -F 32 "${boot}" +mkfs.ext4 -qfL ROOT "$root" + +# Mount +mount "${root}" /mnt && mkdir /mnt/boot +[[ -d /sys/firmware/efi/efivars/ ]] && mount "${boot}" /mnt/boot + +# Make Swap +fallocate -l "$swap_size" /mnt/swapfile && chmod 600 /mnt/swapfile +mkswap /mnt/swapfile + +# Get CPU type & install microcode +ucode=amd-ucode +[[ $(grep "vendor_id" /proc/cpuinfo) == *Intel* ]] && ucode=intel-ucode + +# Sync packages +pacman -Syy + +# Install base packages +basestrap /mnt base base-devel dinit seatd-dinit pam_rundir + +# Install Linux & utilities +basestrap /mnt \ + linux-{firmware,headers} "${ucode}" \ + grub efibootmgr os-prober \ + git nano man-{db,man-pages} bc btop + +# Install services +basestrap /mnt {iwd,openntpd,cronie,openssh,ufw}-dinit + +# Enable DHCP client for iwd +printf "[General]\nEnableNetworkConfiguration=true" >> /mnt/etc/iwd/main.conf + +# Enable services +services="ufw iwd openntpd cronie" +for service in $services; do + artix-chroot /mnt bash -c "dinitctl enable $service" +done + +# Generate file-system table +fstabgen -U /mnt >> /mnt/etc/fstab + +# Set swappiness levels +mkdir -p /mnt/etc/sysctl.d/ +echo vm.swappiness=10 > /mnt/etc/sysctl.d/99-swappiness.conf + +# Set locale +printf "%s.UTF-8 UTF-8\n%s ISO-8859-1" "$locale" "$locale" >> /mnt/etc/locale.gen +printf "LANG=%s.UTF-8\nexport LC_COLLATE=C" "$locale" > /mnt/etc/locale.conf +artix-chroot /mnt bash -c "locale-gen" + +# Set timezone +artix-chroot /mnt bash -c \ + "ln -sf /usr/share/zoneinfo/${timezone} /etc/localtime && hwclock -w" + +# Set default text editor +echo "export EDITOR=nano" >> /mnt/etc/profile + +# Set hostname +echo "$hostname" > /mnt/etc/hostname + +# Set root password +artix-chroot /mnt bash -c "echo root:artix | chpasswd" + +# Add new user +artix-chroot /mnt bash -c "useradd -mG ${user_groups} ${user}" +artix-chroot /mnt bash -c "echo \"${user}:artix\" | chpasswd" + +# Set user privileges +echo " +Cmnd_Alias STAT = /usr/bin/ufw status +Cmnd_Alias PACMAN = /usr/bin/checkupdates +Cmnd_Alias REBOOT = /bin/halt,/bin/reboot +Defaults pwfeedback +%wheel ALL=(ALL) ALL +${user} ALL=(ALL) NOPASSWD:PACMAN,REBOOT,STAT +" >> /mnt/etc/sudoers + +# Add PACMAN download style +# Set MAKEFLAGS to match CPU threads for faster compiling +cp /etc/makepkg.conf /etc/makepkg.conf.bak +sed "s/#MAKEFLAGS=\".*\"/MAKEFLAGS=\"-j$(nproc)\"/" \ + -i /mnt/etc/makepkg.conf + +# Configure GRUB +# install grub +grub_options="--target=i386-pc --recheck ${drive}" +[[ -d /sys/firmware/efi/efivars/ ]] \ + && grub_options="--target=x86_64-efi --efi-directory=/boot --bootloader-id=GRUB" + +artix-chroot /mnt bash -c \ + "grub-install ${grub_options} && grub-mkconfig -o /boot/grub/grub.cfg" + +# FINISH +umount -R /mnt +swapoff -a +set +x + +echo " +====================================================================== + Installation Finished +====================================================================== +" +echo "You can now reboot and log into system" +echo "NOTE: AFTER reboot be sure to enable the firewall with 'ufw enable'" -- cgit