fresh/bootstrap.sh

201 lines
5.5 KiB
Bash
Raw Normal View History

2019-06-09 02:32:33 +02:00
#!/bin/bash
2022-03-12 14:59:45 +01:00
# Author: Philip Gaber <phga@posteo.de>
############################################################################
# NOTE: While testing with a VM make sure to enable EFI boot in VM options #
############################################################################
2019-06-09 02:32:33 +02:00
while getopts "p:n:d:" opt;
do case $opt in
p) PASSWD=${OPTARG} ;;
n) NAME=${OPTARG} ;;
d) DEV=${OPTARG} ;;
2022-03-11 20:33:34 +01:00
e) ENC=${OPTARG} ;;
2022-03-11 21:02:58 +01:00
s) SWAP_SIZE=${OPTARG} ;;
2022-03-12 14:21:21 +01:00
k) KERNEL=${OPTARG} ;;
2019-06-09 02:32:33 +02:00
\?) echo "-$OPTARG is not valid" >&2 && exit ;;
esac
done
init() {
2022-03-11 21:20:13 +01:00
sleep 1
2022-03-11 21:02:58 +01:00
echo ""
echo "+---------------------------+"
echo "| Just Some Short Questions |"
echo "+---------------------------+"
echo ""
[ -z "$NAME" ] && read -p "Hostname: " NAME
2022-03-12 14:21:21 +01:00
while [ -z "$PASSWD" ] || [ ! "$PASSWD" == "$CHECK" ]; do
read -sp "Root password: " PASSWD
2020-04-06 03:24:22 +02:00
echo
read -sp "Repeat: " CHECK
done
# Show some possible disks
2022-03-12 14:21:21 +01:00
[ -z "$DEV" ] && lsblk -nrpo "name,size,model" &&
read -p "Provide installation medium (e.g. sda, nvme0n1): " DEV
[[ "$DEV" =~ sd[a-z] ]] && SUF="1-3" && MODE="SATA"
[[ "$DEV" =~ nvme[0-9]n[0-9] ]] && SUF="p1-3" && MODE="NVME"
2022-03-11 21:02:58 +01:00
[ -z "$SWAP_SIZE" ] && read -p "Specify the size for the SWAP partition (16G, 1M, ...): " SWAP_SIZE
2022-03-11 20:33:34 +01:00
[ -z "$ENC" ] && read -p "Do you want the root partition to be encrypted (y/n)? " ENC
2022-03-12 14:21:21 +01:00
[ -z "$KERNEL" ] && read -p "Which kernel? [1: linux, 2: linux-zen]" KERNEL
[ "$KERNEL" == "1" ] && KERNEL="linux" || KERNEL="linux-zen"
2022-03-11 20:38:09 +01:00
[ "$ENC" == "y" ] && ENC=true || ENC=false
echo "+---------------------+"
echo "| Archlinux Bootstrap |"
echo "+---------------------+"
echo "HOSTNAME = $NAME"
echo "ROOTPASSWD = ${PASSWD:0:1}***${PASSWD: -1}"
echo "DEVICEPARTS = $DEV$SUF"
2022-03-11 21:02:58 +01:00
echo "SWAP_SIZE = $SWAP_SIZE"
2022-03-11 20:33:34 +01:00
echo "ENCRYPTION = $ENC"
2022-03-12 14:21:21 +01:00
echo "KERNEL = $KERNEL"
2022-03-11 20:33:34 +01:00
read -p "Do you want to continue with these values (y/n)? " cont
2022-03-12 14:21:21 +01:00
[ ! "$cont" == "y" ] && unset NAME PASSWD DEV ENC SWAP_SIZE KERNEL && init
2020-04-06 03:24:22 +02:00
echo "Let's GOOOO"
}
2022-03-11 20:33:34 +01:00
crypt_prepare_disk() {
set +e
2022-03-11 20:33:34 +01:00
cryptsetup open --type plain -d /dev/urandom $1 wipe_me
dd if=/dev/zero of=/dev/mapper/wipe_me bs=1M status=progress
cryptsetup close wipe_me
set -e
2022-03-11 20:33:34 +01:00
}
crypt_create_fs() {
cryptsetup -y -v luksFormat $1
cryptsetup open $1 root
mkfs.ext4 /dev/mapper/root
}
2019-06-09 02:32:33 +02:00
# stop on error
set -e
# initialize important values
init
2019-06-09 02:32:33 +02:00
2022-03-11 20:33:34 +01:00
[ "$ENC" == true ] && crypt_prepare_disk "/dev/$DEV"
# All values set, start bootstrapping
gdisk /dev/$DEV <<EOF
2019-06-09 02:32:33 +02:00
o
y
n
+1G
ef00
n
2022-03-11 21:02:58 +01:00
+${SWAP_SIZE}
2019-06-09 02:32:33 +02:00
8200
n
8304
w
y
EOF
2022-03-11 20:33:34 +01:00
[ $MODE == "NVME" ] && suffix="p" || suffix=""
if [ "$ENC" == true ]; then
2022-03-11 21:20:13 +01:00
echo "MAKING CHANGES ON /dev/${DEV}${suffix}1-3"
mkfs.fat -I -F 32 -n P_EFI "/dev/${DEV}${suffix}1" # -I bc of virtual mappings
crypt_create_fs "/dev/${DEV}${suffix}3"
mkfs.ext2 -L cryptswap "/dev/${DEV}${suffix}2" 1M # Otherwise label will be lost after reboot
2022-03-11 20:33:34 +01:00
else
2022-03-11 21:20:13 +01:00
echo "MAKING CHANGES ON /dev/${DEV}${suffix}1-3"
mkfs.fat -F 32 -n P_EFI "/dev/${DEV}${suffix}1" # -I bc of virtual mappings
mkfs.ext4 -L P_ROOT "/dev/${DEV}${suffix}3"
mkswap -L P_SWAP "/dev/${DEV}${suffix}2"
2022-03-11 20:33:34 +01:00
fi
2022-03-11 21:20:13 +01:00
ROOT_UUID=$(blkid | grep -Po '/dev/'"${DEV}${suffix}"'3.* UUID="\K[0-9a-f-]+')
2022-03-11 20:33:34 +01:00
if [ "$ENC" == true ]; then
mount /dev/mapper/root /mnt
KERNEL_OPTIONS='cryptdevice=UUID='"$ROOT_UUID"':root root=/dev/mapper/root'
else
mount -L P_ROOT /mnt
KERNEL_OPTIONS='root=LABEL=P_ROOT rw resume=LABEL=P_SWAP'
fi
2019-06-09 02:32:33 +02:00
mkdir -p /mnt/boot
mount -L P_EFI /mnt/boot # EFI
2022-03-11 20:33:34 +01:00
[ "$ENC" == false ] && swapon -L P_SWAP # swap
2022-03-11 21:33:33 +01:00
# MAYB: Obsolete bc of reflector in achiso?
cp /etc/pacman.d/mirrorlist /etc/pacman.d/mirrorlist.bak
sed -i '/.*\.de\/.*/!d' /etc/pacman.d/mirrorlist
2019-06-09 02:32:33 +02:00
2020-03-22 15:29:17 +01:00
# for server dhcpcd and other programs are not required -> see good2know
2022-03-12 14:21:21 +01:00
pacstrap /mnt base base-devel "$KERNEL" linux-firmware vi dhcpcd wpa_supplicant dialog git netctl curl
2019-06-09 02:32:33 +02:00
genfstab -p /mnt > /mnt/etc/fstab
cat <<EOF > /mnt/root/bootstrap2.sh
#!/bin/bash
2022-03-11 20:33:34 +01:00
if [ $ENC == true ]; then
sed -i 's/\(^HOOKS.*block\)/\1 encrypt/' /etc/mkinitcpio.conf
2022-03-11 21:45:49 +01:00
echo "swap LABEL=cryptswap /dev/urandom swap,offset=2048,cipher=aes-xts-plain64,size=512" >> /etc/crypttab
2022-03-11 20:33:34 +01:00
echo "/dev/mapper/swap none swap defaults 0 0" >> /etc/fstab
fi
2019-06-09 02:32:33 +02:00
ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
echo "en_US.UTF-8 UTF-8" > /etc/locale.gen
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf
echo $NAME > /etc/hostname
2022-03-12 14:21:21 +01:00
mkinitcpio -p $KERNEL
2019-06-09 02:32:33 +02:00
pacman -Sy --noconfirm efibootmgr dosfstools gptfdisk
bootctl install
# MAYBE: add intel-ucode images, check for amd
2019-06-09 02:32:33 +02:00
cat <<EEE > /boot/loader/entries/arch-uefi.conf
title Arch
2022-03-12 14:21:21 +01:00
linux /vmlinuz-$KERNEL
initrd /initramfs-$KERNEL.img
2022-03-11 20:33:34 +01:00
options $KERNEL_OPTIONS
2019-06-09 02:32:33 +02:00
EEE
cat <<EEE > /boot/loader/entries/arch-uefi-fallback.conf
title Arch Linux Fallback
2022-03-12 14:21:21 +01:00
linux /vmlinuz-$KERNEL
initrd /initramfs-$KERNEL-fallback.img
2022-03-11 20:33:34 +01:00
options $KERNEL_OPTIONS
2019-06-09 02:32:33 +02:00
EEE
cat <<EEE > /boot/loader/loader.conf
default arch-uefi
timeout 1
EEE
pacman --noconfirm -Sy reflector
reflector --country 'Germany' --sort rate --protocol https --save /etc/pacman.d/mirrorlist
printf "${PASSWD}\n${PASSWD}\n" | passwd root
2019-06-09 02:32:33 +02:00
2021-03-12 16:19:36 +01:00
cd && curl -L https://g.phga.de/phga/fresh/archive/master.tar.gz -o fresh.tar.gz && tar -xzf fresh.tar.gz
2020-04-06 04:27:23 +02:00
# basically a shitty one time job, which does not work, seems like root does not source .bashrc
echo '/root/fresh/fresh.sh' > .bash_profile
2019-06-09 02:32:33 +02:00
exit
EOF
chmod u+x /mnt/root/bootstrap2.sh
arch-chroot /mnt /root/bootstrap2.sh
rm /mnt/root/bootstrap2.sh
2019-06-09 02:32:33 +02:00
2022-03-11 21:45:49 +01:00
reboot