diff options
| author | Mitchell Riedstra <mitch@riedstra.dev> | 2025-09-06 13:26:19 -0400 |
|---|---|---|
| committer | Mitchell Riedstra <mitch@riedstra.dev> | 2025-09-06 13:26:19 -0400 |
| commit | 58c75f167fd210374129cd7cb5f259c698260ca6 (patch) | |
| tree | f4a367670d3071e22d68255a0c01e14e8fce05f4 | |
| parent | 0b11c5f77323f72fb56f8dc217c726133860f1f9 (diff) | |
| download | voussoir-58c75f167fd210374129cd7cb5f259c698260ca6.tar.gz voussoir-58c75f167fd210374129cd7cb5f259c698260ca6.tar.xz | |
Installer works, albeit basic
| -rw-r--r-- | archiso_config/airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount | 8 | ||||
| -rw-r--r-- | archiso_config/airootfs/etc/systemd/system/pacman-init.service | 15 | ||||
| -rw-r--r-- | archiso_config/packages.x86_64 | 1 | ||||
| -rw-r--r-- | installer/run.sh | 234 |
4 files changed, 258 insertions, 0 deletions
diff --git a/archiso_config/airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount b/archiso_config/airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount new file mode 100644 index 0000000..038961e --- /dev/null +++ b/archiso_config/airootfs/etc/systemd/system/etc-pacman.d-gnupg.mount @@ -0,0 +1,8 @@ +[Unit] +Description=Temporary /etc/pacman.d/gnupg directory + +[Mount] +What=tmpfs +Where=/etc/pacman.d/gnupg +Type=tmpfs +Options=mode=0755,noswap diff --git a/archiso_config/airootfs/etc/systemd/system/pacman-init.service b/archiso_config/airootfs/etc/systemd/system/pacman-init.service new file mode 100644 index 0000000..b824884 --- /dev/null +++ b/archiso_config/airootfs/etc/systemd/system/pacman-init.service @@ -0,0 +1,15 @@ +[Unit] +Description=Initializes Pacman keyring +Requires=etc-pacman.d-gnupg.mount +After=etc-pacman.d-gnupg.mount time-sync.target +BindsTo=etc-pacman.d-gnupg.mount +Before=archlinux-keyring-wkd-sync.service + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/bin/pacman-key --init +ExecStart=/usr/bin/pacman-key --populate + +[Install] +WantedBy=multi-user.target diff --git a/archiso_config/packages.x86_64 b/archiso_config/packages.x86_64 index 279358f..2a45249 100644 --- a/archiso_config/packages.x86_64 +++ b/archiso_config/packages.x86_64 @@ -55,6 +55,7 @@ irssi iw iwd jfsutils +jq kitty-terminfo ldns less diff --git a/installer/run.sh b/installer/run.sh new file mode 100644 index 0000000..9907522 --- /dev/null +++ b/installer/run.sh @@ -0,0 +1,234 @@ +#!/bin/sh +set -e +_red="$(printf "\033[1;31m")" +_yellow="$(printf "\033[1;33m")" +_green="$(printf "\033[1;32m")" +_clear="$(printf "\033[0m")" + +_disk="${INSTALLATION_DISK:-}" +_cryptname="${CRYPTDEVICE_NAME:-root}" + +_install_path="${INSTALL_PATH:-/mnt}" +_mnt="${_install_path}" +_tz="${TZ:-America/New_York}" +_hostname="${INSTALL_HOSTNAME:-arch}" + +PACSTRAP="${PACSTRAP:-yes}" +DISK_SETUP="${DISK_SETUP:-yes}" +CONFIGURE="${CONFIGURE:-yes}" + +echo "############################################################" +echo "INSTALL PROCESS" +echo "############################################################" +echo +echo "We're going to keep this short and to the point" +echo "First the overview, here's the process:" +echo +echo " * Select the disk to install to. Ideally, remove all disks you don't want touched" +echo " * Set the encryption passphrase. ${_red}THERE IS NO RECOVERY IF YOU LOSE IT${_clear}" +echo " * Reboot into your new system" +echo +echo +echo "No alternative parition layouts are supported, no dual booting to the same drive." +echo "If you want these things, feel free to install Arch by hand, you're on your own" +echo +echo + +if [ "$DISK_SETUP" = yes ]; then + +_disk= +echo "Select a disk from the list:" + +if [ "$(lsblk -N | wc -l)" -gt 1 ] ; then + echo "NVME:" + lsblk -N | sed -re "s/^(nvme[^ ]*)/$_green\1$_clear/g" +else + printf '%s' "$_yellow" + echo "Warning: No NVME drives found on this system." + printf '%s' "$_clear" +fi + +if [ "$(lsblk -S | wc -l)" -gt 1 ] ; then + echo "SCSI:" + lsblk -S | sed -re "s/^(sd[^ ]*)/$_green\1$_clear/g" +fi + +if [ "$(lsblk -v | wc -l)" -gt 1 ] ; then + echo "Virtio:" + lsblk -v | sed -re "s/^(vio[^ ]*)/$_green\1$_clear/g" +fi + +if [ "$(lsblk -S | wc -l)" -lt 2 ] && [ "$(lsblk -N | wc -l)" -lt 2 ] && [ "$(lsblk -v | wc -l)" -lt 2 ]; then + printf '%s' "$_red" + echo No suitable drives for installation found, exiting + printf '%s' "$_clear" + exit 1 +fi + +while true ; do + +printf "Which disk to use for installation (green): " +read -r _disk + +printf "%s" "Selected disk ${_yellow}$_disk${_clear} Are you sure you want to ${_red}delete everything${_clear}? (type \"YES\" in caps): $_clear" +read -r resp +case $resp in + YES) break;; + *) continue ;; +esac + +done + +if [ -b "$_disk" ] ; then + true +elif [ -b "/dev/$_disk" ] ; then + _disk="/dev/$_disk" +else + echo Neither "$_disk" or /dev/"$_disk" appear to be valid block devices, exiting + exit 1 +fi + +_part1="${_disk}1" +_part2="${_disk}2" +_part3="${_disk}3" +if echo "$_disk" | grep "nvme" ; then + _part1="${_disk}p1" + _part2="${_disk}p2" + _part3="${_disk}p3" +fi + + +set -x +wipefs -a "$_disk" +sgdisk --zap-all "$_disk" +sgdisk --hybrid "$_disk" +sgdisk \ + --new=1::+1G --typecode=1:ef00 \ + --new=2::+2G --typecode=2:8300 \ + --largest-new=3 --typecode=3:8e00 \ + "$_disk" +partprobe >/dev/null 2>&1 || echo "" + +mkfs.vfat -F 32 "$_part1" +mkfs.ext4 "$_part2" +set +x + +echo "You will now enter your passphrase for ${_red}disk encryption${_clear}: " +cryptsetup luksFormat "$_part3" + +_part3_uuid="$(blkid -o json "$_part3" | jq -r .uuid | tr -d '\n')" +if [ -z "$_part3_uuid" ] ; then + echo "${_red}Unable to find UUID for partition 3, bailing${_clear}" + exit 1 +fi + + +echo "We're now going to unlock that disk with the same passhrase: " +cryptsetup luksOpen "$_part3" "$_cryptname" + +set -x +mkfs.btrfs /dev/mapper/"$_cryptname" + + +mount /dev/mapper/"$_cryptname" "$_mnt" +cd "$_mnt" +btrfs sub create root +btrfs sub create home +cd - +umount /dev/mapper/"$_cryptname" + +mount -o subvol=root,compress=zstd /dev/mapper/"$_cryptname" "$_mnt" +mkdir -p "$_mnt"/home +mount -o subvol=home,compress=zstd /dev/mapper/"$_cryptname" "$_mnt"/home +mkdir -p "$_mnt"/boot +mount "$_part2" "$_mnt"/boot +mkdir -p "$_mnt"/boot/efi +mount "$_part1" "$_mnt"/boot/efi + +fi # DISK_SETUP + + +do_edit() { +printf "Edit \"$1\" ? : " +read -r resp +case $resp in + Y|y) arch-chroot "${_install_path}" nvim "$1" ;; + *) ;; +esac +} + +do_chroot() { + arch-chroot "$_install_path" "$@" +} + +pacman-key --init +pacman-key --populate + +# TODO: all the same packages as the ISO +if [ $PACSTRAP = yes ] ; then +pacstrap -K "$_install_path" \ + arch-install-scripts \ + base \ + base-devel \ + btrfs-progs \ + cryptsetup \ + dosfstools \ + e2fsprogs \ + efibootmgr \ + git \ + gptfdisk \ + grub \ + linux \ + linux-firmware \ + linux-firmware-marvell \ + lvm2 \ + networkmanager \ + nvim \ + sof-firmware \ + tmux \ + xfsprogs \ + +fi + + +if [ "$CONFIGURE" = yes ] ; then +genfstab -U "$_install_path" > "${_install_path}/etc/fstab" + +# do_edit /etc/fstab + +# do_edit /etc/locale.gen +sed -i -e '/^en_US.UTF-8 UTF-8$/d' "${_install_path}/etc/locale.gen" +echo "en_US.UTF-8 UTF-8" >> "${_install_path}/etc/locale.gen" + +do_chroot locale-gen + +do_chroot ln -sf "/usr/share/zoneinfo/$_tz" /etc/localtime + +sed -i \ + -e 's/^HOOKS=.*$/HOOKS=(base udev autodetect microcode modconf kms keyboard block keymap encrypt lvm2 consolefont filesystems fsck)/g' \ + "${_install_path}/etc/mkinitcpio.conf" + +# do_edit /etc/mkinitcpio.conf + +do_chroot mkinitcpio -p linux + +sed -i \ + -e 's/^GRUB_CMDLINE_LINUX_DEFAULT=.*$/GRUB_CMDLINE_LINUX_DEFAULT=""/' \ + "${_install_path}"/etc/default/grub + +sed -i \ + -e 's@^GRUB_CMDLINE_LINUX=.*$@GRUB_CMDLINE_LINUX="cryptdevice=UUID='"$_part3_uuid"':'"$_cryptname"'"@g' \ + "${_install_path}"/etc/default/grub + +# do_edit /etc/default/grub + +# Make this bootable directly as removable media +do_chroot grub-install --target=x86_64-efi --removable --efi-directory=/boot/efi + +# But also add an entry to the uEFI, and set it as default +do_chroot grub-install --target=x86_64-efi --efi-directory=/boot/efi + +do_chroot grub-mkconfig -o /boot/grub/grub.cfg + +do_chroot passwd +fi # CONFIGURE |
