Compare commits

..

4 Commits

Author SHA1 Message Date
Joca 51fbc1f2cf
Add the ability to choose between different architectures 2025-02-21 14:19:48 -03:00
Joca 0facbea16a
Several Modifications
- Renamed Scripts to scripts.lst
- Script now restores tty configuration
- Removed xargs
- Removed install all option
2025-02-17 21:43:39 -03:00
Joca 5aaacf72a0
Add config scripts to install-stage2 and install-stage1 2025-01-28 22:25:56 -03:00
Joca 734d5b8332
Remove Package Selections, removed non-ascii
characters
2025-01-28 18:59:16 -03:00
11 changed files with 272 additions and 5775 deletions

View File

@ -55,7 +55,7 @@ There are a couple manual steps to get started before the installer scripts can
- Download and run stage 1 of the USB installation script
- The base image doesnt come with a way to download files so you need to install that first: `xbps-install -S wget`
- If it yells at you about updating xbps, do that, then try again
- `wget https://lostcave.ddnss.de/git/BodgeMaster/void-usb/raw/branch/master/install-stage1.sh`
- `wget https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/install-stage1.sh`
- `bash install-stage1.sh`
The scripts will take it from there, asking you for information and downloading things as needed.

File diff suppressed because one or more lines are too long

View File

@ -6,14 +6,13 @@ Use this to Deploy rices/set up services/etc.
Each configuration script should follow this structure:
```bash
#!/usr/bin/env bash
#!/bin/bash
# NAME: Your Script Name
# DESC: A brief description of what the script does.
# Your script logic here
```
If `# NAME:` is not found, install stage 2 will fall back to displaying the script's filename.
If `# DESC:` is not found, "No description available." will be displayed instead.
If NAME and DESC are not found, the script will default to the script's filename.
Place the scripts under this folder, add the filename to `scripts.lst` (separate by newline) and they will show up in the installer.
Place the scripts under this folder, add the filename to `scripts` (Separate by newline) and they will show up on the installer.

View File

@ -1,2 +1 @@
i3wm.sh
icewm_bodgemaster_env.sh

View File

@ -1,7 +1,7 @@
#!/usr/bin/env bash
LOGFILE=/tmp/void-usb-install-log
GIT_REPO_BASE="https://lostcave.ddnss.de/git/BodgeMaster/void-usb/raw/branch/master"
GIT_REPO_BASE="https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master"
function press_any_key {
echo "Press any key to continue or Ctrl+c to abort..."
@ -78,8 +78,10 @@ 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"
#TODO: If going down the path of extracting routines from void-installer, that should be done here
#TODO: Select keyboard layout
KBD_LAYOUT="de-latin1"
clear
echo "Select the USB stick to install to (NAME column below)...
@ -131,168 +133,70 @@ if grep "$TARGET_DISK" /proc/mounts >> $LOGFILE 2>&1; then
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
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
+2M
n
+66591
n
+1G
n
+66591
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"
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 "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 "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
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
# used for chroot later
mkdir /mnt/target/run >> $LOGFILE 2>&1
mount --rbind /run /mnt/target/run >> $LOGFILE 2>&1
mkdir /mnt/target/proc >> $LOGFILE 2>&1
mount --rbind /proc /mnt/target/proc >> $LOGFILE 2>&1
mkdir /mnt/target/sys >> $LOGFILE 2>&1
mount --rbind /sys /mnt/target/sys >> $LOGFILE 2>&1
mkdir /mnt/target/dev >> $LOGFILE 2>&1
mount --rbind /dev /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
# 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"
clear
echo "Storage is now prepared and ready for installation.
@ -303,20 +207,21 @@ the chosen mirror from the config file it generates.
"
press_any_key
xmirror
#TODO: also remove CPU architecture
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")
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]}"
echo "$((i+1))) ${options[$i]}"
done
read -p "Input your choice (number): " choice
read -p "Input your choice: " choice
if [ "$choice" -ge 1 ] && [ "$choice" -le "${#options[@]}" ]; then
# Funny loop in bash...
if [[ "$choice" =~ ^[0-9]+$ ]] && [ "$choice" -ge 1 ] && [ "$choice" -le "${#options[@]}" ]; then
TARGET_TYPE="${options[$((choice-1))]}"
break
else
@ -326,9 +231,12 @@ done
echo "You selected: $TARGET_TYPE"
#TODO: also add CPU architecture
if grep "musl" <<< "$TARGET_TYPE"; then
TARGET_MIRROR="$TARGET_MIRROR/musl"
TARGET_TYPE="$(sed -e 's/ musl//' <<< "$TARGET_TYPE")"
# Probably not the smartest idea, but since there is just one option for musl,
# I figured out this should do.
TARGET_TYPE="x86_64"
fi
echo -n "Copying repository keys... "
@ -348,12 +256,7 @@ XBPS_ARCH="$TARGET_TYPE" xbps-install --yes --sync --rootdir /mnt/target --repos
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
squashfs-tools grub grub-i386-efi grub-x86_64-efi dracut xz 2>&1 | tee --append $LOGFILE
echo ""
echo "Adding mirror configuration."
@ -396,27 +299,15 @@ echo "
echo "done"
echo "Adding fstab."
if [ -n "$TARGET_PART_BOOT" ]; then
echo "# See fstab(5).
# <device> <mount point> <fstype> <options> <dump> <pass>
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, /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
/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 defaults,fmask=0077,dmask=0077 0 2
" > /mnt/target/etc/fstab
echo "Configuring keyboard layout."
if grep "#KEYMAP=" /mnt/target/etc/rc.conf; then
@ -432,105 +323,9 @@ else
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.
#TODO: Figure out how to configure keyboard for Xorg
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
#TODO timezone
clear
echo "Assume that the hardware clock is UTC?
@ -592,8 +387,6 @@ 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
@ -601,9 +394,10 @@ 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
TARGET_PRELOAD_GRUB_MODULES="usb usbms uhci ehci ohci part_gpt f2fs ahci ata pata"
run_in_target grub-install --target=i386-pc --boot-directory=/boot/efi/LOADER --disk-module=native --modules="'$TARGET_PRELOAD_GRUB_MODULES'" "'/dev/$TARGET_DISK'" >> $LOGFILE 2>&1
run_in_target grub-install --target=i386-efi --boot-directory=/boot/efi/LOADER --disk-module=native --efi-directory=/boot/efi --removable --no-nvram --modules="'$TARGET_PRELOAD_GRUB_MODULES'" "'/dev/$TARGET_DISK'" >> $LOGFILE 2>&1
run_in_target grub-install --target=x86_64-efi --boot-directory=/boot/efi/LOADER --disk-module=native --efi-directory=/boot/efi --removable --no-nvram --modules="'$TARGET_PRELOAD_GRUB_MODULES'" "'/dev/$TARGET_DISK'" >> $LOGFILE 2>&1
echo "done"
echo -n "Adding grub-config helper... "
@ -638,14 +432,28 @@ function get_stage2_file {
wget --output-document="$STAGE2_DIR/$1" "$GIT_REPO_BASE/$1" >> $LOGFILE 2>&1
}
get_stage2_file "install-stage2.sh" >> $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"
function download_scripts {
local scripts_file="$1"
# Read the scripts file line by line
while IFS= read -r script; do
# Call the function to download each script
get_stage2_file "custom-scripts/$script"
done < "$scripts_file"
}
# Create the custom-scripts directory
CUSTOM_SCRIPTS_DIR="$STAGE2_DIR/custom-scripts"
mkdir -p "$CUSTOM_SCRIPTS_DIR"
# Download the scripts file into the custom-scripts folder
SCRIPTS_FILE="scripts" # The name of the scripts file in the custom-scripts folder
get_stage2_file "custom-scripts/$SCRIPTS_FILE"
download_scripts "$CUSTOM_SCRIPTS_DIR/$SCRIPTS_FILE"
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

View File

@ -1,7 +1,6 @@
#!/usr/bin/env bash
LOGFILE=/tmp/void-usb-install-log
STAGE2_DIR="/opt/void-usb/installer/"
function press_any_key {
echo "Press any key to continue or Ctrl+c to abort..."
@ -70,7 +69,6 @@ Alternatively, you can continue without internet but the system will be left in
echo -n "."
done
echo " $INTERNET"
# TODO: allow to connect again if still no internet
fi
fi
@ -81,20 +79,25 @@ if [ "$INTERNET" = "up" ]; then
fi
STAGE2_DIR="/opt/void-usb/installer/" # Change this to your desired directory
CONFIG_DIR="$STAGE2_DIR/custom-scripts"
SCRIPT_LIST="$CONFIG_DIR/scripts.lst"
SCRIPTS=()
NAMES=()
DESCRIPTIONS=()
# Find all scripts and extract their names & descriptions
echo "Scanning for configuration scripts in $CONFIG_DIR..."
for script in "$CONFIG_DIR"/*.sh; do
[ -f "$script" ] || continue # Skip if no .sh files found
SCRIPTS+=("$script")
SCRIPT_NAME=$(grep '^# NAME:' "$script" | sed 's/^# NAME:[[:space:]]*//')
# Extract name from "# NAME:" (first occurrence)
SCRIPT_NAME=$(grep -m1 '^# NAME:' "$script" | sed 's/^# NAME:[[:space:]]*//')
[ -z "$SCRIPT_NAME" ] && SCRIPT_NAME="$(basename "$script")"
SCRIPT_DESC=$(grep '^# DESC:' "$script" | sed 's/^# DESC:[[:space:]]*//')
# Extract description from "# DESC:" (first occurrence)
SCRIPT_DESC=$(grep -m1 '^# DESC:' "$script" | sed 's/^# DESC:[[:space:]]*//')
[ -z "$SCRIPT_DESC" ] && SCRIPT_DESC="No description available."
NAMES+=("$SCRIPT_NAME")
@ -107,46 +110,38 @@ if [ ${#SCRIPTS[@]} -eq 0 ]; then
exit 1
fi
# Display menu dynamically
echo "Available configurations:"
for i in "${!SCRIPTS[@]}"; do
echo "$((i+1)): ${NAMES[i]} - ${DESCRIPTIONS[i]}"
echo "$((i+1))) ${NAMES[i]} - ${DESCRIPTIONS[i]}"
done
echo "$(( ${#SCRIPTS[@]} + 1 )): Exit"
echo "$(( ${#SCRIPTS[@]} + 1 ))) Exit"
CHOICE=0
while ! (( CHOICE >= 1 && CHOICE <= ${#SCRIPTS[@]} )); do
read -p "Select an option [1-$((${#SCRIPTS[@]}+1))]: " CHOICE
if (( CHOICE >= 1 && CHOICE <= ${#SCRIPTS[@]} )); then
echo "Running: ${NAMES[CHOICE-1]}"
bash "${SCRIPTS[CHOICE-1]}"
elif (( CHOICE == ${#SCRIPTS[@]} + 1 )); then
# Get user input
read -p "Select an option (1-${#SCRIPTS[@]}): " choice
# Run selected script
if (( choice >= 1 && choice <= ${#SCRIPTS[@]} )); then
echo "Running: ${NAMES[choice-1]}"
bash "${SCRIPTS[choice-1]}"
elif (( choice == ${#SCRIPTS[@]} + 1 )); then
echo "Exiting..."
break
else
exit 0
else
echo "Invalid choice."
fi
done
exit 1
fi
# Stage 2 Tasks
echo "Setting up user..."
read -p "Enter username: " NEW_USER
#TODO: let the user choose additional groups (suggest sane defaults for different use cases)
# cdrom? optical? storage? what they do?
# users (dows this even do anything)
useradd -m -s /bin/bash -G wheel,users,kvm,video,audio,dialout,network,scanner "$NEW_USER"
useradd -m -G wheel "$NEW_USER"
passwd "$NEW_USER"
echo "Cleaning up installation files..."
mv /etc/sv/agetty-tty1/conf.bak /etc/sv/agetty-tty1/conf >> $LOGFILE 2>&1
if [ -f /root/.profile.bak ]; then
mv /root/.profile.bak /root/.profile
else
rm /root/.profile
fi
rm -rf "$STAGE2_DIR"
clear
echo "To save the changes made to the system, a new system image needs to be created.
echo "Restoring TTY1 configuration..."
mv /mnt/target/etc/sv/agetty-tty1/conf.bak /mnt/target/etc/sv/agetty-tty1/conf >> $LOGFILE 2>&1
The system will reboot now. While shutting down, you will be asked about creating a system image. Choose yes."
reboot
bash --norc --noprofile

View File

@ -11,6 +11,23 @@ VERSION="$2"
echo "Updating default kernel and initramfs symlinks..."
#####################
# Delete old symlinks
#####################
OLD_LINUX=/boot/vmlinu?
if [ ! -f "$OLD_LINUX" ]; then
# in cases where its a .gz or .xz or whatever
OLD_LINUX=$(find /boot -type l -name "vmlinu*" 2>/dev/null | sort | head -n1)
fi
[ -f "$OLD_LINUX" ] && rm "$OLD_LINUX"
OLD_INITRAMFS=/boot/initramfs.img
if [ ! -f "$OLD_INITRAMFS" ]; then
# hope to find anything named initramfs or initrd
OLD_INITRAMFS=$(find /boot -type l -name "init*" 2>/dev/null | sort | head -n1)
fi
[ -f "$OLD_INITRAMFS" ] && rm "$OLD_INITRAMFS"
#####################
# Create new symlinks
#####################
@ -22,7 +39,7 @@ fi
if grep -e ".gz$" -e ".xz$" -e ".bz$" -e ".bz2$" -e ".lzma$" -e ".lz$" -e ".img$" >/dev/null 2>&1 <<< "$NEW_LINUX_FILE"; then
NEW_LINUX_SYMLINK="$NEW_LINUX_SYMLINK$(grep -o -e ".gz$" -e ".xz$" -e ".bz$" -e ".bz2$" -e ".lzma$" -e ".lz$" -e ".img$" 2>/dev/null <<< "$NEW_LINUX_FILE")"
fi
ln -s -f "$NEW_LINUX_FILE" "/boot/$NEW_LINUX_SYMLINK"
ln -s "$NEW_LINUX_FILE" "/boot/$NEW_LINUX_SYMLINK"
NEW_INITRAMFS_FILE="$(find /boot -name "init*$VERSION*" 2>/dev/null | sed 's|^/boot/||')"
NEW_INITRAMFS_SYMLINK="initramfs"
@ -32,7 +49,7 @@ fi
if grep -e ".gz$" -e ".xz$" -e ".bz$" -e ".bz2$" -e ".lzma$" -e ".lz$" -e ".img$" >/dev/null 2>&1 <<< "$NEW_INITRAMFS_FILE"; then
NEW_INITRAMFS_SYMLINK="$NEW_INITRAMFS_SYMLINK$(grep -o -e ".gz$" -e ".xz$" -e ".bz$" -e ".bz2$" -e ".lzma$" -e ".lz$" -e ".img$" 2>/dev/null <<< "$NEW_INITRAMFS_FILE")"
fi
ln -s -f "$NEW_INITRAMFS_FILE" "/boot/$NEW_INITRAMFS_SYMLINK"
ln -s "$NEW_INITRAMFS_FILE" "/boot/$NEW_INITRAMFS_SYMLINK"
echo "Default kernel and initramfs are now: $NEW_LINUX_FILE, $NEW_INITRAMFS_FILE"

View File

@ -13,4 +13,5 @@ while [ "$(vkpurge list | wc -l)" -gt "$KEEP_OLD_KERNELS" ]; do
OLDEST_KERNEL="$(vkpurge list | sort | head -n1)"
echo "Removing old kernel $OLDEST_KERNEL using vkpurge..."
vkpurge rm "$OLDEST_KERNEL"
fi
done

View File

@ -1,4 +1,6 @@
TODO:
make sure that gufw works as intended
check for Nvidia Optimus support - or make it happen somehow
compare sizes of glibc and musl installations
need xdg menu maker?
adjust required USB stick and RAM size in README
@ -7,27 +9,114 @@ do not rely on the RTC
- use ntp to get time
- only fall back to using rtc if offline
- do not set the RTC
make our own time zone selection
keyboard?
make our own or extract (if feasible) kb selection and time zone selection to hijack them for our purposes
- potentially interesting packages
- ckbcomp
- kbd-data
overview of the installation process at the start
overall progress indication (step x out of y)
look into roxterm as an alternative terminal
deal with the entropy thing that runs after rc.shutdown
first run message in .xinitrc.d
- auto-removes itself
- displays README.txt on root dir of the F2FS partition
add online check to all the selections that need internet
sort out /etc/resolv.conf for the chroot
set keyboard layout for initramfs
tell user about expected GRUB error messaegs
disable hibernate, warn about suspend
use zswap
rices: when shutting down, let Xorg exit first, then run `loginctl {poweroff,reboot}`
- this is needed so the user can interact with the console
disable suspend and hibernate
when shutting down, let Xorg exit first, then run `loginctl {poweroff,reboot}`
add polkit to common packages
https://github.com/aarnt/octoxbps
system-image
check that all output goes to current TTY
package selections:
desktop
icewm-full
packages
-> audio applet -> volctl
-> system monitor, file browser, image viewer, text editor, archive manager
-> GUI package manager? GUI update manager?
-> notification daemon?
xscreensaver
blueman
-> BT support?
post-install
add ultimate.bashrc
add backgrounds
modify bashrc to auto-start X if not already running
kick off scripts in .xinitrc.d from .xinitrc
exec icewm-session from .xinitrc
add to .xinitrc.d
start pipewire, pipewire-pulse, wireplumber
start conky
start desktop applets
volctl &
nm-applet &
blueman-applet &
display README
start xscreensaver
xscreensaver --no-splash &
start conky
conky &
put README.txt with relevant information on root dir of F2FS partition
symlink to /home/README.txt
add a symlink ~/.local/bin/xterm that points to lxterminal
configure icewm
startup script
choose random background
configuration
configure conky
configure xscreensaver
icewm-lite
post-install
add ultimate.bashrc
modify bashrc to auto-start X if not already running
kick off scripts in .xinitrc.d from .xinitrc
exec icewm (not session) from .xinitrc
add to .xinitrc.d
start pipewire, pipewire-pulse, wireplumber
display README
put README.txt with relevant information on root dir of F2FS partition
symlink to /home/README.txt
configure icewm
none
post-install
add ultimate.bashrc
modify bashrc to display README
put README.txt with relevant information on root dir of F2FS partition
symlink to /home/README.txt
musl downsides:
- no nvidia drivers
- may be janky in regards to running some Minecraft versions
musl upsides:
- ??
Stage 1:
-> select kb layout
-> select installation type (x86_32/x86_64, glibc/musl)
-> configure time zone
-> selection dialog?
-> symlink /etc/localtime
Stage 2:
-> set up user
-> ask for username
-> run useradd (non-interactively)
-> useradd --groups "comma,separated,groups" --create-home --shell /bin/bash $USERNAME
-> groups: dialout users wheel
-> ?? groups:
-> cdrom optical - can listen to CDs? Can watch DVDs? Can mount / unmount CDs/DVDs?
-> storage - can mount / unmount disks from GUI?
-> scanner - can scan things (for example using XSane?)
-> network - can interface with NetworkManager?
-> kvm - can run QEMU?
-> run passwd (interactively)
-> clean up
-> mv /mnt/target/etc/sv/agetty-tty1/conf.bak /mnt/target/etc/sv/agetty-tty1/conf
-> if [ -f /mnt/target/root/.profile.bak ]; then mv /mnt/target/root/.profile.bak /mnt/target/root/.profile; else rm /mnt/target/root/.profile; fi
-> rm -r /opt/void-usb/installer
-> build new squashfs image and reboot

View File

@ -4,27 +4,21 @@ OS_NAME="Void Linux USB"
GRUB_PREFIX="/boot/efi/LOADER/grub"
CFG_CUSTOM_BEFORE="custom_before.cfg"
CFG_CUSTOM_AFTER="custom_after.cfg"
CONTAINER_UUID="$(blkid --output value --match-tag UUID "$(grep " /run/void-usb/container " /proc/mounts | sed -e 's/ .*//')")"
LINUX_CMDLINE="quiet root=/dev/loop0 ro void-usb-container=UUID=$CONTAINER_UUID"
if [ "$(findmnt --noheadings --nofsroot --output SOURCE /boot)" = "$(findmnt --noheadings --nofsroot --output SOURCE /run/void-usb/container)" ]; then
GRUB_BOOT_PATH="/boot"
else
# assuming separate /boot partition
GRUB_BOOT_PATH=""
DEFAULT_LINUX=/boot/vmlinu?
if [ ! -f "$DEFAULT_LINUX" ]; then
# in cases where its a .gz or .xz or whatever
DEFAULT_LINUX=$(find /boot -type l -name "vmlinu*" 2>/dev/null | sort | head -n1)
fi
VOIDUSB_CONTAINER="$(findmnt --noheadings --output SOURCE /run/void-usb/container)"
if grep "/dev/mapper" <<< "$VOIDUSB_CONTAINER" > /dev/null; then
LUKS_SETTINGS="rd.luks.uuid=$(blkid --output value --match-tag UUID /dev/"$(ls /sys/block/"$(basename "$(realpath "$VOIDUSB_CONTAINER")")"/slaves | head -n1)")"
else
VOIDUSB_CONTAINER="UUID=$(blkid --output value --match-tag UUID "$VOIDUSB_CONTAINER")"
fi
# TODO: rd.vconsole.keymap
LINUX_CMDLINE="quiet root=/dev/loop0 ro $LUKS_SETTINGS void-usb-container=$VOIDUSB_CONTAINER rd.vconsole.keymap=us"
DEFAULT_LINUX=$(find /boot -type l -name "vmlinu*" 2>/dev/null | sort | head -n1)
DEFAULT_LINUX="$(sed 's|^/boot/||' <<< "$DEFAULT_LINUX")"
# hope to find anything named initramfs or initrd
DEFAULT_INITRAMFS=$(find /boot -type l -name "init*" 2>/dev/null | sort | head -n1)
DEFAULT_INITRAMFS=/boot/initramfs.img
if [ ! -f "$DEFAULT_INITRAMFS" ]; then
# hope to find anything named initramfs or initrd
DEFAULT_INITRAMFS=$(find /boot -type l -name "init*" 2>/dev/null | sort | head -n1)
fi
DEFAULT_INITRAMFS="$(sed 's|^/boot/||' <<< "$DEFAULT_INITRAMFS")"
function make_menuentry {
@ -55,9 +49,9 @@ function make_menuentry {
echo "
menuentry 'Linux $LINUX_VERSION' {
echo 'Loading $LINUX...'
linux $GRUB_BOOT_PATH/$LINUX $LINUX_CMDLINE
linux /boot/$LINUX $LINUX_CMDLINE
echo 'Loading initial ramdisk...'
initrd $GRUB_BOOT_PATH/$INITRAMFS
initrd /boot/$INITRAMFS
}" >> "$GRUB_PREFIX/grub.cfg"
}
@ -71,7 +65,7 @@ echo "# This file is auto-generated by $0.
# $GRUB_PREFIX/$CFG_CUSTOM_BEFORE or
# $GRUB_PREFIX/$CFG_CUSTOM_AFTER
search --fs-uuid --set=root $(blkid --output value --match-tag UUID "$(findmnt --noheadings --nofsroot --output SOURCE /boot)")
search --fs-uuid --set=root $CONTAINER_UUID
set menu_color_normal=white/black
set menu_color_highlight=black/light-gray
@ -86,9 +80,9 @@ fi
menuentry '$OS_NAME' {
echo 'Loading Linux...'
linux $GRUB_BOOT_PATH/$DEFAULT_LINUX $LINUX_CMDLINE
linux /boot/$DEFAULT_LINUX $LINUX_CMDLINE
echo 'Loading initial ramdisk...'
initrd $GRUB_BOOT_PATH/$DEFAULT_INITRAMFS
initrd /boot/$DEFAULT_INITRAMFS
}
submenu 'Choose kernel version...' {" > "$GRUB_PREFIX/grub.cfg"

View File

@ -19,8 +19,7 @@ function echo_tty {
function yesno {
unset DISCARD_ME
while [ -z "$DISCARD_ME" ]; do
echo_tty -n "[y/n] "
read -n1 DISCARD_ME < $TTY_OR_CONSOLE > $TTY_OR_CONSOLE
read -p "[y/n] " -n1 DISCARD_ME < $TTY_OR_CONSOLE > $TTY_OR_CONSOLE
case "$DISCARD_ME" in
y)
# add a line break
@ -98,14 +97,10 @@ if $DONT_ASK || yesno; then
echo_tty "Building image..."
mksquashfs / /run/void-usb/container/new_squashfs.img -b 1M -comp xz -progress -noappend -pf /run/void-usb/system-image-pseudo -ef /run/void-usb/system-image-excludes > $TTY_OR_CONSOLE
if [ "$?" -ne 0 ]; then
echo_tty "An error ocurred while generating the image. It will be discarded."
sleep 5
else
echo_tty -n "Moving new image in place... "
mv /run/void-usb/container/new_squashfs.img /run/void-usb/container/squashfs.img
echo_tty "done"
fi
else
echo_tty "Discarding system changes."
fi