void-usb/install-stage1.sh

679 lines
24 KiB
Bash

#!/usr/bin/env bash
LOGFILE=/tmp/void-usb-install-log
GIT_REPO_BASE="https://lostcave.ddnss.de/git/BodgeMaster/void-usb/raw/branch/master"
function press_any_key {
echo "Press any key to continue or Ctrl+c to abort..."
read -n1 DISCARD_ME
echo ""
}
function are_you_really_really_sure {
echo "Enter the following exactly to continue: $1"
read -p "> " DISCARD_ME
echo ""
if [ "$1" = "$DISCARD_ME" ]; then
return 0
else
return 1
fi
}
function yesno {
unset DISCARD_ME
while [ -z "$DISCARD_ME" ]; do
read -p "[y/n] " -n1 DISCARD_ME
case "$DISCARD_ME" in
y)
echo ""
return 0
;;
n)
echo ""
return 1
;;
*)
echo " Please enter y for yes or n for no."
unset DISCARD_ME
;;
esac
done
}
function run_in_target {
echo "$@" | chroot /mnt/target sh
}
clear
touch $LOGFILE
if [ ! "$(id -u)" -eq 0 ]; then
echo "Must be root to run this script!"
exit 1
fi
if ping -c2 repo-default.voidlinux.org >> $LOGFILE 2>&1; then
:
else
echo "An internet connection is required to run this script."
exit 1
fi
echo "
This script will now download and install Void Linux on your USB stick.
Any data that is currently on the stick will be lost and it won't be
usable from Windows or MacOS.
Before we begin, the following packages need to be installed (if not installed already):
- xmirror
- wget
"
press_any_key
echo -n "Ensuring that XBPS is up-to-date... "
xbps-install --yes --sync --update xbps >> $LOGFILE 2>&1
echo "done"
echo -n "Installing xmirror, squashfs-tools, wget... "
xbps-install --yes xmirror wget >> $LOGFILE 2>&1
echo "done"
#TODO: Select keyboard layout by showing lists of what's present (directories for region, then files within)
KBD_LAYOUT="us"
clear
echo "Select the USB stick to install to (NAME column below)...
"
# exclude loop devices and optical drives
lsblk --exclude 7,11 --nodeps --output NAME,SIZE,MODEL
echo ""
read -p "> " TARGET_DISK
while [ ! -b "/dev/$TARGET_DISK" ]; do
lsblk --exclude 7,11 --nodeps --output NAME,SIZE,MODEL
echo "$TARGET_DISK is not a valid device!"
read -p "> " TARGET_DISK
done
clear
echo "Selected device:"
lsblk --output NAME,SIZE,MODEL,LABEL,FSTYPE "/dev/$TARGET_DISK"
echo "
WARNING: The selected device will be wiped, partitioned, and formatted.
ALL DATA ON IT WILL BE LOST PERMANENTLY.
It will not be usable with Windows or MacOS while holding Void.
"
if are_you_really_really_sure "Yes, erase it."; then
true
else
echo "Aborting."
exit 1
fi
if grep "$TARGET_DISK" /proc/mounts >> $LOGFILE 2>&1; then
echo "The device seems to be mounted. Unmount?"
if yesno; then
echo -n "Attempting to unmount... "
readarray -t MOUNTPOINTS <<< "$(findmnt --raw --noheadings --output SOURCE,TARGET | grep "$TARGET_DISK" | sed 's/^[^ ]* //')"
for I in ${!MOUNTPOINTS[@]}; do
umount -R "${MOUNTPOINTS[$I]}" >> $LOGFILE 2>&1
done
if grep "$TARGET_DISK" /proc/mounts >> $LOGFILE 2>&1; then
echo "failed"
echo "It seems the device is still mounted. Installation cannot continue."
exit 1
else
echo "done"
fi
else
echo "Aborting."
exit 1
fi
fi
echo "
Do you want to encrypt your files?
With the exception of the files essential for booting, the system will be encrypted.
This will use an additional 1Gib of storage space.
If you enable encryption, you will be prompted for a passphrase. This passphrase will be
asked separately during bootup and may be different from the user login.
"
if yesno; then
ADD_CRYPTSETUP="cryptsetup"
echo -n "Wiping and partitioning storage... "
# new GPT
# 2M BIOS GRUB
# 66592 sectors ESP (first sector + 66591 sectors, the minimum to format FAT32 with default settings)
# everything else one big partition
echo "g
n
+2M
n
+66591
n
+1G
n
t
1
4
t
2
1
t
3
142
t
4
20
w" | fdisk --wipe always --wipe-partitions always "/dev/$TARGET_DISK" >> $LOGFILE 2>&1
TARGET_PART_BIOS="$(lsblk --raw --noheadings --output PATH "/dev/$TARGET_DISK" | sed -n '2p')"
TARGET_PART_EFI="$(lsblk --raw --noheadings --output PATH "/dev/$TARGET_DISK" | sed -n '3p')"
TARGET_PART_BOOT="$(lsblk --raw --noheadings --output PATH "/dev/$TARGET_DISK" | sed -n '4p')"
TARGET_PART_BIG="$(lsblk --raw --noheadings --output PATH "/dev/$TARGET_DISK" | sed -n '5p')"
echo "done"
echo -n "Formatting partitions... "
mkfs.vfat -F32 -n "EFIBOOT" "$TARGET_PART_EFI" >> $LOGFILE 2>&1
mkfs.f2fs -f -l "boot" "$TARGET_PART_BOOT" >> $LOGFILE 2>&1
echo "Setting up encryption. You will be asked for the same password twice."
cryptsetup luksFormat --batch-mode --type luks2 --force-password "$TARGET_PART_BIG"
DEV_MAPPER_NAME="luks-$(blkid --output value --match-tag UUID "$TARGET_PART_BIG")"
cryptsetup luksOpen --batch-mode --type luks2 "$TARGET_PART_BIG" "$DEV_MAPPER_NAME"
if [ "$?" -gt 0 ]; then
echo "Failed to open encrypted container. The entered passwords probably didn't match."
exit 1
fi
mkfs.f2fs -f -l "container" /dev/mapper/"$DEV_MAPPER_NAME" >> $LOGFILE 2>&1
echo "done"
echo -n "Mounting partitions and virtual file systems... "
mkdir -p /mnt/target >> $LOGFILE 2>&1
mount -t tmpfs -o size=3g,mode=755 tmpfs /mnt/target >> $LOGFILE 2>&1
# used for chroot later
mkdir /mnt/target/run >> $LOGFILE 2>&1
mount -t tmpfs none /mnt/target/run >> $LOGFILE 2>&1
mkdir /mnt/target/proc >> $LOGFILE 2>&1
mount -t proc proc /mnt/target/proc >> $LOGFILE 2>&1
mkdir /mnt/target/sys >> $LOGFILE 2>&1
mount --rbind /sys /mnt/target/sys >> $LOGFILE 2>&1
mount --make-rslave /mnt/target/sys >> $LOGFILE 2>&1
mkdir /mnt/target/dev >> $LOGFILE 2>&1
mount --rbind /dev /mnt/target/dev >> $LOGFILE 2>&1
mount --make-rslave /mnt/target/dev >> $LOGFILE 2>&1
# actual storage
mkdir -p /mnt/target/run/void-usb/container >> $LOGFILE 2>&1
mount /dev/mapper/"$DEV_MAPPER_NAME" /mnt/target/run/void-usb/container >> $LOGFILE 2>&1
mkdir /mnt/target/boot >> $LOGFILE 2>&1
mount "$TARGET_PART_BOOT" /mnt/target/boot
mkdir /mnt/target/boot/efi >> $LOGFILE 2>&1
mount "$TARGET_PART_EFI" /mnt/target/boot/efi >> $LOGFILE 2>&1
mkdir /mnt/target/home >> $LOGFILE 2>&1
mkdir /mnt/target/run/void-usb/container/home >> $LOGFILE 2>&1
mount --bind /mnt/target/run/void-usb/container/home /mnt/target/home >> $LOGFILE 2>&1
echo "done"
else
echo -n "Wiping and partitioning storage... "
# new GPT
# 2M BIOS GRUB
# 66592 sectors ESP (first sector + 66591 sectors, the minimum to format FAT32 with default settings)
# everything else one big partition
echo "g
n
+2M
n
+66591
n
t
1
4
t
2
1
t
3
20
w" | fdisk --wipe always --wipe-partitions always "/dev/$TARGET_DISK" >> $LOGFILE 2>&1
TARGET_PART_BIOS="$(lsblk --raw --noheadings --output PATH "/dev/$TARGET_DISK" | sed -n '2p')"
TARGET_PART_EFI="$(lsblk --raw --noheadings --output PATH "/dev/$TARGET_DISK" | sed -n '3p')"
TARGET_PART_BIG="$(lsblk --raw --noheadings --output PATH "/dev/$TARGET_DISK" | sed -n '4p')"
echo "done"
echo -n "Formatting partitions... "
mkfs.vfat -F32 -n "EFIBOOT" "$TARGET_PART_EFI" >> $LOGFILE 2>&1
mkfs.f2fs -f -l "container" "$TARGET_PART_BIG" >> $LOGFILE 2>&1
echo "done"
echo -n "Mounting partitions and virtual file systems... "
mkdir -p /mnt/target >> $LOGFILE 2>&1
mount -t tmpfs -o size=3g,mode=755 tmpfs /mnt/target >> $LOGFILE 2>&1
# used for chroot later
mkdir /mnt/target/run >> $LOGFILE 2>&1
mount -t tmpfs none /mnt/target/run >> $LOGFILE 2>&1
mkdir /mnt/target/proc >> $LOGFILE 2>&1
mount -t proc proc /mnt/target/proc >> $LOGFILE 2>&1
mkdir /mnt/target/sys >> $LOGFILE 2>&1
mount --rbind /sys /mnt/target/sys >> $LOGFILE 2>&1
mount --make-rslave /mnt/target/sys >> $LOGFILE 2>&1
mkdir /mnt/target/dev >> $LOGFILE 2>&1
mount --rbind /dev /mnt/target/dev >> $LOGFILE 2>&1
mount --make-rslave /mnt/target/dev >> $LOGFILE 2>&1
# actual storage
mkdir -p /mnt/target/run/void-usb/container >> $LOGFILE 2>&1
mount "$TARGET_PART_BIG" /mnt/target/run/void-usb/container >> $LOGFILE 2>&1
mkdir /mnt/target/boot >> $LOGFILE 2>&1
mkdir /mnt/target/run/void-usb/container/boot >> $LOGFILE 2>&1
mount --bind /mnt/target/run/void-usb/container/boot /mnt/target/boot >> $LOGFILE 2>&1
mkdir /mnt/target/boot/efi >> $LOGFILE 2>&1
mount "$TARGET_PART_EFI" /mnt/target/boot/efi >> $LOGFILE 2>&1
mkdir /mnt/target/home >> $LOGFILE 2>&1
mkdir /mnt/target/run/void-usb/container/home >> $LOGFILE 2>&1
mount --bind /mnt/target/run/void-usb/container/home /mnt/target/home >> $LOGFILE 2>&1
echo "done"
fi
clear
echo "Storage is now prepared and ready for installation.
You need to select a download mirror for Void next.
The script will launch xmirror on the host/live system and determine
the chosen mirror from the config file it generates.
"
press_any_key
xmirror
TARGET_MIRROR="$(sed 's/repository=//;s|/musl$||' /etc/xbps.d/00-repository-main.conf)"
#TODO: allow only 32 bit on a 32 bit system
options=("x86_64" "x86_64-musl" "x86_32")
while true; do
echo "Select your desired architecture."
for i in "${!options[@]}"; do
echo "$((i+1)): ${options[$i]}"
done
read -p "Input your choice (number): " choice
if [ "$choice" -ge 1 ] && [ "$choice" -le "${#options[@]}" ]; then
TARGET_TYPE="${options[$((choice-1))]}"
break
else
echo "Selection invalid."
fi
done
echo "You selected: $TARGET_TYPE"
if grep "musl" <<< "$TARGET_TYPE"; then
TARGET_MIRROR="$TARGET_MIRROR/musl"
TARGET_TYPE="$(sed -e 's/ musl//' <<< "$TARGET_TYPE")"
fi
echo -n "Copying repository keys... "
mkdir -p /mnt/target/var/db/xbps/keys >> $LOGFILE 2>&1
cp /var/db/xbps/keys/* /mnt/target/var/db/xbps/keys/ >> $LOGFILE 2>&1
echo "done"
clear
echo "The next step is installing packages for base system components.
Depending on your internet connection, your USB stick, and the phase of the moon, this may take a while.
The XBPS log will be displayed for this step.
"
press_any_key
XBPS_ARCH="$TARGET_TYPE" xbps-install --yes --sync --rootdir /mnt/target --repository "$TARGET_MIRROR" \
linux bash shadow f2fs-tools dosfstools dbus NetworkManager iana-etc \
iw wpa_supplicant util-linux which tar man-pages iproute2 iputils \
wifi-firmware traceroute grep gzip file sed gawk less coreutils findutils \
diffutils pciutils usbutils tzdata base-files ncurses mdocml procps-ng \
kbd xbps sudo ethtool kmod eudev runit-void removed-packages nano acpid \
squashfs-tools grub grub-i386-efi grub-x86_64-efi dracut xz $ADD_CRYPTSETUP 2>&1 | tee --append $LOGFILE
if [ "$?" -ne 0 ]; then
echo ""
echo "An error occurred while trying to install the base system."
exit 1
fi
echo ""
echo "Adding mirror configuration."
echo "repository=$TARGET_MIRROR" > /mnt/target/etc/xbps.d/00-repository-main.conf
echo "Adding sudo configuration."
echo "%wheel ALL=(ALL:ALL) ALL" > /mnt/target/etc/sudoers.d/wheel_as_sudo_group
echo "Disabling root password."
run_in_target passwd --lock root
echo "Adding dracut configuration."
echo '# Void USB dracut configuration
hostonly="no"
compress="xz"
add_dracutmodules+=" void-usb "
omit_dracutmodules+=" nvdimm resume "' > /mnt/target/etc/dracut.conf.d/99-void-usb.conf
echo -n "Adding dracut module void-usb... "
mkdir -p /mnt/target/lib/dracut/modules.d/90void-usb >> $LOGFILE 2>&1
chmod 755 /mnt/target/lib/dracut/modules.d/90void-usb >> $LOGFILE 2>&1
wget --output-document=/mnt/target/lib/dracut/modules.d/90void-usb/module-setup.sh "$GIT_REPO_BASE/dracut-modules/90void-usb/module-setup.sh" >> $LOGFILE 2>&1
chmod 744 /mnt/target/lib/dracut/modules.d/90void-usb/module-setup.sh >> $LOGFILE 2>&1
wget --output-document=/mnt/target/lib/dracut/modules.d/90void-usb/create-loop0.sh "$GIT_REPO_BASE/dracut-modules/90void-usb/create-loop0.sh" >> $LOGFILE 2>&1
chmod 744 /mnt/target/lib/dracut/modules.d/90void-usb/create-loop0.sh >> $LOGFILE 2>&1
wget --output-document=/mnt/target/lib/dracut/modules.d/90void-usb/squashfs-img.sh "$GIT_REPO_BASE/dracut-modules/90void-usb/squashfs-img.sh" >> $LOGFILE 2>&1
chmod 744 /mnt/target/lib/dracut/modules.d/90void-usb/squashfs-img.sh >> $LOGFILE 2>&1
wget --output-document=/mnt/target/lib/dracut/modules.d/90void-usb/overlay.sh "$GIT_REPO_BASE/dracut-modules/90void-usb/overlay.sh" >> $LOGFILE 2>&1
chmod 744 /mnt/target/lib/dracut/modules.d/90void-usb/overlay.sh >> $LOGFILE 2>&1
echo "done"
echo -n "Adding system-image helper... "
mkdir -p /mnt/target/opt/void-usb >> $LOGFILE 2>&1
chmod 755 /mnt/target/opt/void-usb >> $LOGFILE 2>&1
wget --output-document=/mnt/target/opt/void-usb/system-image "$GIT_REPO_BASE/opt/system-image" >> $LOGFILE 2>&1
chmod 744 /mnt/target/opt/void-usb/system-image >> $LOGFILE 2>&1
echo "
/opt/void-usb/system-image" >> /mnt/target/etc/rc.shutdown
echo "done"
echo "Adding fstab."
if [ -n "$TARGET_PART_BOOT" ]; then
echo "# See fstab(5).
# <device> <mount point> <fstype> <options> <dump> <pass>
# /run/void-usb/container, /run/void-usb/overlay, and / are mounted by scripts in initramfs
UUID=$(blkid --output value --match-tag UUID $TARGET_PART_BOOT) /boot f2fs nodev,nosuid,noexec 0 2
/run/void-usb/container/home /home none bind 0 0
UUID=$(blkid --output value --match-tag UUID $TARGET_PART_EFI) /boot/efi vfat nodev,nosuid,noexec,umask=133,dmask=022 0 2
" > /mnt/target/etc/fstab
else
echo "# See fstab(5).
# <device> <mount point> <fstype> <options> <dump> <pass>
# /run/void-usb/container, /run/void-usb/overlay, and / are mounted by scripts in initramfs
/run/void-usb/container/boot /boot none bind 0 0
/run/void-usb/container/home /home none bind 0 0
UUID=$(blkid --output value --match-tag UUID $TARGET_PART_EFI) /boot/efi vfat nodev,nosuid,noexec,umask=133,dmask=022 0 2
" > /mnt/target/etc/fstab
fi
echo "Configuring keyboard layout."
if grep "#KEYMAP=" /mnt/target/etc/rc.conf; then
sed -i -e 's/#KEYMAP=.*/KEYMAP="'"$KBD_LAYOUT"'"/' /mnt/target/etc/rc.conf
else
clear
echo "WARNING: Could not locate the keymap setting in rc.conf." | tee --append $LOGFILE
echo "The script will attempt to add one." | tee --append $LOGFILE
echo ""
press_any_key
echo "" >> /mnt/target/etc/rc.conf
echo "# Install script could not find keymap setting, adding one here." >> /mnt/target/etc/rc.conf
echo "KEYMAP=\"$KBD_LAYOUT\"" >> /mnt/target/etc/rc.conf
fi
clear
REGIONS="$(find /usr/share/zoneinfo/ -mindepth 1 -maxdepth 1 -type d -exec basename \{\} \; | sort)"
I=1
echo "
To set up time zone information, you will now be prompted for a region and location.
The location should be the one that determines your timezone, it isn't necessarily the one nearest to you.
Please choose a region:"
for REGION in $REGIONS; do
echo "$I: $REGION"
I=$((I+1))
done
REGION=""
CHOICE=0
while ! [ "$CHOICE" -gt 0 -a "$CHOICE" -le "$(wc -l <<< "$REGIONS")" ]; do
read -p "Select an option [1-$(wc -l <<< "$REGIONS")]: " CHOICE
if [ "$CHOICE" -gt 0 -a "$CHOICE" -le "$(wc -l <<< "$REGIONS")" ]; then
REGION="$(sed -n -e "${CHOICE}p" <<< "$REGIONS")"
else
echo "Invalid choice."
fi
done
LOCATIONS="$(find /usr/share/zoneinfo/"$REGION"/ -mindepth 1 -maxdepth 1 -exec basename \{\} \; | sort)"
I=1
echo "
Please choose a location or sub-region:"
for LOCATION in $LOCATIONS; do
if [ "$((I % 3))" -eq 0 ]; then
echo "$I: $LOCATION"
else
echo -n "$I: $LOCATION"
echo -ne "\t"
fi
I=$((I+1))
done
LOCATION=""
CHOICE=0
while ! [ "$CHOICE" -gt 0 -a "$CHOICE" -le "$(wc -l <<< "$LOCATIONS")" ]; do
read -p "Select an option [1-$(wc -l <<< "$LOCATIONS")]: " CHOICE
if [ "$CHOICE" -gt 0 -a "$CHOICE" -le "$(wc -l <<< "$LOCATIONS")" ]; then
LOCATION="$(sed -n -e "${CHOICE}p" <<< "$LOCATIONS")"
else
echo "Invalid choice."
fi
done
if [ -d "/usr/share/zoneinfo/$REGION/$LOCATION" ]; then
REGION="$REGION/$LOCATION"
LOCATIONS="$(find /usr/share/zoneinfo/"$REGION"/ -mindepth 1 -maxdepth 1 -exec basename \{\} \; | sort)"
I=1
echo "
Please choose a location:"
for LOCATION in $LOCATIONS; do
if [ "$((I % 3))" -eq 0 ]; then
echo "$I: $LOCATION"
else
echo -n "$I: $LOCATION"
echo -ne "\t"
fi
I=$((I+1))
done
LOCATION=""
CHOICE=0
while ! [ "$CHOICE" -gt 0 -a "$CHOICE" -le "$(wc -l <<< "$LOCATIONS")" ]; do
read -p "Select an option [1-$(wc -l <<< "$LOCATIONS")]: " CHOICE
if [ "$CHOICE" -gt 0 -a "$CHOICE" -le "$(wc -l <<< "$LOCATIONS")" ]; then
LOCATION="$(sed -n -e "${CHOICE}p" <<< "$LOCATIONS")"
else
echo "Invalid choice."
fi
done
fi
TIMEZONE="$REGION/$LOCATION"
echo "Configuring timezone."
if grep "#TIMEZONE=" /mnt/target/etc/rc.conf; then
sed -i -e 's/#TIMEZONE=.*/TIMEZONE="'"$TIMEZONE"'"/' /mnt/target/etc/rc.conf
else
clear
echo "WARNING: Could not locate the time zone setting in rc.conf." | tee --append $LOGFILE
echo "The script will attempt to add one." | tee --append $LOGFILE
echo ""
press_any_key
echo "" >> /mnt/target/etc/rc.conf
echo "# Install script could not find time zone setting, adding one here." >> /mnt/target/etc/rc.conf
echo "TIMEZONE=\"$TIMEZONE\"" >> /mnt/target/etc/rc.conf
fi
echo "Setting SEEDRNG_SKIP_CREDIT=true"
if grep "#SEEDRNG_SKIP_CREDIT=" /mnt/target/etc/rc.conf; then
sed -i -e 's/#SEEDRNG_SKIP_CREDIT=.*/SEEDRNG_SKIP_CREDIT=true/' /mnt/target/etc/rc.conf
else
clear
echo "WARNING: Could not locate the SEEDRNG_SKIP_CREDIT setting in rc.conf." | tee --append $LOGFILE
echo "The script will attempt to add one." | tee --append $LOGFILE
echo ""
press_any_key
echo "" >> /mnt/target/etc/rc.conf
echo "# Install script could not find SEEDRNG_SKIP_CREDIT setting, adding one here." >> /mnt/target/etc/rc.conf
echo "SEEDRNG_SKIP_CREDIT=true" >> /mnt/target/etc/rc.conf
fi
clear
echo "Assume that the hardware clock is UTC?
Most Unix-like systems set the clock in your computer to UTC and add the time zone
on-the-fly. Windows on the other hand usually sets the hardware clock to local time.
If you want to use this stick on Windows computers, you will most likely want to answer no here.
"
if yesno; then
if grep "#HARDWARECLOCK=" /mnt/target/etc/rc.conf; then
sed -i -e 's/#HARDWARECLOCK=.*/HARDWARECLOCK="UTC"/' /mnt/target/etc/rc.conf
else
clear
echo "WARNING: Could not locate the hardwareclock setting in rc.conf." | tee --append $LOGFILE
echo "The script will attempt to add one." | tee --append $LOGFILE
echo ""
press_any_key
echo "" >> /mnt/target/etc/rc.conf
echo "# Install script could not find hardwareclock setting, adding one here." >> /mnt/target/etc/rc.conf
echo 'HARDWARECLOCK="UTC"' >> /mnt/target/etc/rc.conf
fi
else
if grep "#HARDWARECLOCK=" /mnt/target/etc/rc.conf; then
sed -i -e 's/#HARDWARECLOCK=.*/HARDWARECLOCK="localtime"/' /mnt/target/etc/rc.conf
else
clear
echo "WARNING: Could not locate the hardwareclock setting in rc.conf." | tee --append $LOGFILE
echo "The script will attempt to add one." | tee --append $LOGFILE
echo ""
press_any_key
echo "" >> /mnt/target/etc/rc.conf
echo "# Install script could not find hardwareclock setting, adding one here." >> /mnt/target/etc/rc.conf
echo 'HARDWARECLOCK="localtime"' >> /mnt/target/etc/rc.conf
fi
fi
clear
echo "Do you want to set a hostname?
This is equivalent to giving a name to your computer - except it's a system on a USB drive.
If you leave this empty, it will be set to void-usb.
Allowed characters are a-zA-Z0-9 (and - in the middle).
"
while [ -z "$TARGET_HOSTNAME" ]; do
read -p "> " TARGET_HOSTNAME
if [ -z "$TARGET_HOSTNAME" ]; then
TARGET_HOSTNAME="void-usb"
else
if grep -e "^[a-zA-Z0-9][a-zA-Z0-9-]*[a-zA-Z0-9]$" -e "^[a-zA-Z0-9]*$" <<< "$TARGET_HOSTNAME" > /dev/null 2>&1; then
true
else
echo "Allowed characters are a-zA-Z0-9 (and - in the middle)."
unset TARGET_HOSTNAME
fi
fi
done
echo "$TARGET_HOSTNAME" > /mnt/target/etc/hostname
#TODO: set up / fix locale on glibc
clear
echo -n "Installing bootloader... "
mkdir /mnt/target/boot/efi/LOADER >> $LOGFILE 2>&1
echo "GRUB has been deliberately installed to a non-standard location.
This avoids default kernel hooks breaking the custom config." > /mnt/target/boot/efi/LOADER/README.TXT
# no idea if any of these are even necessary/relevant but it can't hurt...
run_in_target grub-install --target=i386-pc --boot-directory=/boot/efi/LOADER "'/dev/$TARGET_DISK'" >> $LOGFILE 2>&1
run_in_target grub-install --target=i386-efi --boot-directory=/boot/efi/LOADER --efi-directory=/boot/efi --removable --no-nvram "'/dev/$TARGET_DISK'" >> $LOGFILE 2>&1
run_in_target grub-install --target=x86_64-efi --boot-directory=/boot/efi/LOADER --efi-directory=/boot/efi --removable --no-nvram "'/dev/$TARGET_DISK'" >> $LOGFILE 2>&1
echo "done"
echo -n "Adding grub-config helper... "
wget --output-document=/mnt/target/opt/void-usb/grub-config "$GIT_REPO_BASE/opt/grub-config" >> $LOGFILE 2>&1
chmod 744 /mnt/target/opt/void-usb/grub-config >> $LOGFILE 2>&1
echo "done"
echo -n "Adding kernel hooks... "
wget --output-document=/mnt/target/etc/kernel.d/pre-install/99-void-usb "$GIT_REPO_BASE/kernel.d/pre-install/99-void-usb" >> $LOGFILE 2>&1
chmod 744 /mnt/target/etc/kernel.d/pre-install/99-void-usb >> $LOGFILE 2>&1
wget --output-document=/mnt/target/etc/kernel.d/post-install/99-void-usb "$GIT_REPO_BASE/kernel.d/post-install/99-void-usb" >> $LOGFILE 2>&1
chmod 744 /mnt/target/etc/kernel.d/post-install/99-void-usb >> $LOGFILE 2>&1
wget --output-document=/mnt/target/etc/kernel.d/post-remove/99-void-usb "$GIT_REPO_BASE/kernel.d/post-remove/99-void-usb" >> $LOGFILE 2>&1
chmod 744 /mnt/target/etc/kernel.d/post-remove/99-void-usb >> $LOGFILE 2>&1
echo "done"
echo -n "Reconfiguring all installed packages... "
run_in_target xbps-reconfigure -fa >> $LOGFILE 2>&1
echo "done"
echo -n "Configuring runit to start some services... "
run_in_target ln -s /etc/sv/acpid /etc/runit/runsvdir/default/
run_in_target ln -s /etc/sv/dbus /etc/runit/runsvdir/default/
run_in_target ln -s /etc/sv/NetworkManager /etc/runit/runsvdir/default/
echo "done"
echo -n "Adding stage 2 installer... "
STAGE2_DIR="/mnt/target/opt/void-usb/installer"
function get_stage2_file {
[ -d "$STAGE2_DIR/$(dirname $1)" ] || mkdir -p "$STAGE2_DIR/$(dirname $1)"
wget --output-document="$STAGE2_DIR/$1" "$GIT_REPO_BASE/$1" >> $LOGFILE 2>&1
}
get_stage2_file "install-stage2.sh" >> $LOGFILE 2>&1
chmod 744 "$STAGE2_DIR/install-stage2.sh" >> $LOGFILE 2>&1
# Stage 2 prefab environment/rice install scripts
get_stage2_file "custom-scripts/scripts.lst"
while read -r NEXT_SCRIPT; do
[ -n "$NEXT_SCRIPT" ] && get_stage2_file "custom-scripts/$NEXT_SCRIPT"
done < "$STAGE2_DIR/custom-scripts/scripts.lst"
mv /mnt/target/etc/sv/agetty-tty1/conf /mnt/target/etc/sv/agetty-tty1/conf.bak >> $LOGFILE 2>&1
echo 'if [ -x /sbin/agetty -o -x /bin/agetty ]; then
if [ "${tty}" = "tty1" ]; then
GETTY_ARGS="--noclear --autologin root"
fi
fi' > /mnt/target/etc/sv/agetty-tty1/conf
[ -f /mnt/target/root/.profile ] && mv /mnt/target/root/.profile /mnt/target/root/.profile.bak >> $LOGFILE 2>&1
echo "if ps aux | grep 'installer-stage2.sh' | grep -v 'grep' > /dev/null 2>&1; then
true
else
/opt/void-usb/installer/install-stage2.sh
exit
fi" > /mnt/target/root/.profile
echo "done"
# This is not technically necessary and could be done with chroot, but it should help to save some memory.
clear
echo "Stage 1 installation is now complete.
The freshly installed system needs to be booted to continue with stage 2 of the installation process.
The installer will now create a system image and reboot the computer.
"
press_any_key
echo "Creating system image..."
run_in_target /opt/void-usb/system-image --yes
reboot