2024-05-31 00:27:47 -04:00
#!/bin/bash
# Copyright (C) 2021-2024 Thien Tran, Tommaso Chiti
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may not
# use this file except in compliance with the License. You may obtain a copy of
# the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations under
# the License.
2024-07-20 21:19:01 -04:00
set -u
2024-05-31 00:27:47 -04:00
output( ) {
2024-06-26 03:09:37 -04:00
printf '\e[1;34m%-6s\e[m\n' " ${ @ } "
2024-05-31 00:27:47 -04:00
}
unpriv( ) {
sudo -u nobody " $@ "
}
2024-07-05 11:30:29 -04:00
installation_date = $( date "+%Y-%m-%d %H:%M:%S" )
2024-06-02 03:47:34 -04:00
# Check if this is a VM
virtualization = $( systemd-detect-virt)
2024-05-31 00:27:47 -04:00
install_mode_selector( ) {
2024-05-31 02:20:02 -04:00
output 'Is this a desktop or server installation?'
output '1) Desktop'
output '2) Server'
output 'Insert the number of your selection:'
read -r choice
2024-05-31 00:27:47 -04:00
case $choice in
1 ) install_mode = desktop
; ;
2 ) install_mode = server
; ;
2024-05-31 02:20:02 -04:00
* ) output 'You did not enter a valid selection.'
2024-05-31 00:27:47 -04:00
install_mode_selector
esac
}
2024-06-02 03:47:34 -04:00
luks_prompt( ) {
if [ " ${ virtualization } " != 'none' ] ; then
output "Virtual machine detected. Do you want to set up LUKS?"
output '1) No'
output '2) Yes'
output 'Insert the number of your selection:'
read -r choice
case $choice in
1 ) use_luks = '0'
; ;
2 ) use_luks = '1'
; ;
* ) output 'You did not enter a valid selection.'
luks_prompt
esac
else
use_luks = '1'
fi
}
2024-10-25 03:35:02 -04:00
luks_passphrase_prompt ( ) {
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
2024-10-25 03:35:02 -04:00
output 'Enter your encryption passphrase (the password will not be shown on the screen):'
read -r -s luks_passphrase
2024-05-31 00:27:47 -04:00
2024-10-25 03:35:02 -04:00
if [ -z " ${ luks_passphrase } " ] ; then
output 'You need to enter a passphrase.'
luks_passphrase_prompt
2024-06-02 03:47:34 -04:00
fi
2024-05-31 00:27:47 -04:00
2024-10-25 03:35:02 -04:00
output 'Confirm your encryption passphrase (the passphrase will not be shown on the screen):'
read -r -s luks_passphrase2
if [ " ${ luks_passphrase } " != " ${ luks_passphrase2 } " ] ; then
output 'Passphrases do not match, please try again.'
luks_passphrase_prompt
2024-06-02 03:47:34 -04:00
fi
2024-05-31 00:27:47 -04:00
fi
}
2024-05-31 01:03:12 -04:00
disk_prompt ( ) {
2024-05-31 02:46:05 -04:00
lsblk
2024-05-31 02:20:02 -04:00
output 'Please select the number of the corresponding disk (e.g. 1):'
2024-10-11 19:36:07 -04:00
select entry in $( lsblk -dpnoNAME| grep -P "/dev/nvme|sd|mmcblk|vd" ) ;
2024-05-31 01:03:12 -04:00
do
disk = " ${ entry } "
2024-05-31 02:44:41 -04:00
output " Arch Linux will be installed on the following disk: ${ disk } "
2024-05-31 01:03:12 -04:00
break
done
}
2024-05-31 00:27:47 -04:00
username_prompt ( ) {
2024-10-11 19:38:03 -04:00
output 'Please enter the name for a user account:'
2024-05-31 00:27:47 -04:00
read -r username
2024-05-31 02:20:02 -04:00
if [ -z " ${ username } " ] ; then
2024-10-11 19:38:03 -04:00
output 'Sorry, You need to enter a username.'
2024-05-31 00:27:47 -04:00
username_prompt
fi
}
2024-10-11 19:38:03 -04:00
fullname_prompt ( ) {
output 'Please enter the full name for the user account:'
read -r fullname
if [ -z " ${ fullname } " ] ; then
output 'Please enter the full name of the users account.'
fullname_prompt
fi
}
2024-05-31 00:27:47 -04:00
user_password_prompt ( ) {
2024-05-31 02:20:02 -04:00
output 'Enter your user password (the password will not be shown on the screen):'
2024-05-31 00:27:47 -04:00
read -r -s user_password
if [ -z " ${ user_password } " ] ; then
2024-05-31 02:20:02 -04:00
output 'You need to enter a password.'
2024-05-31 00:27:47 -04:00
user_password_prompt
fi
2024-05-31 02:20:02 -04:00
output 'Confirm your user password (the password will not be shown on the screen):'
2024-05-31 00:27:47 -04:00
read -r -s user_password2
if [ " ${ user_password } " != " ${ user_password2 } " ] ; then
2024-05-31 02:20:02 -04:00
output 'Passwords do not match, please try again.'
2024-05-31 00:27:47 -04:00
user_password_prompt
fi
}
2024-05-31 02:20:02 -04:00
hostname_prompt ( ) {
2024-06-01 00:59:27 -04:00
if [ " ${ install_mode } " = 'server' ] ; then
output 'Enter your hostname:'
read -r hostname
if [ -z " ${ hostname } " ] ; then
output 'You need to enter a hostname.'
hostname_prompt
fi
else
hostname = 'localhost'
2024-05-31 02:20:02 -04:00
fi
}
2024-06-02 03:02:15 -04:00
network_daemon_prompt( ) {
if [ " ${ install_mode } " = 'server' ] ; then
output 'Which network daemon do you want to use'
output '1) networkmanager'
output '2) systemd-networkd'
output 'Insert the number of your selection:'
read -r choice
case $choice in
1 ) network_daemon = 'networkmanager'
; ;
2 ) network_daemon = 'systemd-networkd'
; ;
* ) output 'You did not enter a valid selection.'
install_mode_selector
esac
else
network_daemon = 'networkmanager'
fi
}
2024-05-31 00:27:47 -04:00
# Set hardcoded variables (temporary, these will be replaced by future prompts)
locale = en_US
kblayout = us
2024-10-25 05:38:52 -04:00
# Cleaning the TTY
2024-05-31 00:27:47 -04:00
clear
# Initial prompts
install_mode_selector
2024-06-02 03:47:34 -04:00
luks_prompt
2024-10-25 03:35:02 -04:00
luks_passphrase_prompt
2024-05-31 01:03:12 -04:00
disk_prompt
2024-05-31 00:27:47 -04:00
username_prompt
2024-10-11 19:38:03 -04:00
fullname_prompt
2024-05-31 00:27:47 -04:00
user_password_prompt
2024-05-31 02:20:02 -04:00
hostname_prompt
2024-06-02 03:02:15 -04:00
network_daemon_prompt
2024-05-31 00:27:47 -04:00
2024-05-31 01:03:12 -04:00
# Installation
2024-05-31 00:27:47 -04:00
2024-10-25 05:34:48 -04:00
## Updating the live environment usually causes more problems than its worth, and quite often can't be done without remounting cowspace with more capacity
2024-05-31 00:27:47 -04:00
pacman -Sy
2024-05-31 01:03:12 -04:00
## Installing curl
2024-05-31 00:27:47 -04:00
pacman -S --noconfirm curl
2024-06-04 19:52:00 -04:00
## Wipe the disk
2024-06-04 20:51:43 -04:00
sgdisk --zap-all " ${ disk } "
2024-05-31 01:03:12 -04:00
2024-10-25 05:34:48 -04:00
## Creating a new partition scheme
2024-05-31 01:03:12 -04:00
output " Creating new partition scheme on ${ disk } . "
2024-06-04 19:52:00 -04:00
sgdisk -g " ${ disk } "
sgdisk -I -n 1:0:+512M -t 1:ef00 -c 1:'ESP' " ${ disk } "
sgdisk -I -n 2:0:0 -c 2:'rootfs' " ${ disk } "
2024-05-31 00:27:47 -04:00
2024-05-31 02:20:02 -04:00
ESP = '/dev/disk/by-partlabel/ESP'
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
cryptroot = '/dev/disk/by-partlabel/rootfs'
fi
2024-05-31 00:27:47 -04:00
2024-10-25 05:34:48 -04:00
## Informing the Kernel of the changes
2024-05-31 02:20:02 -04:00
output 'Informing the Kernel about the disk changes.'
2024-05-31 01:03:12 -04:00
partprobe " ${ disk } "
2024-05-31 00:27:47 -04:00
2024-10-25 05:34:48 -04:00
## Formatting the ESP as FAT32
2024-05-31 02:20:02 -04:00
output 'Formatting the EFI Partition as FAT32.'
2024-06-04 20:51:43 -04:00
mkfs.fat -F 32 -s 2 " ${ ESP } "
2024-05-31 00:27:47 -04:00
2024-10-25 05:34:48 -04:00
## Creating a LUKS Container for the root partition
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
output 'Creating LUKS Container for the root partition.'
2024-10-25 03:35:02 -04:00
echo -n " ${ luks_passphrase } " | cryptsetup luksFormat --pbkdf pbkdf2 " ${ cryptroot } " -d -
echo -n " ${ luks_passphrase } " | cryptsetup open " ${ cryptroot } " cryptroot -d -
2024-06-02 03:47:34 -04:00
BTRFS = '/dev/mapper/cryptroot'
else
BTRFS = '/dev/disk/by-partlabel/rootfs'
fi
2024-05-31 00:27:47 -04:00
2024-10-25 05:34:48 -04:00
## Formatting the partition as BTRFS
2024-06-02 04:07:30 -04:00
output 'Formatting the rootfs as BTRFS.'
2024-10-25 01:41:41 -04:00
mkfs.btrfs -f " ${ BTRFS } "
2024-05-31 01:03:12 -04:00
mount " ${ BTRFS } " /mnt
2024-10-25 05:34:48 -04:00
## Creating BTRFS subvolumes
2024-05-31 02:20:02 -04:00
output 'Creating BTRFS subvolumes.'
2024-05-31 00:27:47 -04:00
2024-06-04 20:51:43 -04:00
btrfs su cr /mnt/@
btrfs su cr /mnt/@/.snapshots
mkdir -p /mnt/@/.snapshots/1
btrfs su cr /mnt/@/.snapshots/1/snapshot
btrfs su cr /mnt/@/boot/
btrfs su cr /mnt/@/home
btrfs su cr /mnt/@/root
btrfs su cr /mnt/@/srv
btrfs su cr /mnt/@/var_log
btrfs su cr /mnt/@/var_crash
btrfs su cr /mnt/@/var_cache
btrfs su cr /mnt/@/var_tmp
btrfs su cr /mnt/@/var_spool
btrfs su cr /mnt/@/var_lib_libvirt_images
btrfs su cr /mnt/@/var_lib_machines
2024-06-01 17:46:06 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
2024-06-04 20:51:43 -04:00
btrfs su cr /mnt/@/var_lib_gdm
btrfs su cr /mnt/@/var_lib_AccountsService
2024-06-01 17:46:06 -04:00
fi
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
2024-06-04 20:51:43 -04:00
btrfs su cr /mnt/@/cryptkey
2024-06-02 03:47:34 -04:00
fi
2024-05-31 00:27:47 -04:00
2024-05-31 01:03:12 -04:00
## Disable CoW on subvols we are not taking snapshots of
2024-05-31 00:27:47 -04:00
chattr +C /mnt/@/boot
2024-05-31 01:03:12 -04:00
chattr +C /mnt/@/home
chattr +C /mnt/@/root
2024-05-31 00:27:47 -04:00
chattr +C /mnt/@/srv
chattr +C /mnt/@/var_log
chattr +C /mnt/@/var_crash
chattr +C /mnt/@/var_cache
chattr +C /mnt/@/var_tmp
chattr +C /mnt/@/var_spool
chattr +C /mnt/@/var_lib_libvirt_images
chattr +C /mnt/@/var_lib_machines
2024-06-01 17:46:06 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
chattr +C /mnt/@/var_lib_gdm
chattr +C /mnt/@/var_lib_AccountsService
fi
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
chattr +C /mnt/@/cryptkey
fi
2024-05-31 00:27:47 -04:00
2024-05-31 01:03:12 -04:00
## Set the default BTRFS Subvol to Snapshot 1 before pacstrapping
2024-05-31 00:27:47 -04:00
btrfs subvolume set-default " $( btrfs subvolume list /mnt | grep "@/.snapshots/1/snapshot" | grep -oP '(?<=ID )[0-9]+' ) " /mnt
2024-07-05 11:30:29 -04:00
echo " <?xml version=\"1.0\"?>
2024-05-31 00:27:47 -04:00
<snapshot>
<type>single</type>
<num>1</num>
2024-07-05 11:30:29 -04:00
<date>${ installation_date } </date>
2024-05-31 00:27:47 -04:00
<description>First Root Filesystem</description>
<cleanup>number</cleanup>
2024-07-05 11:30:29 -04:00
</snapshot>" > /mnt/@/.snapshots/1/info.xml
2024-05-31 00:27:47 -04:00
chmod 600 /mnt/@/.snapshots/1/info.xml
2024-10-25 05:34:48 -04:00
## Mounting the newly created subvolumes
2024-05-31 00:27:47 -04:00
umount /mnt
2024-05-31 02:20:02 -04:00
output 'Mounting the newly created subvolumes.'
2024-05-31 03:55:59 -04:00
mount -o ssd,noatime,compress= zstd " ${ BTRFS } " /mnt
2024-06-02 03:47:34 -04:00
mkdir -p /mnt/{ boot,root,home,.snapshots,srv,tmp,var/log,var/crash,var/cache,var/tmp,var/spool,var/lib/libvirt/images,var/lib/machines}
2024-06-01 17:46:06 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
mkdir -p /mnt/{ var/lib/gdm,var/lib/AccountsService}
fi
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
mkdir -p /mnt/cryptkey
fi
2024-05-31 01:03:12 -04:00
mount -o ssd,noatime,compress= zstd,nodev,nosuid,noexec,subvol= @/boot " ${ BTRFS } " /mnt/boot
mount -o ssd,noatime,compress= zstd,nodev,nosuid,subvol= @/root " ${ BTRFS } " /mnt/root
mount -o ssd,noatime,compress= zstd,nodev,nosuid,subvol= @/home " ${ BTRFS } " /mnt/home
mount -o ssd,noatime,compress= zstd,subvol= @/.snapshots " ${ BTRFS } " /mnt/.snapshots
mount -o ssd,noatime,compress= zstd,subvol= @/srv " ${ BTRFS } " /mnt/srv
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/var_log " ${ BTRFS } " /mnt/var/log
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/var_crash " ${ BTRFS } " /mnt/var/crash
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/var_cache " ${ BTRFS } " /mnt/var/cache
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/var_tmp " ${ BTRFS } " /mnt/var/tmp
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/var_spool " ${ BTRFS } " /mnt/var/spool
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/var_lib_libvirt_images " ${ BTRFS } " /mnt/var/lib/libvirt/images
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/var_lib_machines " ${ BTRFS } " /mnt/var/lib/machines
2024-05-31 00:27:47 -04:00
2024-10-25 05:38:52 -04:00
# GNOME requires /var/lib/gdm and /var/lib/AccountsService to be writeable when booting into a readonly snapshot
2024-06-01 17:46:06 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/var_lib_gdm $BTRFS /mnt/var/lib/gdm
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/var_lib_AccountsService $BTRFS /mnt/var/lib/AccountsService
fi
2024-06-01 15:02:03 -04:00
2024-05-31 01:11:58 -04:00
### The encryption is splitted as we do not want to include it in the backup with snap-pac.
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
mount -o ssd,noatime,compress= zstd,nodatacow,nodev,nosuid,noexec,subvol= @/cryptkey " ${ BTRFS } " /mnt/cryptkey
fi
2024-05-31 00:27:47 -04:00
mkdir -p /mnt/boot/efi
mount -o nodev,nosuid,noexec " ${ ESP } " /mnt/boot/efi
2024-06-04 19:52:00 -04:00
## Pacstrap
output 'Installing the base system (it may take a while).'
output "You may see an error when mkinitcpio tries to generate a new initramfs."
output "It is okay. The script will regenerate the initramfs later in the installation process."
pacstrap /mnt apparmor base chrony efibootmgr firewalld grub grub-btrfs inotify-tools linux-firmware linux-hardened linux-lts nano reflector sbctl snapper sudo zram-generator
2024-05-31 01:11:58 -04:00
if [ " ${ virtualization } " = 'none' ] ; then
CPU = $( grep vendor_id /proc/cpuinfo)
2024-05-31 01:15:53 -04:00
if [ [ " ${ CPU } " = = *"AuthenticAMD" * ] ] ; then
2024-05-31 01:11:58 -04:00
microcode = amd-ucode
else
microcode = intel-ucode
fi
2024-05-31 00:27:47 -04:00
2024-06-04 19:52:00 -04:00
pacstrap /mnt " ${ microcode } "
fi
2024-06-02 03:02:15 -04:00
2024-06-02 03:14:37 -04:00
if [ " ${ network_daemon } " = 'networkmanager' ] ; then
2024-06-02 03:02:15 -04:00
pacstrap /mnt networkmanager
fi
2024-06-01 00:53:28 -04:00
2024-05-31 02:20:02 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
2024-10-25 02:12:57 -04:00
pacstrap /mnt flatpak gdm gnome-console gnome-control-center nautilus pipewire-alsa pipewire-pulse pipewire-jack
2024-05-31 02:20:02 -04:00
elif [ " ${ install_mode } " = 'server' ] ; then
2024-06-21 18:40:07 -04:00
pacstrap /mnt openssh unbound
2024-05-31 02:20:02 -04:00
fi
2024-05-31 00:27:47 -04:00
2024-05-31 02:20:02 -04:00
if [ " ${ virtualization } " = 'none' ] ; then
2024-05-31 23:06:43 -04:00
pacstrap /mnt fwupd
2024-05-31 08:14:52 -04:00
echo 'UriSchemes=file;https' | sudo tee -a /mnt/etc/fwupd/fwupd.conf
2024-05-31 17:35:50 -04:00
elif [ " ${ virtualization } " = 'kvm' ] ; then
pacstrap /mnt qemu-guest-agent
if [ " ${ install_mode } " = 'desktop' ] ; then
pacstrap /mnt spice-vdagent
fi
2024-05-31 02:20:02 -04:00
fi
2024-05-31 17:35:50 -04:00
## Install snap-pac list otherwise we will have problems
2024-05-31 04:52:10 -04:00
pacstrap /mnt snap-pac
2024-10-25 05:34:48 -04:00
## Generate /etc/fstab
2024-05-31 02:20:02 -04:00
output 'Generating a new fstab.'
2024-05-31 00:27:47 -04:00
genfstab -U /mnt >> /mnt/etc/fstab
sed -i 's#,subvolid=258,subvol=/@/.snapshots/1/snapshot,subvol=@/.snapshots/1/snapshot##g' /mnt/etc/fstab
2024-05-31 02:20:02 -04:00
output 'Setting up hostname, locale and keyboard layout'
2024-10-25 05:34:48 -04:00
## Set hostname
2024-05-31 00:27:47 -04:00
echo " $hostname " > /mnt/etc/hostname
2024-10-25 05:34:48 -04:00
## Setting hosts file
2024-05-31 02:20:02 -04:00
echo 'Setting hosts file.'
echo " 127.0.0.1 localhost
2024-05-31 00:27:47 -04:00
::1 localhost
2024-05-31 02:20:02 -04:00
127.0.1.1 $hostname .localdomain $hostname " > /mnt/etc/hosts
2024-05-31 00:27:47 -04:00
2024-10-25 05:38:52 -04:00
## Setup locales
2024-05-31 00:27:47 -04:00
echo " $locale .UTF-8 UTF-8 " > /mnt/etc/locale.gen
echo " LANG= $locale .UTF-8 " > /mnt/etc/locale.conf
2024-10-25 05:34:48 -04:00
## Setup keyboard layout
2024-05-31 00:27:47 -04:00
echo " KEYMAP= $kblayout " > /mnt/etc/vconsole.conf
2024-05-31 02:20:02 -04:00
## Configure /etc/mkinitcpio.conf
output 'Configuring /etc/mkinitcpio for ZSTD compression and LUKS hook.'
2024-05-31 06:31:45 -04:00
sed -i 's/#COMPRESSION="zstd"/COMPRESSION="zstd"/g' /mnt/etc/mkinitcpio.conf
2024-06-01 21:56:40 -04:00
sed -i 's/^MODULES=.*/MODULES=(btrfs)/g' /mnt/etc/mkinitcpio.conf
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
sed -i 's/^HOOKS=.*/HOOKS=(systemd autodetect microcode modconf keyboard sd-vconsole block sd-encrypt)/g' /mnt/etc/mkinitcpio.conf
else
sed -i 's/^HOOKS=.*/HOOKS=(systemd autodetect microcode modconf keyboard sd-vconsole block)/g' /mnt/etc/mkinitcpio.conf
fi
2024-05-31 00:27:47 -04:00
2024-10-25 05:34:48 -04:00
## Enable LUKS in GRUB and setting the UUID of the LUKS container
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
sed -i 's/#GRUB_ENABLE_CRYPTODISK=.*/GRUB_ENABLE_CRYPTODISK=y/g' /mnt/etc/default/grub
fi
2024-06-02 13:44:34 -04:00
## Do not preload part_msdos
sed -i 's/ part_msdos//g' /mnt/etc/default/grub
## Ensure correct GRUB settings
2024-05-31 06:31:45 -04:00
echo '' >> /mnt/etc/default/grub
2024-06-02 13:38:49 -04:00
echo ' # Default to linux-hardened
GRUB_DEFAULT = "1>2"
2024-07-29 16:43:04 -04:00
# Booting with BTRFS subvolume
2024-05-31 06:31:45 -04:00
GRUB_BTRFS_OVERRIDE_BOOT_PARTITION_DETECTION = true' >> /mnt/etc/default/grub
2024-05-31 23:13:48 -04:00
2024-10-25 05:34:48 -04:00
## Disable root subvol pinning
## This is **extremely** important, as snapper expects to be able to set the default btrfs subvol
2024-05-31 13:40:17 -04:00
# shellcheck disable=SC2016
2024-05-31 06:31:45 -04:00
sed -i 's/rootflags=subvol=${rootsubvol}//g' /mnt/etc/grub.d/10_linux
2024-05-31 13:40:17 -04:00
# shellcheck disable=SC2016
2024-05-31 06:31:45 -04:00
sed -i 's/rootflags=subvol=${rootsubvol}//g' /mnt/etc/grub.d/20_linux_xen
2024-05-31 00:27:47 -04:00
2024-05-31 02:20:02 -04:00
## Kernel hardening
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
UUID = $( blkid -s UUID -o value " ${ cryptroot } " )
sed -i " s#quiet#rd.luks.name= ${ UUID } =cryptroot root= ${ BTRFS } lsm=landlock,lockdown,yama,integrity,apparmor,bpf mitigations=auto,nosmt spectre_v2=on spectre_bhi=on spec_store_bypass_disable=on tsx=off kvm.nx_huge_pages=force nosmt=force l1d_flush=on spec_rstack_overflow=safe-ret gather_data_sampling=force reg_file_data_sampling=on random.trust_bootloader=off random.trust_cpu=off intel_iommu=on amd_iommu=force_isolation efi=disable_early_pci_dma iommu=force iommu.passthrough=0 iommu.strict=1 slab_nomerge init_on_alloc=1 init_on_free=1 pti=on vsyscall=none ia32_emulation=0 page_alloc.shuffle=1 randomize_kstack_offset=on debugfs=off lockdown=confidentiality module.sig_enforce=1#g " /mnt/etc/default/grub
else
sed -i " s#quiet#root= ${ BTRFS } lsm=landlock,lockdown,yama,integrity,apparmor,bpf mitigations=auto,nosmt spectre_v2=on spectre_bhi=on spec_store_bypass_disable=on tsx=off kvm.nx_huge_pages=force nosmt=force l1d_flush=on spec_rstack_overflow=safe-ret gather_data_sampling=force reg_file_data_sampling=on random.trust_bootloader=off random.trust_cpu=off intel_iommu=on amd_iommu=force_isolation efi=disable_early_pci_dma iommu=force iommu.passthrough=0 iommu.strict=1 slab_nomerge init_on_alloc=1 init_on_free=1 pti=on vsyscall=none ia32_emulation=0 page_alloc.shuffle=1 randomize_kstack_offset=on debugfs=off lockdown=confidentiality module.sig_enforce=1#g " /mnt/etc/default/grub
fi
2024-05-31 00:27:47 -04:00
2024-10-25 05:34:48 -04:00
## Add keyfile to the initramfs to avoid double password
2024-06-02 03:47:34 -04:00
if [ " ${ use_luks } " = '1' ] ; then
2024-06-04 20:51:43 -04:00
dd bs = 512 count = 4 if = /dev/random of = /mnt/cryptkey/.root.key iflag = fullblock
chmod 000 /mnt/cryptkey/.root.key
2024-10-25 03:35:02 -04:00
echo -n " ${ luks_passphrase } " | cryptsetup luksAddKey /dev/disk/by-partlabel/rootfs /mnt/cryptkey/.root.key -d -
2024-06-02 03:47:34 -04:00
sed -i 's#FILES=()#FILES=(/cryptkey/.root.key)#g' /mnt/etc/mkinitcpio.conf
sed -i "s#module\.sig_enforce=1#module.sig_enforce=1 rd.luks.key=/cryptkey/.root.key#g" /mnt/etc/default/grub
fi
2024-05-31 00:27:47 -04:00
2024-05-31 02:20:02 -04:00
## Continue kernel hardening
2024-08-09 18:36:05 -04:00
unpriv curl -s https://raw.githubusercontent.com/secureblue/secureblue/live/files/system/etc/modprobe.d/blacklist.conf | tee /mnt/etc/modprobe.d/blacklist.conf > /dev/null
2024-06-01 19:14:36 -04:00
if [ " ${ install_mode } " = 'server' ] ; then
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/sysctl.d/99-server.conf | tee /mnt/etc/sysctl.d/99-server.conf > /dev/null
2024-06-04 17:22:19 -04:00
else
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/sysctl.d/99-workstation.conf | tee /mnt/etc/sysctl.d/99-workstation.conf > /dev/null
2024-05-31 16:59:44 -04:00
fi
2024-05-31 02:20:02 -04:00
## Setup NTS
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/GrapheneOS/infrastructure/main/chrony.conf | tee /mnt/etc/chrony.conf > /dev/null
2024-10-11 17:24:18 -04:00
mkdir -p /mnt/etc/sysconfig
2024-08-25 22:11:56 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/sysconfig/chronyd | tee /mnt/etc/sysconfig/chronyd > /dev/null
2024-05-31 00:27:47 -04:00
2024-05-31 02:20:02 -04:00
## Remove nullok from system-auth
2024-05-31 00:27:47 -04:00
sed -i 's/nullok//g' /mnt/etc/pam.d/system-auth
2024-06-01 18:38:01 -04:00
## Harden SSH
2024-10-25 05:34:48 -04:00
## Arch annoyingly does not split openssh-server out so even desktop Arch will have the daemon
2024-06-01 18:38:01 -04:00
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/ssh/ssh_config.d/10-custom.conf | tee /mnt/etc/ssh/ssh_config.d/10-custom.conf > /dev/null
2024-08-06 18:07:45 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/ssh/sshd_config.d/10-custom.conf | tee /mnt/etc/ssh/sshd_config.d/10-custom.conf > /dev/null
2024-06-01 18:41:17 -04:00
sed -i 's/PasswordAuthentication no/PasswordAuthentication yes/g' /mnt/etc/ssh/sshd_config.d/10-custom.conf
2024-06-14 19:20:42 -04:00
mkdir -p /mnt/etc/systemd/system/sshd.service.d/
2024-10-15 17:14:37 -04:00
unpriv curl -s https://raw.githubusercontent.com/GrapheneOS/infrastructure/main/systemd/system/sshd.service.d/override.conf | tee /mnt/etc/systemd/system/sshd.service.d/override.conf > /dev/null
2024-06-01 18:04:41 -04:00
2024-05-31 02:20:02 -04:00
## Disable coredump
2024-10-11 17:24:18 -04:00
mkdir -p /mnt/etc/security/limits.d/
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/security/limits.d/30-disable-coredump.conf | tee /mnt/etc/security/limits.d/30-disable-coredump.conf > /dev/null
2024-06-04 17:42:30 -04:00
mkdir -p /mnt/etc/systemd/coredump.conf.d
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/systemd/coredump.conf.d/disable.conf | tee /mnt/etc/systemd/coredump.conf.d/disable.conf > /dev/null
2024-05-31 00:27:47 -04:00
2024-06-01 04:57:24 -04:00
# Disable XWayland
2024-06-01 18:50:23 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
mkdir -p /mnt/etc/systemd/user/org.gnome.Shell@wayland.service.d
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/systemd/user/org.gnome.Shell%40wayland.service.d/override.conf | tee /mnt/etc/systemd/user/org.gnome.Shell@wayland.service.d/override.conf > /dev/null
2024-06-01 18:50:23 -04:00
fi
2024-06-01 04:57:24 -04:00
2024-06-01 04:54:06 -04:00
# Setup dconf
2024-06-01 17:46:06 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
2024-06-02 05:00:23 -04:00
# This doesn't actually take effect atm - need to investigate
2024-06-01 17:46:06 -04:00
mkdir -p /mnt/etc/dconf/db/local.d/locks
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/dconf/db/local.d/locks/automount-disable | tee /mnt/etc/dconf/db/local.d/locks/automount-disable > /dev/null
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/dconf/db/local.d/locks/privacy | tee /mnt/etc/dconf/db/local.d/locks/privacy > /dev/null
2024-06-01 04:54:06 -04:00
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/dconf/db/local.d/adw-gtk3-dark | tee /mnt/etc/dconf/db/local.d/adw-gtk3-dark > /dev/null
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/dconf/db/local.d/automount-disable | tee /mnt/etc/dconf/db/local.d/automount-disable > /dev/null
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/dconf/db/local.d/button-layout | tee /mnt/etc/dconf/db/local.d/button-layout > /dev/null
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/dconf/db/local.d/prefer-dark | tee /mnt/etc/dconf/db/local.d/prefer-dark > /dev/null
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/dconf/db/local.d/privacy | tee /mnt/etc/dconf/db/local.d/privacy > /dev/null
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/dconf/db/local.d/touchpad | tee /mnt/etc/dconf/db/local.d/touchpad > /dev/null
2024-06-01 17:46:06 -04:00
fi
2024-06-01 04:54:06 -04:00
2024-05-31 02:20:02 -04:00
## ZRAM configuration
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/systemd/zram-generator.conf | tee /mnt/etc/systemd/zram-generator.conf > /dev/null
2024-05-31 00:27:47 -04:00
2024-06-21 18:40:07 -04:00
## Setup unbound
if [ " ${ install_mode } " = 'server' ] ; then
2024-08-06 18:17:45 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Arch-Setup-Script/main/etc/unbound/unbound.conf | tee /mnt/etc/unbound/unbound.conf > /dev/null
2024-06-21 18:40:07 -04:00
fi
2024-05-31 08:13:20 -04:00
## Setup Networking
2024-06-02 03:02:15 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
2024-07-03 05:24:40 -04:00
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/NetworkManager/conf.d/00-macrandomize.conf | tee /mnt/etc/NetworkManager/conf.d/00-macrandomize.conf > /dev/null
unpriv curl -s https://raw.githubusercontent.com/TommyTran732/Linux-Setup-Scripts/main/etc/NetworkManager/conf.d/01-transient-hostname.conf | tee /mnt/etc/NetworkManager/conf.d/01-transient-hostname.conf > /dev/null
2024-05-31 08:13:20 -04:00
fi
2024-06-02 03:02:15 -04:00
if [ " ${ network_daemon } " = 'networkmanager' ] ; then
2024-06-02 04:32:58 -04:00
mkdir -p /mnt/etc/systemd/system/NetworkManager.service.d/
2024-07-03 05:24:40 -04:00
unpriv curl -s https://gitlab.com/divested/brace/-/raw/master/brace/usr/lib/systemd/system/NetworkManager.service.d/99-brace.conf | tee /mnt/etc/systemd/system/NetworkManager.service.d/99-brace.conf > /dev/null
2024-09-10 19:19:53 -04:00
fi
if [ " ${ network_daemon } " = 'systemd-networkd' ] ; then
2024-10-25 05:34:48 -04:00
# arch-iso has working networking, booted does not
2024-09-10 19:19:53 -04:00
cp -ap /etc/systemd/network/20* /mnt/etc/systemd/network/ > /dev/null
fi
2024-05-31 08:13:20 -04:00
2024-10-25 05:38:52 -04:00
## Configuring the system
2024-05-31 00:27:47 -04:00
arch-chroot /mnt /bin/bash -e <<EOF
2024-06-06 16:02:51 -04:00
# Setting up timezone
2024-05-31 06:31:45 -04:00
# Temporarily hardcoding here
2024-06-20 08:19:03 -04:00
ln -sf /usr/share/zoneinfo/Etc/UTC /etc/localtime
2024-05-31 00:27:47 -04:00
2024-06-06 16:02:51 -04:00
# Setting up clock
2024-05-31 00:27:47 -04:00
hwclock --systohc
2024-06-06 16:02:51 -04:00
# Generating locales
2024-05-31 19:31:00 -04:00
locale-gen
2024-05-31 00:27:47 -04:00
2024-06-06 16:02:51 -04:00
# Create SecureBoot keys
2024-06-06 16:08:31 -04:00
# This isn't strictly necessary, but linux-hardened preset expects it and mkinitcpio will fail without it
2024-05-31 23:06:43 -04:00
sbctl create-keys
2024-06-06 16:02:51 -04:00
# Generating a new initramfs
2024-05-31 19:31:00 -04:00
chmod 600 /boot/initramfs-linux*
mkinitcpio -P
2024-05-31 00:27:47 -04:00
2024-06-06 16:02:51 -04:00
# Installing GRUB
2024-06-01 22:17:57 -04:00
grub-install --target= x86_64-efi --efi-directory= /boot/efi --bootloader-id= GRUB --disable-shim-lock
2024-05-31 00:27:47 -04:00
2024-06-06 16:02:51 -04:00
# Creating grub config file
2024-05-31 19:31:00 -04:00
grub-mkconfig -o /boot/grub/grub.cfg
2024-05-31 00:27:47 -04:00
# Adding user with sudo privilege
2024-10-11 19:38:03 -04:00
useradd -c " $fullname " -m " $username "
usermod -aG wheel " $username "
2024-05-31 07:05:10 -04:00
2024-06-01 17:46:06 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
# Setting up dconf
dconf update
fi
2024-06-01 04:54:06 -04:00
2024-05-31 07:05:10 -04:00
# Snapper configuration
umount /.snapshots
rm -r /.snapshots
snapper --no-dbus -c root create-config /
btrfs subvolume delete /.snapshots
mkdir /.snapshots
mount -a
chmod 750 /.snapshots
2024-05-31 00:27:47 -04:00
EOF
2024-05-31 02:20:02 -04:00
## Set user password.
2024-06-04 20:51:43 -04:00
[ -n " $username " ] && echo " Setting user password for ${ username } . " && echo -e " ${ user_password } \n ${ user_password } " | arch-chroot /mnt passwd " $username "
2024-05-31 00:27:47 -04:00
2024-05-31 02:20:02 -04:00
## Give wheel user sudo access.
2024-06-01 19:02:15 -04:00
sed -i 's/# %wheel ALL=(ALL:ALL) ALL/%wheel ALL=(ALL:ALL) ALL/g' /mnt/etc/sudoers
2024-05-31 00:27:47 -04:00
2024-05-31 02:20:02 -04:00
## Enable services
2024-05-31 19:06:24 -04:00
systemctl enable apparmor --root= /mnt
systemctl enable chronyd --root= /mnt
systemctl enable firewalld --root= /mnt
systemctl enable fstrim.timer --root= /mnt
systemctl enable grub-btrfsd.service --root= /mnt
systemctl enable reflector.timer --root= /mnt
systemctl enable snapper-timeline.timer --root= /mnt
systemctl enable snapper-cleanup.timer --root= /mnt
systemctl enable systemd-oomd --root= /mnt
systemctl disable systemd-timesyncd --root= /mnt
2024-05-31 00:27:47 -04:00
2024-06-02 03:02:15 -04:00
if [ " ${ network_daemon } " = 'networkmanager' ] ; then
systemctl enable NetworkManager --root= /mnt
else
systemctl enable systemd-networkd --root= /mnt
fi
2024-06-01 01:04:33 -04:00
if [ " ${ install_mode } " = 'desktop' ] ; then
systemctl enable gdm --root= /mnt
2024-10-11 17:48:22 -04:00
rm /mnt/etc/resolv.conf
ln -s /run/systemd/resolve/stub-resolv.conf /mnt/etc/resolv.conf
2024-06-21 18:40:07 -04:00
systemctl enable systemd-resolved --root= /mnt
2024-06-01 01:04:33 -04:00
fi
if [ " ${ install_mode } " = 'server' ] ; then
2024-08-06 18:16:43 -04:00
systemctl enable sshd --root= /mnt
2024-06-21 18:40:07 -04:00
systemctl enable unbound --root= /mnt
2024-06-01 01:04:33 -04:00
fi
2024-05-31 02:20:02 -04:00
## Set umask to 077.
2024-06-01 18:39:36 -04:00
sed -i 's/^UMASK.*/UMASK 077/g' /mnt/etc/login.defs
sed -i 's/^HOME_MODE/#HOME_MODE/g' /mnt/etc/login.defs
sed -i 's/umask 022/umask 077/g' /mnt/etc/bash.bashrc
2024-05-31 00:27:47 -04:00
2024-05-31 02:20:02 -04:00
# Finish up
2024-05-31 00:27:47 -04:00
echo "Done, you may now wish to reboot (further changes can be done by chrooting into /mnt)."
2024-06-06 16:02:51 -04:00
exit