It has no UEFI which is weird since UEFI was already pretty standard at the time the Gen8 was designed. Plus it is very picky with booting from USB. First it doesn't want to boot from the blue USB 3.0 ports. Second it only boots from USB devices formatted with MBR and where its first partition is FAT32 formatted with sector sizes not bigger than 16kb (Source: a 'reputable source' in the HP Community).
But now comes the worst characteristic about the Gen8. You can't change the boot order of the SATA devices. So if you use the ODD power cable (with an ODD to SATA adapter of course) and the "SATA ODD" port, you have a journey to go as the boot order is as follows: The leftmost drive, followed by the next 3 drives - and finally the device connected tot eh SATA ODD port. There's also a "CDROM Drive" boot order item in the boot order menu - but it doesn't boot the SATA ODD port, only if there's a real CDROM drive.
The Gen8 has an internal USB port and an internal MicroSD port. Put a bootloader on one of them and chainload into your SSDs boot loader. But you could also put a boot loader on your first drive, but that's a not so nice solution imo.
So this now becomes an instruction.
In the BIOS settings, in the Boot Order menu, put "USB keydrive" at position 1 to have the Gen8 boot from USB first. This will be useful when installing your OS and later booting your OS (by chainloading from the USB drive to your SSD drive).
Fisrt, remove all your drives from the drive bay so that the Gen8 boots from your SSD on the ODD port instead of trying to boot from your drives.
Now install your favourite Linux OS on the SSD. Note that you can (and imo should) indeed format the target drive with GPT as the USB drive will later be able to boot from GPT drives! If you don't know how to put an OS installer on a USB drive, my go-to solution is Ventoy, which formats an USB device so that you can still use it as a normal USB device and you can put ISOs on it, from which you can boot from. Remember to let Ventoy format your USB device with MBR instead of GPT.
Booted into your Linux OS, insert another USB drive (put it inside the Gen8's internal USB port). This will be the drive the Gen8 boots from and chainloads into your SSDs bootloader. It now has to be formatted with MBR and a FAT32 formatted partition.
Find out which disk is your USB drive. You can you lsblk to look at all the disks present. In the following code blocks, replace sdX with the name of your USD drive:
sudo parted -s /dev/sdX mklabel msdos \
mkpart primary fat32 1MiB 512MiB \
set 1 boot on
sudo mkfs.vfat -F32 /dev/sdX1
sudo mount /dev/sdX1 /mnt
The first command partitions your USB drive with MBR, creates a partition which is 512MiB in size (generous could also be less), and sets the partition as bootable. The next command formats the first partition with FAT32 (the cluster size is automatically chosen by the partition size and is small enough at 512MiB). The final command mounts the new FAT32 partition to /mnt so that we can install the bootloader (GRUB) onto it and configure it.
Install GRUB into the MBR of the USB drive and the necessary files into the FAT32 partition of the USB drive:
sudo grub-install --target=i386-pc --boot-directory=/mnt/boot /dev/sdX
GRUB needs to know what drive to boot. Unfortunately that's not so easy, so there's more to do. One solution is to set any partition's filesystem label to e.g. "linux". So GRUB can look for a filesystem with the "boot" label and boot the drive on which that partition is located.
If you have a boot partition or installed your OS on an ext4 filesystem, let's mark one of them. It doesn't matter which partition has the label as GRUB only needs to know the drive it's located. But set exactly one partition's label to 'linux', otherwise GRUB will find multiple partitions and will break it:
sudo e2label /dev/sdY2 linux
Replace sdY2 with the partition of either your boot or root partition.
Now GRUB has to be configured to look for the drive and boot from it:
sudo cat >/mnt/boot/grub/grub.cfg <<'EOF'
insmod part_gpt # to be able to read GPT partitions
insmod regexp # needed for the regexp string search
insmod search # so that the search command will work
set timeout=2 # bootloader waits 2 seconds before booting the default (see below) entry
set default=0 # the first (0th) and only entry
menuentry "Boot from SSD" { # the name of the entry in the bootloader, can be set to whatever you want
search --label linux --set=part # look for partitions with the 'linux' label and put the result into the 'part' variable
regexp --set 1:disk '^(hd[0-9]+),.*$' "$part" # remove the partition id from the found partition so that only the drive name remains
set root=($disk) # set 'root' variable to the disk the chainloader will load the code from
drivemap -s ($disk) (hd0) # tell the BIOS that the drive it should read & execute code from is now the SSD
chainloader +1 # load the boot code from the SSD
boot # finally, boot the code
}
EOF
What happens here? Find the partition labeled 'linux' extract the disk name from it, tell the bootloader to boot from that disk, tell the BIOS to read & execute code from that disk, read the boot code from the disk and finally boot it.
That's it! Put all your drives back into the drive bays and reboot. The bootloader from the USB drive will show up, wait 2 seconds and finally chainloads into the bootloader from your SSD, which will then boot your OS. Yay!
Have fun :)
Execute all the commands from the code blocks above but replace sdX with the internal USB drive you want to boot from and sdY with any ext4 formatted partition where your OS is installed on.
Here's a grub.cfg to boot a Talos distro