55 Commits

Author SHA1 Message Date
d186c475b0 Added boilerplate script to aide in creation of new scripts 2025-12-31 22:51:16 -05:00
90fefb094e Have apt update repositories before upgrading packages 2025-12-31 22:50:35 -05:00
dff8209e31 Added instalation of app indicator dropdown for Wing Panel 2025-12-31 22:49:59 -05:00
a4f6ea6f9c Specified exactly which version of Flatpaks were being installed to better automate their installation 2025-12-31 18:32:10 -05:00
86e9244590 Fixed '10-globally-managed-devices.conf' not being created under '/mnt' 2025-12-31 18:31:33 -05:00
e1b75419c9 Revert commit fd1a033 2025-12-31 16:43:20 -05:00
8347198afe Fixed bad mount command 2025-12-31 16:24:17 -05:00
5c3cd838a9 Changed how 'elementary-desktop' is installed due to not being to via mmdebstrap 2025-12-31 16:11:43 -05:00
9b90ca2273 Missing apps installed and 'gnome-software' and 'snapd' removed to bring custom installation in line with default 2025-12-31 16:00:46 -05:00
e952c663ad Installation of 'elementary-desktop' now handled by mmdebstrap 2025-12-31 15:59:33 -05:00
0b562b0ccf Made groups to add user to when not Fedora into a variable with an if statement to add 'netdev' to that list if the OS is Debian, due to elementaryOS not having the 'netdev' group 2025-12-31 15:25:03 -05:00
99f90d47c8 Added elementaryOS to have 'home-fix.sh' run on first boot like Debian 2025-12-31 15:23:43 -05:00
74f884f7a0 Added bits that should fix networking both in chroot and after install 2025-12-31 15:23:02 -05:00
fd1a033bd9 Changed cpoy operation to use rsync 2025-12-31 15:22:05 -05:00
44c7813b22 Added 'rsync' to packages to install via 'mmdebstrap' 2025-12-31 15:21:27 -05:00
13f87e00dd Updated variable names and casing 2025-12-24 18:55:43 -05:00
07caef3f2c Added needed bits to set 'baseDir' and source variables from 'system.conf' 2025-12-24 18:54:52 -05:00
7ea1035154 Updated commands used to set 'baseDir' variable 2025-12-24 18:54:12 -05:00
781a2a9143 Corrected commands to set 'baseDir' variable 2025-12-24 18:52:39 -05:00
79d53e948b Added 'rsync' to list of packages for 'mmdebstrap' to install 2025-12-24 18:52:10 -05:00
0609f35f91 Explicitly install 'linux-headers-generic' (bug 1091428) 2025-12-24 17:52:32 -05:00
db6c05fbe3 Properly configured 'zfs.sh' and 'partition.sh' to recognize flags for running different parts of the script 2025-12-24 17:31:17 -05:00
b6c2455aaa Updated variable names and casing 2025-12-24 17:26:01 -05:00
feb638b9f1 Added check to see if 'ID' = 'debian' before creating 'contrib.sources' due to elementaryOS sharing this porting of 'debian.sh' with Debian 2025-12-24 17:12:10 -05:00
4d223b8815 Added check to see if 'ID' = 'debian' before creating 'contrib.sources' due to elementaryOS sharing this porting of 'debian.sh' with Debian 2025-12-24 17:05:59 -05:00
a918ccf2e7 Make new shell scripts executable 2025-12-24 16:48:05 -05:00
568c80a05e Commented out (should be) depricated part of setup process 2025-12-24 16:38:08 -05:00
00fe875b44 Removed unneeded double check if 'ID' = 'fedora' 2025-12-24 16:37:13 -05:00
8414563171 Split off ZFS-relatesd tasks into 'zfs.sh' 2025-12-24 16:36:33 -05:00
30b3b58336 Split off creating/formatting EFI partition into 'partition.sh' 2025-12-24 16:35:53 -05:00
3e4eeb7d37 Split off more Fedora-related tasks into 'fedora.sh' 2025-12-24 16:34:29 -05:00
8305fa16cd Split off more Debian-related tasks into 'debian.sh' 2025-12-24 16:32:44 -05:00
16018759fb Split off rsyncing folder of scripts to seperate script 2025-12-24 16:29:35 -05:00
2028fa4396 Split off rbinding operations 2025-12-24 16:28:55 -05:00
637f5b69db Split off mtab related activities 2025-12-24 16:28:18 -05:00
3902f873e9 Split off creating tmpfs directories 2025-12-24 16:27:28 -05:00
8bca55e467 Split off setting hostname 2025-12-24 16:26:47 -05:00
377d56b1cd Split off copying of hostid file 2025-12-24 16:25:49 -05:00
9c8add89e5 Updated variable names and casing 2025-12-24 16:22:32 -05:00
648d07f355 Split off creating and setting up 'home-fix.sh' 2025-12-24 16:14:33 -05:00
f44f7464b9 Split chroot operation into seperate script 2025-12-24 16:12:47 -05:00
ec2d8148e0 Split chroot operation into seperate script 2025-12-24 16:11:14 -05:00
2139685f77 Renamed options from short numbered format (i.e. '-1', '-2') to long descriptive format (i.e. '--mmdebstrap', '--sources') 2025-11-05 19:34:58 -05:00
58231de76b Updated variable names from all caps to camel case 2025-11-05 19:34:05 -05:00
16bec76758 Changed how 'baseDir' is determined 2025-11-05 19:29:43 -05:00
6f99804427 Updated variable names from all caps to camel case 2025-11-05 18:57:25 -05:00
31b2c3579c Changed how 'baseDir' is determined 2025-11-05 18:56:44 -05:00
e35e7d6f59 Changed how 'baseDir' is determined 2025-11-05 18:47:33 -05:00
eb74132f81 Updated variable names from all caps to camel case 2025-11-05 17:53:26 -05:00
d80992da00 Renamed options from short numbered format (i.e. '-1', '-2') to long descriptive format (i.e. '--mmdebstrap', '--sources') 2025-11-05 14:36:12 -05:00
0b033e852c Move EFI related commands/tasks into dedicated script 2025-11-05 12:18:37 -05:00
82871fc03a Added items to checklist 2025-11-05 11:50:41 -05:00
33fdebcd19 Renamed 'mkfs.zfs.sh' to 'zfs.sh' 2025-11-05 11:32:17 -05:00
8fd8e139b1 Renamed 'base-' scripts to remove 'base-' from them 2025-11-05 11:26:45 -05:00
3acf1af161 Explain purpose of this branch and create initial checklist 2025-11-05 11:15:08 -05:00
28 changed files with 1091 additions and 1018 deletions

128
README.md
View File

@@ -1,118 +1,18 @@
# ZFSBootMenu Root Install # ZFSBootMenu Root Install
## Intro ## (Re)Design Document
Well howdy! 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.
Welcome to the ZFSBootMenu Root Install script! ## Checklist
[X] Rename all `base-` scripts to remove `base-`
This here script is designed to install (currently) either Debian or Fedora [ ] Move (at least almost) all Debian related commands and tasks to `debian.sh`
with OpenZFS as the root filesystem, and utilize ZFSBootMenu for actually [ ] Move (at least almost) all Fedora related commands and tasks to `fedora.sh`
getting the system up and running (as opposed to i.e. GRUB2 or systemd-bootd) [ ] 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`)
Some of the benefits of this setup include: [X] Move all EFI related commands and tasks to a new `efi.sh` script
- Having a reliable copy-on-write (CoW) filesystem [X] Rename `mkfs.zfs.sh` to `zfs.sh`
- Being able to easily create and rollback to snapshots from either the OS or ZFSBootMenu [ ] Point any distro-specific commands/tasks that are shared with Debian to use `debian.sh` to avoid any unnecessary duplication
- 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 [ ] Rewrite `README.md`
- 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.) [ ] 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}")`
## 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

@@ -1,89 +0,0 @@
#!/bin/bash
set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")"
source \
/etc/os-release
source \
"${BASEDIR}/system.conf"
if [[ "${1}" == '-1' ]]; 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}" == '-2' ]]; 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
elif [[ "${1}" == '-3' ]]; 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

View File

@@ -1,36 +0,0 @@
#!/bin/bash
set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")"
source \
/etc/os-release
source \
"${BASEDIR}/system.conf"
if [[ "${1}" == '-1' ]]; 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}" == '-2' ]]; then
mv /mnt/etc/resolv.conf \
/mnt/etc/resolv.conf.orig
cp -L \
/etc/resolv.conf \
/mnt/etc
elif [[ "${1}" == '-3' ]]; then
#
fi

22
boilerplate.sh Executable file
View File

@@ -0,0 +1,22 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
printf "Enter name of new script (without file extension):\n${baseDir}/"
read -r newScript
cat << EOF | tee "${baseDir}/${newScript}.sh" &> /dev/null
#!/bin/bash
set -euo pipefail
baseDir="\$(realpath "\$(dirname "\${0}")")"
source \\
/etc/os-release
source \\
"\${baseDir}/system.conf"
EOF
chmod +x "${baseDir}/${newScript}.sh"

17
chroot.sh Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
printf \
"\nNow chrooting into /mnt...\n\n"
if [[ "${*}" == *--continue* ]]; then
chroot \
/mnt \
"$(printf "${baseDir}\n" | sed 's|.*\/|\/|')/install.sh"
else
chroot \
/mnt
fi

View File

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

181
debian.sh Executable file
View File

@@ -0,0 +1,181 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
source \
/etc/os-release
source \
"${baseDir}/system.conf"
if [[ "${1}" == '--live' ]]; then
if [[ "${ID}" == 'debian' ]] && [[ ! "$(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
apt \
--update \
install \
--yes \
mmdebstrap \
gdisk \
linux-headers-generic \
systemd-timesyncd \
whois \
zfsutils-linux
elif [[ "${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 \
rsync \
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
elif [[ "${1}" == '--dpkg-reconfigure' ]]; then
cat << EOF
Regardless of the language(s) you choose, be sure to enable 'en_US.UTF-8'!
Press any key to continue...
EOF
read -srn 1
dpkg-reconfigure \
locales \
tzdata \
keyboard-configuration \
console-setup
elif [[ "${1}" == '--purge-os-prober' ]]; then
apt \
purge \
--yes \
os-prober
elif [[ "${1}" == '--network-manager' ]]; then
cp \
/etc/NetworkManager/NetworkManager.conf \
/etc/NetworkManager/NetworkManager.conf.orig
cat \
/etc/NetworkManager/NetworkManager.conf.orig | \
sed 's|managed=false|managed=true|' | \
tee /etc/NetworkManager/NetworkManager.conf &> /dev/null
elif [[ "${1}" == '--contrib' ]]; then
cat << EOF | tee --append /etc/apt/sources.list.d/${VERSION_CODENAME}.sources &> /dev/null
# ${VERSION_CODENAME^} Backports
Enabled: yes
Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: ${VERSION_CODENAME}-backports
Components: main non-free-firmware contrib
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
EOF
if [[ "${VERSION_CODENAME}" == 'bookworm' ]]; then
cat << EOF | tee --append /etc/apt/preferences.d/backports.pref &> /dev/null
Package: /wayland/
Pin: release n=${VERSION_CODENAME}-backports
Pin-Priority: -1
EOF
fi
elif [[ "${1}" == '--tasksel' ]]; then
if [[ ! -f /usr/bin/tasksel ]]; then
apt \
--update \
install \
--yes \
tasksel
fi
tasksel \
--new-install
fi

61
efi.sh Executable file
View File

@@ -0,0 +1,61 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${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,15 +1,15 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")" baseDir="$(realpath "$(dirname "${0}")")"
source \ source \
/etc/os-release /etc/os-release
source \ source \
"${BASEDIR}/system.conf" "${baseDir}/system.conf"
if [[ "${1}" == '-1' ]]; then if [[ "${1}" == '--mmdebstrap' ]]; then
packages=(\ packages=(\
console-setup \ console-setup \
cryptsetup \ cryptsetup \
@@ -26,6 +26,7 @@ nano \
network-manager \ network-manager \
openssh-{client,server} \ openssh-{client,server} \
popularity-contest \ popularity-contest \
rsync \
zfs-initramfs \ zfs-initramfs \
zstd\ zstd\
) )
@@ -44,7 +45,7 @@ zstd\
${include} \ ${include} \
"${UBUNTU_VERSION_CODENAME}" \ "${UBUNTU_VERSION_CODENAME}" \
/mnt /mnt
elif [[ "${1}" == '-2' ]]; then elif [[ "${1}" == '--sources' ]]; then
cat <<EOF >/mnt/etc/apt/sources.list.d/${UBUNTU_VERSION_CODENAME}.sources cat <<EOF >/mnt/etc/apt/sources.list.d/${UBUNTU_VERSION_CODENAME}.sources
# ${UBUNTU_VERSION_CODENAME^} # ${UBUNTU_VERSION_CODENAME^}
Enabled: yes Enabled: yes
@@ -90,11 +91,11 @@ Signed-By: /etc/apt/trusted.gpg.d/patches.key.asc
EOF EOF
rm /mnt/etc/apt/sources.list rm /mnt/etc/apt/sources.list
elif [[ "${1}" == '-3' ]]; then elif [[ "${1}" == '--skel' ]]; then
rsync -pogAXtlHrDx \ rsync -pogAXtlHrDx \
/etc/skel \ /etc/skel \
/mnt/etc /mnt/etc
elif [[ "${1}" == '-4' ]]; then elif [[ "${1}" == '--elementary' ]]; then
cp \ cp \
/etc/os-release \ /etc/os-release \
/mnt/etc /mnt/etc
@@ -102,4 +103,54 @@ elif [[ "${1}" == '-4' ]]; then
cp \ cp \
/etc/apt/trusted.gpg.d/{elementary,patches}.key.asc \ /etc/apt/trusted.gpg.d/{elementary,patches}.key.asc \
/mnt/etc/apt/trusted.gpg.d/ /mnt/etc/apt/trusted.gpg.d/
elif [[ "${1}" == '--network' ]]; then
mkdir \
-p \
/mnt/run/systemd/resolve/
mount \
--bind \
/run/systemd/resolve/ \
/mnt/run/systemd/resolve/
touch \
/mnt/etc/NetworkManager/conf.d/10-globally-managed-devices.conf
elif [[ "${1}" == '--apps' ]]; then
app=(\
io.elementary.calculator \
io.elementary.camera \
io.elementary.capnet-assist \
io.elementary.maps \
io.elementary.music \
io.elementary.screenshot \
io.elementary.videos \
org.gnome.Epiphany \
org.gnome.Evince \
org.gnome.FileRoller \
org.gnome.font-viewer\
)
apps="app/${app[0]}/x86_64/stable"
for ((i=1;i<${#app[@]};i++)); do
apps+=" app/${app[${i}]}/x86_64/stable"
done
flatpak \
install \
appcenter \
-y \
${apps}
elif [[ "${1}" == '--purge' ]]; then
apt \
purge \
--yes \
--autoremove \
gnome-software \
snapd
elif [[ "${1}" == '--desktop' ]]; then
apt \
install \
--yes \
elementary-desktop
fi fi

62
fedora.sh Executable file
View File

@@ -0,0 +1,62 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
source \
/etc/os-release
source \
"${baseDir}/system.conf"
if [[ "${1}" == '--live' ]]; 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
elif [[ "${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

@@ -2,7 +2,7 @@
set -euo pipefail set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")" baseDir="$(realpath "$(dirname "${0}")")"
printf '\033[?47l\012' printf '\033[?47l\012'

59
home-fix-setup.sh Executable file
View File

@@ -0,0 +1,59 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
source \
/etc/os-release
source \
"${baseDir}/system.conf"
cat << EOF | tee /usr/bin/home-fix.sh &> /dev/null
#!/bin/bash
set -euo pipefail
chown -R ${username}:${username} /home/${username}
sudo -u ${username} cp -a /etc/skel/. /home/${username}
if [[ ! -z "\$(find -P /home/${username}/ | grep '\.face')" ]]; then
find -P /home/${username}/ | grep '\.face' | xargs -d '\n' -I {} rm {}
fi
if [[ ! -z "\$(find -P /var/spool/cron | grep 'root')" ]]; then
rm \$(find -P /var/spool/cron | grep 'root')
fi
printf "\$(date +%Y-%m-%d\ %H:%M:%S) I did the thing\n" | tee /var/log/home-fix.log &> /dev/null
if [[ -f '/usr/bin/home-fix.sh' ]]; then
rm /usr/bin/home-fix.sh
fi
zfs snapshot ${hostname,,}/ROOT/${ID}@home-fix
zfs snapshot -r ${hostname,,}/home/${username}@home-fix
EOF
chmod \
+x \
/usr/bin/home-fix.sh
if [[ "${ID}" == 'fedora' ]]; then
printf \
"@reboot\tsudo -u ${username} '${baseDir}/finalize.sh'\n@reboot\t/usr/bin/home-fix.sh\n" | \
tee /var/spool/cron/root &> /dev/null
elif [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
printf \
"@reboot\tsudo -u ${username} '${baseDir}/finalize.sh'\n@reboot\t/usr/bin/home-fix.sh\n" | \
tee /var/spool/cron/crontabs/root &> /dev/null
chown \
:crontab \
/var/spool/cron/crontabs/root
chmod \
0600 \
/var/spool/cron/crontabs/root
fi

7
host-id.sh Executable file
View File

@@ -0,0 +1,7 @@
#!/bin/bash
set -euo pipefail
cp \
/etc/hostid \
/mnt/etc/

15
hostname.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
source \
"${baseDir}/system.conf"
printf \
"${hostname}\n" | tee /mnt/etc/hostname &> /dev/null
printf \
"127.0.1.1\t${hostname}\n" | tee --append /mnt/etc/hosts &> /dev/null

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")" baseDir="$(dirname "${0}" | sed "s|^\.|${PWD}|")"
printf \ printf \
'\033[?47l\012' '\033[?47l\012'
@@ -9,7 +9,7 @@ printf \
cat << EOF cat << EOF
####################################### #######################################
## ## ## ##
## $(cat "${BASEDIR}/title") Script ## ## $(cat "${baseDir}/title") Script ##
## ## ## ##
## Jean <jean@easthighnerd.net> ## ## Jean <jean@easthighnerd.net> ##
## ## ## ##
@@ -27,26 +27,20 @@ EOF
source \ source \
/etc/os-release /etc/os-release
source \ source \
"${BASEDIR}/system.conf" "${baseDir}/system.conf"
if [[ ! "${DISK}" == **/dev/disk/by-id/** ]]; then if [[ ! "${disk}" == **/dev/disk/by-id/** ]]; then
if [[ "${DISK}" == **/dev/nvme** ]]; then if [[ "${disk}" == **/dev/nvme** ]]; then
PART1='p1' part2='p2'
PART2='p2'
else else
PART1='1' part2='2'
PART2='2'
fi fi
else else
PART1='-part1' part2='-part2'
PART2='-part2'
fi fi
if [[ ! -f "/etc/mtab" ]]; then if [[ ! -f "/etc/mtab" ]]; then
ln \ "${baseDir}/mtab.sh"
-s \
/proc/self/mounts \
/etc/mtab
fi fi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
@@ -55,12 +49,12 @@ if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
fi fi
if [[ "${ID}" == 'fedora' ]]; then if [[ "${ID}" == 'fedora' ]]; then
if [[ "${ENCRYPTION}" == 'yes' ]]; then if [[ "${encryption}" == 'yes' ]]; then
cat << EOF | tee /etc/dracut.conf.d/zol.conf &> /dev/null cat << EOF | tee /etc/dracut.conf.d/zol.conf &> /dev/null
nofsck="yes" nofsck="yes"
add_dracutmodules+=" zfs " add_dracutmodules+=" zfs "
omit_dracutmodules+=" btrfs " omit_dracutmodules+=" btrfs "
install_items+=" /etc/zfs/keys/${HOSTNAME,,}.key " install_items+=" /etc/zfs/keys/${hostname,,}.key "
EOF EOF
else else
cat <<EOF >/etc/dracut.conf.d/zol.conf cat <<EOF >/etc/dracut.conf.d/zol.conf
@@ -69,9 +63,7 @@ add_dracutmodules+=" zfs "
omit_dracutmodules+=" btrfs " omit_dracutmodules+=" btrfs "
EOF EOF
fi fi
fi
if [[ "${ID}" == 'fedora' ]]; then
if [[ "${VERSION_ID}" -lt '41' ]]; then if [[ "${VERSION_ID}" -lt '41' ]]; then
dnf \ dnf \
config-manager \ config-manager \
@@ -115,53 +107,29 @@ if [[ "${ID}" == 'fedora' ]]; then
fi fi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
cat << EOF "${baseDir}/debian.sh" --dpkg-reconfigure
Regardless of the language(s) you choose, be sure to enable 'en_US.UTF-8'!
Press any key to continue...
EOF
read -srn 1
dpkg-reconfigure \
locales \
tzdata \
keyboard-configuration \
console-setup
fi fi
if [[ "${ID}" == 'debian' ]]; then # if [[ "${ID}" == 'debian' ]]; then
printf \ # printf \
'REMAKE_INITRD=yes\n' | \ # 'REMAKE_INITRD=yes\n' | \
tee /etc/dkms/zfs.conf &> /dev/null # tee /etc/dkms/zfs.conf &> /dev/null
fi # fi
if [[ ! "${*}" = *--no-part* ]]; then if [[ ! "${*}" = *--no-part* ]]; then
mkdosfs \ "${baseDir}/partition.sh" --efi
-F 32 \
-s 1 \
-n EFI \
${DISK}${PART1}
fi fi
mkdir \
-p \
/boot/efi
printf \
"/dev/disk/by-uuid/$(blkid -s UUID -o value ${DISK}${PART1}) /boot/efi vfat defaults 0 0\n" | \
tee --append /etc/fstab &> /dev/null
sleep 5
mount \
/boot/efi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
apt \ "${baseDir}/debian.sh" --purge-os-prober
purge \ fi
--yes \
os-prober if [[ "${ID}" == 'elementary' ]]; then
"${baseDir}/elementary.sh" --desktop
"${baseDir}/elementary.sh" --purge
"${baseDir}/elementary.sh" --apps
fi fi
printf \ printf \
@@ -177,9 +145,9 @@ passwd
printf \ printf \
'\033[?47l' '\033[?47l'
if [[ "${ENABLE_SWAP}" == "yes" ]]; then if [[ "${enableSwap}" == "yes" ]]; then
printf \ printf \
"swap\t${DISK}${PART2}\t/dev/random\tswap,cipher=aes-xts-plain64,size=512\n" | \ "swap\t${disk}${part2}\t/dev/random\tswap,cipher=aes-xts-plain64,size=512\n" | \
tee /etc/crypttab &> /dev/null tee /etc/crypttab &> /dev/null
printf \ printf \
@@ -188,14 +156,7 @@ if [[ "${ENABLE_SWAP}" == "yes" ]]; then
fi fi
if [[ "${ID}" == 'debian' ]]; then if [[ "${ID}" == 'debian' ]]; then
cp \ "${baseDir}/debian.sh" --network-manager
/etc/NetworkManager/NetworkManager.conf \
/etc/NetworkManager/NetworkManager.conf.orig
cat \
/etc/NetworkManager/NetworkManager.conf.orig | \
sed 's|managed=false|managed=true|' | \
tee /etc/NetworkManager/NetworkManager.conf &> /dev/null
fi fi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
@@ -215,59 +176,19 @@ fi
zfs \ zfs \
set \ set \
org.zfsbootmenu:commandline='quiet splash rhgb noresume' \ org.zfsbootmenu:commandline='quiet splash rhgb noresume' \
${HOSTNAME,,}/ROOT/${ID} ${hostname,,}/ROOT/${ID}
if [[ ! "${*}" = *--no-part* ]]; then if [[ ! "${*}" = *--no-part* ]]; then
if [[ ! -z "$(zfs list | grep 'keystore')" ]]; then if [[ ! -z "$(zfs list | grep 'keystore')" ]]; then
zfs \ zfs \
set \ set \
org.zfsbootmenu:keysource=${HOSTNAME,,}/keystore \ org.zfsbootmenu:keysource=${hostname,,}/keystore \
${HOSTNAME,,} ${hostname,,}
fi fi
fi fi
if [[ ! "${*}" = *--no-part* ]]; then if [[ ! "${*}" = *--no-part* ]]; then
mkdir \ "${baseDir}/efi.sh"
-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 fi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
@@ -287,6 +208,6 @@ fi
zfs \ zfs \
snapshot \ snapshot \
${HOSTNAME,,}/ROOT/${ID}@install ${hostname,,}/ROOT/${ID}@install
"${BASEDIR}/post-inst.sh" "${baseDir}/post-inst.sh"

16
list.sh
View File

@@ -2,18 +2,18 @@
set -euo pipefail set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")" baseDir="$(realpath "$(dirname "${0}")")"
DISKS_BY_ID="$(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')" 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')" disks="$(lsblk -do name | grep -v 'loop' | grep -v 'sr' | grep -v 'zram' | grep -v 'NAME')"
NETWORK_INTERFACES="$(ip -br addr show | sed -e 's| .*$||g' | grep -v '^lo' | grep -v 'tailscale' | grep -v '^wg')" networkInterfaces="$(ip -br addr show | sed -e 's| .*$||g' | grep -v '^lo' | grep -v 'tailscale' | grep -v '^wg')"
cat << EOF cat << EOF
####################################### #######################################
## ## ## ##
## $(cat "${BASEDIR}/title") Script ## ## $(cat "${baseDir}/title") Script ##
## ## ## ##
## Jean <jean@easthighnerd.net> ## ## Jean <jean@easthighnerd.net> ##
## ## ## ##
@@ -34,13 +34,13 @@ EOF
cat << EOF cat << EOF
Available disks (/dev/disk/by-id/): Available disks (/dev/disk/by-id/):
${DISKS_BY_ID} ${disksById}
Available disks (/dev/): Available disks (/dev/):
${DISKS} ${disks}
Available network interfaces: Available network interfaces:
${NETWORK_INTERFACES} ${networkInterfaces}
Press any key to return to the main menu Press any key to return to the main menu

40
menu.sh
View File

@@ -2,17 +2,17 @@
set -euo pipefail set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")" baseDir="$(realpath "$(dirname "${0}")")"
OPTION='start' option='start'
while [[ ! "${OPTION}" == 'Exit' ]]; do while [[ ! "${option}" == 'Exit' ]]; do
printf '\033[?47h\033[2J\033[H' printf '\033[?47h\033[2J\033[H'
cat << EOF cat << EOF
####################################### #######################################
## ## ## ##
## $(cat "${BASEDIR}/title") Script ## ## $(cat "${baseDir}/title") Script ##
## ## ## ##
## Jean <jean@easthighnerd.net> ## ## Jean <jean@easthighnerd.net> ##
## ## ## ##
@@ -26,9 +26,9 @@ while [[ ! "${OPTION}" == 'Exit' ]]; do
################# #################
EOF EOF
select OPTION in 'List' 'Configure' 'Pre Install' 'Install' 'WiFi Setup' 'Post Install' 'Finalize' 'Exit' select option in 'List' 'Configure' 'Pre Install' 'Install' 'WiFi Setup' 'Post Install' 'Finalize' 'Exit'
do do
case "${OPTION}" in case "${option}" in
'List'|'Configure'|'Pre Install'|'Install'|'WiFi Setup'|'Post Install'|'Finalize'|'Exit') 'List'|'Configure'|'Pre Install'|'Install'|'WiFi Setup'|'Post Install'|'Finalize'|'Exit')
break break
;; ;;
@@ -40,20 +40,20 @@ EOF
printf '\033[2J\033[H' printf '\033[2J\033[H'
if [[ "${OPTION}" == 'List' ]]; then if [[ "${option}" == 'List' ]]; then
"${BASEDIR}/list.sh" "${baseDir}/list.sh"
elif [[ "${OPTION}" == 'Configure' ]]; then elif [[ "${option}" == 'Configure' ]]; then
"${BASEDIR}/configure.sh" "${baseDir}/configure.sh"
elif [[ "${OPTION}" == 'Pre Install' ]]; then elif [[ "${option}" == 'Pre Install' ]]; then
"${BASEDIR}/pre-inst.sh" "${baseDir}/pre-inst.sh"
elif [[ "${OPTION}" == 'Install' ]]; then elif [[ "${option}" == 'Install' ]]; then
"${BASEDIR}/install.sh" "${baseDir}/install.sh"
elif [[ "${OPTION}" == 'WiFi Setup' ]]; then elif [[ "${option}" == 'WiFi Setup' ]]; then
"${BASEDIR}/wifi.sh" "${baseDir}/wifi.sh"
elif [[ "${OPTION}" == 'Post Install' ]]; then elif [[ "${option}" == 'Post Install' ]]; then
"${BASEDIR}/post-inst.sh" "${baseDir}/post-inst.sh"
elif [[ "${OPTION}" == 'Finalize' ]]; then elif [[ "${option}" == 'Finalize' ]]; then
"${BASEDIR}/finalize.sh" "${baseDir}/finalize.sh"
fi fi
printf '\033[?47h\033[2J\033[H' printf '\033[?47h\033[2J\033[H'

17
mkdir-tmpfs.sh Executable file
View File

@@ -0,0 +1,17 @@
#!/bin/bash
set -euo pipefail
mkdir \
-p \
/mnt/run
mount \
-t \
tmpfs \
tmpfs \
/mnt/run
mkdir \
-p \
/mnt/run/lock

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

8
mtab.sh Executable file
View File

@@ -0,0 +1,8 @@
#!/bin/bash
set -euo pipefail
ln \
-s \
/proc/self/mounts \
/etc/mtab

37
namarupa.sh Executable file
View File

@@ -0,0 +1,37 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
source \
/etc/os-release
source \
"${baseDir}/system.conf"
curl \
--progress \
--location \
--remote-name \
--continue-at - \
--output-dir '/tmp' \
'https://github.com/lenemter/wingpanel-indicator-namarupa/raw/main/com.github.lenemter.wingpanel-indicator-namarupa.deb'
apt \
--update \
install \
--yes \
'/tmp/com.github.lenemter.wingpanel-indicator-namarupa.deb'
mkdir \
-p \
/home/${username}/.config/autostart
cp \
/etc/xdg/autostart/indicator-application.desktop \
/home/${username}/.config/autostart/
sed \
-i \
's/^OnlyShowIn.*/OnlyShowIn=Unity;GNOME;Pantheon;/' \
/home/${username}/.config/autostart/indicator-application.desktop

View File

@@ -1,21 +1,23 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")" baseDir="$(realpath "$(dirname "${0}")")"
source \ source \
/etc/os-release /etc/os-release
source \ source \
"${BASEDIR}/system.conf" "${baseDir}/system.conf"
if [[ ! "${DISK}" == **/dev/disk/by-id/** ]]; then
if [[ "${DISK}" == **/dev/nvme** ]]; then if [[ "${1}" == '--disk' ]]; then
PART3='p3' if [[ ! "${disk}" == **/dev/disk/by-id/** ]]; then
if [[ "${disk}" == **/dev/nvme** ]]; then
part3='p3'
else else
PART3='3' part3='3'
fi fi
else else
PART3='-part3' part3='-part3'
fi fi
swapoff \ swapoff \
@@ -23,40 +25,70 @@ swapoff \
wipefs \ wipefs \
-a \ -a \
${DISK} ${disk}
if [[ ! "${DISK_TYPE}" == 'HDD' ]]; then if [[ ! "${diskType}" == 'HDD' ]]; then
blkdiscard \ blkdiscard \
-f \ -f \
${DISK} ${disk}
fi fi
sgdisk \ sgdisk \
--zap-all \ --zap-all \
${DISK} ${disk}
sgdisk \ sgdisk \
-n1:0:+512M \ -n1:0:+512M \
-t1:EF00 \ -t1:EF00 \
-c1:EFI \ -c1:EFI \
${DISK} ${disk}
if [[ "${ENABLE_SWAP}" == "yes" ]]; then if [[ "${enableSwap}" == "yes" ]]; then
SWAP_SIZE="$(((($(vmstat -sS M | grep 'total memory' | sed 's/ M total memory//') / 1024) + 1) * 2))" swapSize="$(((($(vmstat -sS M | grep 'total memory' | sed 's/ M total memory//') / 1024) + 1) * 2))"
if [[ "${SWAP_SIZE#}" -gt '32' ]]; then if [[ "${swapSize#}" -gt '32' ]]; then
SWAP_SIZE='32' swapSize='32'
fi fi
sgdisk \ sgdisk \
-n2:0:+${SWAP_SIZE}G \ -n2:0:+${swapSize}G \
-t2:BF02 \ -t2:BF02 \
-c2:swap \ -c2:swap \
${DISK} ${disk}
fi fi
sgdisk \ sgdisk \
-n3:0:0 \ -n3:0:0 \
-t3:BF00 \ -t3:BF00 \
-c3:${ID} \ -c3:${ID} \
${DISK} ${disk}
elif [[ "${1}" == '--efi' ]]; then
if [[ ! "${disk}" == **/dev/disk/by-id/** ]]; then
if [[ "${disk}" == **/dev/nvme** ]]; then
part1='p1'
else
part1='1'
fi
else
part1='-part1'
fi
mkdosfs \
-F 32 \
-s 1 \
-n EFI \
${disk}${part1}
mkdir \
-p \
/boot/efi
printf \
"/dev/disk/by-uuid/$(blkid -s UUID -o value ${disk}${part1}) /boot/efi vfat defaults 0 0\n" | \
tee --append /etc/fstab &> /dev/null
sleep 5
mount \
/boot/efi
fi

View File

@@ -2,7 +2,12 @@
set -euo pipefail set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")" baseDir="$(realpath "$(dirname "${0}")")"
source \
/etc/os-release
source \
"${baseDir}/system.conf"
printf \ printf \
@@ -11,7 +16,7 @@ printf \
cat << EOF cat << EOF
####################################### #######################################
## ## ## ##
## $(cat "${BASEDIR}/title") Script ## ## $(cat "${baseDir}/title") Script ##
## ## ## ##
## Jean <jean@easthighnerd.net> ## ## Jean <jean@easthighnerd.net> ##
## ## ## ##
@@ -32,41 +37,41 @@ source \
/etc/os-release /etc/os-release
source \ source \
"${BASEDIR}/system.conf" "${baseDir}/system.conf"
if [[ ! "${*}" = *--no-part* ]]; then # if [[ ! "${*}" = *--no-part* ]]; then
zfs create\ zfs create\
${HOSTNAME,,}/home/${USERNAME} ${hostname,,}/home/${username}
zfs create\ zfs create\
${HOSTNAME,,}/home/${USERNAME}/.config ${hostname,,}/home/${username}/.config
zfs create\ zfs create\
-o canmount=off\ -o canmount=off\
${HOSTNAME,,}/home/${USERNAME}/.var ${hostname,,}/home/${username}/.var
zfs create\ zfs create\
${HOSTNAME,,}/home/${USERNAME}/.var/app ${hostname,,}/home/${username}/.var/app
zfs create\ zfs create\
-o canmount=off\ -o canmount=off\
${HOSTNAME,,}/home/${USERNAME}/.local ${hostname,,}/home/${username}/.local
zfs create\ zfs create\
-o canmount=off\ -o canmount=off\
${HOSTNAME,,}/home/${USERNAME}/.local/share ${hostname,,}/home/${username}/.local/share
zfs create\ zfs create\
${HOSTNAME,,}/home/${USERNAME}/.local/share/flatpak ${hostname,,}/home/${username}/.local/share/flatpak
printf \ printf \
'Adding user account...\n' 'Adding user account...\n'
adduser ${USERNAME} adduser ${username}
else # else
adduser --no-create-home ${USERNAME} # adduser --no-create-home ${username}
fi # fi
if [[ "${ID}" == 'fedora' ]]; then if [[ "${ID}" == 'fedora' ]]; then
printf \ printf \
@@ -77,7 +82,7 @@ if [[ "${ID}" == 'fedora' ]]; then
Enter a password for the new user account: Enter a password for the new user account:
EOF EOF
passwd \ passwd \
${USERNAME} ${username}
printf \ printf \
'\033[?47l' '\033[?47l'
@@ -86,88 +91,40 @@ EOF
-a \ -a \
-G \ -G \
audio,cdrom,dip,floppy,wheel,video,dialout \ audio,cdrom,dip,floppy,wheel,video,dialout \
${USERNAME} ${username}
else else
if [[ -z "$(cat /etc/group | grep 'lpadmin')" ]]; then if [[ -z "$(cat /etc/group | grep 'lpadmin')" ]]; then
groupadd --gid 108 lpadmin groupadd --gid 108 lpadmin
fi fi
groups='audio,cdrom,dip,floppy,plugdev,sudo,video,dialout,lpadmin'
if [[ "${ID}" == 'debian' ]]; then
groups+=',netdev'
fi
usermod \ usermod \
-a \ -a \
-G \ -G \
audio,cdrom,dip,floppy,netdev,plugdev,sudo,video,dialout,lpadmin \ ${groups} \
${USERNAME} ${username}
fi fi
if [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'elementary' ]]; then
cat << EOF > /etc/apt/sources.list.d/backports.list "${baseDir}/namarupa.sh"
deb http://archive.ubuntu.com/ubuntu/ ${UBUNTU_VERSION_CODENAME}-backports main restricted universe multiverse
deb-src http://archive.ubuntu.com/ubuntu/ ${UBUNTU_VERSION_CODENAME}-backports main restricted universe multiverse
EOF
cat << EOF > /etc/apt/preferences.d/backports.pref
Package: *
Pin: release n=${UBUNTU_VERSION_CODENAME}*
Pin-Priority: 990
Package: linux* /wayland/
Pin: release n=${UBUNTU_VERSION_CODENAME}-backports
Pin-Priority: -1
EOF
elif [[ "${ID}" == 'debian' ]]; then elif [[ "${ID}" == 'debian' ]]; then
cat << EOF | tee --append /etc/apt/sources.list.d/${VERSION_CODENAME}.sources &> /dev/null "${baseDir}/debian.sh" --contrib
# ${VERSION_CODENAME^} Backports
Enabled: yes
Types: deb deb-src
URIs: http://deb.debian.org/debian/
Suites: ${VERSION_CODENAME}-backports
Components: main non-free-firmware contrib
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
EOF
if [[ "${VERSION_CODENAME}" == 'bookworm' ]]; then
cat << EOF | tee --append /etc/apt/preferences.d/backports.pref &> /dev/null
Package: /wayland/
Pin: release n=${VERSION_CODENAME}-backports
Pin-Priority: -1
EOF
fi
fi fi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
apt \ apt \
--update \
dist-upgrade \ dist-upgrade \
--yes --yes
fi fi
if [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" = 'debian' ]]; then
apt \ "${baseDir}/debian.sh" --tasksel
install \
--yes \
--autoremove \
elementary-desktop
elif [[ "${ID}" = 'debian' ]]; then
if [[ ! -f /usr/bin/tasksel ]]; then
apt \
install \
--yes \
tasksel
fi
tasksel \
--new-install
fi fi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
@@ -203,56 +160,9 @@ EOF
tee /etc/apt/apt.conf.d/99-apt_moo &> /dev/null tee /etc/apt/apt.conf.d/99-apt_moo &> /dev/null
fi fi
if [[ ! "${*}" = *--no-part* ]]; then # if [[ ! "${*}" = *--no-part* ]]; then
cat << EOF | tee /usr/bin/home-fix.sh &> /dev/null "${baseDir}/home-fix-setup.sh"
#!/bin/bash # fi
set -euo pipefail
chown -R ${USERNAME}:${USERNAME} /home/${USERNAME}
sudo -u ${USERNAME} cp -a /etc/skel/. /home/${USERNAME}
if [[ ! -z "\$(find -P /home/${USERNAME}/ | grep '\.face')" ]]; then
find -P /home/${USERNAME}/ | grep '\.face' | xargs -d '\n' -I {} rm {}
fi
if [[ ! -z "\$(find -P /var/spool/cron | grep 'root')" ]]; then
rm \$(find -P /var/spool/cron | grep 'root')
fi
printf "\$(date +%Y-%m-%d\ %H:%M:%S) I did the thing\n" | tee /var/log/home-fix.log &> /dev/null
if [[ -f '/usr/bin/home-fix.sh' ]]; then
rm /usr/bin/home-fix.sh
fi
zfs snapshot ${HOSTNAME,,}/ROOT/${ID}@home-fix
zfs snapshot -r ${HOSTNAME,,}/home/${USERNAME}@home-fix
EOF
chmod \
+x \
/usr/bin/home-fix.sh
if [[ "${ID}" == 'fedora' ]]; then
printf \
"@reboot\tsudo -u ${USERNAME} '${BASEDIR}/finalize.sh'\n@reboot\t/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" | \
tee /var/spool/cron/crontabs/root &> /dev/null
chown \
:crontab \
/var/spool/cron/crontabs/root
chmod \
0600 \
/var/spool/cron/crontabs/root
fi
fi
if [[ ! -f '/usr/bin/shutdown' ]]; then if [[ ! -f '/usr/bin/shutdown' ]]; then
ln -s /sbin/shutdown /usr/bin/shutdown ln -s /sbin/shutdown /usr/bin/shutdown
@@ -264,7 +174,7 @@ fi
zfs \ zfs \
snapshot \ snapshot \
${HOSTNAME,,}/ROOT/${ID}@post-install ${hostname,,}/ROOT/${ID}@post-install
printf \ printf \
'\033[?47h\033[2J\033[H' '\033[?47h\033[2J\033[H'

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")" baseDir="$(realpath "$(dirname "${0}")")"
printf \ printf \
'\033[?47l\012' '\033[?47l\012'
@@ -9,7 +9,7 @@ printf \
cat << EOF cat << EOF
####################################### #######################################
## ## ## ##
## $(cat "${BASEDIR}/title") Script ## ## $(cat "${baseDir}/title") Script ##
## ## ## ##
## Jean <jean@easthighnerd.net> ## ## Jean <jean@easthighnerd.net> ##
## ## ## ##
@@ -28,21 +28,7 @@ EOF
source \ source \
/etc/os-release /etc/os-release
source \ source \
"${BASEDIR}/system.conf" "${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 if [[ -f '/usr/bin/gsettings' ]]; then
@@ -54,156 +40,77 @@ if [[ -f '/usr/bin/gsettings' ]]; then
fi fi
if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'debian' ]] || [[ "${ID}" == 'elementary' ]]; then
apt \ "${baseDir}/debian.sh" --live
update && \
apt \
install \
--yes \
mmdebstrap \
gdisk \
systemd-timesyncd \
whois \
zfsutils-linux
elif [[ "${ID}" == 'fedora' ]]; then elif [[ "${ID}" == 'fedora' ]]; then
if [[ "${VERSION_ID}" -lt '41' ]]; then "${baseDir}/fedora.sh" --live
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 fi
timedatectl timedatectl
if [[ ! "$(hostname)" == "debian-live" ]]; then if [[ ! "$(hostname)" == "debian-live" ]]; then
zgenhostid \ "${baseDir}/zfs.sh" --host-id
-f \
0x00bab10c
fi fi
"${BASEDIR}/partition.sh" "${baseDir}/partition.sh" --disk
sleep 5 sleep 5
"${BASEDIR}/mkfs.zfs.sh" "${baseDir}/zfs.sh" --format
mkdir \ "${baseDir}/zfs.sh" --create
-p \
/mnt/run
mount \ "${baseDir}/mkdir-tmpfs.sh"
-t \
tmpfs \
tmpfs \
/mnt/run
mkdir \
-p \
/mnt/run/lock
if [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'elementary' ]]; then
"${BASEDIR}/base-elementary.sh" -1 "${baseDir}/elementary.sh" --mmdebstrap
elif [[ "${ID}" == 'debian' ]]; then elif [[ "${ID}" == 'debian' ]]; then
"${BASEDIR}/base-debian.sh" -1 "${baseDir}/debian.sh" --mmdebstrap
elif [[ "${ID}" == 'fedora' ]]; then
"${baseDir}/fedora.sh" --rsync
fi fi
printf \ "${baseDir}/hostname.sh"
"${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 if [[ "${ID}" == 'debian' ]]; then
"${BASEDIR}/base-debian.sh" -2 "${baseDir}/debian.sh" --network-interfaces
elif [[ "${ID}" == 'elementary' ]]; then
"${baseDir}/elementary.sh" --network
fi fi
if [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'elementary' ]]; then
"${BASEDIR}/base-elementary.sh" -2 "${baseDir}/elementary.sh" --sources
elif [[ "${ID}" == 'debian' ]]; then elif [[ "${ID}" == 'debian' ]]; then
"${BASEDIR}/base-debian.sh" -3 "${baseDir}/debian.sh" --sources
fi fi
mount \ "${baseDir}/rbind.sh"
--rbind \
/dev \
/mnt/dev
mount \ "${baseDir}/host-id.sh"
--rbind \
/proc \
/mnt/proc
mount \
--rbind \
/sys \
/mnt/sys
cp \
/etc/hostid \
/mnt/etc/
if [[ "${ID}" == 'fedora' ]]; then if [[ "${ID}" == 'fedora' ]]; then
"${BASEDIR}/base-fedora.sh" -2 "${baseDir}/fedora.sh" --resolv-conf
fi fi
rsync -pogAXtlHrDx \ "${baseDir}/rsync.sh"
"${BASEDIR}" \
/mnt
if [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'elementary' ]]; then
"${BASEDIR}/base-elementary.sh" -3 "${baseDir}/elementary.sh" --skel
fi fi
# if [[ ! "${*}" = *--no-part* ]]; then # if [[ ! "${*}" = *--no-part* ]]; then
if [[ -f "/etc/zfs/keys/${HOSTNAME,,}.key" ]]; then if [[ -f "/etc/zfs/keys/${hostname,,}.key" ]]; then
cp \ "${baseDir}/zfs.sh" --key
/etc/zfs/keys/${HOSTNAME,,}.key \
/mnt/etc/zfs/keys/
fi fi
# fi # fi
if [[ "${ID}" == 'elementary' ]]; then if [[ "${ID}" == 'elementary' ]]; then
"${BASEDIR}/base-elementary.sh" -4 "${baseDir}/elementary.sh" --elementary
fi fi
printf \ "${baseDir}/chroot.sh" --continue
"\nNow chrooting into /mnt...\n\n"
chroot \ "${baseDir}/zfs.sh" --unmount
/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 \ printf \
'\033[?47h\033[2J\033[H' '\033[?47h\033[2J\033[H'

18
rbind.sh Executable file
View File

@@ -0,0 +1,18 @@
#!/bin/bash
set -euo pipefail
mount \
--rbind \
/dev \
/mnt/dev
mount \
--rbind \
/proc \
/mnt/proc
mount \
--rbind \
/sys \
/mnt/sys

9
rsync.sh Executable file
View File

@@ -0,0 +1,9 @@
#!/bin/bash
set -euo pipefail
baseDir="$(realpath "$(dirname "${0}")")"
rsync -pogAXtlHrDx \
"${baseDir}" \
/mnt

View File

@@ -7,13 +7,13 @@ set -euo pipefail
# resolvectl status | grep 'Link' | sed -e 's|^.*(||g; s|).*||g' | while read -r INTERFACE; do resolvectl dns ${INTERFACE} 9.9.9.9; done && sleep 3 && nmcli device status | grep -v 'DEVICE' | grep -v 'lo' | sed -e 's| .*||g' | while read -r INTERFACE; do nmcli device disconnect ${INTERFACE}; sleep 1; nmcli device connect ${INTERFACE}; done # resolvectl status | grep 'Link' | sed -e 's|^.*(||g; s|).*||g' | while read -r INTERFACE; do resolvectl dns ${INTERFACE} 9.9.9.9; done && sleep 3 && nmcli device status | grep -v 'DEVICE' | grep -v 'lo' | sed -e 's| .*||g' | while read -r INTERFACE; do nmcli device disconnect ${INTERFACE}; sleep 1; nmcli device connect ${INTERFACE}; done
BASEDIR="$(dirname "${0}" | sed "s|^\.|${PWD}|")" baseDir="$(realpath "$(dirname "${0}")")"
cat << EOF cat << EOF
####################################### #######################################
## ## ## ##
## $(cat "${BASEDIR}/title") Script ## ## $(cat "${baseDir}/title") Script ##
## ## ## ##
## Jean <jean@easthighnerd.net> ## ## Jean <jean@easthighnerd.net> ##
## ## ## ##
@@ -37,7 +37,7 @@ nmcli device wifi list
printf "Enter the SSID of the WiFi network you wish to connect to:\n" printf "Enter the SSID of the WiFi network you wish to connect to:\n"
read -r WIFI_NAME read -r WIFI_NAME
nmcli --ask device wifi connect ${WIFI_NAME} nmcli --ask device wifi connect ${wifiName}
cat << EOF cat << EOF

238
zfs.sh Executable file
View File

@@ -0,0 +1,238 @@
#!/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 \
"\nEnter a password to encrypt your root pool (minimum 8 characters):\n"
read \
-r \
-s \
zpoolPassword
printf \
"\nVerify the password to encrypt your root pool:\n"
read \
-r \
-s \
zpoolPasswordVerify
if [[ ! "${zpoolPassword}" == "${zpoolPasswordVerify}" ]]; then
printf \
"ERROR:\tPasswords do not match!\n"
elif [[ -z "${zpoolPassword}" ]]; then
printf \
"ERROR:\tPassword is empty!\n"
elif [[ "${#zpoolPassword}" -lt '8' ]]; then
printf \
"ERROR:\tPassword is too short!\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/
elif [[ "${1}" == '--unmount' ]]; then
mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -I {} umount -Rlf {}
if [[ "${ID}" == 'fedora' ]]; then
umount \
-nR \
/mnt
fi
zpool \
export \
-a
elif [[ "${1}" == '--host-id' ]]; then
zgenhostid \
-f \
0x00bab10c
fi