#!/bin/bash # enter the zoid (zfs on root with zraid) - developed by acidvegas (https://git.acid.vegas/void) # reference: https://docs.zfsbootmenu.org/en/v2.2.x/guides/void-linux/uefi.html # https://docs.zfsbootmenu.org/en/v2.3.x/guides/void-linux/uefi.html (do we need to make any updates?) set -xev # Configuration HOSTNAME=blackhole BOOT_DRIVE=/dev/sde # Use the internal USB drive for the boot partition POOL_DRIVES="/dev/sda /dev/sdb /dev/sdc /dev/sdd" # Verify these with lsblk before running convert_pool_drives() { local devices=$1 local by_id_drives="" for dev in $devices; do local device_by_id_path="" for id in /dev/disk/by-id/*; do if [ "$(readlink -f "$id")" = "$(readlink -f "$dev")" ] && ! [[ $id =~ .*-part[0-9]+ ]]; then device_by_id_path="$id" break fi done by_id_drives+="${device_by_id_path} " done echo $by_id_drives } setup_zfs() { source /etc/os-release export ID zgenhostid -f 0x00bab10c wipefs -a $BOOT_DRIVE sgdisk --zap-all $BOOT_DRIVE sgdisk -n "1:1m:+1g" -t "1:ef00" "$BOOT_DRIVE" for d in $POOL_DRIVES; do wipefs -a $d sgdisk --zap-all $d sgdisk -n "1:0:-10m" -t "1:bf00" "$d" if zdb -l "$d" &> /dev/null; then zpool labelclear -f "$d" fi done POOL_DRIVES=$(convert_pool_drives "$POOL_DRIVES") zpool create -f -o ashift=12 -O compression=lz4 -O acltype=posixacl -O xattr=sa -O relatime=on -o autotrim=on -o compatibility=openzfs-2.1-linux -m none zroot raidz $POOL_DRIVES zfs create -o mountpoint=none zroot/ROOT zfs create -o mountpoint=/ -o canmount=noauto zroot/ROOT/$ID zfs create -o mountpoint=/home zroot/home zpool set bootfs=zroot/ROOT/$ID zroot zpool export zroot zpool import -N -R /mnt zroot zfs mount zroot/ROOT/$ID zfs mount zroot/home udevadm trigger XBPS_ARCH=x86_64 xbps-install -S -R https://mirrors.servercentral.com/voidlinux/current -r /mnt base-system cp /etc/hostid /mnt/etc xchroot /mnt } setup_chroot() { passwd xbps-install -Suy xbps-install -y void-repo-nonfree xbps-install -Suy xbps-install -y intel-ucode ln -sf /etc/sv/intel-ucode /etc/runit/runsvdir/default/ ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime ln -sf /etc/sv/dhcpcd /etc/runit/runsvdir/default/ hwclock --systohc printf "$HOSTNAME\n" > /etc/hostname printf "HOSTNAME=\"$HOSTNAME\"\nHARDWARECLOCK=\"UTC\"\nTIMEZONE=\"America/New_York\"\nKEYMAP=us\n" > /etc/rc.conf printf "en_US.UTF-8 UTF-8\nen_US ISO-8859-1\n" > /etc/default/libc-locales xbps-reconfigure -f glibc-locales printf "nofsck=\"yes\"\nadd_dracutmodules+=\" zfs \"\nomit_dracutmodules+=\" btrfs \"\n" > /etc/dracut.conf.d/zol.conf xbps-install -y zfs zfs set org.zfsbootmenu:commandline="quiet loglevel=4" zroot/ROOT mkfs.vfat -F32 ${BOOT_DRIVE}1 BOOT_UUID=$(blkid -s UUID -o value ${BOOT_DRIVE}1) echo "UUID=$BOOT_UUID /boot/efi vfat defaults 0 0" > /etc/fstab mkdir -p /boot/efi mount /boot/efi # Everything below this line is a "hacky" solution to a problem I was having with the zfsbootmenu package # https://github.com/zbm-dev/zfsbootmenu/issues/293 # The developers of zfsbootmenu are rude and unhelpful, so I had to figure this out on my own: # 12:39 -- Mode #zfsbootmenu [+b *!*@big.dick.acid.vegas] by zdykstra # 12:39 ◀▬▬ zdykstra has kicked acidvegas (acidvegas) # 12:39 -- #zfsbootmenu: Cannot join channel (+b) - you are banned xbps-install -S zfsbootmenu gummiboot-efistub yq yq -iy '.Global.ManageImages=true | .Global.BootMountPoint="/boot/efi" | .Components.Enabled=false | .EFI.ImageDir="/boot/efi/EFI/zbm" | .EFI.Versions=false | .EFI.Enabled=true | .Kernel.CommandLine="quiet loglevel=0"' /etc/zfsbootmenu/config.yaml generate-zbm xbps-install -y refind refind-install rm /boot/refind_linux.conf printf "\"Boot default\" \"quiet loglevel=0 zbm.skip\"\n\"Boot to menu\" \"quiet loglevel=0 zbm.show\"\n" > /boot/efi/EFI/ZBM/refind_linux.conf mkdir -p /boot/efi/EFI/BOOT mvrefind /boot/efi/EFI/refind /boot/efi/EFI/BOOT temp=$(mktemp -d) wget -O $temp/latest.tar.gz https://get.zfsbootmenu.org/latest.tar.gz tar xvf $temp/latest.tar.gz -C $temp/ rm $temp/latest.tar.gz mv $temp/zfs*/* /boot/efi/EFI/ZBM/ rm /boot/efi/EFI/ZBM/vmlinuz.efi xbps-remove zfsbootmenu xbps-reconfigure -fa exit } if [ "$#" -ne 1 ]; then printf "usage: $0 [zfs|chroot|final]\n" exit 1 fi case "$1" in zfs) setup_zfs ;; chroot) setup_chroot ;; final) umount -n -R /mnt; zpool export zroot; reboot ;; *) printf "usage: $0 [zfs|chroot|final]\n"; exit 1 ;; esac