NixOS-Installer/install.sh

186 lines
3.9 KiB
Bash
Raw Normal View History

2024-12-14 17:37:18 +01:00
#!/bin/usr/env bash
# https://nixos.org/manual/nixos/stable/#sec-installation-manual
# https://wizardzines.com/comics/bash-errors/bash-errors.png
set -euo pipefail
exec >> >(tee -i /tmp/install.log)
exec 2>&1
clear
# Friendly introduction.
echo "0. WELCOME"
echo "Welcome to the NixOS installation script!"
echo "This script will ERASE ALL DATA on the partition you will choose next!"
echo
read -p "Do you want to continue? Type [Y]es or [N]o. " -n 1 -r
echo
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
exit 1
fi
clear
# Selecting disk.
echo "1. PARTITIONING"
echo "Please select a disk to partition:"
echo
# Don't separate values by space.
IFS=$'\n'
# Set variable containing name and size of all disks.
declare -a dsks=( $(lsblk -d | tail -n+2 | awk '{print $1" "$4}') )
# Select value on array.
2024-12-15 11:36:39 +01:00
select dev in "${dsks[@]}"; do
break
2024-12-14 17:37:18 +01:00
done
echo
# Separate values by spaces.
IFS=' '
2024-12-15 11:36:39 +01:00
# Cut size from variable
dev=${dev%% *}
2024-12-14 17:37:18 +01:00
clear
echo "2. ENCRYPTION"
echo
# Setting encryption password.
echo "Choose a strong password for encrypting the primary partition:"
pwcr=""
while [[ -z "${pwcr}" ]]; do
echo "Please enter a password: "
read -rs pwfr
read -rs -p "Retype a password: " pwsc
if [[ "${pwfr}" == "${pwsc}" ]];
then
pwcr="${pwfr}"
echo
echo "Both passwords are the same. Continuing.."
break
else
echo
echo "You have entered different passwords. Try again.."
echo
fi
done
clear
echo "4. USER"
echo
# Setting username
echo "Please enter a username:"
read -r user
echo
echo "5. INSTALLING SYSTEM.."
echo
# Starting partitioning.
echo "Partitioning /dev/${dev}.."
echo
# Clearing partition table of selected disk.
echo "Clearing existing partitioning table."
sudo parted "/dev/${dev}" -- mklabel gpt
echo
# Creating boot partition.
echo "Creating boot partition of 512 MB."
sudo parted "/dev/${dev}" -- mkpart ESP 1MB 512MB
echo
# Setting type for EFI.
echo "Setting partition type."
sudo parted "/dev/${dev}" -- set 1 esp on
echo
# Creating system partition.
echo "Creating system partition."
2024-12-15 11:36:39 +01:00
sudo parted "/dev/${dev}" -- mkpart root 512MB 100%
2024-12-14 17:37:18 +01:00
echo
# Print partitions.
echo "This is your new partition table:"
lsblk | grep "${dev}"
echo
# Get new variable.
if [[ "${dev}" = "nvme0n1" ]]; then
main="${dev}p2"
else
main="${dev}2"
fi
# Encrypting partition.
echo "Encrypting system partition. This might take a while."
echo
echo -en "${pwcr}\n${pwcr}" | sudo cryptsetup -c aes-xts-plain -s 512 luksFormat /dev/$main
echo "Partition successfully encrypted."
echo
# Opening encrypted partition and mounting at /dev/mapper/main.
echo "Decrypting.. This also might take a while."
echo
echo -en "${pwcr}\n${pwcr}" | sudo cryptsetup open "/dev/${main}" main
echo "Partition successfully opened."
echo
lsblk | grep "${dev}"
echo
echo "Creating the filesystem."
if [ "${dev}" = "nvme0n1" ]; then
boot="${dev}p1"
else
boot="${dev}1"
fi
sudo mkfs.fat -F 32 -n UEFI "/dev/${boot}"
echo "Filesystem for boot successfully created."
echo
# Creating btrfs partition.
sudo mkfs.btrfs "/dev/mapper/main"
sudo mount "/dev/mapper/main" "/mnt"
sudo btrfs subvolume create "/mnt/root"
sudo btrfs subvolume create "/mnt/home"
sudo umount "/mnt"
echo
echo "Mounting.."
sudo mount -o autodefrag,compress=zstd:3,subvol=root "/dev/mapper/main" "/mnt"
sudo mkdir -p "/mnt/home"
sudo mount -o autodefrag,compress=zstd:3,subvol=home "/dev/mapper/main" "/mnt/home"
sudo mkdir -p "/mnt/boot"
sudo mount -o umask=077 "/dev/${boot}" "/mnt/boot"
echo "Mounting complete."
echo
lsblk -a
echo
# Copy existing config
sudo nixos-generate-config --root /mnt
sudo mv /mnt/etc/nixos/configuration.nix /mnt/etc/nixos/configuration.nix.bak
2024-12-15 11:36:39 +01:00
sudo cp configuration.nix /mnt/etc/nixos
2024-12-14 17:37:18 +01:00
# Replace username in config
sudo sed -i "s/username/${user}/g" /mnt/etc/nixos/configuration.nix
# Install
sudo nixos-install
# Set user password
sudo nixos-enter --root /mnt -c 'passwd $user'