Add CLI options for mirroring
Includes slight refactor into functions
This commit is contained in:
parent
bda0e1c8c3
commit
2b07753419
11
LICENSE
11
LICENSE
@ -1,5 +1,12 @@
|
|||||||
Copyright (C) 2022 by Kris Lamoureux <kris@lamoureux.io>
|
Copyright (C) 2022 by Kris Lamoureux <kris@lamoureux.io>
|
||||||
|
|
||||||
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted.
|
Permission to use, copy, modify, and/or distribute this software for any
|
||||||
|
purpose with or without fee is hereby granted.
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
|
||||||
|
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
|
||||||
|
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
|
||||||
|
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
|
||||||
|
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
|
||||||
|
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
|
||||||
|
PERFORMANCE OF THIS SOFTWARE.
|
||||||
|
14
README.md
14
README.md
@ -21,11 +21,7 @@ Due to [licensing concerns with OpenZFS and Linux](https://openzfs.github.io/ope
|
|||||||
```
|
```
|
||||||
sudo cp output/debianzfs.qcow2 /var/lib/libvirt/images/
|
sudo cp output/debianzfs.qcow2 /var/lib/libvirt/images/
|
||||||
```
|
```
|
||||||
4. Grab auto-generated passwords from the log
|
4. Make a Libvirt VM and start
|
||||||
```
|
|
||||||
grep PW= debianzfs.log
|
|
||||||
```
|
|
||||||
5. Make a Libvirt VM and start
|
|
||||||
```
|
```
|
||||||
sudo virt-install --name debianzfs \
|
sudo virt-install --name debianzfs \
|
||||||
--description 'Debian ZFS' \
|
--description 'Debian ZFS' \
|
||||||
@ -37,19 +33,19 @@ Due to [licensing concerns with OpenZFS and Linux](https://openzfs.github.io/ope
|
|||||||
--graphics vnc,listen=127.0.0.1,port=5901 \
|
--graphics vnc,listen=127.0.0.1,port=5901 \
|
||||||
--boot uefi,loader=/usr/shar/OVMF/OVMF_CODE.fd
|
--boot uefi,loader=/usr/shar/OVMF/OVMF_CODE.fd
|
||||||
```
|
```
|
||||||
6. If dropped into UEFI shell
|
5. If dropped into UEFI shell
|
||||||
```
|
```
|
||||||
Shell> FS0:
|
Shell> FS0:
|
||||||
FS0:\> EFI\debian\grubx64.efi
|
FS0:\> EFI\debian\grubx64.efi
|
||||||
```
|
```
|
||||||
|
|
||||||
7. If dropped into initramfs
|
6. If dropped into initramfs
|
||||||
```
|
```
|
||||||
zpool import -f rpool
|
zpool import -f rpool
|
||||||
exit
|
exit
|
||||||
```
|
```
|
||||||
8. Enter rpool password
|
7. Enter rpool password: `letmeinzfs!`
|
||||||
9. Login with root's password
|
8. Login with root's password: `changeme`
|
||||||
|
|
||||||
### License
|
### License
|
||||||
- DebianZFS is licensed under 0BSD, a public domain equivalent license; see the `LICENSE` file for more information
|
- DebianZFS is licensed under 0BSD, a public domain equivalent license; see the `LICENSE` file for more information
|
@ -45,7 +45,7 @@ build {
|
|||||||
}
|
}
|
||||||
|
|
||||||
provisioner "shell" {
|
provisioner "shell" {
|
||||||
inline = ["sudo /tmp/debianzfs.sh /dev/vda"]
|
inline = ["sudo /tmp/debianzfs.sh -p changeme -P letmeinzfs! /dev/vda debianzfs"]
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
240
debianzfs.sh
Normal file → Executable file
240
debianzfs.sh
Normal file → Executable file
@ -3,62 +3,60 @@
|
|||||||
# Script is based off official guide: see "Debian Bullseye Root on ZFS"
|
# Script is based off official guide: see "Debian Bullseye Root on ZFS"
|
||||||
# https://openzfs.github.io/openzfs-docs/Getting%20Started/Debian/Debian%20Bullseye%20Root%20on%20ZFS.html
|
# https://openzfs.github.io/openzfs-docs/Getting%20Started/Debian/Debian%20Bullseye%20Root%20on%20ZFS.html
|
||||||
|
|
||||||
# Settings
|
#################
|
||||||
export DEBIAN_FRONTEND=noninteractive
|
### Functions ###
|
||||||
DISK=$1
|
#################
|
||||||
ZFSHOST=$2
|
function usage () {
|
||||||
[ -z "$ZFSHOST" ] && ZFSHOST="debianzfs"
|
echo "Usage: ./$(basename "$0") [-mpPr] <DISK> [hostname]"
|
||||||
CODENAME="bullseye"
|
}
|
||||||
ZFSROOT="/mnt"
|
|
||||||
|
|
||||||
# Display commands
|
function disk_check () {
|
||||||
set -x
|
DISK_TYPE=$(file "$1" | awk '{ print $2$3 }')
|
||||||
|
if [ "$DISK_TYPE" != "blockspecial" ]; then
|
||||||
|
echo "ERROR: Disk '$1' is not a block device"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
# Is the DISK path a block device?
|
function disk_status () {
|
||||||
DISK_TYPE=$(file "${DISK}" | awk '{ print $2$3 }')
|
OUTPUT=$(wipefs "$1")
|
||||||
if [ "$DISK_TYPE" != "blockspecial" ]; then
|
if [ -n "$OUTPUT" ]; then
|
||||||
echo "ERROR: Disk '${DISK}' is not a block device"
|
echo "ERROR: $1 is not empty"
|
||||||
exit 1;
|
echo "$OUTPUT"
|
||||||
fi
|
exit 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
###############################################
|
function password_prompt () {
|
||||||
### Step 1: Prepare The Install Environment ###
|
unset PASSWORD_PROMPT_RESULT
|
||||||
###############################################
|
while true; do
|
||||||
|
read -r -s -p "${1}: " password
|
||||||
|
echo ''
|
||||||
|
read -r -s -p "${1} (confirm): " password_confirm
|
||||||
|
echo ''
|
||||||
|
if [ "$password" == "$password_confirm" ]; then
|
||||||
|
if [ -z "$password" ]; then
|
||||||
|
echo "Password can not be empty, try again."
|
||||||
|
else
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "Passwords did not match, try again."
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
PASSWORD_PROMPT_RESULT="$password"
|
||||||
|
export PASSWORD_PROMPT_RESULT
|
||||||
|
}
|
||||||
|
|
||||||
# 1. Boot the Debian GNU/Linux Live CD... done
|
|
||||||
# 2. Setup and update the repositories
|
|
||||||
SOURCES_LIST="/etc/apt/sources.list"
|
|
||||||
[ -f "$SOURCES_LIST" ] && mv "$SOURCES_LIST" "$SOURCES_LIST.$(date +%s).bak"
|
|
||||||
echo "deb http://deb.debian.org/debian/ ${CODENAME} main contrib" > "$SOURCES_LIST"
|
|
||||||
apt-get update
|
|
||||||
|
|
||||||
# 3. Optional: Install and start the OpenSSH server in the Live CD environment... done
|
function disk_format () {
|
||||||
# 4. Disable automounting... skipping, no GUI-based automounting present
|
sgdisk -n2:1M:+512M -t2:EF00 "$1"
|
||||||
# 5. Become root... done
|
sgdisk -n3:0:+1G -t3:BF01 "$1"
|
||||||
# 6. Install ZFS in the Live CD environment (plus some tools)
|
sgdisk -n4:0:0 -t4:BF00 "$1"
|
||||||
apt-get install -y debootstrap gdisk pwgen zfsutils-linux
|
}
|
||||||
|
|
||||||
###############################
|
function create_boot_pool () {
|
||||||
### Step 2: Disk Formatting ###
|
zpool create -f \
|
||||||
###############################
|
|
||||||
|
|
||||||
# 1. Set a variable with the disk name
|
|
||||||
# 2. If you are re-using a disk, clear it as necessary... skipping: do this yourself :)
|
|
||||||
# Ensure swap partitions are not in use
|
|
||||||
swapoff --all
|
|
||||||
|
|
||||||
# 3. Partition your disk(s)
|
|
||||||
# Run this for UEFI booting (for use now or in the future)
|
|
||||||
sgdisk -n2:1M:+512M -t2:EF00 "$DISK"
|
|
||||||
|
|
||||||
# Run this for the boot pool
|
|
||||||
sgdisk -n3:0:+1G -t3:BF01 "$DISK"
|
|
||||||
|
|
||||||
# Unencrypted or ZFS native encryption
|
|
||||||
sgdisk -n4:0:0 -t4:BF00 "$DISK"
|
|
||||||
|
|
||||||
# 4. Create the boot pool
|
|
||||||
zpool create -f \
|
|
||||||
-o ashift=12 \
|
-o ashift=12 \
|
||||||
-o autotrim=on -d \
|
-o autotrim=on -d \
|
||||||
-o cachefile=/etc/zfs/zpool.cache \
|
-o cachefile=/etc/zfs/zpool.cache \
|
||||||
@ -80,14 +78,12 @@ zpool create -f \
|
|||||||
-O compression=lz4 \
|
-O compression=lz4 \
|
||||||
-O normalization=formD \
|
-O normalization=formD \
|
||||||
-O relatime=on \
|
-O relatime=on \
|
||||||
-O canmount=off -O mountpoint=/boot -R "$ZFSROOT" \
|
-O canmount=off -O mountpoint=/boot -R "$1" \
|
||||||
bpool "${DISK}3"
|
bpool "$2"
|
||||||
|
}
|
||||||
|
|
||||||
# 5. Create the root pool
|
function create_root_pool () {
|
||||||
# ZFS native encryption (with a random password)
|
echo "$3" | zpool create -f \
|
||||||
RPOOLPW="$(pwgen -s 16 1)"
|
|
||||||
echo "$RPOOLPW" | \
|
|
||||||
zpool create -f \
|
|
||||||
-o ashift=12 \
|
-o ashift=12 \
|
||||||
-o autotrim=on \
|
-o autotrim=on \
|
||||||
-O encryption=on -O keylocation=prompt -O keyformat=passphrase \
|
-O encryption=on -O keylocation=prompt -O keyformat=passphrase \
|
||||||
@ -95,9 +91,128 @@ zpool create -f \
|
|||||||
-O compression=lz4 \
|
-O compression=lz4 \
|
||||||
-O normalization=formD \
|
-O normalization=formD \
|
||||||
-O relatime=on \
|
-O relatime=on \
|
||||||
-O canmount=off -O mountpoint=/ -R "$ZFSROOT" \
|
-O canmount=off -O mountpoint=/ -R "$1" \
|
||||||
rpool "${DISK}4"
|
rpool "$2"
|
||||||
unset RPOOLPW
|
}
|
||||||
|
|
||||||
|
################
|
||||||
|
### Settings ###
|
||||||
|
################
|
||||||
|
# Static
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
CODENAME="bullseye"
|
||||||
|
|
||||||
|
# Options
|
||||||
|
while getopts ':m:p:P:r:' OPTION; do
|
||||||
|
case "$OPTION" in
|
||||||
|
m) MIRROR="$OPTARG";;
|
||||||
|
p) ROOTPW="$OPTARG";;
|
||||||
|
P) RPOOLPW="$OPTARG";;
|
||||||
|
r) ZFSROOT="$OPTARG";;
|
||||||
|
?)
|
||||||
|
usage
|
||||||
|
exit 1;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
shift "$((OPTIND -1))"
|
||||||
|
|
||||||
|
# Parameters
|
||||||
|
DISK=$1
|
||||||
|
ZFSHOST=$2
|
||||||
|
|
||||||
|
# Verify variables
|
||||||
|
[ -z "$ZFSROOT" ] && ZFSROOT="/mnt"
|
||||||
|
|
||||||
|
if [ -z "$DISK" ]; then
|
||||||
|
echo "ERROR: DISK not set"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$ZFSHOST" ]; then
|
||||||
|
echo "ERROR: HOSTNAME not set"
|
||||||
|
usage
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$ROOTPW" ]; then
|
||||||
|
password_prompt "Root Passphrase"
|
||||||
|
ROOTPW="$PASSWORD_PROMPT_RESULT"
|
||||||
|
unset PASSWORD_PROMPT_RESULT
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ -z "$RPOOLPW" ]; then
|
||||||
|
password_prompt "ZFS Encryption Passphrase"
|
||||||
|
RPOOLPW="$PASSWORD_PROMPT_RESULT"
|
||||||
|
unset PASSWORD_PROMPT_RESULT
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$DEBUG" == "true" ]; then
|
||||||
|
echo "CODENAME=${CODENAME}"
|
||||||
|
echo "DISK=${DISK}"
|
||||||
|
echo "ZFSHOST=${ZFSHOST}"
|
||||||
|
echo "ZFSROOT=${ZFSROOT}"
|
||||||
|
echo "MIRROR=${MIRROR}"
|
||||||
|
echo "ROOTPW=${ROOTPW}"
|
||||||
|
echo "RPOOLPW=${RPOOLPW}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Display commands
|
||||||
|
set -x
|
||||||
|
|
||||||
|
# Are the DISK paths block devices? AND
|
||||||
|
# Are the DISK pathes empty devices? i.e., no filesystem signatures
|
||||||
|
disk_check "$DISK"
|
||||||
|
disk_status "$DISK"
|
||||||
|
if [ -n "$MIRROR" ]; then
|
||||||
|
disk_check "$MIRROR"
|
||||||
|
disk_status "$MIRROR"
|
||||||
|
fi
|
||||||
|
|
||||||
|
###############################################
|
||||||
|
### Step 1: Prepare The Install Environment ###
|
||||||
|
###############################################
|
||||||
|
|
||||||
|
# 1. Boot the Debian GNU/Linux Live CD... done
|
||||||
|
# 2. Setup and update the repositories
|
||||||
|
SOURCES_LIST="/etc/apt/sources.list"
|
||||||
|
[ -f "$SOURCES_LIST" ] && mv "$SOURCES_LIST" "$SOURCES_LIST.$(date +%s).bak"
|
||||||
|
echo "deb http://deb.debian.org/debian/ ${CODENAME} main contrib" > "$SOURCES_LIST"
|
||||||
|
apt-get update
|
||||||
|
|
||||||
|
# 3. Optional: Install and start the OpenSSH server in the Live CD environment... done
|
||||||
|
# 4. Disable automounting... skipping, no GUI-based automounting present
|
||||||
|
# 5. Become root... done
|
||||||
|
# 6. Install ZFS in the Live CD environment (plus some tools)
|
||||||
|
apt-get install -y debootstrap gdisk zfsutils-linux
|
||||||
|
|
||||||
|
###############################
|
||||||
|
### Step 2: Disk Formatting ###
|
||||||
|
###############################
|
||||||
|
|
||||||
|
# 1. Set a variable with the disk name
|
||||||
|
# 2. If you are re-using a disk, clear it as necessary... skipping: do this yourself :)
|
||||||
|
# Ensure swap partitions are not in use
|
||||||
|
swapoff --all
|
||||||
|
|
||||||
|
# 3. Partition your disk(s)
|
||||||
|
# UEFI booting + boot pool + ZFS native encryption
|
||||||
|
disk_format "$DISK"
|
||||||
|
[ -n "$MIRROR" ] && disk_format "$MIRROR"
|
||||||
|
|
||||||
|
# 4. Create the boot pool
|
||||||
|
if [ -z "$MIRROR" ]; then
|
||||||
|
create_boot_pool "$ZFSROOT" "${DISK}3"
|
||||||
|
else
|
||||||
|
create_boot_pool "$ZFSROOT" "mirror ${DISK}3 ${MIRROR}3"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# 5. Create the root pool
|
||||||
|
if [ -z "$MIRROR" ]; then
|
||||||
|
create_root_pool "$ZFSROOT" "${DISK}4" "$RPOOLPW"
|
||||||
|
else
|
||||||
|
create_root_pool "$ZFSROOT" "mirror ${DISK}4 ${MIRROR}4" "$RPOOLPW"
|
||||||
|
fi
|
||||||
|
|
||||||
###################################
|
###################################
|
||||||
### Step 3: System Installation ###
|
### Step 3: System Installation ###
|
||||||
@ -185,8 +300,8 @@ deb-src http://deb.debian.org/debian ${CODENAME}-updates main contrib
|
|||||||
EOF
|
EOF
|
||||||
|
|
||||||
# 4. Bind the virtual filesystems from the LiveCD environment to the new system and chroot into it
|
# 4. Bind the virtual filesystems from the LiveCD environment to the new system and chroot into it
|
||||||
# Copy DISK var under ZFSROOT
|
# Copy DISK/MIRROR vars under ZFSROOT
|
||||||
echo "DISK=${DISK}" > "$ZFSROOT/var/tmp/zfsenv"
|
echo -e "DISK=${DISK}\nROOTPW=${ROOTPW}" > "$ZFSROOT/var/tmp/zfsenv"
|
||||||
|
|
||||||
# Bind
|
# Bind
|
||||||
mount --make-private --rbind /dev /mnt/dev
|
mount --make-private --rbind /dev /mnt/dev
|
||||||
@ -232,7 +347,6 @@ apt-get install -y grub-efi-amd64 shim-signed
|
|||||||
apt-get purge -y os-prober
|
apt-get purge -y os-prober
|
||||||
|
|
||||||
# 10. Set a root password
|
# 10. Set a root password
|
||||||
ROOTPW=$(pwgen 8 1)
|
|
||||||
echo "root:\$ROOTPW" | chpasswd
|
echo "root:\$ROOTPW" | chpasswd
|
||||||
unset ROOTPW
|
unset ROOTPW
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user