archinstall/install.sh
2019-08-09 14:58:11 +02:00

255 lines
6.4 KiB
Bash
Executable File

#!/bin/bash
# the storage device on which arch linux shall be installed
storage_device='/dev/nvme0n1'
#storage_device='/dev/sda'
#storage_device='/dev/mmcblk0'
# encryption password
encryption_password='foobar'
host='foobar'
root_password='foobar'
user='foobar'
user_password='foobar'
email='foo@bar.org'
boot_mode='efi'
#boot_mode='bios'
# packages to install
base='base base-devel grub efibootmgr xf86-input-synaptics stow tmux git vim python3 go wpa_supplicant dialog gnome gnome-tweaks libreoffice-fresh virtualbox virtualbox-guest-iso firefox hunspell-de nextcloud-client evolution vlc gst-libav gst-plugins-ugly progress gimp cups samsung-unified-driver sane xsane tlp tp_smapi acpi_call ntfs-3g gimagereader-gtk tesseract-date-eng tesseract-data-deu nmap youtube-dl octave kdenlive pkgfile signal-desktop-bin telegram-desktop-bin freecad zotero slic3r-bin downgrade pmount ttf-ms-fonts openvpn networkmanager-openvpn net-tools networkmanager-openconnect skypeforlinux-stable-bin fritzing python-pipenv'
# helper
cd $(dirname "${BASH_SOURCE[0]}")
source bsf/bsf
s() { $* >/dev/null; }
S() { $* >/dev/null 2>&1; }
e() { echo -n " ::: $* ... "; }
d() { echo "done"; echo ""; }
update() { pacman -Syyu; }
if [[ `echo "$storage_device" | grep -E "(mmcblk|nvme)"` ]]; then
storage="${storage_device}p"
else
storage="$storage_device"
fi
root
e "checking internet connection"
s ping -c1 archlinux.org
if [[ "$?" -ne 0 ]]; then
echo "error: internet connection needed"
exit 1
fi
d
e "determining boot mode"
if [[ ! "$boot_mode" ]]; then
s ls /sys/firmware/efi/efivars
if [[ "$?" -eq 0 ]]; then
boot_mode='efi'
else
boot_mode='bios'
fi
fi
d
e "updating system clock"
s timedatectl set-ntp true
d
e "wiping $storage_device"
S umount /mnt/efi
S umount /mnt/boot
S umount /mnt
S vgremove -y vg
S cryptsetup luksClose lvm
s wipefs -af "$storage_device"
d
e "creating partitions"
if [[ "$boot_mode" == "efi" ]]; then
s sgdisk -n "1:2048:+1G" -t "1:EF00" "$storage_device"
else
s sgdisk -n "1:2048:+1G" -t "1:EF02" "$storage_device"
fi
s sgdisk -n "2:0:0" -t "2:8309" "$storage_device"
echo "$encryption_password" | cryptsetup -q luksFormat --type luks1 "${storage}2"
echo "$encryption_password" | cryptsetup -q open "${storage}2" lvm
d
e "creating lvm"
s pvcreate /dev/mapper/lvm
s vgcreate vg /dev/mapper/lvm
s lvcreate -L 8G vg -n swap
s lvcreate -l 100%FREE vg -n root
d
e "formatting filesystems"
if [[ "$boot_mode" == "efi" ]]; then
s mkfs.vfat -F32 "${storage}1"
else
s mkfs.vfat "${storage}1"
fi
S mkfs.ext4 /dev/vg/root
s mkswap /dev/vg/swap
d
e "mounting filesystems"
s mount /dev/vg/root /mnt
if [[ "$boot_mode" == "efi" ]]; then
s mkdir /mnt/efi
s mount "${storage}1" /mnt/efi
else
s mkdir /mnt/boot
s mount "${storage}1" /mnt/boot
fi
d
e "installing base system"
s mkdir -p /mnt/var/cache/pacman/pkg
s cp -rp /var/cache/pacman/pkg/* /mnt/var/cache/pacman/pkg/
s sync
S pacstrap /mnt $base
d
e "generating fstab"
genfstab -U /mnt >> /mnt/etc/fstab
d
e "copying config and setup scipts to new installation"
uuid=`blkid | awk '/lvm/ { print $2 }' | grep -oP '[^"]*"\K[^"]*'`
cat <<EOF > /mnt/root/install.sh
#!/bin/bash
# helper
s() { \$* >/dev/null; }
S() { \$* >/dev/null 2>&1; }
e() { echo -n " ::: \$* ... "; }
d() { echo "done"; echo ""; }
e "setting timezone"
s ln -sf /usr/share/zoneinfo/Europe/Berlin /etc/localtime
d
e "synchronising hardware clock"
s hwclock --systohc
d
e "setting locale"
s sed -i 's/#de_DE\.UTF-8/de_DE.UTF-8/g' /etc/locale.gen
s locale-gen
echo "LANG=de_DE.UTF-8" > /etc/locale.con#f
echo "KEYMAP=de-latin1" > /etc/vconsole.conf
d
e "setting hostname $host"
echo "$host" > /etc/hostname
echo "127.0.0.1 $host" > /etc/hosts
echo "::1 $host" >> /etc/hosts
echo "127.0.1.1 $host.localdomain $host" >> /etc/hosts
d
e "initializing pacman"
S pacman-key --init
d
e "generating keyfile to unlock luks lvm after boot"
S dd bs=512 count=4 if=/dev/urandom of=/luks.key iflag=fullblock
s chmod 000 /luks.key
echo "$encryption_password" | cryptsetup -q luksAddKey "${storage}2" /luks.key
d
e "generating mkinitcpio"
#s sed -i 's/ filesystems keyboard / keyboard keymap encrypt lvm2 filesystems /g' /etc/mkinitcpio.conf
#s sed -i 's/FILES=()/FILES=(\/luks.key)/g' /etc/mkinitcpio.conf
S mkinitcpio -p linux
S chmod 600 /boot/initramfs-linux*
d
e "configuring grub"
#s sed -i 's/#GRUB_ENABLE_CRYPTODISK/GRUB_ENABLE_CRYPTODISK/g' /etc/default/grub
s sed -i 's/UUID=:/UUID=$uuid:/g' /etc/default/grub
#TODO
# for efi mode this needs to be run from an efi system, else this will fail
S grub-install --target=x86_64-efi --efi-directory=/efi --bootloader-id=GRUB --recheck
S grub-mkconfig -o /boot/grub/grub.cfg
d
e "changing root password"
echo -e "${root_password}\n${root_password}" | passwd
d
e "adding user $user"
s useradd -m "$user"
echo -e "${user_password}\n${user_password}" | passwd $user
d
e "yay"
S pacman -S --needed --noconfirm go
su $user -c "cd; git clone https://aur.archlinux.org/yay.git; cd yay; makepkg -s;"
S pacman --noconfirm -U "/home/$user/yay/"\$(ls -ahl /home/$user/yay/ | grep -oE "yay-[0-9.-]+x86_64.pkg.tar.xz")
cd /root
s rm -rf /home/$user/yay
d
e "printing"
s systemctl enable org.cups.cupsd.service
d
e "performance"
echo -n 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
s systemctl enable --now tlp.service tlp-sleep.service
s sed -i 's/CriticalPowerAction=HybridSleep/CriticalPowerAction=PowerOff/' /etc/UPower/UPower.conf
d
e "bluetooth"
s modprobe btusb
s systemctl enable bluetooth.service
d
e "wifi"
s modprobe iwlwifi
d
e "git"
s git config --global user.email "$email"
s git config --global user.name "$user"
d
e "disable touchscreen"
s echo 'SUBSYSTEM=="usb", ATTRS{idVendor}=="2386", ATTRS{idProduct}=="3114", ATTR{authorized}="0" > /etc/udev/rules.d/80-touchscreen.rules
d
#TOTEST: restore git .files
e "restoring config"
cd "$HOME"
s mkdir -p it
cd it
s git clone https://willipink.eu/git/moritz/.files.git
cd .files
s bash ./setup.sh -bs
d
#TODO
## enabled gnome-extensions, * are not installed by default
#*Hide app icon
#*Hide activities button
#Removable drive menu
#Places status indicator
#*Arch Linux updates indicator
#-> einstellungen -> erweiterte einstellungen -> Kommando, um Pakete zu aktualisieren:
#gnome-terminal -e 'yay -Syu --noconfirm --nocleanmenu --nodiffmenu --noeditmenu --noremovemake --norebuild --noredownload'
#+Tray icon
exit
EOF
s cp mkinitcpio.conf /mnt/etc/mkinitcpio.conf
s cp grub /mnt/etc/default/grub
d
e "chrooting into arch"
s arch-chroot /mnt chmod u+x /root/install.sh
d
arch-chroot /mnt /root/install.sh