#!/bin/bash set -euo pipefail # @TODO: Implement more soft-coding and interactivity to this script ZFS_KEY_LOC="file:///etc/zfs/keys/zroot.key" ZFS_COMPAT="openzfs-2.1-linux" ZFS_KEY_FORMAT="passphrase" ZFS_COMPRESSION="zstd-3" if [ -z "$1" ]; then exit 1 fi if [ -z "$3" ] && [ "$1" == "init" ]; then ZFS_POOL_NAME="media" else if [ "$1" == "init" ]; then ZFS_POOL_NAME="$3" fi fi if [ -z "$2" ] && [ "$1" == "init" ]; then exit 1 else if [ "$1" == "init" ]; then ZFS_TARGET_DRIVE="$2" # @NOTE typically, device name will be disk by-id and end with "-part1" given how it is to be used with other scripts fi fi if [ "$1" == "init" ]; then sudo zpool create \ -o ashift=12 \ -o autotrim=on \ -o compatibility="$ZFS_COMPAT" \ -O encryption=on \ -O keylocation="$ZFS_KEY_LOC" \ -O keyformat="$ZFS_KEY_FORMAT" \ -O acltype=posixacl \ -O xattr=sa \ -O dnodesize=auto \ -O compression="$ZFS_COMPRESSION" \ -O normalization=formD \ -O relatime=on \ -O canmount=off \ -O mountpoint=none \ "$ZFS_POOL_NAME" \ /dev/disk/by-id/"${ZFS_TARGET_DRIVE}" elif [ "$1" == "ext" ]; then if [ -z "$2" ]; then exit 1 else ZFS_POOL_NAME="$2" fi ZFS_DATASET_OPTS="$3" shift 3 # @NOTE from this point on, @ must be list of arrays each containing two strings for i in "$@"; do mkdir -p "${i[0]}" sudo zfs create "${ZFS_DATASET_OPTS}" -o mountpoint="${HOME}${i[0]}" "${ZFS_POOL_NAME}/${i[1]}" done fi if [ -z "$4" ] && [ "$1" == "init" ]; then DATASET=("${HOME}/Documents/.calibre" "${ZFS_POOL_NAME}/LITERATURE") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" DATASET=("${HOME}/Videos" "${ZFS_POOL_NAME}/FILM") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" DATASET=("${HOME}/.var/app/com.valvesoftware.Steam" "${ZFS_POOL_NAME}/STEAMGAMES") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${ZFS_POOL_NAME}/RARCHGAMES") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" DATASET=("${HOME}/Games" "${ZFS_POOL_NAME}/GAMES") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" ln -s "${HOME}/.var/app/com.valvesoftware.Steam" "${DATASET[0]}/Steam" ln -s "${HOME}/.var/app/org.libretro.RetroArch" "${DATASET[0]}/libRetro" DATASET=("${HOME}/.var/app/org.libretro.RetroArch" "${ZFS_POOL_NAME}/RARCHGAMES") mkdir -p "${DATASET[0]}" sudo zfs create -o mountpoint="${DATASET[0]}" "${DATASET[1]}" DATASET=("${HOME}/.XXX" "${ZFS_POOL_NAME}/XXX") mkdir -p "${DATASET[0]}" sudo zfs create -o keylocation=prompt -o keyformat=passphrase -o mountpoint="${DATASET[0]}" "${DATASET[1]}" else if [ "$1" == "init" ]; then ZFS_DATASET_OPTS="$4" shift 4 # @NOTE from this point on, @ must be list of arrays each containing two strings for i in "$@"; do mkdir -p "${i[0]}" sudo zfs create "${ZFS_DATASET_OPTS}" -o mountpoint="${HOME}${i[0]}" "${ZFS_POOL_NAME}/${i[1]}" done else exit 0 fi fi