12 Commits

Author SHA1 Message Date
2ddb6bdfb8 Added '--format=directory' for 'mmdebstrap' 2025-07-11 21:28:39 -04:00
fca5e6c6fc Added '--mode=root' for 'mmdebstrap' 2025-07-11 21:28:11 -04:00
7135728394 Removed 'firmware-ipw2x00' package from installation list due to license agreement issues with 'mmdebstrap' 2025-07-11 21:23:39 -04:00
f0bfcbad56 Added '--components=main,non-free-firmware,contrib' for 'mmdebstrap' 2025-07-11 21:22:28 -04:00
2fdc93d9a1 Added '*kate-swp' to '.gitignore' 2025-07-11 21:20:39 -04:00
fc18016a9e Put packages back on sepeate lines, each with their own --include= preceding them 2025-07-11 21:13:25 -04:00
aafbd7ef8f MAde all packages for --include in mmdebstrap one line 2025-07-11 21:01:42 -04:00
fcf09e2ffc Added --skip=check/empty to mmdebstrap 2025-07-11 21:00:45 -04:00
cda85111e7 Changed a hostname lookup from the ${HOST} variable to the hostname command 2025-07-11 20:48:36 -04:00
d1e3cedd1f Changed a hostname lookup from the ${HOST} variable to the hostname command 2025-07-11 20:47:43 -04:00
d85a175989 Fixed contrib.sources not writing to correct path. Changed tee's redirection from &> to 1> 2025-07-11 20:46:31 -04:00
39065008aa Replaced debootstrap with mmdebstrap, added packages from install.sh to --include for mmdebstrap, and commented out relevent section in install.sh 2025-07-11 20:24:57 -04:00
12 changed files with 859 additions and 923 deletions

128
README.md
View File

@@ -1,18 +1,118 @@
# ZFSBootMenu Root Install
## (Re)Design Document
## Intro
The purpose of this branch is to modularize as many functions of the scripts as possible, i.e. by moving all Debian related commands into the Debian-specific script, move all EFI related commands into its own script, etc.
Well howdy!
## Checklist
[X] Rename all `base-` scripts to remove `base-`
[ ] Move (at least almost) all Debian related commands and tasks to `debian.sh`
[ ] Move (at least almost) all Fedora related commands and tasks to `fedora.sh`
[ ] Move (at least almost) all elementary OS related commands and tasks to `elementary.sh`
[ ] Rename flags in all distro specific scripts from numbered (i.e. `-1`, `-2`) to descriptive (i.e. `--mmdebstrap`, `--network-interfaces`)
[X] Move all EFI related commands and tasks to a new `efi.sh` script
[X] Rename `mkfs.zfs.sh` to `zfs.sh`
[ ] Point any distro-specific commands/tasks that are shared with Debian to use `debian.sh` to avoid any unnecessary duplication
[ ] Rewrite `README.md`
[ ] Rename all script-specific variables to lowercase with singular capital letters to seperate words in variable name
[ ] Update how `baseDir` is set using `realpath $(basedir "${0}")`
Welcome to the ZFSBootMenu Root Install script!
This here script is designed to install (currently) either Debian or Fedora
with OpenZFS as the root filesystem, and utilize ZFSBootMenu for actually
getting the system up and running (as opposed to i.e. GRUB2 or systemd-bootd)
Some of the benefits of this setup include:
- Having a reliable copy-on-write (CoW) filesystem
- Being able to easily create and rollback to snapshots from either the OS or ZFSBootMenu
- Easy backups by sending/receiving snapshots to local or remote locations, including being able to do a "raw send", where the data being sent is the raw encrypted data without the decryption key, useful for backing up to third-party backup services
- Having multiple version of an OS installed on the system via different root datasets (i.e. stable and testing versions, old and new versions, etc.)
## Getting Started
**! THESE SCRIPTS ARE TO BE RUN ON THE LIVE MEDIUM OF THE OS YOU INTEND ON
INSTALLING AND AS THE ROOT USER !**
To use this script, you run the `menu.sh` script, and use its, well, menu to
go step by step through installing the OS you wish to have on your PC
The steps are as follows, and will be expanded on throughout this document:
- List
- Configure
- Partition
- Install
- Post Install
- Finalize
- WiFi Setup
## List
This lists all currently connected storage devices and network interfaces of the system
This is handy to know what devices and interfaces were picked up by the OS and the script, and to make sure that everything is "hunky-dory"
Storage devices are listed seperately for both /dev/ (i.e. sda, sdb), and for /dev/disk/by-id/ (i.e. ata-WD_Blue)
The latter method (/dev/disk/by-id/) is STRONGLY recommended when selecting the installation disk during configuration, and the former method (/dev/) should only be used in an environment where the latter method is unavailable (i.e. in a virtual machine)
## Configure
When run, this will guide you through creating a configuration file (system.conf) that is used throughout the script for various tasks
This includes:
- Disk type (SSD or HDD)
- Disk to install to
- Hostname of the machine
- Username of your new user account
- Whether to configure SWAP or not (SWAP will be equal to RAM x2)
- Whether to use encryption or not (ZFS native encryption is used)
## Partition
The disk selected during configuration will be completely wiped and
partitioned, and formatted with the ZFS filesystem
Debian or Fedora will be installed via their respective means for this setup (debootstrap for Debian, and an rsync for Fedora)
If encryption was configured on, you will enter a password for your new zpool during this step
The partition layout is as such:
- A 512MiB partition for EFI
- A RAMx2 partition for SWAP (if configured)
- A partition for ZFS (remaining space)
Multiple ZFS datatets are setup from this script, including (but not limited to):
- A dataset for the root filesystem (such as to allow multiple OSes)
- A dataset for your home directory
- A datatset for your config directory
- Seperate datasets for /srv, /tmp, /usr, /var, etc.
After this script has mostly concluded, you will be chrooted into the new installation to continue
Once the chroot has been exited, everything will be unmounted and the zpool exported
Afterwards, you will be notified to reboot the machine
## Install
This is where you finish installing the system
After being chrooted by the partition script, you'll run the menu script again from `/ZFSBootMenu Root Install/menu.sh` and begin this step
This is where the needed packages are installed, the system gets configured, and ZFSBootMenu is downloaded and EFI entries made
Exactly what needs doing depends on what OS is being installed (Debian or Fedora)
After completion, the post install script should be automatically ran
## Post Install
This is where the datasets for the individual user are created, as well as the user themselves
When installing Debian, this part will also have you select the desktop environment you wish to install (if any), and setup an APT hook to a script that takes a snapshot before any packages are installed, removed, or upgraded, to allow for easy rollback in the event of a botched package operation
## Finalize
This part ensures that timedatectl is set properly, as well as locks the root account, and sets up Flathub in user mode for installation of software packaged as Flatpaks
## WiFi Setup
This part is mostly obsolete
This script allows for the configuration of a WiFi network from the terminal, in the event that a wired connection is unavailable

View File

@@ -2,13 +2,13 @@
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")"
cat << EOF
#######################################
## ##
## $(cat "${baseDir}/title") Script ##
## $(cat "${BASEDIR}/title") Script ##
## ##
## Jean <jean@easthighnerd.net> ##
## ##
@@ -25,17 +25,17 @@ EOF
printf \
'zolFedoraVer="2-6"\n' | \
'ZOL_FEDORA_VER="2-6"\n' | \
tee \
"${baseDir}/system.conf" \
"${BASEDIR}/system.conf" \
&> \
/dev/null
printf \
'(NVMe) SSD or HDD?\n'
select option in 'SSD' 'HDD'
select OPTION in 'SSD' 'HDD'
do
case "${option}" in
case "${OPTION}" in
'SSD'|'HDD')
break
;;
@@ -47,10 +47,10 @@ do
done
printf \
"diskType=\"${option}\"\n" | \
"DISK_TYPE=\"${OPTION}\"\n" | \
tee \
--append \
"${baseDir}/system.conf" \
"${BASEDIR}/system.conf" \
&> \
/dev/null
@@ -59,9 +59,9 @@ printf \
printf \
'\nGet disk from:\n'
select option in '/dev/disk/by-id/' '/dev/'
select OPTION in '/dev/disk/by-id/' '/dev/'
do
case "${option}" in
case "${OPTION}" in
'/dev/disk/by-id/'|'/dev/')
break
;;
@@ -75,26 +75,26 @@ done
printf \
'\033[2J\033[H'
if [[ "${option}" == '/dev/disk/by-id/' ]]; then
drives="$(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 's|^.*\:[0-5][0-9] ||g; s| -> .*$||g' | tr -d '[:blank:]')"
if [[ "${OPTION}" == '/dev/disk/by-id/' ]]; then
DRIVES="$(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 's|^.*\:[0-5][0-9] ||g; s| -> .*$||g' | tr -d '[:blank:]')"
printf \
'\nSelect the disk you want to use:\n'
drives=( ${drives} )
DRIVES=( ${DRIVES} )
shopt -s extglob
menu="@(${drives[0]}"
MENU="@(${DRIVES[0]}"
for ((i=1;i<${#drives[@]};i++)); do
menu+="|${drives[$i]}"
for ((i=1;i<${#DRIVES[@]};i++)); do
MENU+="|${DRIVES[$i]}"
done
menu+=")"
MENU+=")"
select drive in "${drives[@]}"
select DRIVE in "${DRIVES[@]}"
do
case ${drive} in
${menu})
case ${DRIVE} in
${MENU})
break
;;
*)
@@ -105,32 +105,32 @@ if [[ "${option}" == '/dev/disk/by-id/' ]]; then
done
printf \
"disk=\"/dev/disk/by-id/${drive}\"\n" | \
"DISK=\"/dev/disk/by-id/${DRIVE}\"\n" | \
tee \
--append \
"${baseDir}/system.conf" \
"${BASEDIR}/system.conf" \
&> \
/dev/null
elif [[ "${option}" == '/dev/' ]]; then
drives="$(lsblk -do name | grep -v 'loop' | grep -v 'sr' | grep -v 'zram' | grep -v 'NAME' | tr -d '[:blank:]')"
elif [[ "${OPTION}" == '/dev/' ]]; then
DRIVES="$(lsblk -do name | grep -v 'loop' | grep -v 'sr' | grep -v 'zram' | grep -v 'NAME' | tr -d '[:blank:]')"
printf \
'\nSelect the disk you want to use:\n'
drives=( ${drives} )
DRIVES=( ${DRIVES} )
shopt -s extglob
menu="@(${drives[0]}"
MENU="@(${DRIVES[0]}"
for ((i=1;i<${#drives[@]};i++)); do
menu+="|${drives[$i]}"
for ((i=1;i<${#DRIVES[@]};i++)); do
MENU+="|${DRIVES[$i]}"
done
menu+=")"
MENU+=")"
select drive in "${drives[@]}"
select DRIVE in "${DRIVES[@]}"
do
case ${drive} in
${menu})
case ${DRIVE} in
${MENU})
break
;;
*)
@@ -141,10 +141,10 @@ elif [[ "${option}" == '/dev/' ]]; then
done
printf \
"disk=\"/dev/${drive}\"\n" | \
"DISK=\"/dev/${DRIVE}\"\n" | \
tee \
--append \
"${baseDir}/system.conf" \
"${BASEDIR}/system.conf" \
&> \
/dev/null
fi
@@ -152,52 +152,52 @@ fi
printf \
'\033[2J\033[H'
hostname='-'
HOSTNAME='-'
while [[ "${hostname}" == '-' ]] || [[ -z "${hostname}" ]] || [[ "${hostname}" = *' '* ]] || [[ "${hostname}" = *_* ]]; do
while [[ "${HOSTNAME}" == '-' ]] || [[ -z "${HOSTNAME}" ]] || [[ "${HOSTNAME}" = *' '* ]] || [[ "${HOSTNAME}" = *_* ]]; do
printf \
'\nEnter a hostname for this machine (no spaces or underscores):\n'
read \
-r \
hostname
HOSTNAME
if [[ "${hostname}" = *' '* ]] || [[ "${hostname}" = *_* ]]; then
if [[ "${HOSTNAME}" = *' '* ]] || [[ "${HOSTNAME}" = *_* ]]; then
printf \
'ERROR:\tNo spaces or underscores in the hostname!\n'
fi
done
printf \
"hostname=\"${hostname}\"\n" | \
"HOSTNAME=\"${HOSTNAME}\"\n" | \
tee \
--append \
"${baseDir}/system.conf" \
"${BASEDIR}/system.conf" \
&> \
/dev/null
printf \
'\033[2J\033[H'
username='-'
USERNAME='-'
while [[ "${username}" == '-' ]] || [[ -z "${username}" ]] || [[ "${username}" = *' '* ]] || [[ "${username}" = *[A-Z]* ]]; do
while [[ "${USERNAME}" == '-' ]] || [[ -z "${USERNAME}" ]] || [[ "${USERNAME}" = *' '* ]] || [[ "${USERNAME}" = *[A-Z]* ]]; do
printf \
'\nEnter a name for the new user account (lowercase, no spaces):\n'
read \
-r \
username
USERNAME
if [[ "${username}" = *' '* ]] || [[ "${username}" = *[A-Z]* ]]; then
if [[ "${USERNAME}" = *' '* ]] || [[ "${USERNAME}" = *[A-Z]* ]]; then
printf \
'ERROR:\tNo spaces or uppercase letters in the username!\n'
fi
done
printf \
"username=\"${username}\"\n" | \
"USERNAME=\"${USERNAME}\"\n" | \
tee \
--append \
"${baseDir}/system.conf" \
"${BASEDIR}/system.conf" \
&> \
/dev/null
@@ -206,9 +206,9 @@ printf \
printf \
'\nEnable SWAP?\n'
select option in 'yes' 'no'
select OPTION in 'yes' 'no'
do
case "${option}" in
case "${OPTION}" in
'yes'|'no')
break
;;
@@ -220,10 +220,10 @@ do
done
printf \
"enableSwap=\"${option}\"\n" | \
"ENABLE_SWAP=\"${OPTION}\"\n" | \
tee \
--append \
"${baseDir}/system.conf" \
"${BASEDIR}/system.conf" \
&> \
/dev/null
@@ -232,9 +232,9 @@ printf \
printf \
'\nEnable encryption?\n'
select option in 'yes' 'no'
select OPTION in 'yes' 'no'
do
case "${option}" in
case "${OPTION}" in
'yes'|'no')
break
;;
@@ -246,10 +246,10 @@ do
done
printf \
"encryption=\"${option}\"\n" | \
"ENCRYPTION=\"${OPTION}\"\n" | \
tee \
--append \
"${baseDir}/system.conf" \
"${BASEDIR}/system.conf" \
&> \
/dev/null
@@ -258,7 +258,7 @@ printf \
cat << EOF
Configuration stored in '${baseDir}/system.conf'
Configuration stored in '${BASEDIR}/system.conf'
Press any key to return to the main menu
EOF

View File

@@ -1,89 +0,0 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
source \
/etc/os-release
source \
"${baseDir}/system.conf"
if [[ "${1}" == '--mmdebstrap' ]]; then
packages=(\
console-setup \
cryptsetup \
curl \
dosfstools \
dpkg-dev \
efibootmgr \
ethtool \
firmware-{ast,atheros,bnx{2,2x},brcm80211,iwlwifi,libertas,linux,realtek,zd1211} \
flatpak \
keyboard-configuration \
linux-{headers,image}-amd64 \
locales \
nano \
network-manager \
openssh-{client,server} \
popularity-contest \
printer-driver-all \
systemd-timesyncd \
tasksel \
zfs-initramfs \
zstd\
)
include="--include=${packages[0]}"
for ((i=1;i<${#packages[@]};i++)); do
include+=" --include=${packages[${i}]}"
done
mmdebstrap \
--skip=check/empty \
--components=main,non-free-firmware,contrib \
--mode=root \
--format=directory \
${include} \
"${VERSION_CODENAME}" \
/mnt
elif [[ "${1}" == '--network-interfaces' ]]; then
networkInterface=($(ip -br addr show | sed 's| .*$||g' | grep -v '^lo' | grep -v 'tailscale' | grep -v '^wg'))
shopt -s extglob
for ((i = 0; i < ${#networkInterface[@]}; i++)); do
cat << EOF | tee /mnt/etc/network/interfaces.d/${networkInterface[$i]} &> /dev/null
allow-hotplug ${networkInterface[$i]}
iface ${networkInterface[$i]} inet dhcp
EOF
done
elif [[ "${1}" == '--sources' ]]; then
cat << EOF | tee /mnt/etc/apt/sources.list.d/${VERSION_CODENAME}.sources &> /dev/null
# ${VERSION_CODENAME^}
Enabled: yes
Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: ${VERSION_CODENAME}
Components: main non-free-firmware contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
# ${VERSION_CODENAME^} Security
Enabled: yes
Types: deb deb-src
URIs: http://deb.debian.org/debian-security/
Suites: ${VERSION_CODENAME}-security
Components: main non-free-firmware contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
# ${VERSION_CODENAME^} Updates
Enabled: yes
Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: ${VERSION_CODENAME}-updates
Components: main non-free-firmware contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
rm /mnt/etc/apt/sources.list
fi

61
efi.sh
View File

@@ -1,61 +0,0 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(basename "${0}")")"
source \
"${baseDir}/system.conf"
mkdir \
-p \
/boot/efi/EFI/ZBM
mkdir \
-p \
/boot/efi/EFI/BOOT
curl \
--progress-bar \
--show-error \
--output \
/boot/efi/EFI/ZBM/VMLINUZ.EFI \
--location \
https://get.zfsbootmenu.org/efi
rsync \
-pogAXtlHrDx \
--stats \
--info=progress2 \
/boot/efi/EFI/ZBM/VMLINUZ.EFI \
/boot/efi/EFI/ZBM/VMLINUZ-BACKUP.EFI
rsync \
-pogAXtlHrDx \
--stats \
--info=progress2 \
/boot/efi/EFI/ZBM/VMLINUZ.EFI \
/boot/efi/EFI/BOOT/BOOTX64.EFI
rsync \
-pogAXtlHrDx \
--stats \
--info=progress2 \
/boot/efi/EFI/ZBM/VMLINUZ.EFI \
/boot/efi/EFI/BOOT/shellx64.efi
efibootmgr \
-c \
-d "${disk}" \
-p '1' \
-L 'ZFSBootMenu (Backup)' \
-l '\EFI\ZBM\VMLINUZ-BACKUP.EFI'
efibootmgr \
-c \
-d "${disk}" \
-p '1' \
-L 'ZFSBootMenu' \
-l '\EFI\ZBM\VMLINUZ.EFI'

View File

@@ -1,105 +0,0 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
source \
/etc/os-release
source \
"${baseDir}/system.conf"
if [[ "${1}" == '--mmdebstrap' ]]; then
packages=(\
console-setup \
cryptsetup \
curl \
dosfstools \
dpkg-dev \
efibootmgr \
ethtool \
flatpak \
keyboard-configuration \
linux-generic \
locales \
nano \
network-manager \
openssh-{client,server} \
popularity-contest \
zfs-initramfs \
zstd\
)
include="--include=${packages[0]}"
for ((i=1;i<${#packages[@]};i++)); do
include+=" --include=${packages[${i}]}"
done
mmdebstrap \
--skip=check/empty \
--components=main,restricted,universe,multiverse \
--mode=root \
--format=directory \
${include} \
"${UBUNTU_VERSION_CODENAME}" \
/mnt
elif [[ "${1}" == '--sources' ]]; then
cat <<EOF >/mnt/etc/apt/sources.list.d/${UBUNTU_VERSION_CODENAME}.sources
# ${UBUNTU_VERSION_CODENAME^}
Enabled: yes
Types: deb deb-src
URIs: http://archive.ubuntu.com/ubuntu/
Suites: ${UBUNTU_VERSION_CODENAME}
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# ${UBUNTU_VERSION_CODENAME^} Security
Enabled: yes
Types: deb deb-src
URIs: http://security.ubuntu.com/ubuntu/
Suites: ${UBUNTU_VERSION_CODENAME}-security
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
# ${UBUNTU_VERSION_CODENAME^} Updates
Enabled: yes
Types: deb deb-src
URIs: http://archive.ubuntu.com/ubuntu/
Suites: ${UBUNTU_VERSION_CODENAME}-updates
Components: main restricted universe multiverse
Signed-By: /usr/share/keyrings/ubuntu-archive-keyring.gpg
EOF
cat <<EOF >/mnt/etc/apt/sources.list.d/elementary.sources
Enabled: yes
Types: deb deb-src
URIs: https://ppa.launchpadcontent.net/elementary-os/stable/ubuntu
Suites: ${UBUNTU_VERSION_CODENAME}
Components: main
Signed-By: /etc/apt/trusted.gpg.d/elementary.key.asc
EOF
cat <<EOF >/mnt/etc/apt/sources.list.d/patches.sources
Enabled: yes
Types: deb deb-src
URIs: https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu
Suites: ${UBUNTU_VERSION_CODENAME}
Components: main
Signed-By: /etc/apt/trusted.gpg.d/patches.key.asc
EOF
rm /mnt/etc/apt/sources.list
elif [[ "${1}" == '--skel' ]]; then
rsync -pogAXtlHrDx \
/etc/skel \
/mnt/etc
elif [[ "${1}" == '--elementary' ]]; then
cp \
/etc/os-release \
/mnt/etc
cp \
/etc/apt/trusted.gpg.d/{elementary,patches}.key.asc \
/mnt/etc/apt/trusted.gpg.d/
fi

View File

@@ -1,36 +0,0 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
source \
/etc/os-release
source \
"${baseDir}/system.conf"
if [[ "${1}" == '--rsync' ]]; then
mkdir -p /run/install
if [[ "${VERSION_ID}" -lt '41' ]]; then
mount /dev/mapper/live-base /run/install
else
mount /dev/live-base /run/install
fi
rsync -pogAXtlHrDx \
--stats \
--exclude=/boot/efi/* \
--exclude=/etc/machine-id \
--info=progress2 \
/run/install/ /mnt
elif [[ "${1}" == '--resolv-conf' ]]; then
mv /mnt/etc/resolv.conf \
/mnt/etc/resolv.conf.orig
cp -L \
/etc/resolv.conf \
/mnt/etc
elif [[ "${1}" == '-3' ]]; then
#
fi

View File

@@ -1,7 +1,7 @@
#!/bin/bash
set -euo pipefail
baseDir="$(dirname "${0}" | sed "s|^\.|${PWD}|")"
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")"
printf \
'\033[?47l\012'
@@ -9,7 +9,7 @@ printf \
cat << EOF
#######################################
## ##
## $(cat "${baseDir}/title") Script ##
## $(cat "${BASEDIR}/title") Script ##
## ##
## Jean <jean@easthighnerd.net> ##
## ##
@@ -27,7 +27,7 @@ EOF
source \
/etc/os-release
source \
"${baseDir}/system.conf"
"${BASEDIR}/system.conf"
if [[ ! "${DISK}" == **/dev/disk/by-id/** ]]; then
if [[ "${DISK}" == **/dev/nvme** ]]; then
@@ -71,7 +71,47 @@ EOF
fi
fi
if [[ "${ID}" == 'fedora' ]]; then
if [[ "${ID}" == 'elementary' ]]; then
apt \
install \
--yes \
--no-install-recommends \
console-setup \
cryptsetup \
curl \
dpkg-dev \
efibootmgr \
ethtool \
flatpak \
keyboard-configuration \
linux-generic \
locales \
nano \
network-manager \
openssh-{client,server} \
popularity-contest
# elif [[ "${ID}" == 'debian' ]]; then
# apt \
# install \
# --yes \
# console-setup \
# cryptsetup \
# curl \
# dpkg-dev \
# efibootmgr \
# ethtool \
# firmware-{ast,atheros,bnx{2,2x},brcm80211,ipw2x00,iwlwifi,libertas,linux,realtek,zd1211} \
# flatpak \
# keyboard-configuration \
# linux-{headers,image}-amd64 \
# locales \
# nano \
# network-manager \
# openssh-{client,server} \
# popularity-contest \
# printer-driver-all \
# tasksel
elif [[ "${ID}" == 'fedora' ]]; then
if [[ "${VERSION_ID}" -lt '41' ]]; then
dnf \
config-manager \
@@ -128,6 +168,12 @@ EOF
tzdata \
keyboard-configuration \
console-setup
apt install \
--yes \
dosfstools \
systemd-timesyncd \
zfs-initramfs
fi
if [[ "${ID}" == 'debian' ]]; then
@@ -227,7 +273,47 @@ if [[ ! "${*}" = *--no-part* ]]; then
fi
if [[ ! "${*}" = *--no-part* ]]; then
"${baseDir}/efi.sh"
mkdir \
-p \
/boot/efi/EFI/ZBM
mkdir \
-p \
/boot/efi/EFI/BOOT
curl \
--progress-bar \
--show-error \
--output \
/boot/efi/EFI/ZBM/VMLINUZ.EFI \
--location \
https://get.zfsbootmenu.org/efi
cp \
/boot/efi/EFI/ZBM/VMLINUZ.EFI \
/boot/efi/EFI/ZBM/VMLINUZ-BACKUP.EFI
cp \
/boot/efi/EFI/ZBM/VMLINUZ.EFI \
/boot/efi/EFI/BOOT/BOOTX64.EFI
cp \
/boot/efi/EFI/ZBM/VMLINUZ.EFI \
/boot/efi/EFI/BOOT/shellx64.efi
efibootmgr \
-c \
-d "${DISK}" \
-p '1' \
-L 'ZFSBootMenu (Backup)' \
-l '\EFI\ZBM\VMLINUZ-BACKUP.EFI'
efibootmgr \
-c \
-d "${DISK}" \
-p '1' \
-L 'ZFSBootMenu' \
-l '\EFI\ZBM\VMLINUZ.EFI'
fi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
@@ -249,4 +335,4 @@ zfs \
snapshot \
${HOSTNAME,,}/ROOT/${ID}@install
"${baseDir}/post-inst.sh"
"${BASEDIR}/post-inst.sh"

View File

@@ -26,10 +26,10 @@ while [[ ! "${OPTION}" == 'Exit' ]]; do
#################
EOF
select OPTION in 'List' 'Configure' 'Pre Install' 'Install' 'WiFi Setup' 'Post Install' 'Finalize' 'Exit'
select OPTION in 'List' 'Configure' 'Partition' 'Install' 'WiFi Setup' 'Post Install' 'Finalize' 'Exit'
do
case "${OPTION}" in
'List'|'Configure'|'Pre Install'|'Install'|'WiFi Setup'|'Post Install'|'Finalize'|'Exit')
'List'|'Configure'|'Partition'|'Install'|'WiFi Setup'|'Post Install'|'Finalize'|'Exit')
break
;;
*)
@@ -44,8 +44,8 @@ EOF
"${BASEDIR}/list.sh"
elif [[ "${OPTION}" == 'Configure' ]]; then
"${BASEDIR}/configure.sh"
elif [[ "${OPTION}" == 'Pre Install' ]]; then
"${BASEDIR}/pre-inst.sh"
elif [[ "${OPTION}" == 'Partition' ]]; then
"${BASEDIR}/partition.sh"
elif [[ "${OPTION}" == 'Install' ]]; then
"${BASEDIR}/install.sh"
elif [[ "${OPTION}" == 'WiFi Setup' ]]; then

View File

@@ -3,6 +3,27 @@ set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")"
printf \
'\033[?47l\012'
cat << EOF
#######################################
## ##
## $(cat "${BASEDIR}/title") Script ##
## ##
## Jean <jean@easthighnerd.net> ##
## ##
#######################################
#################
## ##
## Partition ##
## ##
#################
EOF
source \
/etc/os-release
source \
@@ -18,45 +39,579 @@ else
PART3='-part3'
fi
if [[ "${ID}" == 'debian' ]]; then
if [[ ! "$(hostname)" == "debian-live" ]]; then
cat << EOF | tee /etc/apt/sources.list.d/contrib.sources 1> /dev/null
Enabled: yes
Types: deb
URIs: http://deb.debian.org/debian/
Suites: ${VERSION_CODENAME}
Components: contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
fi
fi
if [[ -f '/usr/bin/gsettings' ]]; then
gsettings \
set \
org.gnome.desktop.media-handling \
automount \
false
fi
if [[ "${ID}" == 'debian' ]]; then
apt \
update && \
apt \
install \
--yes \
mmdebstrap \
gdisk \
zfsutils-linux \
systemd-timesyncd
elif [[ "${ID}" == 'fedora' ]]; then
if [[ "${VERSION_ID}" -lt '41' ]]; then
dnf config-manager \
--disable \
updates
else
dnf config-manager \
setopt \
updates.enabled=0
fi
dnf install \
-y \
https://zfsonlinux.org/fedora/zfs-release-${ZOL_FEDORA_VER}$(rpm --eval "%{dist}").noarch.rpm
dnf install \
-y \
https://dl.fedoraproject.org/pub/fedora/linux/releases/${VERSION_ID}/Everything/x86_64/os/Packages/k/kernel-devel-$(uname -r).rpm
dnf install \
-y \
zfs \
gdisk
modprobe \
zfs
fi
timedatectl
if [[ ! "$(hostname)" == "debian-live" ]]; then
zgenhostid \
-f \
0x00bab10c
fi
swapoff \
--all
wipefs \
-a \
${DISK}
if [[ ! "${DISK_TYPE}" == 'HDD' ]]; then
blkdiscard \
-f \
if [[ ! "${*}" = *--no-part* ]]; then
wipefs \
-a \
${DISK}
fi
sgdisk \
--zap-all \
${DISK}
sgdisk \
-n1:0:+512M \
-t1:EF00 \
-c1:EFI \
${DISK}
if [[ "${ENABLE_SWAP}" == "yes" ]]; then
SWAP_SIZE="$(((($(vmstat -sS M | grep 'total memory' | sed 's/ M total memory//') / 1024) + 1) * 2))"
if [[ "${SWAP_SIZE#}" -gt '32' ]]; then
SWAP_SIZE='32'
if [[ ! "${DISK_TYPE}" == 'HDD' ]]; then
blkdiscard \
-f \
${DISK}
fi
sgdisk \
-n2:0:+${SWAP_SIZE}G \
-t2:BF02 \
-c2:swap \
--zap-all \
${DISK}
sgdisk \
-n1:0:+512M \
-t1:EF00 \
-c1:EFI \
${DISK}
if [[ "${ENABLE_SWAP}" == "yes" ]]; then
SWAP_SIZE="$(((($(vmstat -sS M | grep 'total memory' | sed 's/ M total memory//') / 1024) + 1) * 2))"
sgdisk \
-n2:0:+${SWAP_SIZE}G \
-t2:BF02 \
-c2:swap \
${DISK}
fi
sgdisk \
-n3:0:0 \
-t3:BF00 \
-c3:${ID} \
${DISK}
sleep 5
if [[ "${ENCRYPTION}" == 'yes' ]]; then
ZPOOL_PASSWORD='A'
ZPOOL_PASSWORD_VERIFY='B'
printf \
'\033[?47h\033[2J\033[H'
while [[ ! "${ZPOOL_PASSWORD}" == "${ZPOOL_PASSWORD_VERIFY}" ]] || [[ -z "${ZPOOL_PASSWORD}" ]] || [[ "${#ZPOOL_PASSWORD}" -lt '8' ]]; do
printf \
"\nEnter a password to encrypt your root pool (minimum 8 characters):\n"
read \
-r \
-s \
ZPOOL_PASSWORD
printf \
"\nVerify the password to encrypt your root pool:\n"
read \
-r \
-s \
ZPOOL_PASSWORD_VERIFY
if [[ ! "${ZPOOL_PASSWORD}" == "${ZPOOL_PASSWORD_VERIFY}" ]]; then
printf \
"ERROR:\tPasswords do not match!\n"
elif [[ -z "${ZPOOL_PASSWORD}" ]]; then
printf \
"ERROR:\tPassword is empty!\n"
elif [[ "${#ZPOOL_PASSWORD}" -lt '8' ]]; then
printf \
"ERROR:\tPassword is too short!\n"
fi
done
printf \
'\033[?47l'
mkdir \
-p \
/etc/zfs/keys/
printf \
"${ZPOOL_PASSWORD}\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
zfs create \
-o canmount=off \
-o mountpoint=none \
${HOSTNAME,,}/ROOT
else
zpool import \
-N \
-R \
/mnt \
${HOSTNAME,,}
zfs load-key \
-r \
-L prompt \
${HOSTNAME,,}
fi
sgdisk \
-n3:0:0 \
-t3:BF00 \
-c3:${ID} \
${DISK}
zfs create \
-o canmount=noauto \
-o mountpoint=/ \
${HOSTNAME,,}/ROOT/${ID}
zfs mount \
${HOSTNAME,,}/ROOT/${ID}
if [[ ! "${*}" = *--no-part* ]]; then
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,,}
else
zfs mount \
${HOSTNAME,,}/home
zfs mount \
${HOSTNAME,,}/home/root
zfs mount \
${HOSTNAME,,}/var/log
zfs mount \
${HOSTNAME,,}/var/spool
zfs mount \
${HOSTNAME,,}/var/cache
zfs mount \
${HOSTNAME,,}/var/lib/nfs
zfs mount \
${HOSTNAME,,}/var/tmp
zfs mount \
${HOSTNAME,,}/srv
zfs mount \
${HOSTNAME,,}/usr/local
zfs mount \
${HOSTNAME,,}/var/games
zfs mount \
${HOSTNAME,,}/var/lib/AccountsService
zfs mount \
${HOSTNAME,,}/var/lib/NetworkManager
zfs mount \
${HOSTNAME,,}/var/www
zfs mount \
${HOSTNAME,,}/keystore
fi
if [[ "${ID}" == 'fedora' ]]; then
mkdir -p /run/install
if [[ "${VERSION_ID}" -lt '41' ]]; then
mount /dev/mapper/live-base /run/install
else
mount /dev/live-base /run/install
fi
rsync -pogAXtlHrDx \
--stats \
--exclude=/boot/efi/* \
--exclude=/etc/machine-id \
--info=progress2 \
/run/install/ /mnt
fi
if [[ ! "${*}" = *--no-part* ]]; then
zfs create \
${HOSTNAME,,}/var/mail
chmod \
1777 \
/mnt/tmp
else
zfs mount \
${HOSTNAME,,}/var/mail
fi
mkdir \
-p \
/mnt/run
mount \
-t \
tmpfs \
tmpfs \
/mnt/run
mkdir \
-p \
/mnt/run/lock
if [[ "${ID}" == 'elementary' ]]; then
mmdebstrap \
--include='' \
"${UBUNTU_VERSION_CODENAME}" \
/mnt
elif [[ "${ID}" == 'debian' ]]; then
mmdebstrap \
--skip=check/empty \
--components=main,non-free-firmware,contrib \
--mode=root \
--format=directory \
--include=console-setup \
--include=cryptsetup \
--include=curl \
--include=dpkg-dev \
--include=efibootmgr \
--include=ethtool \
--include=firmware-{ast,atheros,bnx{2,2x},brcm80211,iwlwifi,libertas,linux,realtek,zd1211} \
--include=flatpak \
--include=keyboard-configuration \
--include=linux-{headers,image}-amd64 \
--include=locales \
--include=nano \
--include=network-manager \
--include=openssh-{client,server} \
--include=popularity-contest \
--include=printer-driver-all \
--include=tasksel \
"${VERSION_CODENAME}" \
/mnt
fi
printf \
"${HOSTNAME}\n" | tee /mnt/etc/hostname &> /dev/null
printf \
"127.0.1.1\t${HOSTNAME}\n" | tee --append /mnt/etc/hosts &> /dev/null
if [[ "${ID}" == 'debian' ]]; then
NETWORK_INTERFACE=($(ip -br addr show | sed 's| .*$||g' | grep -v '^lo' | grep -v 'tailscale' | grep -v '^wg'))
shopt -s extglob
for ((i = 0; i < ${#NETWORK_INTERFACE[@]}; i++)); do
cat << EOF | tee /mnt/etc/network/interfaces.d/${NETWORK_INTERFACE[$i]} &> /dev/null
allow-hotplug ${NETWORK_INTERFACE[$i]}
iface ${NETWORK_INTERFACE[$i]} inet dhcp
EOF
done
fi
if [[ "${ID}" == 'elementary' ]]; then
cat <<EOF >/mnt/etc/apt/sources.list
deb http://archive.ubuntu.com/ubuntu/ ${UBUNTU_VERSION_CODENAME} main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ ${UBUNTU_VERSION_CODENAME} main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ ${UBUNTU_VERSION_CODENAME}-security main restricted universe multiverse
deb-src http://security.ubuntu.com/ubuntu/ ${UBUNTU_VERSION_CODENAME}-security main restricted universe multiverse
deb http://archive.ubuntu.com/ubuntu/ ${UBUNTU_VERSION_CODENAME}-updates main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ ${UBUNTU_VERSION_CODENAME}-updates main restricted universe multiverse
EOF
cat <<EOF >/mnt/etc/apt/sources.list.d/elementary.list
deb https://ppa.launchpadcontent.net/elementary-os/stable/ubuntu ${UBUNTU_VERSION_CODENAME} main
deb-src https://ppa.launchpadcontent.net/elementary-os/stable/ubuntu ${UBUNTU_VERSION_CODENAME} main
EOF
cat <<EOF >/mnt/etc/apt/sources.list.d/patches.list
deb https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu ${UBUNTU_VERSION_CODENAME} main
deb-src https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu ${UBUNTU_VERSION_CODENAME} main
EOF
elif [[ "${ID}" == 'debian' ]]; then
cat << EOF | tee /mnt/etc/apt/sources.list.d/${VERSION_CODENAME}.sources &> /dev/null
# ${VERSION_CODENAME^}
Enabled: yes
Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: ${VERSION_CODENAME}
Components: main non-free-firmware contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
# ${VERSION_CODENAME^} Security
Enabled: yes
Types: deb deb-src
URIs: http://deb.debian.org/debian-security/
Suites: ${VERSION_CODENAME}-security
Components: main non-free-firmware contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
# ${VERSION_CODENAME^} Updates
Enabled: yes
Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: ${VERSION_CODENAME}-updates
Components: main non-free-firmware contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
fi
mount \
--rbind \
/dev \
/mnt/dev
mount \
--rbind \
/proc \
/mnt/proc
mount \
--rbind \
/sys \
/mnt/sys
cp \
/etc/hostid \
/mnt/etc/
if [[ "${ID}" == 'fedora' ]]; then
mv /mnt/etc/resolv.conf \
/mnt/etc/resolv.conf.orig
cp -L \
/etc/resolv.conf \
/mnt/etc
fi
rsync -pogAXtlHrDx \
"${BASEDIR}" \
/mnt
if [[ "${ID}" == 'elementary' ]]; then
rsync -pogAXtlHrDx \
/etc/skel \
/mnt/etc
fi
if [[ ! "${*}" = *--no-part* ]]; then
if [[ -f "/etc/zfs/keys/${HOSTNAME,,}.key" ]]; then
cp \
/etc/zfs/keys/${HOSTNAME,,}.key \
/mnt/etc/zfs/keys/
fi
fi
if [[ "${ID}" == 'elementary' ]]; then
cp \
/etc/os-release \
/mnt/etc
cp \
/etc/apt/trusted.gpg.d/{elementary,patches}.key.asc \
/mnt/etc/apt/trusted.gpg.d/
fi
printf \
"\nNow chrooting into /mnt...\n\n"
chroot \
/mnt \
bash \
--login
mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -I {} umount -Rlf {}
if [[ "${ID}" == 'fedora' ]]; then
umount \
-nR \
/mnt
fi
zpool \
export \
-a
printf \
'\033[?47h\033[2J\033[H'
cat <<EOF
Script has finished running
Please reboot your computer
Press any key to return to the main menu
EOF
read -srn 1

View File

@@ -88,10 +88,6 @@ EOF
audio,cdrom,dip,floppy,wheel,video,dialout \
${USERNAME}
else
if [[ -z "$(cat /etc/group | grep 'lpadmin')" ]]; then
groupadd --gid 108 lpadmin
fi
usermod \
-a \
-G \
@@ -115,9 +111,7 @@ Pin: release n=${UBUNTU_VERSION_CODENAME}-backports
Pin-Priority: -1
EOF
elif [[ "${ID}" == 'debian' ]]; then
cat << EOF | tee --append /etc/apt/sources.list.d/${VERSION_CODENAME}.sources &> /dev/null
# ${VERSION_CODENAME^} Backports
cat << EOF | tee /etc/apt/sources.list.d/backports.sources &> /dev/null
Enabled: yes
Types: deb deb-src
URIs: http://deb.debian.org/debian/
@@ -127,13 +121,9 @@ Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
cat << EOF | tee /etc/apt/preferences.d/backports.pref &> /dev/null
Package: *
Pin: release n=${VERSION_CODENAME}*
Pin-Priority: 990
Package: linux-*
Pin: release n=${VERSION_CODENAME}-backports
Pin-Priority: -1
Package: *
Pin: release n=${VERSION_CODENAME}*
Pin-Priority: 990
EOF
if [[ "${VERSION_CODENAME}" == 'bookworm' ]]; then
@@ -212,7 +202,7 @@ chown -R ${USERNAME}:${USERNAME} /home/${USERNAME}
sudo -u ${USERNAME} cp -a /etc/skel/. /home/${USERNAME}
if [[ ! -z "\$(find -P /home/${USERNAME}/ | grep '\.face')" ]]; then
if [[ ! -z "$(find -P /home/${USERNAME}/ | grep '\.face')" ]]; then
find -P /home/${USERNAME}/ | grep '\.face' | xargs -d '\n' -I {} rm {}
fi
@@ -237,11 +227,11 @@ EOF
if [[ "${ID}" == 'fedora' ]]; then
printf \
"@reboot\tsudo -u ${USERNAME} '${BASEDIR}/finalize.sh'\n@reboot\t/usr/bin/home-fix.sh\n" | \
'@reboot /usr/bin/home-fix.sh\n' | \
tee /var/spool/cron/root &> /dev/null
elif [[ "${ID}" == 'debian' ]]; then
printf \
"@reboot\tsudo -u ${USERNAME} '${BASEDIR}/finalize.sh'\n@reboot\t/usr/bin/home-fix.sh\n" | \
'@reboot /usr/bin/home-fix.sh\n' | \
tee /var/spool/cron/crontabs/root &> /dev/null
chown \
@@ -254,14 +244,6 @@ EOF
fi
fi
if [[ ! -f '/usr/bin/shutdown' ]]; then
ln -s /sbin/shutdown /usr/bin/shutdown
fi
if [[ ! -f '/usr/bin/reboot' ]]; then
ln -s /sbin/reboot /usr/bin/reboot
fi
zfs \
snapshot \
${HOSTNAME,,}/ROOT/${ID}@post-install
@@ -273,7 +255,7 @@ cat << EOF
Script has finished running
Please exit the chroot
Please reboot your computer
Press any key to return to the main menu
EOF

View File

@@ -1,222 +0,0 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
printf \
'\033[?47l\012'
cat << EOF
#######################################
## ##
## $(cat "${baseDir}/title") Script ##
## ##
## Jean <jean@easthighnerd.net> ##
## ##
#######################################
####################
## ##
## Pre ##
## Installation ##
## ##
####################
EOF
source \
/etc/os-release
source \
"${baseDir}/system.conf"
if [[ "${ID}" == 'debian' ]]; then
if [[ ! "$(hostname)" == "debian-live" ]]; then
cat << EOF | tee /etc/apt/sources.list.d/contrib.sources 1> /dev/null
Enabled: yes
Types: deb
URIs: http://deb.debian.org/debian/
Suites: ${VERSION_CODENAME}
Components: contrib
Signed-By: /usr/share/keyrings/debian-archive-keyring.gpg
EOF
fi
fi
if [[ -f '/usr/bin/gsettings' ]]; then
gsettings \
set \
org.gnome.desktop.media-handling \
automount \
false
fi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
apt \
update && \
apt \
install \
--yes \
mmdebstrap \
gdisk \
systemd-timesyncd \
whois \
zfsutils-linux
elif [[ "${ID}" == 'fedora' ]]; then
if [[ "${VERSION_ID}" -lt '41' ]]; then
dnf config-manager \
--disable \
updates
else
dnf config-manager \
setopt \
updates.enabled=0
fi
dnf install \
-y \
https://zfsonlinux.org/fedora/zfs-release-${zolFedoraVer}$(rpm --eval "%{dist}").noarch.rpm
dnf install \
-y \
https://dl.fedoraproject.org/pub/fedora/linux/releases/${VERSION_ID}/Everything/x86_64/os/Packages/k/kernel-devel-$(uname -r).rpm
dnf install \
-y \
zfs \
gdisk
modprobe \
zfs
fi
timedatectl
if [[ ! "$(hostname)" == "debian-live" ]]; then
zgenhostid \
-f \
0x00bab10c
fi
"${baseDir}/partition.sh"
sleep 5
"${baseDir}/zfs.sh"
mkdir \
-p \
/mnt/run
mount \
-t \
tmpfs \
tmpfs \
/mnt/run
mkdir \
-p \
/mnt/run/lock
if [[ "${ID}" == 'elementary' ]]; then
"${baseDir}/elementary.sh" --mmdebstrap
elif [[ "${ID}" == 'debian' ]]; then
"${baseDir}/debian.sh" --mmdebstrap
elif [[ "${ID}" == 'fedora' ]]; then
"${baseDir}/fedora.sh" --rsync
fi
printf \
"${hostname}\n" | tee /mnt/etc/hostname &> /dev/null
printf \
"127.0.1.1\t${hostname}\n" | tee --append /mnt/etc/hosts &> /dev/null
if [[ "${ID}" == 'debian' ]]; then
"${baseDir}/debian.sh" --network-interfaces
fi
if [[ "${ID}" == 'elementary' ]]; then
"${baseDir}/elementary.sh" --sources
elif [[ "${ID}" == 'debian' ]]; then
"${baseDir}/debian.sh" --sources
fi
mount \
--rbind \
/dev \
/mnt/dev
mount \
--rbind \
/proc \
/mnt/proc
mount \
--rbind \
/sys \
/mnt/sys
cp \
/etc/hostid \
/mnt/etc/
if [[ "${ID}" == 'fedora' ]]; then
"${baseDir}/fedora.sh" --resolv-conf
fi
rsync -pogAXtlHrDx \
"${baseDir}" \
/mnt
if [[ "${ID}" == 'elementary' ]]; then
"${baseDir}/elementary.sh" --skel
fi
# if [[ ! "${*}" = *--no-part* ]]; then
if [[ -f "/etc/zfs/keys/${hostname,,}.key" ]]; then
cp \
/etc/zfs/keys/${hostname,,}.key \
/mnt/etc/zfs/keys/
fi
# fi
if [[ "${ID}" == 'elementary' ]]; then
"${baseDir}/elementary.sh" --elementary
fi
printf \
"\nNow chrooting into /mnt...\n\n"
chroot \
/mnt \
"$(printf "${baseDir}\n" | sed 's|.*\/|\/|')/install.sh"
mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -I {} umount -Rlf {}
if [[ "${ID}" == 'fedora' ]]; then
umount \
-nR \
/mnt
fi
zpool \
export \
-a
printf \
'\033[?47h\033[2J\033[H'
cat <<EOF
Script has finished running
Please reboot your computer
Press any key to return to the main menu
EOF
read -srn 1

274
zfs.sh
View File

@@ -1,274 +0,0 @@
#!/bin/bash
set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")"
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 [[ ! "${*}" = *--no-part* ]]; then
if [[ "${ENCRYPTION}" == 'yes' ]]; then
ZPOOL_PASSWORD='A'
ZPOOL_PASSWORD_VERIFY='B'
printf \
'\033[?47h\033[2J\033[H'
while [[ ! "${ZPOOL_PASSWORD}" == "${ZPOOL_PASSWORD_VERIFY}" ]] || [[ -z "${ZPOOL_PASSWORD}" ]] || [[ "${#ZPOOL_PASSWORD}" -lt '8' ]]; do
printf \
"\nEnter a password to encrypt your root pool (minimum 8 characters):\n"
read \
-r \
-s \
ZPOOL_PASSWORD
printf \
"\nVerify the password to encrypt your root pool:\n"
read \
-r \
-s \
ZPOOL_PASSWORD_VERIFY
if [[ ! "${ZPOOL_PASSWORD}" == "${ZPOOL_PASSWORD_VERIFY}" ]]; then
printf \
"ERROR:\tPasswords do not match!\n"
elif [[ -z "${ZPOOL_PASSWORD}" ]]; then
printf \
"ERROR:\tPassword is empty!\n"
elif [[ "${#ZPOOL_PASSWORD}" -lt '8' ]]; then
printf \
"ERROR:\tPassword is too short!\n"
fi
done
printf \
'\033[?47l'
mkdir \
-p \
/etc/zfs/keys/
printf \
"${ZPOOL_PASSWORD}\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
zfs create \
-o canmount=off \
-o mountpoint=none \
${HOSTNAME,,}/ROOT
# else
# zpool import \
# -N \
# -R \
# /mnt \
# ${HOSTNAME,,}
#
# zfs load-key \
# -r \
# -L prompt \
# ${HOSTNAME,,}
# fi
zfs create \
-o canmount=noauto \
-o mountpoint=/ \
${HOSTNAME,,}/ROOT/${ID}
zfs mount \
${HOSTNAME,,}/ROOT/${ID}
# if [[ ! "${*}" = *--no-part* ]]; then
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,,}
# else
# zfs mount \
# ${HOSTNAME,,}/home
#
# zfs mount \
# ${HOSTNAME,,}/home/root
#
# zfs mount \
# ${HOSTNAME,,}/var/log
#
# zfs mount \
# ${HOSTNAME,,}/var/spool
#
# zfs mount \
# ${HOSTNAME,,}/var/cache
#
# zfs mount \
# ${HOSTNAME,,}/var/lib/nfs
#
# zfs mount \
# ${HOSTNAME,,}/var/tmp
#
# zfs mount \
# ${HOSTNAME,,}/srv
#
# zfs mount \
# ${HOSTNAME,,}/usr/local
#
# zfs mount \
# ${HOSTNAME,,}/var/games
#
# zfs mount \
# ${HOSTNAME,,}/var/lib/AccountsService
#
# zfs mount \
# ${HOSTNAME,,}/var/lib/NetworkManager
#
# zfs mount \
# ${HOSTNAME,,}/var/www
#
# zfs mount \
# ${HOSTNAME,,}/keystore
# fi
if [[ "${ID}" == 'fedora' ]]; then
"${BASEDIR}/base-fedora.sh" -1
fi
# if [[ ! "${*}" = *--no-part* ]]; then
zfs create \
${HOSTNAME,,}/var/mail
chmod \
1777 \
/mnt/tmp
# else
# zfs mount \
# ${HOSTNAME,,}/var/mail
# fi