From c32c9abcd158c0bc62826e929897ed1be494fe21 Mon Sep 17 00:00:00 2001 From: "Jean (east-high-Nerd)" Date: Sat, 1 Aug 2026 22:24:18 -0400 Subject: [PATCH] Split [zfs.sh] into multiple scripts inside a [zfs] directory, adjusted references in other files to reflect changes --- install.sh | 4 +- list.sh | 6 +- post-inst.sh | 2 +- pre-inst.sh | 10 +- zfs.sh | 278 ------------------------------------------------ zfs/create.sh | 116 ++++++++++++++++++++ zfs/format.sh | 102 ++++++++++++++++++ zfs/home.sh | 32 ++++++ zfs/host-id.sh | 7 ++ zfs/key.sh | 12 +++ zfs/keystore.sh | 13 +++ zfs/splash.sh | 15 +++ zfs/unmount.sh | 16 +++ 13 files changed, 324 insertions(+), 289 deletions(-) delete mode 100755 zfs.sh create mode 100755 zfs/create.sh create mode 100755 zfs/format.sh create mode 100755 zfs/home.sh create mode 100755 zfs/host-id.sh create mode 100755 zfs/key.sh create mode 100755 zfs/keystore.sh create mode 100755 zfs/splash.sh create mode 100755 zfs/unmount.sh diff --git a/install.sh b/install.sh index 9cad32f..909e7b6 100755 --- a/install.sh +++ b/install.sh @@ -83,10 +83,10 @@ elif [[ "${ID}" == 'fedora' ]]; then "${baseDir}/fedora.sh" --dracut fi -"${baseDir}/zfs.sh" --splash +"${baseDir}/zfs/splash.sh" if [[ ! -z "$(zfs list | grep 'keystore')" ]]; then - "${baseDir}/zfs.sh" --keystore + "${baseDir}/zfs/keystore.sh" fi "${baseDir}/efi.sh" diff --git a/list.sh b/list.sh index 4c49f97..745b00e 100755 --- a/list.sh +++ b/list.sh @@ -5,9 +5,9 @@ set -euo pipefail baseDir="$(realpath "$(dirname "${0}")")" -disksById="$(ls -Ago /dev/disk/by-id/ | grep -v 'sr' | grep -v 'dm-' | grep -v 'nvme-eui.' | grep -v '\-part' | grep -v 'wwn-' | grep -v '_[1-9] -> ' | grep -v 'total' | sed -e 's|^.*\:[0-5][0-9] ||g')" -disks="$(lsblk -do name | grep -v 'loop' | grep -v 'sr' | grep -v 'zram' | grep -v 'NAME')" -networkInterfaces="$(ip -br addr show | sed -e 's| .*$||g' | grep -v '^lo' | grep -v 'tailscale' | grep -v '^wg')" +disksById="$(ls -Ago /dev/disk/by-id/ | awk '!/sr/&&!/dm-/&&!/nvme-eui\./&&!/\-part/&&!/wwn-/&&!/_[1-9] -> /&&NR!=1{print$7" -> "$9}')" +disks="$(lsblk -do name | awk 'NR!=1&&!/loop/&&!/sr/&&!/zram/')" +networkInterfaces="$(ip -br addr show | awk '!/^lo/&&!/tailscale/&&!/^wg/{print$1}')" cat << EOF diff --git a/post-inst.sh b/post-inst.sh index 32d44a6..aeb3238 100755 --- a/post-inst.sh +++ b/post-inst.sh @@ -33,7 +33,7 @@ cat << EOF EOF -"${baseDir}/zfs.sh" --home +"${baseDir}/zfs/home.sh" "${baseDir}/adduser.sh" diff --git a/pre-inst.sh b/pre-inst.sh index fe1440f..5ae7822 100755 --- a/pre-inst.sh +++ b/pre-inst.sh @@ -48,7 +48,7 @@ fi timedatectl if [[ ! "$(hostname)" == "debian-live" ]]; then - "${baseDir}/zfs.sh" --host-id + "${baseDir}/zfs/host-id.sh" fi @@ -56,9 +56,9 @@ fi sleep 5 -"${baseDir}/zfs.sh" --format +"${baseDir}/zfs/format.sh" -"${baseDir}/zfs.sh" --create +"${baseDir}/zfs/create.sh" "${baseDir}/mkdir-tmpfs.sh" @@ -99,7 +99,7 @@ if [[ "${ID}" == 'elementary' ]]; then fi if [[ -f "/etc/zfs/keys/${hostname,,}.key" ]]; then - "${baseDir}/zfs.sh" --key + "${baseDir}/zfs/key.sh" fi if [[ "${ID}" == 'elementary' ]]; then @@ -108,7 +108,7 @@ fi "${baseDir}/chroot.sh" --continue -"${baseDir}/zfs.sh" --unmount +"${baseDir}/zfs/unmount.sh" printf \ '\033[?47h\033[2J\033[H' diff --git a/zfs.sh b/zfs.sh deleted file mode 100755 index 824bf2b..0000000 --- a/zfs.sh +++ /dev/null @@ -1,278 +0,0 @@ -#!/bin/bash -set -euo pipefail - -baseDir="$(realpath "$(dirname "${0}")")" - -source \ - /etc/os-release -source \ - "${baseDir}/system.conf" - - -if [[ ! "${disk}" == **/dev/disk/by-id/** ]]; then - if [[ "${disk}" == **/dev/nvme** ]]; then - part3='p3' - else - part3='3' - fi -else - part3='-part3' -fi - - -if [[ "${1}" == '--format' ]]; then - if [[ "${encryption}" == 'yes' ]]; then - zpoolPassword='A' - zpoolPasswordVerify='B' - - printf \ - '\033[?47h\033[2J\033[H' - - while [[ ! "${zpoolPassword}" == "${zpoolPasswordVerify}" ]] || [[ -z "${zpoolPassword}" ]] || [[ "${#zpoolPassword}" -lt '8' ]]; do - printf \ - "Enter a password to encrypt your root pool (minimum 8 characters):\n" - read \ - -r \ - -s \ - zpoolPassword - - printf \ - "Verify the password to encrypt your root pool:\n" - read \ - -r \ - -s \ - zpoolPasswordVerify - - if [[ ! "${zpoolPassword}" == "${zpoolPasswordVerify}" ]]; then - printf \ - "ERROR:\tPasswords do not match!\n\n" - elif [[ -z "${zpoolPassword}" ]]; then - printf \ - "ERROR:\tPassword is empty!\n\n" - elif [[ "${#zpoolPassword}" -lt '8' ]]; then - printf \ - "ERROR:\tPassword is too short!\n\n" - fi - done - - printf \ - '\033[?47l' - - mkdir \ - -p \ - /etc/zfs/keys/ - - printf \ - "${zpoolPassword}\n" | tee /etc/zfs/keys/${hostname,,}.key &> /dev/null - - chmod \ - 000 \ - /etc/zfs/keys/${hostname,,}.key - - zpool create \ - -o ashift=12 \ - -o autotrim=on \ - -o compatibility=openzfs-2.1-linux \ - -O encryption=on \ - -O keylocation=file:///etc/zfs/keys/${hostname,,}.key \ - -O keyformat=passphrase \ - -O acltype=posixacl \ - -O xattr=sa \ - -O dnodesize=auto \ - -O compression=zstd-3 \ - -O normalization=formD \ - -O relatime=on \ - -O canmount=off \ - -O mountpoint=/ \ - -R /mnt \ - ${hostname,,} \ - ${disk}${part3} - else - zpool create \ - -o ashift=12 \ - -o autotrim=on \ - -o compatibility=openzfs-2.1-linux \ - -O encryption=off \ - -O acltype=posixacl \ - -O xattr=sa \ - -O dnodesize=auto \ - -O compression=zstd-3 \ - -O normalization=formD \ - -O relatime=on \ - -O canmount=off \ - -O mountpoint=/ \ - -R /mnt \ - ${hostname,,} \ - ${disk}${part3} - fi -fi - -if [[ "${1}" == '--create' ]]; then - zfs create \ - -o canmount=off \ - -o mountpoint=none \ - ${hostname,,}/ROOT - - zfs create \ - -o canmount=noauto \ - -o mountpoint=/ \ - ${hostname,,}/ROOT/${ID} - - zfs mount \ - ${hostname,,}/ROOT/${ID} - - zfs create \ - ${hostname,,}/home - - zfs create \ - -o mountpoint=/root \ - ${hostname,,}/home/root - - chmod \ - 700 \ - /mnt/root - - zfs create \ - -o canmount=off \ - -o mountpoint=/var \ - ${hostname,,}/var - - zfs create \ - -o canmount=off \ - ${hostname,,}/var/lib - - zfs create \ - ${hostname,,}/var/log - - zfs create \ - ${hostname,,}/var/spool - - zfs create \ - -o com.sun:auto-snapshot=false \ - ${hostname,,}/var/cache - - zfs create \ - -o com.sun:auto-snapshot=false \ - ${hostname,,}/var/lib/nfs - - zfs create \ - -o com.sun:auto-snapshot=false \ - ${hostname,,}/var/tmp - - chmod \ - 1777 \ - /mnt/var/tmp - - zfs create \ - -o mountpoint=/srv \ - ${hostname,,}/srv - - zfs create \ - -o canmount=off \ - -o mountpoint=/usr \ - ${hostname,,}/usr - - zfs create \ - ${hostname,,}/usr/local - - zfs create \ - ${hostname,,}/var/games - - zfs create \ - ${hostname,,}/var/lib/AccountsService - - zfs create \ - ${hostname,,}/var/lib/NetworkManager - - zfs create \ - ${hostname,,}/var/www - - zfs create \ - -o com.sun:auto-snapshot=false \ - -o mountpoint=/tmp \ - ${hostname,,}/tmp - - if [[ "${encryption}" == 'yes' ]]; then - zfs create \ - -o com.sun:auto-snapshot=false \ - -o mountpoint=/etc/zfs/keys \ - ${hostname,,}/keystore - fi - - zpool set \ - bootfs=${hostname,,}/ROOT/${ID} \ - ${hostname,,} - - if [[ "${ID}" == 'fedora' ]]; then - "${baseDir}/fedora.sh" --rsync - fi - - zfs create \ - ${hostname,,}/var/mail - - chmod \ - 1777 \ - /mnt/tmp -fi - -if [[ "${1}" == '--key' ]]; then - cp \ - /etc/zfs/keys/${hostname,,}.key \ - /mnt/etc/zfs/keys/ -fi - -if [[ "${1}" == '--unmount' ]]; then - umount \ - -nR \ - /mnt - - zpool \ - export \ - ${hostname,,} -fi - -if [[ "${1}" == '--host-id' ]]; then - zgenhostid \ - -f \ - 0x00bab10c -fi - -if [[ "${1}" == '--home' ]]; then - zfs create\ - ${hostname,,}/home/${username} - - zfs create\ - ${hostname,,}/home/${username}/.config - - zfs create\ - -o canmount=off\ - ${hostname,,}/home/${username}/.var - - zfs create\ - ${hostname,,}/home/${username}/.var/app - - zfs create\ - -o canmount=off\ - ${hostname,,}/home/${username}/.local - - zfs create\ - -o canmount=off\ - ${hostname,,}/home/${username}/.local/share - - zfs create\ - ${hostname,,}/home/${username}/.local/share/flatpak -fi - -if [[ "${1}" == '--keystore' ]]; then - zfs \ - set \ - org.zfsbootmenu:keysource=${hostname,,}/keystore \ - ${hostname,,} -fi - -if [[ "${1}" == '--splash' ]]; then - zfs \ - set \ - org.zfsbootmenu:commandline='quiet splash rhgb noresume' \ - ${hostname,,}/ROOT/${ID} -fi diff --git a/zfs/create.sh b/zfs/create.sh new file mode 100755 index 0000000..57dc50c --- /dev/null +++ b/zfs/create.sh @@ -0,0 +1,116 @@ +#!/bin/bash +set -euo pipefail + +baseDir="$(realpath "$(dirname "${0}")/../")" + +source \ + /etc/os-release +source \ + "${baseDir}/system.conf" + + +zfs create \ + -o canmount=off \ + -o mountpoint=none \ + ${hostname,,}/ROOT + +zfs create \ + -o canmount=noauto \ + -o mountpoint=/ \ + ${hostname,,}/ROOT/${ID} + +zfs mount \ + ${hostname,,}/ROOT/${ID} + +zfs create \ + ${hostname,,}/home + +zfs create \ + -o mountpoint=/root \ + ${hostname,,}/home/root + +chmod \ + 700 \ + /mnt/root + +zfs create \ + -o canmount=off \ + -o mountpoint=/var \ + ${hostname,,}/var + +zfs create \ + -o canmount=off \ + ${hostname,,}/var/lib + +zfs create \ + ${hostname,,}/var/log + +zfs create \ + ${hostname,,}/var/spool + +zfs create \ + -o com.sun:auto-snapshot=false \ + ${hostname,,}/var/cache + +zfs create \ + -o com.sun:auto-snapshot=false \ + ${hostname,,}/var/lib/nfs + +zfs create \ + -o com.sun:auto-snapshot=false \ + ${hostname,,}/var/tmp + +chmod \ + 1777 \ + /mnt/var/tmp + +zfs create \ + -o mountpoint=/srv \ + ${hostname,,}/srv + +zfs create \ + -o canmount=off \ + -o mountpoint=/usr \ + ${hostname,,}/usr + +zfs create \ + ${hostname,,}/usr/local + +zfs create \ + ${hostname,,}/var/games + +zfs create \ + ${hostname,,}/var/lib/AccountsService + +zfs create \ + ${hostname,,}/var/lib/NetworkManager + +zfs create \ + ${hostname,,}/var/www + +zfs create \ + -o com.sun:auto-snapshot=false \ + -o mountpoint=/tmp \ + ${hostname,,}/tmp + +if [[ "${encryption}" == 'yes' ]]; then + zfs create \ + -o com.sun:auto-snapshot=false \ + -o mountpoint=/etc/zfs/keys \ + ${hostname,,}/keystore +fi + +zpool set \ + bootfs=${hostname,,}/ROOT/${ID} \ + ${hostname,,} + +if [[ "${ID}" == 'fedora' ]]; then + "${baseDir}/fedora.sh" --rsync +fi + +zfs create \ + ${hostname,,}/var/mail + +chmod \ + 1777 \ + /mnt/tmp diff --git a/zfs/format.sh b/zfs/format.sh new file mode 100755 index 0000000..d2f9173 --- /dev/null +++ b/zfs/format.sh @@ -0,0 +1,102 @@ +#!/bin/bash +set -euo pipefail + +baseDir="$(realpath "$(dirname "${0}")/../")" + +source \ + "${baseDir}/system.conf" + +if [[ ! "${disk}" == **/dev/disk/by-id/** ]]; then + if [[ "${disk}" == **/dev/nvme** ]]; then + part3='p3' + else + part3='3' + fi +else + part3='-part3' +fi + + +if [[ "${encryption}" == 'yes' ]]; then + zpoolPassword='A' + zpoolPasswordVerify='B' + + printf \ + '\033[?47h\033[2J\033[H' + + while [[ ! "${zpoolPassword}" == "${zpoolPasswordVerify}" ]] || [[ -z "${zpoolPassword}" ]] || [[ "${#zpoolPassword}" -lt '8' ]]; do + printf \ + "Enter a password to encrypt your root pool (minimum 8 characters):\n" + read \ + -r \ + -s \ + zpoolPassword + + printf \ + "Verify the password to encrypt your root pool:\n" + read \ + -r \ + -s \ + zpoolPasswordVerify + + if [[ ! "${zpoolPassword}" == "${zpoolPasswordVerify}" ]]; then + printf \ + "ERROR:\tPasswords do not match!\n\n" + elif [[ -z "${zpoolPassword}" ]]; then + printf \ + "ERROR:\tPassword is empty!\n\n" + elif [[ "${#zpoolPassword}" -lt '8' ]]; then + printf \ + "ERROR:\tPassword is too short!\n\n" + fi + done + + printf \ + '\033[?47l' + mkdir \ + -p \ + /etc/zfs/keys/ + + printf \ + "${zpoolPassword}\n" | tee /etc/zfs/keys/${hostname,,}.key &> /dev/null + + chmod \ + 000 \ + /etc/zfs/keys/${hostname,,}.key + + zpool create \ + -o ashift=12 \ + -o autotrim=on \ + -o compatibility=openzfs-2.1-linux \ + -O encryption=on \ + -O keylocation=file:///etc/zfs/keys/${hostname,,}.key \ + -O keyformat=passphrase \ + -O acltype=posixacl \ + -O xattr=sa \ + -O dnodesize=auto \ + -O compression=zstd-3 \ + -O normalization=formD \ + -O relatime=on \ + -O canmount=off \ + -O mountpoint=/ \ + -R /mnt \ + ${hostname,,} \ + ${disk}${part3} +else + zpool create \ + -o ashift=12 \ + -o autotrim=on \ + -o compatibility=openzfs-2.1-linux \ + -O encryption=off \ + -O acltype=posixacl \ + -O xattr=sa \ + -O dnodesize=auto \ + -O compression=zstd-3 \ + -O normalization=formD \ + -O relatime=on \ + -O canmount=off \ + -O mountpoint=/ \ + -R /mnt \ + ${hostname,,} \ + ${disk}${part3} +fi diff --git a/zfs/home.sh b/zfs/home.sh new file mode 100755 index 0000000..29c6587 --- /dev/null +++ b/zfs/home.sh @@ -0,0 +1,32 @@ +#!/bin/bash +set -euo pipefail + +baseDir="$(realpath "$(dirname "${0}")/../")" + +source \ + "${baseDir}/system.conf" + + +zfs create\ + ${hostname,,}/home/${username} + +zfs create\ + ${hostname,,}/home/${username}/.config + +zfs create\ + -o canmount=off\ + ${hostname,,}/home/${username}/.var + +zfs create\ + ${hostname,,}/home/${username}/.var/app + +zfs create\ + -o canmount=off\ + ${hostname,,}/home/${username}/.local + +zfs create\ + -o canmount=off\ + ${hostname,,}/home/${username}/.local/share + +zfs create\ + ${hostname,,}/home/${username}/.local/share/flatpak diff --git a/zfs/host-id.sh b/zfs/host-id.sh new file mode 100755 index 0000000..c288e86 --- /dev/null +++ b/zfs/host-id.sh @@ -0,0 +1,7 @@ +#!/bin/bash +set -euo pipefail + + +zgenhostid \ + -f \ + 0x00bab10c diff --git a/zfs/key.sh b/zfs/key.sh new file mode 100755 index 0000000..979be57 --- /dev/null +++ b/zfs/key.sh @@ -0,0 +1,12 @@ +#!/bin/bash +set -euo pipefail + +baseDir="$(realpath "$(dirname "${0}")/../")" + +source \ + "${baseDir}/system.conf" + + +cp \ + /etc/zfs/keys/${hostname,,}.key \ + /mnt/etc/zfs/keys/ diff --git a/zfs/keystore.sh b/zfs/keystore.sh new file mode 100755 index 0000000..3868d0c --- /dev/null +++ b/zfs/keystore.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -euo pipefail + +baseDir="$(realpath "$(dirname "${0}")/../")" + +source \ + "${baseDir}/system.conf" + + +zfs \ + set \ + org.zfsbootmenu:keysource=${hostname,,}/keystore \ + ${hostname,,} diff --git a/zfs/splash.sh b/zfs/splash.sh new file mode 100755 index 0000000..5a6bbe1 --- /dev/null +++ b/zfs/splash.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -euo pipefail + +baseDir="$(realpath "$(dirname "${0}")/../")" + +source \ + /etc/os-release +source \ + "${baseDir}/system.conf" + + +zfs \ + set \ + org.zfsbootmenu:commandline='quiet splash rhgb noresume' \ + ${hostname,,}/ROOT/${ID} diff --git a/zfs/unmount.sh b/zfs/unmount.sh new file mode 100755 index 0000000..673d576 --- /dev/null +++ b/zfs/unmount.sh @@ -0,0 +1,16 @@ +#!/bin/bash +set -euo pipefail + +baseDir="$(realpath "$(dirname "${0}")/../")" + +source \ + "${baseDir}/system.conf" + + +umount \ + -nR \ + /mnt + +zpool \ + export \ + ${hostname,,}