186 lines
4.9 KiB
Bash
Executable File
186 lines
4.9 KiB
Bash
Executable File
#!/bin/bash
|
|
# enter the zoid (zfs on root with raidz) - developed by acidvegas (https://git.acid.vegas/void)
|
|
|
|
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" # Drives used for the ZFS pool
|
|
RAIDZ_PARITY="1" # Number of drives to use for the RAID-Z parity (must be 1 or greater otherwise why are you using ZFS?)
|
|
|
|
checks() {
|
|
# Check if the system is using UEFI or BIOS
|
|
if [ ! -d /sys/firmware/efi ]; then
|
|
echo "System must be using UEFI"
|
|
exit 1
|
|
fi
|
|
|
|
# Check if all drives exist and are valid
|
|
for d in $BOOT_DRIVE $POOL_DRIVES; do
|
|
if [ ! -b $d ]; then
|
|
echo "Drive $d does not exist"
|
|
exit 1
|
|
fi
|
|
done
|
|
|
|
if [ $RAIDZ_PARITY -lt 1 ]; then
|
|
echo "RAID-Z parity must be 1 or greater"
|
|
exit 1
|
|
fi
|
|
|
|
# Double check the drives are correct
|
|
echo "Current block devices:" && lsblk
|
|
echo "Selected boot drive: $BOOT_DRIVE"
|
|
echo "Selected drives for the ZFS pool: $POOL_DRIVES"
|
|
read -p "Are these drives correct? (y/n): " -r
|
|
if [ $REPLY != "y" ]; then
|
|
echo "Update the POOL_DRIVES configuration"
|
|
exit 1
|
|
fi
|
|
}
|
|
|
|
|
|
setup_zfs() {
|
|
# Validation
|
|
checks
|
|
|
|
# Install dependencies
|
|
xbps-install -y gptfdisk util-linux zfs
|
|
|
|
# Generate the hostid
|
|
source /etc/os-release
|
|
export ID
|
|
zgenhostid -f 0x00bab10c
|
|
|
|
echo "No turning back now...ZFS TIME!"
|
|
|
|
# Prepare the boot drive
|
|
wipefs -a $BOOT_DRIVE
|
|
sgdisk --zap-all $BOOT_DRIVE
|
|
sgdisk -n "1:1m:+1g" -t "1:ef00" "$BOOT_DRIVE"
|
|
|
|
# Prepare the ZFS pool drives
|
|
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
|
|
|
|
echo "Entering a quasar cluster..."
|
|
|
|
# Create the ZFS pool
|
|
ZFS_POOL_DRIVES=$(echo $(for dev in $POOL_DRIVES; do find /dev/disk/by-id/ -samefile $(readlink -f "$dev") ! -name "*-part*" -print -quit; done))
|
|
zpool create -f -o ashift=12 -O compression=lz4 -O acltype=posixacl -O xattr=sa -O noatime=on -o autotrim=on -o compatibility=openzfs-2.1-linux -m none zroot raidz${RAIDZ_PARITY} $ZFS_POOL_DRIVES
|
|
|
|
# Create the ZFS datasets
|
|
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
|
|
|
|
# Export and import the ZFS pool
|
|
zpool export zroot
|
|
zpool import -N -R /mnt zroot
|
|
zfs mount zroot/ROOT/$ID
|
|
zfs mount zroot/home
|
|
|
|
# Trigger udev
|
|
udevadm trigger
|
|
|
|
echo "Creating a black hole..."
|
|
|
|
# Install base system
|
|
XBPS_ARCH=x86_64 xbps-install -S -R https://mirrors.servercentral.com/voidlinux/current -r /mnt base-system
|
|
|
|
# Copy the hostid into the new system
|
|
cp /etc/hostid /mnt/etc
|
|
|
|
# Chroot into the new system
|
|
echo "Entering the matrix...make sure to run the following command to continue: ./enterthezoid chroot"
|
|
xchroot /mnt
|
|
}
|
|
|
|
|
|
setup_chroot() {
|
|
# Set the root password
|
|
echo "root:root" | chpasswd
|
|
|
|
# Update the package manager
|
|
xbps-install -Suy
|
|
|
|
# Install the non-free repository
|
|
xbps-install -y void-repo-nonfree
|
|
xbps-install -Suy
|
|
|
|
# Install & enable the intel microcode service
|
|
xbps-install -y intel-ucode
|
|
ln -sf /etc/sv/intel-ucode /etc/runit/runsvdir/default/
|
|
|
|
# Set the timezone & hardware clock
|
|
ln -sf /usr/share/zoneinfo/America/New_York /etc/localtime
|
|
hwclock --systohc
|
|
|
|
# Set the hostname
|
|
echo "$HOSTNAME" > /etc/hostname
|
|
|
|
# Set the rc.conf variables
|
|
printf "HOSTNAME=\"$HOSTNAME\"\nHARDWARECLOCK=\"UTC\"\nTIMEZONE=\"America/New_York\"\nKEYMAP=us\n" > /etc/rc.conf
|
|
|
|
# Set the locales
|
|
printf "en_US.UTF-8 UTF-8\nen_US ISO-8859-1\n" > /etc/default/libc-locales
|
|
xbps-reconfigure -f glibc-locales
|
|
|
|
# Set the dracut configuration
|
|
printf "nofsck=\"yes\"\nadd_dracutmodules+=\" zfs \"\nomit_dracutmodules+=\" btrfs \"\n" > /etc/dracut.conf.d/zol.conf
|
|
|
|
|
|
echo "Interstellar data de-spaghettification commencing..."
|
|
|
|
# Install the zfs package
|
|
xbps-install -y zfs
|
|
|
|
# Setup & mount the boot partition
|
|
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
|
|
|
|
echo "System is armed and dangerous"
|
|
|
|
# Install & configure gummiboot bootloader
|
|
xbps-install -y gummiboot-efistub
|
|
gummiboot install
|
|
|
|
# Create a bootloader entry
|
|
mkdir -p /boot/efi/loader/entries
|
|
printf "title Void Linux\nlinux /vmlinuz-linux\ninitrd /initramfs-linux.img\noptions root=ZFS=zroot/ROOT/void rw quiet loglevel=0" > /boot/efi/loader/entries/void-linux.conf
|
|
|
|
# Reconfigure the bootloader
|
|
xbps-reconfigure -fa
|
|
|
|
# Exit the chroot
|
|
echo "Exiting the matrix...remember to run the following command to continue: ./enterthezoid final"
|
|
exit
|
|
}
|
|
|
|
|
|
|
|
# Check the command
|
|
if [ "$#" -ne 1 ]; then
|
|
echo "usage: $0 [zfs|chroot|final]"
|
|
exit 1
|
|
fi
|
|
|
|
# Execute the command
|
|
case "$1" in
|
|
zfs) setup_zfs ;;
|
|
chroot) setup_chroot ;;
|
|
final) umount -n -R /mnt; zpool export zroot; reboot ;;
|
|
*) echo "usage: $0 [zfs|chroot|final]" && exit 1 ;;
|
|
esac
|