From 92bf235e217e433420c57f948d78d6f6ea80b38e Mon Sep 17 00:00:00 2001 From: BodgeMaster <> Date: Fri, 30 Jun 2023 12:35:37 +0200 Subject: [PATCH] install stage 1: log to a file and write user-friendly messages to stdout --- install-stage1.sh | 196 ++++++++++++++++++++++++++++------------------ 1 file changed, 119 insertions(+), 77 deletions(-) diff --git a/install-stage1.sh b/install-stage1.sh index 4c2d2a1..51ff99b 100644 --- a/install-stage1.sh +++ b/install-stage1.sh @@ -1,5 +1,7 @@ #!/usr/bin/env bash +LOGFILE=/tmp/void-usb-install-log + function press_any_key { echo "Press any key to continue or Ctrl+c to abort..." read -n1 DISCARD_ME @@ -39,6 +41,12 @@ function run_in_target { } clear +touch $LOGFILE + +#TODO: check that we are root +#TODO: check that we are online +# -> could be done by pinging repo-default.voidlinux.org + 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 @@ -48,15 +56,17 @@ Before we begin, the following packages need to be installed (if not installed a - 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 +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 squashfs-tools wget >> $LOGFILE 2>&1 +echo "done" -#TODO: If going down the path of extracting routines from void-installer and -# xmirror, that should be done here. +#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" @@ -90,6 +100,7 @@ else exit 1 fi +echo -n "Wiping and partitioning storage... " # new GPT # 2M BIOS GRUB # 268M ESP @@ -116,38 +127,43 @@ t t 3 20 -w" | fdisk --wipe always --wipe-partitions always "/dev/$TARGET_DISK" +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" -mkfs.vfat -F32 -n "EFIBOOT" "$TARGET_PART_EFI" -mkfs.f2fs -f -l "container" "$TARGET_PART_BIG" +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" -mkdir -p /mnt/target -mount -t tmpfs -o size=3g,mode=755 tmpfs /mnt/target +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 -mount --rbind /run /mnt/target/run -mkdir /mnt/target/proc -mount --rbind /proc /mnt/target/proc -mkdir /mnt/target/sys -mount --rbind /sys /mnt/target/sys -mkdir /mnt/target/dev -mount --rbind /dev /mnt/target/dev +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 -mount "$TARGET_PART_BIG" /mnt/target/run/void-usb/container -mkdir /mnt/target/boot -mkdir /mnt/target/run/void-usb/container/boot -mount --bind /mnt/target/run/void-usb/container/boot /mnt/target/boot -mkdir /mnt/target/boot/efi -mount "$TARGET_PART_EFI" /mnt/target/boot/efi -mkdir /mnt/target/home -mkdir /mnt/target/run/void-usb/container/home -mount --bind /mnt/target/run/void-usb/container/home /mnt/target/home +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. @@ -157,7 +173,6 @@ 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)" @@ -170,26 +185,34 @@ 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/ +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" +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 + squashfs-tools grub grub-i386-efi grub-x86_64-efi dracut xz 2>&1 | tee --append $LOGFILE +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.conf +echo "Disabling root password." +run_in_target passwd --lock root - - -mkdir -p /mnt/target/opt/void-usb -chmod 755 /mnt/target/opt/void-usb - +echo "Adding dracut configuration." echo '# Void USB dracut configuration hostonly="no" @@ -198,22 +221,29 @@ 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/lib/dracut/modules.d/90void-usb/overlay.sh https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/dracut-modules/90void-usb/overlay.sh -chmod 744 /mnt/target/lib/dracut/modules.d/90void-usb/overlay.sh +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 https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/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 https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/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 https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/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 https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/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" -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 -n "Adding file system 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/backup-fs https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/opt/backup-fs >> $LOGFILE 2>&1 +chmod 744 /mnt/target/opt/void-usb/backup-fs >> $LOGFILE 2>&1 echo " /opt/void-usb/backup-fs" >> /mnt/target/etc/rc.shutdown +echo "done" +echo "Adding fstab." echo "# See fstab(5). # @@ -221,16 +251,16 @@ echo "# See fstab(5). /run/void-usb/container/boot /boot none bind 0 0 /run/void-usb/container/home /home none bind 0 0 -tmpfs /tmp tmpfs size=512m 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 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 "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 @@ -238,21 +268,25 @@ else echo "KEYMAP=\"$KBD_LAYOUT\"" >> /mnt/target/etc/rc.conf fi +#TODO: Figure out how to configure keyboard for Xorg + #TODO timezone clear -echo "Is the hardware clock set to UTC? +echo "Assume that the hardware clock is 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. +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." - echo "The script will attempt to add one." + 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 @@ -264,8 +298,8 @@ else 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 "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 @@ -277,8 +311,7 @@ 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. +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). @@ -299,30 +332,39 @@ done echo "$TARGET_HOSTNAME" > /mnt/target/etc/hostname -mkdir /mnt/target/boot/efi/LOADER +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... 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 --disk-module=native --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 --disk-module=native --efi-directory=/boot/efi --removable --no-nvram --modules="'$TARGET_PRELOAD_GRUB_MODULES'" "'/dev/$TARGET_DISK'" +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" -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 +echo -n "Adding grub-config helper... " +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 >> $LOGFILE 2>&1 +chmod 744 /mnt/target/opt/void-usb/grub-config >> $LOGFILE 2>&1 +echo "done" -#TODO: ensure that this is being run by xbps-reconfigure -fa, if not add it here -# run_in_target /opt/void-usb/grub-config +echo -n "Adding kernel hooks... " +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 >> $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 https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/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 https://lostcave.ddnss.de/git/BodgeMaster/void-minecraft-usb/raw/branch/master/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" -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 +echo -n "Reconfiguring all installed packages... " +run_in_target xbps-reconfigure -fa >> $LOGFILE 2>&1 +echo "done" -run_in_target xbps-reconfigure -fa +echo "Creating system image..." +#TODO: make this work without user interaction run_in_target /opt/void-usb/backup-fs #