#!/usr/bin/env nix-shell #! nix-shell -i bash #! nix-shell -p bash nixos-install-tools set -euo pipefail SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) # Parse arguments function help { echo "Usage: $0 [-e] [-h] profile" echo echo "Arguments:" echo " file: OS/disk profile to use" echo echo "Options:" echo " -h: Display this help message." echo " -e: Erase the disk. This can be used in case the wanted partition scheme doesn't match." } disko_mode=mount while getopts "e" OPTION do case "$OPTION" in h) help exit 0 ;; e) disko_mode=disko ;; ?) help exit 2 ;; esac done shift "$(($OPTIND -1))" if [ "$#" -ne 1 ] then help exit 2 fi profile="$1" profile_dir="${SCRIPT_DIR}/${profile}" if [ ! -d "$profile_dir" ] then echo "Profile not found." fi disko_config="${profile_dir}/disko.nix" if [ ! -f "$disko_config" ] then echo "Disk configuration not found." fi nixos_config="${profile_dir}/os.nix" if [ ! -f "$nixos_config" ] then echo "NixOS configuration not found." fi mountpoint="/mnt/nixos" nix_flakes_cmd="nix --extra-experimental-features nix-command --extra-experimental-features flakes" set -x sudo mkdir -p "$mountpoint" # Add channels to root user, as nixos-install uses those. # Not great, but fixable with flakes I guess sudo ./add_channels.sh # Format or mount disk sudo $nix_flakes_cmd run github:nix-community/disko -- --root-mountpoint "$mountpoint" --mode "$disko_mode" "$disko_config" # Generate hardware-config.nix sudo nixos-generate-config --no-filesystems --root "$mountpoint" # --no-filesystems because they are imported via disko # Plug system configuration into this git repo sudo mkdir -p "${mountpoint}/etc/nixos" echo "{ ... }: { imports = [ ./hardware-configuration.nix ${nixos_config} ]; }" | sudo tee "${mountpoint}/etc/nixos/configuration.nix" > /dev/null # Everything there should be covered by (and conflicts with) the repo anyways. # Install NixOS! Or create a new generation. sudo nixos-install --no-root-password --root "$mountpoint" # Install dotfiles. Actually not needed by nixos-install since it doesn't rewrite global paths to the mountpoint. # Without it no nixos-rebuild from the system itself once installed though. # Should probably be replaced with something like git-sync # sudo mkdir -p $mountpoint/home/geoffrey/.config/ # sudo cp -a ../dotfiles $mountpoint/home/geoffrey/.config/ # sudo chown geoffrey:geoffrey $mountpoint/home/geoffrey -R # Signal the installation is done! echo