|
|
|
|
@@ -1,141 +1,167 @@
|
|
|
|
|
#!/run/current-system/sw/bin/bash
|
|
|
|
|
echo "Welcome. This script will install pagedMov's NixOS configuration flake onto your machine."
|
|
|
|
|
echo "If this script stops at any point, it will resume from the most recent major step when you call it again."
|
|
|
|
|
echo "Call the script with --reset to restart the installation process"
|
|
|
|
|
|
|
|
|
|
set -e
|
|
|
|
|
trap 'echo "Aborting installation."; exit 1' INT
|
|
|
|
|
|
|
|
|
|
# set up working directory
|
|
|
|
|
mkdir -p /tmp/install_pwd && cd /tmp/install_pwd
|
|
|
|
|
rm -rf ./*
|
|
|
|
|
if [ "$1" = "--reset" ]; then
|
|
|
|
|
rm -rf /tmp/reset
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
# download disko.nix file for defining partitions
|
|
|
|
|
echo -n "Downloading partition plan..."
|
|
|
|
|
curl -s https://raw.githubusercontent.com/pagedMov/pagedmov-nix-cfg/refs/heads/master/hosts/installer/disko-ext4-singledisk.nix > disko.nix
|
|
|
|
|
echo "Done!"
|
|
|
|
|
if [ ! -f /tmp/install_steps ]; then
|
|
|
|
|
echo "0" > /tmp/install_steps
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo
|
|
|
|
|
echo "This script is about to format and partition a hard drive."
|
|
|
|
|
sleep 2.5
|
|
|
|
|
echo -e "\033[4;31mThis process is irreversible and will destroy all data on the drive.\033[0m"
|
|
|
|
|
sleep 2.5
|
|
|
|
|
echo "Make absolutely sure that you know which drive you are choosing."
|
|
|
|
|
sleep 2.5
|
|
|
|
|
echo
|
|
|
|
|
lsblk -d -o NAME,SIZE
|
|
|
|
|
echo
|
|
|
|
|
echo -n "Which drive do you wish to sacrifice? "
|
|
|
|
|
read -r drive
|
|
|
|
|
install_step=$(cat /tmp/install_steps)
|
|
|
|
|
|
|
|
|
|
size=$(lsblk -b -d -o NAME,SIZE | grep "$drive" | awk '{ printf "%.0f\n", $2 / 1024 / 1024 / 1024 }')
|
|
|
|
|
size=$((size-1))
|
|
|
|
|
root_size_default=$(echo "scale=0;$size * 0.10 / 1" | bc)
|
|
|
|
|
nix_size_default=$(echo "scale=0;$size * 0.35 / 1" | bc)
|
|
|
|
|
step_1() {
|
|
|
|
|
# set up working directory
|
|
|
|
|
mkdir -p /tmp/install_pwd && cd /tmp/install_pwd
|
|
|
|
|
rm -rf ./*
|
|
|
|
|
|
|
|
|
|
for part in "root" "nix"; do
|
|
|
|
|
echo "You have $size GB remaining to work with on this drive. How big do you want your $part partition?"
|
|
|
|
|
# download disko.nix file for defining partitions
|
|
|
|
|
echo -n "Downloading partition plan..."
|
|
|
|
|
curl -s https://raw.githubusercontent.com/pagedMov/pagedmov-nix-cfg/refs/heads/master/hosts/installer/disko-ext4-singledisk.nix > disko.nix
|
|
|
|
|
echo "Done!"
|
|
|
|
|
|
|
|
|
|
if [ "$part" = "root" ]; then
|
|
|
|
|
echo "Default value is 10% of hard drive space ($root_size_default GB)"
|
|
|
|
|
else
|
|
|
|
|
echo "Default value is 35% of hard drive space ($nix_size_default GB)"
|
|
|
|
|
fi
|
|
|
|
|
echo "Give a positive integer or leave blank to use default value"
|
|
|
|
|
deciding=true
|
|
|
|
|
echo
|
|
|
|
|
echo "This script is about to format and partition a hard drive."
|
|
|
|
|
sleep 2.5
|
|
|
|
|
echo -e "\033[4;31mThis process is irreversible and will destroy all data on the drive.\033[0m"
|
|
|
|
|
sleep 2.5
|
|
|
|
|
echo "Make absolutely sure that you know which drive you are choosing."
|
|
|
|
|
sleep 2.5
|
|
|
|
|
echo
|
|
|
|
|
lsblk -d -o NAME,SIZE
|
|
|
|
|
echo
|
|
|
|
|
echo -n "Which drive do you wish to sacrifice? "
|
|
|
|
|
read -r drive
|
|
|
|
|
|
|
|
|
|
while $deciding; do
|
|
|
|
|
echo -n "> "
|
|
|
|
|
read -r size_choice
|
|
|
|
|
size=$(lsblk -b -d -o NAME,SIZE | grep "$drive" | awk '{ printf "%.0f\n", $2 / 1024 / 1024 / 1024 }')
|
|
|
|
|
size=$((size-1))
|
|
|
|
|
root_size_default=$(echo "scale=0;$size * 0.10 / 1" | bc)
|
|
|
|
|
nix_size_default=$(echo "scale=0;$size * 0.35 / 1" | bc)
|
|
|
|
|
|
|
|
|
|
case "$size_choice" in
|
|
|
|
|
'')
|
|
|
|
|
deciding=false
|
|
|
|
|
;;
|
|
|
|
|
*[!0-9]*) # Matches non-numeric input
|
|
|
|
|
echo "Invalid input. Please enter a valid positive number."
|
|
|
|
|
echo
|
|
|
|
|
for part in "root" "nix"; do
|
|
|
|
|
echo "You have $size GB remaining to work with on this drive. How big do you want your $part partition?"
|
|
|
|
|
|
|
|
|
|
if [ "$part" = "root" ]; then
|
|
|
|
|
echo "Default value is 10% of hard drive space ($root_size_default GB)"
|
|
|
|
|
else
|
|
|
|
|
echo "Default value is 35% of hard drive space ($nix_size_default GB)"
|
|
|
|
|
fi
|
|
|
|
|
echo "Give a positive integer or leave blank to use default value"
|
|
|
|
|
echo
|
|
|
|
|
deciding=true
|
|
|
|
|
|
|
|
|
|
while $deciding; do
|
|
|
|
|
echo -n "> "
|
|
|
|
|
read -r size_choice
|
|
|
|
|
|
|
|
|
|
case "$size_choice" in
|
|
|
|
|
'')
|
|
|
|
|
deciding=false
|
|
|
|
|
;;
|
|
|
|
|
0) # Matches zero
|
|
|
|
|
echo "Please enter a positive number greater than zero."
|
|
|
|
|
;;
|
|
|
|
|
*) # Matches positive numbers
|
|
|
|
|
if (( size_choice > size - 50 )); then
|
|
|
|
|
echo "You need to leave more room for the other partitions."
|
|
|
|
|
elif (( size_choice < 5 )); then
|
|
|
|
|
echo "Partition size is too small."
|
|
|
|
|
else
|
|
|
|
|
echo "Valid input: $size_choice"
|
|
|
|
|
deciding=false # Exit the loop on valid input
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
*[!0-9]*) # Matches non-numeric input
|
|
|
|
|
echo "Invalid input. Please enter a valid positive number."
|
|
|
|
|
;;
|
|
|
|
|
0) # Matches zero
|
|
|
|
|
echo "Please enter a positive number greater than zero."
|
|
|
|
|
;;
|
|
|
|
|
*) # Matches positive numbers
|
|
|
|
|
if (( size_choice > size - 50 )); then
|
|
|
|
|
echo "You need to leave more room for the other partitions."
|
|
|
|
|
elif (( size_choice < 5 )); then
|
|
|
|
|
echo "Partition size is too small."
|
|
|
|
|
else
|
|
|
|
|
echo "Valid input: $size_choice"
|
|
|
|
|
deciding=false # Exit the loop on valid input
|
|
|
|
|
fi
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
case "$part" in
|
|
|
|
|
"root" )
|
|
|
|
|
if [ -z "$size_choice" ]; then root_size=$root_size_default; else root_size=$size_choice; fi
|
|
|
|
|
size=$((size - root_size))
|
|
|
|
|
;;
|
|
|
|
|
"nix" )
|
|
|
|
|
if [ -z "$size_choice" ]; then nix_size=$nix_size_default; else nix_size=$size_choice; fi
|
|
|
|
|
size=$((size - nix_size))
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
case "$part" in
|
|
|
|
|
"root" )
|
|
|
|
|
if [ -z "$size_choice" ]; then root_size=$root_size_default; else root_size=$size_choice; fi
|
|
|
|
|
size=$((size - root_size))
|
|
|
|
|
;;
|
|
|
|
|
"nix" )
|
|
|
|
|
if [ -z "$size_choice" ]; then nix_size=$nix_size_default; else nix_size=$size_choice; fi
|
|
|
|
|
size=$((size - nix_size))
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
echo
|
|
|
|
|
echo "Final partition sizes:"
|
|
|
|
|
echo "root: $root_size GB"
|
|
|
|
|
echo "nix: $nix_size GB"
|
|
|
|
|
echo "home: $size GB"
|
|
|
|
|
echo
|
|
|
|
|
|
|
|
|
|
echo "Final partition sizes:"
|
|
|
|
|
echo "root: $root_size GB"
|
|
|
|
|
echo "nix: $nix_size GB"
|
|
|
|
|
echo "home: $size GB"
|
|
|
|
|
sleep 1
|
|
|
|
|
|
|
|
|
|
sleep 1
|
|
|
|
|
# commence formatting
|
|
|
|
|
echo "Commencing formatting/partitioning..." && sleep 0.5
|
|
|
|
|
nix --experimental-features "nix-command flakes" run github:nix-community/disko -- --mode disko /tmp/install_pwd/disko.nix --arg device "\"/dev/$drive\"" --arg root_size "\"$root_size\G\"" --arg nix_size "\"$nix_size\G\""
|
|
|
|
|
|
|
|
|
|
# commence formatting
|
|
|
|
|
echo "Commencing formatting/partitioning..." && sleep 0.5
|
|
|
|
|
nix --experimental-features "nix-command flakes" run github:nix-community/disko -- --mode disko /tmp/install_pwd/disko.nix --arg device "\"/dev/$drive\"" --arg root_size "\"$root_size\G\"" --arg nix_size "\"$nix_size\G\""
|
|
|
|
|
mount /dev/disk/by-partlabel/disk-main-root /mnt
|
|
|
|
|
mkdir -p /mnt/nix && mount /dev/disk/by-partlabel/disk-main-nix /mnt/nix
|
|
|
|
|
mkdir -p /mnt/boot && mount /dev/disk/by-partlabel/disk-main-ESP /mnt/boot
|
|
|
|
|
mkdir -p /mnt/home && mount /dev/disk/by-partlabel/disk-main-home /mnt/home
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mount /dev/disk/by-partlabel/disk-main-root /mnt
|
|
|
|
|
mkdir -p /mnt/nix && mount /dev/disk/by-partlabel/disk-main-nix /mnt/nix
|
|
|
|
|
mkdir -p /mnt/boot && mount /dev/disk/by-partlabel/disk-main-ESP /mnt/boot
|
|
|
|
|
mkdir -p /mnt/home && mount /dev/disk/by-partlabel/disk-main-home /mnt/home
|
|
|
|
|
step_2() {
|
|
|
|
|
mkdir -p /mnt/etc
|
|
|
|
|
cd /mnt/etc/
|
|
|
|
|
if [ ! -d ./nixos ]; then
|
|
|
|
|
git clone https://github.com/pagedMov/pagedmov-nix-cfg.git ./nixos
|
|
|
|
|
|
|
|
|
|
mkdir -p /mnt/etc
|
|
|
|
|
cd /mnt/etc/
|
|
|
|
|
[ -d /mnt/etc/nixos ] && rm -rf /mnt/etc/nixos
|
|
|
|
|
git clone https://github.com/pagedMov/pagedmov-nix-cfg.git ./nixos
|
|
|
|
|
echo
|
|
|
|
|
echo "Do you want to install the light or heavy configuration?"
|
|
|
|
|
echo "Light configuration does not include gaming or virtualization features; intended for laptops, etc."
|
|
|
|
|
echo "Heavy config includes gaming and virtualization features; intended for performant desktop environments."
|
|
|
|
|
echo
|
|
|
|
|
select config in "Heavy" "Light" "Quit"; do
|
|
|
|
|
case $config in
|
|
|
|
|
"Heavy")
|
|
|
|
|
echo "Installing heavy configuration \`Oganesson\`"
|
|
|
|
|
config="oganesson"
|
|
|
|
|
sleep 0.5
|
|
|
|
|
break
|
|
|
|
|
;;
|
|
|
|
|
"Light")
|
|
|
|
|
echo "Installing light configuration \`Mercury\`"
|
|
|
|
|
config="mercury"
|
|
|
|
|
sleep 0.5
|
|
|
|
|
break
|
|
|
|
|
;;
|
|
|
|
|
"Quit")
|
|
|
|
|
echo "Exiting installation..."
|
|
|
|
|
sleep 0.5
|
|
|
|
|
exit 0
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
echo "Invalid option."
|
|
|
|
|
sleep 0.5
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
fi
|
|
|
|
|
|
|
|
|
|
echo "Do you want to install the light or heavy configuration?"
|
|
|
|
|
echo "Light configuration does not include gaming or virtualization features; intended for laptops, etc."
|
|
|
|
|
echo "Heavy config includes gaming and virtualization features; intended for performant desktop environments."
|
|
|
|
|
select config in "Heavy" "Light" "Quit"; do
|
|
|
|
|
case $config in
|
|
|
|
|
"Desktop")
|
|
|
|
|
echo "Installing heavy configuration \`Oganesson\`"
|
|
|
|
|
config="oganesson"
|
|
|
|
|
sleep 0.5
|
|
|
|
|
break
|
|
|
|
|
;;
|
|
|
|
|
"Laptop")
|
|
|
|
|
echo "Installing light configuration \`Mercury\`"
|
|
|
|
|
config="mercury"
|
|
|
|
|
sleep 0.5
|
|
|
|
|
break
|
|
|
|
|
;;
|
|
|
|
|
"Quit")
|
|
|
|
|
echo "Exiting installation..."
|
|
|
|
|
sleep 0.5
|
|
|
|
|
exit 0
|
|
|
|
|
;;
|
|
|
|
|
*)
|
|
|
|
|
echo "Invalid option."
|
|
|
|
|
sleep 0.5
|
|
|
|
|
;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
nixos-install --root /mnt --flake /mnt/etc/nixos#"$config" --no-root-password
|
|
|
|
|
|
|
|
|
|
nixos-install --root /mnt --flake /mnt/etc/nixos#"$config" --no-root-password
|
|
|
|
|
|
|
|
|
|
echo
|
|
|
|
|
echo "Preliminary installation successful!"
|
|
|
|
|
echo "Adapting config to your setup..."
|
|
|
|
|
echo
|
|
|
|
|
echo
|
|
|
|
|
echo "Preliminary installation successful!"
|
|
|
|
|
echo "Beginning secondary installation phase..."
|
|
|
|
|
echo
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
step_3() {
|
|
|
|
|
cp -r /mnt/etc/nixos /mnt/home/pagedmov/.sysflake
|
|
|
|
|
rm -rf /mnt/etc/nixos
|
|
|
|
|
ln -s /mnt/home/pagedmov/.sysflake /etc/nixos
|
|
|
|
|
@@ -150,3 +176,19 @@ echo "INSTALLATION COMPLETE ! !" | toilet -f 3d -w 120 | lolcat -a -s 180
|
|
|
|
|
echo "You can now reboot into your new system."
|
|
|
|
|
echo "The system configuration flake will be found in your home folder under .sysflake"
|
|
|
|
|
echo "/etc/nixos is a symlink leading to the .sysflake folder"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
next_step() {
|
|
|
|
|
((install_step += 1))
|
|
|
|
|
echo $install_step > /tmp/install_steps
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
running=true
|
|
|
|
|
while $running; do
|
|
|
|
|
case $install_step in
|
|
|
|
|
0) step_1;next_step;;
|
|
|
|
|
1) step_2;next_step;;
|
|
|
|
|
2) step_3;next_step;;
|
|
|
|
|
3) step_4;next_step;;
|
|
|
|
|
esac
|
|
|
|
|
done
|
|
|
|
|
|