342 lines
11 KiB
Bash
342 lines
11 KiB
Bash
#!/usr/bin/env bash
|
||
|
||
function press_any_key {
|
||
echo "Press any key to continue or Ctrl+c to abort..."
|
||
read -n1 DISCARD_ME
|
||
}
|
||
|
||
function are_you_really_really_sure {
|
||
echo "Enter the following to continue: $1"
|
||
read -p "> " DISCARD_ME
|
||
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)
|
||
return 0
|
||
;;
|
||
n)
|
||
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
|
||
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
|
||
- squashfs-tools
|
||
- wget
|
||
- xtools-minimal"
|
||
press_any_key
|
||
|
||
xbps-install --sync
|
||
xbps-install --yes --update xbps
|
||
xbps-install --yes xmirror squashfs-tools wget xtools-minimal
|
||
|
||
#TODO: If going down the path of extracting routines from void-installer and
|
||
# xmirror, 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)...
|
||
"
|
||
# exclude loop devices
|
||
lsblk --exclude 7 --nodeps --output NAME,SIZE,MODEL
|
||
echo ""
|
||
read -p "> " TARGET_DISK
|
||
|
||
while [ ! -b "/dev/$TARGET_DISK" ]; do
|
||
lsblk --exclude 7 --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
|
||
|
||
# new GPT
|
||
# 2M BIOS GRUB
|
||
# 268M ESP
|
||
# 1G boot
|
||
# everything else one big partition
|
||
echo "g
|
||
n
|
||
|
||
|
||
+2M
|
||
n
|
||
|
||
|
||
+268M
|
||
n
|
||
|
||
|
||
+1G
|
||
n
|
||
|
||
|
||
|
||
t
|
||
1
|
||
4
|
||
t
|
||
2
|
||
1
|
||
t
|
||
3
|
||
136
|
||
t
|
||
4
|
||
20
|
||
w" | fdisk --wipe always --wipe-partitions always "/dev/$TARGET_DISK"
|
||
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')"
|
||
|
||
mkfs.vfat -F32 -n "EFIBOOT" "$TARGET_PART_EFI"
|
||
mkfs.f2fs -f -l "boot" "$TARGET_PART_BOOT"
|
||
mkfs.f2fs -f -l "container" "$TARGET_PART_BIG"
|
||
|
||
mkdir -p /mnt/target
|
||
#TODO don't use default permissions for tmpfs
|
||
mount -t tmpfs -o size=3g tmpfs /mnt/target
|
||
|
||
# used for chroot later
|
||
mkdir /mnt/target/run
|
||
mount --rbind /run /mnt/target/run
|
||
mkdir /mnt/target/proc
|
||
mount --rbind /run /mnt/target/proc
|
||
mkdir /mnt/target/sys
|
||
mount --rbind /run /mnt/target/sys
|
||
mkdir /mnt/target/dev
|
||
mount --rbind /run /mnt/target/dev
|
||
|
||
# actual storage
|
||
mkdir /mnt/target/boot
|
||
mount "$TARGET_PART_BOOT" /mnt/target/boot
|
||
mkdir /mnt/target/boot/efi
|
||
mount "$TARGET_PART_EFI" /mnt/target/boot/efi
|
||
mkdir /mnt/target/run/void-usb/container
|
||
mount "$TARGET_PART_BIG" /mnt/target/run/void-usb/container
|
||
mkdir /mnt/target/home
|
||
mkdir /mnt/target/run/void-usb/container/home
|
||
mount --bind /mnt/target/run/void-usb/container/home /mnt/target/home
|
||
|
||
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
|
||
#TODO: also remove CPU architecture
|
||
TARGET_MIRROR="$(sed 's/repository=//;s|/musl$||' /etc/xbps.d/00-repository-main.conf)"
|
||
|
||
#TODO: select installation type
|
||
TARGET_TYPE="x86_64"
|
||
|
||
#TODO: also add CPU architecture
|
||
if grep "musl" <<< "$TARGET_TYPE"; then
|
||
TARGET_MIRROR="$TARGET_MIRROR/musl"
|
||
fi
|
||
|
||
mkdir -p /mnt/target/var/db/xbps/keys
|
||
cp /var/db/xbps/keys/* /mnt/target/var/db/xbps/keys/
|
||
|
||
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
|
||
|
||
echo "repository=$TARGET_MIRROR" > /mnt/target/etc/xbps.d/00-repository-main.conf
|
||
|
||
echo "%wheel ALL=(ALL:ALL) ALL" > /mnt/target/etc/sudoers.d/wheel_as_sudo_group.conf
|
||
|
||
|
||
|
||
mkdir -p /mnt/target/opt/void-usb
|
||
chmod 755 /mnt/target/opt/void-usb
|
||
|
||
echo "UUID=$(blkid --output value --match-tag UUID $TARGET_PART_BIG)" > /mnt/target/opt/void-usb/container
|
||
|
||
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
|
||
|
||
mkdir -p /mnt/target/lib/dracut/modules.d/90void-usb
|
||
chmod 755 /mnt/target/lib/dracut/modules.d/90void-usb
|
||
wget --output-document=/mnt/target/lib/dracut/modules.d/90void-usb/module-setup.sh https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/dracut-modules/90void-usb/module-setup.sh
|
||
chmod 744 /mnt/target/lib/dracut/modules.d/90void-usb/module-setup.sh
|
||
wget --output-document=/mnt/target/lib/dracut/modules.d/90void-usb/create-loop0.sh https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/dracut-modules/90void-usb/create-loop0.sh
|
||
chmod 744 /mnt/target/lib/dracut/modules.d/90void-usb/create-loop0.sh
|
||
wget --output-document=/mnt/target/lib/dracut/modules.d/90void-usb/squashfs-img.sh https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/dracut-modules/90void-usb/squashfs-img.sh
|
||
chmod 744 /mnt/target/lib/dracut/modules.d/90void-usb/squashfs-img.sh
|
||
|
||
wget --output-document=/mnt/target/opt/void-usb/backup-fs https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/opt/backup-fs
|
||
chmod 744 /mnt/target/opt/void-usb/backup-fs
|
||
echo "
|
||
/opt/void-usb/backup-fs" >> /mnt/target/etc/rc.shutdown
|
||
|
||
echo "# See fstab(5).
|
||
# <device> <mount point> <fstype> <options> <dump> <pass>
|
||
|
||
# /run/void-usb/container and the underlying image for / are mounted by initramfs
|
||
|
||
# TODO: add overlayfs
|
||
|
||
UUID=$(blkid --output value --match-tag UUID $TARGET_PART_BOOT) /boot f2fs defaults,nodev,nosuid 0 2
|
||
UUID=$(blkid --output value --match-tag UUID $TARGET_PART_EFI) /boot/efi vfat defaults,fmask=0077,dmask=0077 0 2
|
||
/run/void-usb/container/home /home none bind 0 0
|
||
" > /mnt/target/etc/fstab
|
||
|
||
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."
|
||
echo "The script will attempt to add one."
|
||
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
|
||
|
||
#TODO timezone
|
||
|
||
clear
|
||
echo "Is the hardware clock set to UTC?
|
||
|
||
Most Unix/Linux systems set the clock in your computer to UTC and add
|
||
the time zone on-the-fly. If you use Windows, you will 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."
|
||
echo "The script will attempt to add one."
|
||
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."
|
||
echo "The script will attempt to add one."
|
||
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
|
||
|
||
mkdir /mnt/target/boot/efi/LOADER
|
||
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...
|
||
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'"
|
||
run_in_target grub-install --target=i386-efi --boot-directory=/boot/efi/LOADER --efi-directory=/boot/efi --removable --no-nvram --modules="'$TARGET_PRELOAD_GRUB_MODULES'" "'/dev/$TARGET_DISK'"
|
||
run_in_target grub-install --target=x86_64-efi --boot-directory=/boot/efi/LOADER --efi-directory=/boot/efi --removable --no-nvram --modules="'$TARGET_PRELOAD_GRUB_MODULES'" "'/dev/$TARGET_DISK'"
|
||
|
||
wget --output-document=/mnt/target/opt/void-usb/grub-config https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/opt/grub-config
|
||
chmod 744 /mnt/target/opt/void-usb/grub-config
|
||
|
||
#TODO: ensure that this is being run by xbps-reconfigure -fa, if not add it here
|
||
# run_in_target /opt/void-usb/grub-config
|
||
|
||
wget --output-document=/mnt/target/etc/kernel.d/pre-install/99-void-usb https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/kernel.d/pre-install/99-void-usb
|
||
chmod 744 /mnt/target/etc/kernel.d/pre-install/99-void-usb
|
||
wget --output-document=/mnt/target/etc/kernel.d/post-install/99-void-usb https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/kernel.d/post-install/99-void-usb
|
||
chmod 744 /mnt/target/etc/kernel.d/post-install/99-void-usb
|
||
wget --output-document=/mnt/target/etc/kernel.d/post-remove/99-void-usb https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/kernel.d/post-remove/99-void-usb
|
||
chmod 744 /mnt/target/etc/kernel.d/post-remove/99-void-usb
|
||
|
||
run_in_target xbps-reconfigure -fa
|
||
|
||
# running chroot directly bc run_in_target function doesn’t allow user input
|
||
chroot /mnt/target /opt/void-usb/backup-fs
|
||
|
||
#
|