17 Commits

Author SHA1 Message Date
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
e513fe2c60 Corrected name of patches.sources (was patches.list) 2025-10-14 15:56:50 -04:00
8a78dd7f96 Moved packages array into relavent if statement 2025-10-14 11:45:10 -04:00
bee95926b7 Moved packages array into relavent if statement 2025-10-14 11:43:46 -04:00
67763d1b39 Added swap size limit of 32 GiB 2025-10-14 11:39:01 -04:00
10 changed files with 192 additions and 267 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

@@ -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

View File

@@ -1,14 +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}" == '--mmdebstrap' ]]; then
packages=(\ packages=(\
console-setup \ console-setup \
cryptsetup \ cryptsetup \
@@ -33,14 +34,12 @@ zfs-initramfs \
zstd\ zstd\
) )
include="--include=${packages[0]}" include="--include=${packages[0]}"
for ((i=1;i<${#packages[@]};i++)); do for ((i=1;i<${#packages[@]};i++)); do
include+=" --include=${packages[${i}]}" include+=" --include=${packages[${i}]}"
done done
if [[ "${1}" == '-1' ]]; then
mmdebstrap \ mmdebstrap \
--skip=check/empty \ --skip=check/empty \
--components=main,non-free-firmware,contrib \ --components=main,non-free-firmware,contrib \
@@ -49,17 +48,17 @@ if [[ "${1}" == '-1' ]]; then
${include} \ ${include} \
"${VERSION_CODENAME}" \ "${VERSION_CODENAME}" \
/mnt /mnt
elif [[ "${1}" == '-2' ]]; then elif [[ "${1}" == '--network-interfaces' ]]; then
NETWORK_INTERFACE=($(ip -br addr show | sed 's| .*$||g' | grep -v '^lo' | grep -v 'tailscale' | grep -v '^wg')) networkInterface=($(ip -br addr show | sed 's| .*$||g' | grep -v '^lo' | grep -v 'tailscale' | grep -v '^wg'))
shopt -s extglob shopt -s extglob
for ((i = 0; i < ${#NETWORK_INTERFACE[@]}; i++)); do for ((i = 0; i < ${#networkInterface[@]}; i++)); do
cat << EOF | tee /mnt/etc/network/interfaces.d/${NETWORK_INTERFACE[$i]} &> /dev/null cat << EOF | tee /mnt/etc/network/interfaces.d/${networkInterface[$i]} &> /dev/null
allow-hotplug ${NETWORK_INTERFACE[$i]} allow-hotplug ${networkInterface[$i]}
iface ${NETWORK_INTERFACE[$i]} inet dhcp iface ${networkInterface[$i]} inet dhcp
EOF EOF
done done
elif [[ "${1}" == '-3' ]]; then elif [[ "${1}" == '--sources' ]]; then
cat << EOF | tee /mnt/etc/apt/sources.list.d/${VERSION_CODENAME}.sources &> /dev/null cat << EOF | tee /mnt/etc/apt/sources.list.d/${VERSION_CODENAME}.sources &> /dev/null
# ${VERSION_CODENAME^} # ${VERSION_CODENAME^}
Enabled: yes Enabled: yes

61
efi.sh Normal file
View File

@@ -0,0 +1,61 @@
#!/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,14 +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}" == '--mmdebstrap' ]]; then
packages=(\ packages=(\
console-setup \ console-setup \
cryptsetup \ cryptsetup \
@@ -29,14 +30,12 @@ zfs-initramfs \
zstd\ zstd\
) )
include="--include=${packages[0]}" include="--include=${packages[0]}"
for ((i=1;i<${#packages[@]};i++)); do for ((i=1;i<${#packages[@]};i++)); do
include+=" --include=${packages[${i}]}" include+=" --include=${packages[${i}]}"
done done
if [[ "${1}" == '-1' ]]; then
mmdebstrap \ mmdebstrap \
--skip=check/empty \ --skip=check/empty \
--components=main,restricted,universe,multiverse \ --components=main,restricted,universe,multiverse \
@@ -45,7 +44,7 @@ if [[ "${1}" == '-1' ]]; then
${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
@@ -81,7 +80,7 @@ Components: main
Signed-By: /etc/apt/trusted.gpg.d/elementary.key.asc Signed-By: /etc/apt/trusted.gpg.d/elementary.key.asc
EOF EOF
cat <<EOF >/mnt/etc/apt/sources.list.d/patches.list cat <<EOF >/mnt/etc/apt/sources.list.d/patches.sources
Enabled: yes Enabled: yes
Types: deb deb-src Types: deb deb-src
URIs: https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu URIs: https://ppa.launchpadcontent.net/elementary-os/os-patches/ubuntu
@@ -91,11 +90,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

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}" == '--rsync' ]]; then
mkdir -p /run/install mkdir -p /run/install
if [[ "${VERSION_ID}" -lt '41' ]]; then if [[ "${VERSION_ID}" -lt '41' ]]; then
@@ -24,7 +24,7 @@ if [[ "${1}" == '-1' ]]; then
--exclude=/etc/machine-id \ --exclude=/etc/machine-id \
--info=progress2 \ --info=progress2 \
/run/install/ /mnt /run/install/ /mnt
elif [[ "${1}" == '-2' ]]; then elif [[ "${1}" == '--resolv-conf' ]]; then
mv /mnt/etc/resolv.conf \ mv /mnt/etc/resolv.conf \
/mnt/etc/resolv.conf.orig /mnt/etc/resolv.conf.orig

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,7 +27,7 @@ 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
@@ -227,47 +227,7 @@ if [[ ! "${*}" = *--no-part* ]]; then
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
@@ -289,4 +249,4 @@ zfs \
snapshot \ snapshot \
${HOSTNAME,,}/ROOT/${ID}@install ${HOSTNAME,,}/ROOT/${ID}@install
"${BASEDIR}/post-inst.sh" "${baseDir}/post-inst.sh"

View File

@@ -44,6 +44,10 @@ sgdisk \
if [[ "${ENABLE_SWAP}" == "yes" ]]; then if [[ "${ENABLE_SWAP}" == "yes" ]]; then
SWAP_SIZE="$(((($(vmstat -sS M | grep 'total memory' | sed 's/ M total memory//') / 1024) + 1) * 2))" 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'
fi
sgdisk \ sgdisk \
-n2:0:+${SWAP_SIZE}G \ -n2:0:+${SWAP_SIZE}G \
-t2:BF02 \ -t2:BF02 \

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,7 +28,7 @@ EOF
source \ source \
/etc/os-release /etc/os-release
source \ source \
"${BASEDIR}/system.conf" "${baseDir}/system.conf"
if [[ "${ID}" == 'debian' ]]; then if [[ "${ID}" == 'debian' ]]; then
@@ -77,7 +77,7 @@ elif [[ "${ID}" == 'fedora' ]]; then
dnf install \ dnf install \
-y \ -y \
https://zfsonlinux.org/fedora/zfs-release-${ZOL_FEDORA_VER}$(rpm --eval "%{dist}").noarch.rpm https://zfsonlinux.org/fedora/zfs-release-${zolFedoraVer}$(rpm --eval "%{dist}").noarch.rpm
dnf install \ dnf install \
-y \ -y \
@@ -101,11 +101,11 @@ if [[ ! "$(hostname)" == "debian-live" ]]; then
fi fi
"${BASEDIR}/partition.sh" "${baseDir}/partition.sh"
sleep 5 sleep 5
"${BASEDIR}/mkfs.zfs.sh" "${baseDir}/zfs.sh"
mkdir \ mkdir \
-p \ -p \
@@ -122,25 +122,27 @@ mkdir \
/mnt/run/lock /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 \ printf \
"${HOSTNAME}\n" | tee /mnt/etc/hostname &> /dev/null "${hostname}\n" | tee /mnt/etc/hostname &> /dev/null
printf \ printf \
"127.0.1.1\t${HOSTNAME}\n" | tee --append /mnt/etc/hosts &> /dev/null "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
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 \ mount \
@@ -163,27 +165,27 @@ cp \
/mnt/etc/ /mnt/etc/
if [[ "${ID}" == 'fedora' ]]; then if [[ "${ID}" == 'fedora' ]]; then
"${BASEDIR}/base-fedora.sh" -2 "${baseDir}/fedora.sh" --resolv-conf
fi fi
rsync -pogAXtlHrDx \ rsync -pogAXtlHrDx \
"${BASEDIR}" \ "${baseDir}" \
/mnt /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 \ cp \
/etc/zfs/keys/${HOSTNAME,,}.key \ /etc/zfs/keys/${hostname,,}.key \
/mnt/etc/zfs/keys/ /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 \ printf \
@@ -191,7 +193,7 @@ printf \
chroot \ chroot \
/mnt \ /mnt \
"$(printf "${BASEDIR}\n" | sed 's|.*\/|\/|')/install.sh" "$(printf "${baseDir}\n" | sed 's|.*\/|\/|')/install.sh"
mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -I {} umount -Rlf {} mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -I {} umount -Rlf {}

View File