This commit is contained in:
2019-07-15 18:06:25 -07:00
parent 66a138da7d
commit 61516e4473
+477 -477
View File
@@ -1,487 +1,487 @@
#! /bin/bash #! /bin/bash
echo "" echo ""
echo "Updating local packages..." echo "Updating local packages..."
errors=`apt-add-repository universe >/dev/null 2>/dev/null && apt update 2>&1 >/dev/null` errors=`apt-add-repository universe >/dev/null 2>/dev/null && apt update 2>&1 >/dev/null`
if [ "$?" = "0" ]; then if [ "$?" = "0" ]; then
echo "Done." echo "Done."
else else
echo "Failed to add universal repository, update apt repository - $errors" echo "Failed to add universal repository, update apt repository - $errors"
exit 1 exit 1
fi fi
echo "" echo ""
echo "Installing required setup configuration utilities..." echo "Installing required setup configuration utilities..."
errors=$(apt install -y dialog net-tools gdisk zfs-initramfs debootstrap >/dev/null 2>/dev/null) errors=$(apt install -y dialog net-tools gdisk zfs-initramfs debootstrap >/dev/null 2>/dev/null)
if [ "$?" = "0" ]; then if [ "$?" = "0" ]; then
echo "Done." echo "Done."
else else
echo "Failed to install net-tools, gdisk, zfs-initramfs, or debootstrap - $errors" echo "Failed to install net-tools, gdisk, zfs-initramfs, or debootstrap - $errors"
exit 2 exit 2
fi fi
#calculate width and height of console #calculate width and height of console
width=`tput cols` width=`tput cols`
height=`tput lines` height=`tput lines`
window=$((height - 5)) window=$((height - 5))
# gather input at the start # gather input at the start
devices=""; for device in $(ls /dev/disk/by-id | grep -v part); do devices="$devices $device off"; done devices=""; for device in $(ls /dev/disk/by-id | grep -v part); do devices="$devices $device off"; done
disks=`dialog --separate-output --no-cancel --no-items --title "Root devices" --checklist "Select boot drives:" $height $width ${window}$devices 2>&1 1>/dev/tty` disks=`dialog --separate-output --no-cancel --no-items --title "Root devices" --checklist "Select boot drives:" $height $width ${window}$devices 2>&1 1>/dev/tty`
diskcount=`echo "$disks" | wc -l` diskcount=`echo "$disks" | wc -l`
diskoptions="12 35 5 raidz off raidz2 off raidz3 off mirror off none off" diskoptions="12 35 5 raidz off raidz2 off raidz3 off mirror off none off"
if [ "$diskcount" = "0" ] ; then echo "No disks found to use for boot device"; exit 112; fi if [ "$diskcount" = "0" ] ; then echo "No disks found to use for boot device"; exit 112; fi
if [ "$diskcount" = "1" ]; then diskoptions="8 35 1 none off"; fi if [ "$diskcount" = "1" ]; then diskoptions="8 35 1 none off"; fi
if [ "$diskcount" = "2" ]; then diskoptions="9 35 2 mirror off none off"; fi if [ "$diskcount" = "2" ]; then diskoptions="9 35 2 mirror off none off"; fi
if [ "$diskcount" = "3" ]; then diskoptions="10 35 3 raidz off mirror off none off"; fi if [ "$diskcount" = "3" ]; then diskoptions="10 35 3 raidz off mirror off none off"; fi
if [ "$diskcount" = "4" ]; then diskoptions="12 35 5 raidz off raidz2 off raidz3 off mirror off none off"; fi if [ "$diskcount" = "4" ]; then diskoptions="12 35 5 raidz off raidz2 off raidz3 off mirror off none off"; fi
if [ "$diskcount" = "5" ]; then diskoptions="12 35 5 raidz off raidz2 off raidz3 off mirror off none off"; fi if [ "$diskcount" = "5" ]; then diskoptions="12 35 5 raidz off raidz2 off raidz3 off mirror off none off"; fi
if [ "$diskcount" = "6" ]; then diskoptions="12 35 5 raidz off raidz2 off raidz3 off mirror off none off"; fi if [ "$diskcount" = "6" ]; then diskoptions="12 35 5 raidz off raidz2 off raidz3 off mirror off none off"; fi
if [ "$diskcount" -gt "6" ]; then diskoptions="11 35 4 raidz2 off raidz3 off mirror off none off"; fi if [ "$diskcount" -gt "6" ]; then diskoptions="11 35 4 raidz2 off raidz3 off mirror off none off"; fi
if [ "$diskcount" -gt "11" ]; then diskoptions="10 35 3 raidz3 off mirror off none off"; fi if [ "$diskcount" -gt "11" ]; then diskoptions="10 35 3 raidz3 off mirror off none off"; fi
raidtype=`dialog --no-items --no-cancel --title "Root pool ZFS RAID" --radiolist "Select root pool ZFS RAID type:" $diskoptions 2>&1 1>/dev/tty` raidtype=`dialog --no-items --no-cancel --title "Root pool ZFS RAID" --radiolist "Select root pool ZFS RAID type:" $diskoptions 2>&1 1>/dev/tty`
hostname=""; while [ -z "$hostname" ]; do hostname=`dialog --no-cancel --inputbox "Hostname:" 8 40 2>&1 >/dev/tty`; done hostname=""; while [ -z "$hostname" ]; do hostname=`dialog --no-cancel --inputbox "Hostname:" 8 40 2>&1 >/dev/tty`; done
nicdevices=""; for nic in $(ip -o link show | awk -F': ' '{print $2}' | grep -v '^lo'); do nicdevices="$nicdevices $nic off"; done nicdevices=""; for nic in $(ip -o link show | awk -F': ' '{print $2}' | grep -v '^lo'); do nicdevices="$nicdevices $nic off"; done
nics=`dialog --separate-output --no-cancel --no-items --title "Bridged network devices" --checklist "Select the network devices to be bridged to br0:" $height $width ${window}$nicdevices 2>&1 1>/dev/tty` nics=`dialog --separate-output --no-cancel --no-items --title "Bridged network devices" --checklist "Select the network devices to be bridged to br0:" $height $width ${window}$nicdevices 2>&1 1>/dev/tty`
admin=""; while [ -z "$admin" ]; do admin=`dialog --no-cancel --inputbox "Admin user:" 8 40 2>&1 >/dev/tty`; done admin=""; while [ -z "$admin" ]; do admin=`dialog --no-cancel --inputbox "Admin user:" 8 40 2>&1 >/dev/tty`; done
rootpassword="" rootpassword=""
while [ "$rootpassword" = "" ]; do while [ "$rootpassword" = "" ]; do
rootpassword=`dialog --no-cancel --title "Root password" --insecure --passwordbox "Enter root password:" 8 40 2>&1 1>/dev/tty` rootpassword=`dialog --no-cancel --title "Root password" --insecure --passwordbox "Enter root password:" 8 40 2>&1 1>/dev/tty`
confirmpassword=`dialog --no-cancel --title "Root password confirmation" --insecure --passwordbox "Re-enter root password:" 8 40 2>&1 1>/dev/tty` confirmpassword=`dialog --no-cancel --title "Root password confirmation" --insecure --passwordbox "Re-enter root password:" 8 40 2>&1 1>/dev/tty`
if ! [ "$rootpassword" = "$confirmpassword" ]; then if ! [ "$rootpassword" = "$confirmpassword" ]; then
echo "Password does not match confirmation - please retry the setup" echo "Password does not match confirmation - please retry the setup"
rootpassword="" rootpassword=""
fi fi
done done
admins=`dialog --no-items --no-cancel --title "Root pool ZFS RAID" --inputbox "List administrator e-mail addresses separated by comma:" 10 40 2>&1 1>/dev/tty` admins=`dialog --no-items --no-cancel --title "Root pool ZFS RAID" --inputbox "List administrator e-mail addresses separated by comma:" 10 40 2>&1 1>/dev/tty`
a=""; for x in `timedatectl list-timezones`; do a="$a $x" ; done a=""; for x in `timedatectl list-timezones`; do a="$a $x" ; done
timezone=`dialog --no-items --no-cancel --menu "Select time zone:" $height 40 ${window}${a} 2>&1 1>/dev/tty` timezone=`dialog --no-items --no-cancel --menu "Select time zone:" $height 40 ${window}${a} 2>&1 1>/dev/tty`
#timedatectl list-timezones #timedatectl list-timezones
#timezone=`dialog --no-cancel --title "Timezone" --inputbox "Time zone:" 8 40 "America/Los_Angeles" 2>&1 1>/dev/tty` #timezone=`dialog --no-cancel --title "Timezone" --inputbox "Time zone:" 8 40 "America/Los_Angeles" 2>&1 1>/dev/tty`
for disk in `echo "$disks"`; do for disk in `echo "$disks"`; do
echo "" echo ""
echo "Partitioning disk $disk..." echo "Partitioning disk $disk..."
errors=`sgdisk --zap-all /dev/disk/by-id/$disk 2>&1 1>/dev/null && sgdisk -n2:1M:+512M -t2:EF00 /dev/disk/by-id/$disk 2>&1 1>/dev/null && sgdisk -n3:0:+512M -t3:BF01 /dev/disk/by-id/$disk 2>&1 1>/dev/null && sgdisk -n4:0:0 -t4:BF01 /dev/disk/by-id/$disk 2>&1 1>/dev/null` errors=`sgdisk --zap-all /dev/disk/by-id/$disk 2>&1 1>/dev/null && sgdisk -n2:1M:+512M -t2:EF00 /dev/disk/by-id/$disk 2>&1 1>/dev/null && sgdisk -n3:0:+512M -t3:BF01 /dev/disk/by-id/$disk 2>&1 1>/dev/null && sgdisk -n4:0:0 -t4:BF01 /dev/disk/by-id/$disk 2>&1 1>/dev/null`
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
echo "Failed to partition disk $disk - $errors" echo "Failed to partition disk $disk - $errors"
exit 3 exit 3
fi fi
echo "Done." echo "Done."
done done
# create boot mirror list # create boot mirror list
bootmirror=""; rootraidz=""; for disk in `echo "$disks"`; do bootmirror="$bootmirror /dev/disk/by-id/${disk}-part3"; rootraidz="$rootraidz /dev/disk/by-id/${disk}-part4"; done bootmirror=""; rootraidz=""; for disk in `echo "$disks"`; do bootmirror="$bootmirror /dev/disk/by-id/${disk}-part3"; rootraidz="$rootraidz /dev/disk/by-id/${disk}-part4"; done
# refresh drives or there are missing partitions # refresh drives or there are missing partitions
partprobe 2>/dev/null 1>/dev/null partprobe 2>/dev/null 1>/dev/null
# wait for the partitions to show up # wait for the partitions to show up
for disk in `echo "$disks"`; do for disk in `echo "$disks"`; do
pending="0" pending="0"
while ! [ -e "/dev/disk/by-id/${disk}-part3" ]; do while ! [ -e "/dev/disk/by-id/${disk}-part3" ]; do
partprobe 2>/dev/null 1>/dev/null partprobe 2>/dev/null 1>/dev/null
if [ "$pending" = "0" ]; then echo "" && echo "Waiting for ${disk} partition 3 to update..."; pending="1"; fi if [ "$pending" = "0" ]; then echo "" && echo "Waiting for ${disk} partition 3 to update..."; pending="1"; fi
sleep 3 sleep 3
done done
if [ "$pending" = "1" ]; then echo "Done."; fi if [ "$pending" = "1" ]; then echo "Done."; fi
done done
echo "" echo ""
echo "Creating boot zpool..." echo "Creating boot zpool..."
errors=`zpool create -f -o ashift=12 -d -o feature@async_destroy=enabled -o feature@bookmarks=enabled -o feature@embedded_data=enabled -o feature@empty_bpobj=enabled -o feature@enabled_txg=enabled -o feature@extensible_dataset=enabled -o feature@filesystem_limits=enabled -o feature@hole_birth=enabled -o feature@large_blocks=enabled -o feature@lz4_compress=enabled -o feature@spacemap_histogram=enabled -o feature@userobj_accounting=enabled -O acltype=posixacl -O canmount=off -O compression=lz4 -O devices=off -O normalization=formD -O relatime=on -O xattr=sa -O mountpoint=/ -R /mnt bpool mirror$bootmirror 2>&1 1>/dev/null` errors=`zpool create -f -o ashift=12 -d -o feature@async_destroy=enabled -o feature@bookmarks=enabled -o feature@embedded_data=enabled -o feature@empty_bpobj=enabled -o feature@enabled_txg=enabled -o feature@extensible_dataset=enabled -o feature@filesystem_limits=enabled -o feature@hole_birth=enabled -o feature@large_blocks=enabled -o feature@lz4_compress=enabled -o feature@spacemap_histogram=enabled -o feature@userobj_accounting=enabled -O acltype=posixacl -O canmount=off -O compression=lz4 -O devices=off -O normalization=formD -O relatime=on -O xattr=sa -O mountpoint=/ -R /mnt bpool mirror$bootmirror 2>&1 1>/dev/null`
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
echo "Failed to create boot pool - $errors" echo "Failed to create boot pool - $errors"
exit 4 exit 4
fi fi
echo "Done." echo "Done."
# no striped mirror support yet # no striped mirror support yet
# special exception for none raid - this just operates the disks like a stripe, for 1 or more disk - *not* recommended # special exception for none raid - this just operates the disks like a stripe, for 1 or more disk - *not* recommended
if [ "$raidtype" = "none" ]; then if [ "$raidtype" = "none" ]; then
raidtype="" raidtype=""
else else
raidtype=" $raidtype" raidtype=" $raidtype"
fi fi
echo "" echo ""
echo "Creating main zpool..." echo "Creating main zpool..."
error=`zpool create -f -o ashift=12 -O acltype=posixacl -O canmount=off -O compression=lz4 -O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa -O mountpoint=/ -R /mnt rpool${raidtype}${rootraidz} 2>&1 1>/dev/null` error=`zpool create -f -o ashift=12 -O acltype=posixacl -O canmount=off -O compression=lz4 -O dnodesize=auto -O normalization=formD -O relatime=on -O xattr=sa -O mountpoint=/ -R /mnt rpool${raidtype}${rootraidz} 2>&1 1>/dev/null`
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
echo "Failed to create main pool - $errors" echo "Failed to create main pool - $errors"
exit 5 exit 5
fi fi
echo "Done." echo "Done."
echo "" echo ""
echo "Setting up main zpool dataset configuration..." echo "Setting up main zpool dataset configuration..."
errors=`zfs create -o canmount=off -o mountpoint=none rpool/ROOT 2>&1 1>/dev/null && zfs create -o canmount=off -o mountpoint=none bpool/BOOT 2>&1 1>/dev/null && zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/ubuntu 2>&1 1>/dev/null && zfs mount rpool/ROOT/ubuntu 2>&1 1>/dev/null && zfs create -o canmount=noauto -o mountpoint=/boot bpool/BOOT/ubuntu 2>&1 1>/dev/null && zfs mount bpool/BOOT/ubuntu 2>&1 1>/dev/null && zfs create rpool/home 2>&1 1>/dev/null && zfs create -o mountpoint=/root rpool/home/root 2>&1 1>/dev/null && zfs create -o canmount=off rpool/var 2>&1 1>/dev/null && zfs create -o canmount=off rpool/var/lib 2>&1 1>/dev/null && zfs create rpool/var/log 2>&1 1>/dev/null && zfs create rpool/var/spool 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/var/cache 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/var/tmp 2>&1 1>/dev/null && chmod 1777 /mnt/var/tmp 2>&1 1>/dev/null && zfs create rpool/opt 2>&1 1>/dev/null && zfs create rpool/srv 2>&1 1>/dev/null && zfs create -o canmount=off rpool/usr 2>&1 1>/dev/null && zfs create rpool/usr/local 2>&1 1>/dev/null && zfs create rpool/var/mail 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/var/lib/docker 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/var/lib/nfs 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/tmp 2>&1 1>/dev/null && chmod 1777 /mnt/tmp 2>&1 1>/dev/null` errors=`zfs create -o canmount=off -o mountpoint=none rpool/ROOT 2>&1 1>/dev/null && zfs create -o canmount=off -o mountpoint=none bpool/BOOT 2>&1 1>/dev/null && zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/ubuntu 2>&1 1>/dev/null && zfs mount rpool/ROOT/ubuntu 2>&1 1>/dev/null && zfs create -o canmount=noauto -o mountpoint=/boot bpool/BOOT/ubuntu 2>&1 1>/dev/null && zfs mount bpool/BOOT/ubuntu 2>&1 1>/dev/null && zfs create rpool/home 2>&1 1>/dev/null && zfs create -o mountpoint=/root rpool/home/root 2>&1 1>/dev/null && zfs create -o canmount=off rpool/var 2>&1 1>/dev/null && zfs create -o canmount=off rpool/var/lib 2>&1 1>/dev/null && zfs create rpool/var/log 2>&1 1>/dev/null && zfs create rpool/var/spool 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/var/cache 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/var/tmp 2>&1 1>/dev/null && chmod 1777 /mnt/var/tmp 2>&1 1>/dev/null && zfs create rpool/opt 2>&1 1>/dev/null && zfs create rpool/srv 2>&1 1>/dev/null && zfs create -o canmount=off rpool/usr 2>&1 1>/dev/null && zfs create rpool/usr/local 2>&1 1>/dev/null && zfs create rpool/var/mail 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/var/lib/docker 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/var/lib/nfs 2>&1 1>/dev/null && zfs create -o com.sun:auto-snapshot=false rpool/tmp 2>&1 1>/dev/null && chmod 1777 /mnt/tmp 2>&1 1>/dev/null`
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
echo "Error setting up ZFS settings - $errors" echo "Error setting up ZFS settings - $errors"
exit 5 exit 5
fi fi
echo "Done." echo "Done."
echo "" echo ""
echo "Bootstrapping..." echo "Bootstrapping..."
errors=`debootstrap bionic /mnt 2>&1 1>/dev/null` errors=`debootstrap bionic /mnt 2>&1 1>/dev/null`
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
echo "Failed to bootstrap root - $errors" echo "Failed to bootstrap root - $errors"
exit 6 exit 6
fi fi
echo "Done." echo "Done."
echo "" echo ""
echo "Disabling ZFS devices..." echo "Disabling ZFS devices..."
errors=`zfs set devices=off rpool 2>&1 1>/dev/null` errors=`zfs set devices=off rpool 2>&1 1>/dev/null`
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
echo "Failed to set devices=off for root pool- $errors" echo "Failed to set devices=off for root pool- $errors"
exit 7 exit 7
fi fi
echo "Done." echo "Done."
echo "" echo ""
echo "Setting hostname..." echo "Setting hostname..."
echo "$hostname" > /mnt/etc/hostname echo "$hostname" > /mnt/etc/hostname
echo "127.0.1.1 $hostname" >> /mnt/etc/hosts echo "127.0.1.1 $hostname" >> /mnt/etc/hosts
echo "Done." echo "Done."
echo "" echo ""
echo "Setting default apt repositories" echo "Setting default apt repositories"
echo "deb http://archive.ubuntu.com/ubuntu bionic main universe" > /mnt/etc/apt/sources.list echo "deb http://archive.ubuntu.com/ubuntu bionic main universe" > /mnt/etc/apt/sources.list
echo "deb-src http://archive.ubuntu.com/ubuntu bionic main universe" >> /mnt/etc/apt/sources.list echo "deb-src http://archive.ubuntu.com/ubuntu bionic main universe" >> /mnt/etc/apt/sources.list
echo "deb http://security.ubuntu.com/ubuntu bionic-security main universe" >> /mnt/etc/apt/sources.list echo "deb http://security.ubuntu.com/ubuntu bionic-security main universe" >> /mnt/etc/apt/sources.list
echo "deb-src http://security.ubuntu.com/ubuntu bionic-security main universe" >> /mnt/etc/apt/sources.list echo "deb-src http://security.ubuntu.com/ubuntu bionic-security main universe" >> /mnt/etc/apt/sources.list
echo "deb http://archive.ubuntu.com/ubuntu bionic-updates main universe" >> /mnt/etc/apt/sources.list echo "deb http://archive.ubuntu.com/ubuntu bionic-updates main universe" >> /mnt/etc/apt/sources.list
echo "deb-src http://archive.ubuntu.com/ubuntu bionic-updates main universe" >> /mnt/etc/apt/sources.list echo "deb-src http://archive.ubuntu.com/ubuntu bionic-updates main universe" >> /mnt/etc/apt/sources.list
echo "Done." echo "Done."
#echo "network:" > /mnt/etc/netplan/bridge.yaml #echo "network:" > /mnt/etc/netplan/bridge.yaml
#echo " version: 2" >> /mnt/etc/netplan/bridge.yaml #echo " version: 2" >> /mnt/etc/netplan/bridge.yaml
#echo " renderer: networkd" >> /mnt/etc/netplan/bridge.yaml #echo " renderer: networkd" >> /mnt/etc/netplan/bridge.yaml
#echo " ethernets:" >> /mnt/etc/netplan/bridge.yaml #echo " ethernets:" >> /mnt/etc/netplan/bridge.yaml
#for nic in "$nics"; do #for nic in "$nics"; do
#echo " ${nic}:" >> /mnt/etc/netplan/bridge.yaml #echo " ${nic}:" >> /mnt/etc/netplan/bridge.yaml
#echo " dhcp4: no" >> /mnt/etc/netplan/bridge.yaml #echo " dhcp4: no" >> /mnt/etc/netplan/bridge.yaml
#done #done
#echo " bridges:" >> /mnt/etc/netplan/bridge.yaml #echo " bridges:" >> /mnt/etc/netplan/bridge.yaml
#echo " br0:" >> /mnt/etc/netplan/bridge.yaml #echo " br0:" >> /mnt/etc/netplan/bridge.yaml
#echo " macaddress: ${macaddr}" >> /mnt/etc/netplan/bridge.yaml #echo " macaddress: ${macaddr}" >> /mnt/etc/netplan/bridge.yaml
#echo " dhcp4: yes" >> /mnt/etc/netplan/bridge.yaml #echo " dhcp4: yes" >> /mnt/etc/netplan/bridge.yaml
#echo " parameters:" >> /mnt/etc/netplan/bridge.yaml #echo " parameters:" >> /mnt/etc/netplan/bridge.yaml
#echo " stp: true" >> /mnt/etc/netplan/bridge.yaml #echo " stp: true" >> /mnt/etc/netplan/bridge.yaml
#echo " forward-delay: 0" >> /mnt/etc/netplan/bridge.yaml #echo " forward-delay: 0" >> /mnt/etc/netplan/bridge.yaml
#echo " interfaces:" >> /mnt/etc/netplan/bridge.yaml #echo " interfaces:" >> /mnt/etc/netplan/bridge.yaml
#for nic in `echo "$nics"`; do #for nic in `echo "$nics"`; do
#echo " - ${nic}" >> /mnt/etc/netplan/bridge.yaml #echo " - ${nic}" >> /mnt/etc/netplan/bridge.yaml
#done #done
echo "" echo ""
echo "Setting up boot pool import service..." echo "Setting up boot pool import service..."
echo "[Unit]"> /mnt/etc/systemd/system/zfs-import-bpool.service echo "[Unit]"> /mnt/etc/systemd/system/zfs-import-bpool.service
echo " DefaultDependencies=no" >> /mnt/etc/systemd/system/zfs-import-bpool.service echo " DefaultDependencies=no" >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo " Before=zfs-import-scan.service" >> /mnt/etc/systemd/system/zfs-import-bpool.service echo " Before=zfs-import-scan.service" >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo " Before=zfs-import-cache.service" >> /mnt/etc/systemd/system/zfs-import-bpool.service echo " Before=zfs-import-cache.service" >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo "" >> /mnt/etc/systemd/system/zfs-import-bpool.service echo "" >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo "[Service]" >> /mnt/etc/systemd/system/zfs-import-bpool.service echo "[Service]" >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo " Type=oneshot" >> /mnt/etc/systemd/system/zfs-import-bpool.service echo " Type=oneshot" >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo " RemainAfterExit=yes" >> /mnt/etc/systemd/system/zfs-import-bpool.service echo " RemainAfterExit=yes" >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo " ExecStart=/sbin/zpool import -N -o cachefile=none bpool" >> /mnt/etc/systemd/system/zfs-import-bpool.service echo " ExecStart=/sbin/zpool import -N -o cachefile=none bpool" >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo "[Install]" >> /mnt/etc/systemd/system/zfs-import-bpool.service echo "[Install]" >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo " WantedBy=zfs-import.target " >> /mnt/etc/systemd/system/zfs-import-bpool.service echo " WantedBy=zfs-import.target " >> /mnt/etc/systemd/system/zfs-import-bpool.service
echo "Done." echo "Done."
echo "" echo ""
echo "Creating home directory..." echo "Creating home directory..."
errors=`zfs create rpool/home/${admin} 2>&1 1>/dev/null` errors=`zfs create rpool/home/${admin} 2>&1 1>/dev/null`
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
echo "Unable to create home directory - $errors" echo "Unable to create home directory - $errors"
exit 9 exit 9
fi fi
echo "" echo ""
echo "Mounting chroot mounts..." echo "Mounting chroot mounts..."
mount --rbind /dev /mnt/dev mount --rbind /dev /mnt/dev
mount --rbind /proc /mnt/proc mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys mount --rbind /sys /mnt/sys
echo "Done." echo "Done."
echo "" echo ""
echo "Entering chroot..." echo "Entering chroot..."
echo "#!/bin/bash" > /mnt/setup-chroot.sh echo "#!/bin/bash" > /mnt/setup-chroot.sh
echo "echo \"Done.\"" >> /mnt/setup-chroot.sh echo "echo \"Done.\"" >> /mnt/setup-chroot.sh
echo "echo \"\"" >> /mnt/setup-chroot.sh echo "echo \"\"" >> /mnt/setup-chroot.sh
echo "echo \"Mounting /proc/self/mounts...\"" >> /mnt/setup-chroot.sh echo "echo \"Mounting /proc/self/mounts...\"" >> /mnt/setup-chroot.sh
echo "ln -s /proc/self/mounts /etc/mtab" >> /mnt/setup-chroot.sh echo "ln -s /proc/self/mounts /etc/mtab" >> /mnt/setup-chroot.sh
echo "echo \"Done.\"" >> /mnt/setup-chroot.sh echo "echo \"Done.\"" >> /mnt/setup-chroot.sh
echo "echo \"\"" >> /mnt/setup-chroot.sh echo "echo \"\"" >> /mnt/setup-chroot.sh
echo "echo \"Updating apt repositories on root pool...\"" >> /mnt/setup-chroot.sh echo "echo \"Updating apt repositories on root pool...\"" >> /mnt/setup-chroot.sh
echo 'errors=`apt update 2>&1 1>/dev/null`' >> /mnt/setup-chroot.sh echo 'errors=`apt update 2>&1 1>/dev/null`' >> /mnt/setup-chroot.sh
echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh
echo ' echo "Failed to update apt repositories on root pool - $errors"' >> /mnt/setup-chroot.sh echo ' echo "Failed to update apt repositories on root pool - $errors"' >> /mnt/setup-chroot.sh
echo " exit 1">> /mnt/setup-chroot.sh echo " exit 1">> /mnt/setup-chroot.sh
echo "fi">> /mnt/setup-chroot.sh echo "fi">> /mnt/setup-chroot.sh
echo "echo \"Done.\"">> /mnt/setup-chroot.sh echo "echo \"Done.\"">> /mnt/setup-chroot.sh
echo "echo \"\"">> /mnt/setup-chroot.sh echo "echo \"\"">> /mnt/setup-chroot.sh
echo "echo \"Setting locale...\"" >> /mnt/setup-chroot.sh echo "echo \"Setting locale...\"" >> /mnt/setup-chroot.sh
echo 'errors=`locale-gen en_US.UTF-8 2>&1 1>/dev/null`' >> /mnt/setup-chroot.sh echo 'errors=`locale-gen en_US.UTF-8 2>&1 1>/dev/null`' >> /mnt/setup-chroot.sh
echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh
echo ' echo "Failed to set the locale to en_US.UTF-8 - $errors"' >> /mnt/setup-chroot.sh echo ' echo "Failed to set the locale to en_US.UTF-8 - $errors"' >> /mnt/setup-chroot.sh
echo " exit 1">> /mnt/setup-chroot.sh echo " exit 1">> /mnt/setup-chroot.sh
echo "fi">> /mnt/setup-chroot.sh echo "fi">> /mnt/setup-chroot.sh
echo "echo \"Done.\"" >> /mnt/setup-chroot.sh echo "echo \"Done.\"" >> /mnt/setup-chroot.sh
echo "echo \"\"" >> /mnt/setup-chroot.sh echo "echo \"\"" >> /mnt/setup-chroot.sh
echo "echo \"Setting time zone...\"" >> /mnt/setup-chroot.sh echo "echo \"Setting time zone...\"" >> /mnt/setup-chroot.sh
echo "cp /usr/share/zoneinfo/$timezone /etc/localtime" >> /mnt/setup-chroot.sh echo "cp /usr/share/zoneinfo/$timezone /etc/localtime" >> /mnt/setup-chroot.sh
echo "echo \"Done.\"" >> /mnt/setup-chroot.sh echo "echo \"Done.\"" >> /mnt/setup-chroot.sh
echo "echo \"\"" >> /mnt/setup-chroot.sh echo "echo \"\"" >> /mnt/setup-chroot.sh
echo "echo \"Installing linux image, bash, screen, tmux, zfs, vim, sharutils, docker, dosfstools, mailutils, openssh, bridge-utils, net-utils, ufw...\"" >> /mnt/setup-chroot.sh echo "echo \"Installing linux image, bash, screen, tmux, zfs, vim, sharutils, docker, dosfstools, mailutils, openssh, bridge-utils, net-utils, ufw...\"" >> /mnt/setup-chroot.sh
# preconfigure postfix for no configuration # preconfigure postfix for no configuration
#echo "debconf-set-selections <<< \"postfix postfix/main_mailer_type string 'No configuration'\"" >> /mnt/setup-chroot.sh #echo "debconf-set-selections <<< \"postfix postfix/main_mailer_type string 'No configuration'\"" >> /mnt/setup-chroot.sh
#echo "debconf-set-selections <<< \"postfix postfix/mailname string $hostname\"" >> /mnt/setup-chroot.sh #echo "debconf-set-selections <<< \"postfix postfix/mailname string $hostname\"" >> /mnt/setup-chroot.sh
echo "errors=\$(DEBCONF_FRONTEND='noninteractive' apt install -y --no-install-recommends linux-image-generic 2>&1 1>/dev/null && apt purge -y netplan 2>&1 1>/dev/null && DEBCONF_FRONTEND='noninteractive' apt install -y ifupdown vim bridge-utils net-tools bash screen tmux zfs-initramfs dosfstools openssh-server ufw sendmail mailutils docker.io sharutils 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh echo "errors=\$(DEBCONF_FRONTEND='noninteractive' apt install -y --no-install-recommends linux-image-generic 2>&1 1>/dev/null && apt purge -y netplan 2>&1 1>/dev/null && DEBCONF_FRONTEND='noninteractive' apt install -y ifupdown vim bridge-utils net-tools bash screen tmux zfs-initramfs dosfstools openssh-server sendmail mailutils docker.io sharutils 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh
#echo "DEBCONF_FRONTEND='noninteractive' apt install -y --no-install-recommends linux-image-generic && apt install -y vim bash screen tmux zfs-initramfs dosfstools openssh-server ufw sendmail mailutils docker.io sharutils" >> /mnt/setup-chroot.sh #echo "DEBCONF_FRONTEND='noninteractive' apt install -y --no-install-recommends linux-image-generic && apt install -y vim bash screen tmux zfs-initramfs dosfstools openssh-server ufw sendmail mailutils docker.io sharutils" >> /mnt/setup-chroot.sh
echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh
echo ' echo "Failed to install preliminary software - $errors"' >> /mnt/setup-chroot.sh echo ' echo "Failed to install preliminary software - $errors"' >> /mnt/setup-chroot.sh
echo " exit 1">> /mnt/setup-chroot.sh echo " exit 1">> /mnt/setup-chroot.sh
echo "fi">> /mnt/setup-chroot.sh echo "fi">> /mnt/setup-chroot.sh
echo "echo \"Done.\"" >> /mnt/setup-chroot.sh echo "echo \"Done.\"" >> /mnt/setup-chroot.sh
# network configuration should have optional static configuration - not just DHCP, it's very important # network configuration should have optional static configuration - not just DHCP, it's very important
echo "" echo ""
echo "Writing network interfaces file..." echo "Writing network interfaces file..."
macaddr=$(echo $hostname|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/') macaddr=$(echo $hostname|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/')
echo "echo \"auto lo br0\" > /etc/network/interfaces" >> /mnt/setup-chroot.sh echo "echo \"auto lo br0\" > /etc/network/interfaces" >> /mnt/setup-chroot.sh
echo "echo \"iface lo inet loopback\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh echo "echo \"iface lo inet loopback\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh
for nic in "$nics"; do for nic in "$nics"; do
echo "echo \"iface ${nic} inet manual\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh echo "echo \"iface ${nic} inet manual\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh
done done
echo "echo \"iface br0 inet dhcp\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh echo "echo \"iface br0 inet dhcp\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh
echo "echo \" post-up ip link set br0 address $macaddr\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh echo "echo \" post-up ip link set br0 address $macaddr\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh
echo "echo \" bridge_ports $nics\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh echo "echo \" bridge_ports $nics\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh
echo "echo \" bridge_stp on\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh echo "echo \" bridge_stp on\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh
echo "echo \" dns-nameservers 127.0.0.53\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh echo "echo \" dns-nameservers 127.0.0.53\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh
echo "echo \"source-directory /etc/network/interfaces.d\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh echo "echo \"source-directory /etc/network/interfaces.d\" >> /etc/network/interfaces" >> /mnt/setup-chroot.sh
echo "Done." echo "Done."
# configure docker storage to use zfs # configure docker storage to use zfs
mkdir -p /mnt/etc/docker mkdir -p /mnt/etc/docker
echo "{\"storage-driver\":\"zfs\"}" > /mnt/etc/docker/daemon.json echo "{\"storage-driver\":\"zfs\"}" > /mnt/etc/docker/daemon.json
echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /mnt/etc/sysctl.conf echo "net.ipv6.conf.all.disable_ipv6 = 1" >> /mnt/etc/sysctl.conf
echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /mnt/etc/sysctl.conf echo "net.ipv6.conf.default.disable_ipv6 = 1" >> /mnt/etc/sysctl.conf
echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /mnt/etc/sysctl.conf echo "net.ipv6.conf.lo.disable_ipv6 = 1" >> /mnt/etc/sysctl.conf
echo 'echo ""' >> /mnt/setup-chroot.sh echo 'echo ""' >> /mnt/setup-chroot.sh
echo 'echo "Creating EFI partition..."' >> /mnt/setup-chroot.sh echo 'echo "Creating EFI partition..."' >> /mnt/setup-chroot.sh
firstdisk=`echo "$disks" | head -n1` firstdisk=`echo "$disks" | head -n1`
echo "error=\$(mkdosfs -F 32 -s 1 -n EFI /dev/disk/by-id/${firstdisk}-part2 2>&1 1>/dev/null && mkdir /boot/efi 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh echo "error=\$(mkdosfs -F 32 -s 1 -n EFI /dev/disk/by-id/${firstdisk}-part2 2>&1 1>/dev/null && mkdir /boot/efi 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh
echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh
echo ' echo "Failed to create dos file system for EFI partition - $errors"' >> /mnt/setup-chroot.sh echo ' echo "Failed to create dos file system for EFI partition - $errors"' >> /mnt/setup-chroot.sh
echo " exit 100">> /mnt/setup-chroot.sh echo " exit 100">> /mnt/setup-chroot.sh
echo "fi">> /mnt/setup-chroot.sh echo "fi">> /mnt/setup-chroot.sh
echo "echo PARTUUID=$(blkid -s PARTUUID -o value /dev/disk/by-id/${firstdisk}-part2) /boot/efi vfat nofail,x-systemd.device-timeout=0 0 1 >> /etc/fstab" >> /mnt/setup-chroot.sh echo "echo PARTUUID=$(blkid -s PARTUUID -o value /dev/disk/by-id/${firstdisk}-part2) /boot/efi vfat nofail,x-systemd.device-timeout=0 0 1 >> /etc/fstab" >> /mnt/setup-chroot.sh
echo "errors=\$(mount /boot/efi 2>&1 1>/dev/null && apt install -y grub-efi-amd64-signed shim-signed 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh echo "errors=\$(mount /boot/efi 2>&1 1>/dev/null && apt install -y grub-efi-amd64-signed shim-signed 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh
echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh
echo ' echo "Failed to mount EFI partition or install grub-EFI - $errors"' >> /mnt/setup-chroot.sh echo ' echo "Failed to mount EFI partition or install grub-EFI - $errors"' >> /mnt/setup-chroot.sh
echo " exit 1">> /mnt/setup-chroot.sh echo " exit 1">> /mnt/setup-chroot.sh
echo "fi">> /mnt/setup-chroot.sh echo "fi">> /mnt/setup-chroot.sh
echo 'echo "Done."' >> /mnt/setup-chroot.sh echo 'echo "Done."' >> /mnt/setup-chroot.sh
if ! [ "$disks" = "" ]; then if ! [ "$disks" = "" ]; then
echo 'echo ""' >> /mnt/setup-chroot.sh echo 'echo ""' >> /mnt/setup-chroot.sh
echo 'echo "Copying EFI partition to other boot disks..."' >> /mnt/setup-chroot.sh echo 'echo "Copying EFI partition to other boot disks..."' >> /mnt/setup-chroot.sh
i="2" i="2"
for disk in `echo "$disks" | tail -n+2`; do for disk in `echo "$disks" | tail -n+2`; do
echo "errors=\$(dd if=/dev/disk/by-id/${firstdisk}-part2 of=/dev/disk/by-id/${disk}-part2 2>&1 1>/dev/null && efibootmgr -c -g -d /dev/disk/by-id/${disk} -p 3 -L "ubuntu-$i" -l '\EFI\ubuntu\grubx64.efi' 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh echo "errors=\$(dd if=/dev/disk/by-id/${firstdisk}-part2 of=/dev/disk/by-id/${disk}-part2 2>&1 1>/dev/null && efibootmgr -c -g -d /dev/disk/by-id/${disk} -p 3 -L "ubuntu-$i" -l '\EFI\ubuntu\grubx64.efi' 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh
echo "if ! [ \"\$?\" = \"0\" ]; then echo \"EFI copy failed - \$errors\"; exit 20; fi" >> /mnt/setup-chroot.sh echo "if ! [ \"\$?\" = \"0\" ]; then echo \"EFI copy failed - \$errors\"; exit 20; fi" >> /mnt/setup-chroot.sh
i=$((i + 1)) i=$((i + 1))
done done
echo 'echo "Done."' >> /mnt/setup-chroot.sh echo 'echo "Done."' >> /mnt/setup-chroot.sh
fi fi
echo "echo ''" >> /mnt/setup-chroot.sh echo "echo ''" >> /mnt/setup-chroot.sh
echo 'echo "Setting root password..."' >> /mnt/setup-chroot.sh echo 'echo "Setting root password..."' >> /mnt/setup-chroot.sh
echo "errors=\$(echo 'root:${rootpassword}' | chpasswd 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh echo "errors=\$(echo 'root:${rootpassword}' | chpasswd 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh
echo "if ! [ \"\$?\" = \"0\" ]; then echo \"Could not set root password - \$errors\"; exit 21; fi" >> /mnt/setup-chroot.sh echo "if ! [ \"\$?\" = \"0\" ]; then echo \"Could not set root password - \$errors\"; exit 21; fi" >> /mnt/setup-chroot.sh
echo 'echo "Done."'>> /mnt/setup-chroot.sh echo 'echo "Done."'>> /mnt/setup-chroot.sh
echo 'echo ""' >> /mnt/setup-chroot.sh echo 'echo ""' >> /mnt/setup-chroot.sh
echo 'echo "Enabling boot pool import service..."'>> /mnt/setup-chroot.sh echo 'echo "Enabling boot pool import service..."'>> /mnt/setup-chroot.sh
echo "errors=\$(systemctl enable zfs-import-bpool.service 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh echo "errors=\$(systemctl enable zfs-import-bpool.service 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh
echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh
echo ' echo "Failed to enable boot pool import service - $errors"' >> /mnt/setup-chroot.sh echo ' echo "Failed to enable boot pool import service - $errors"' >> /mnt/setup-chroot.sh
echo " exit 102">> /mnt/setup-chroot.sh echo " exit 102">> /mnt/setup-chroot.sh
echo "fi">> /mnt/setup-chroot.sh echo "fi">> /mnt/setup-chroot.sh
echo 'echo "Done."'>> /mnt/setup-chroot.sh echo 'echo "Done."'>> /mnt/setup-chroot.sh
#echo 'echo ""'>> /mnt/setup-chroot.sh #echo 'echo ""'>> /mnt/setup-chroot.sh
#echo 'echo "Enabling tmp file system mounting..."'>> /mnt/setup-chroot.sh #echo 'echo "Enabling tmp file system mounting..."'>> /mnt/setup-chroot.sh
#echo "errors=\$(cp /usr/sharesystemd/tmp.mount /etc/systemd/system/ 2>&1 1>/dev/null && systemctl enable tmp.mount 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh #echo "errors=\$(cp /usr/sharesystemd/tmp.mount /etc/systemd/system/ 2>&1 1>/dev/null && systemctl enable tmp.mount 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh
#echo "if ! [ \"\$?\" = \"0\" ]; then echo \"Failed to enable tmp file system mounting - \$errors\"; exit 103; fi" >> /mnt/setup-chroot.sh #echo "if ! [ \"\$?\" = \"0\" ]; then echo \"Failed to enable tmp file system mounting - \$errors\"; exit 103; fi" >> /mnt/setup-chroot.sh
#echo 'echo "Done."'>> /mnt/setup-chroot.sh #echo 'echo "Done."'>> /mnt/setup-chroot.sh
#addgroup --system lpadmin #addgroup --system lpadmin
#addgroup --system sambashare #addgroup --system sambashare
echo 'echo ""' >> /mnt/setup-chroot.sh echo 'echo ""' >> /mnt/setup-chroot.sh
echo "echo \"Checking ZFS root...\"" >> /mnt/setup-chroot.sh echo "echo \"Checking ZFS root...\"" >> /mnt/setup-chroot.sh
echo 'zfscheck=$(grub-probe /boot 2>&1 1>/dev/null)' >> /mnt/setup-chroot.sh echo 'zfscheck=$(grub-probe /boot 2>&1 1>/dev/null)' >> /mnt/setup-chroot.sh
echo "if ! [ \"\$?\" = \"0\" ]; then echo \"grub-probe check failed - \$zfscheck\"; exit 2; fi" >> /mnt/setup-chroot.sh echo "if ! [ \"\$?\" = \"0\" ]; then echo \"grub-probe check failed - \$zfscheck\"; exit 2; fi" >> /mnt/setup-chroot.sh
echo "echo \"Success.\"" >> /mnt/setup-chroot.sh echo "echo \"Success.\"" >> /mnt/setup-chroot.sh
echo 'echo ""' >> /mnt/setup-chroot.sh echo 'echo ""' >> /mnt/setup-chroot.sh
echo 'echo "Updating initramfs..."' >> /mnt/setup-chroot.sh echo 'echo "Updating initramfs..."' >> /mnt/setup-chroot.sh
echo 'errors=$(update-initramfs -u -k all 2>&1 1>/dev/null)' >> /mnt/setup-chroot.sh echo 'errors=$(update-initramfs -u -k all 2>&1 1>/dev/null)' >> /mnt/setup-chroot.sh
echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh
echo ' echo "Failed to update initramfs - $errors"' >> /mnt/setup-chroot.sh echo ' echo "Failed to update initramfs - $errors"' >> /mnt/setup-chroot.sh
echo " exit 1">> /mnt/setup-chroot.sh echo " exit 1">> /mnt/setup-chroot.sh
echo "fi">> /mnt/setup-chroot.sh echo "fi">> /mnt/setup-chroot.sh
echo "echo \"Done.\"" >> /mnt/setup-chroot.sh echo "echo \"Done.\"" >> /mnt/setup-chroot.sh
# you need sed to do this right! # you need sed to do this right!
echo 'echo ""' >> /mnt/setup-chroot.sh echo 'echo ""' >> /mnt/setup-chroot.sh
echo 'echo "Modifying grub for ZFS root..."' >> /mnt/setup-chroot.sh echo 'echo "Modifying grub for ZFS root..."' >> /mnt/setup-chroot.sh
echo "errors=\$(sed -ir 's/GRUB_CMDLINE_LINUX=\".*\"/GRUB_CMDLINE_LINUX=\"root=ZFS=rpool\/ROOT\/ubuntu\"/g' /etc/default/grub 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh echo "errors=\$(sed -ir 's/GRUB_CMDLINE_LINUX=\".*\"/GRUB_CMDLINE_LINUX=\"root=ZFS=rpool\/ROOT\/ubuntu\"/g' /etc/default/grub 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh
echo "if ! [ \"\$?\" = \"0\" ]; then echo \"Failed to set grub ZFS root - \$errors\"; exit 104; fi" >> /mnt/setup-chroot.sh echo "if ! [ \"\$?\" = \"0\" ]; then echo \"Failed to set grub ZFS root - \$errors\"; exit 104; fi" >> /mnt/setup-chroot.sh
echo 'echo "Done."' >> /mnt/setup-chroot.sh echo 'echo "Done."' >> /mnt/setup-chroot.sh
echo 'echo ""' >> /mnt/setup-chroot.sh echo 'echo ""' >> /mnt/setup-chroot.sh
echo 'echo "Updating grub..."' >> /mnt/setup-chroot.sh echo 'echo "Updating grub..."' >> /mnt/setup-chroot.sh
echo 'errors=$(update-grub 2>&1 1>/dev/null)'>> /mnt/setup-chroot.sh echo 'errors=$(update-grub 2>&1 1>/dev/null)'>> /mnt/setup-chroot.sh
echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh
echo ' echo "Failed to update grub - $errors"' >> /mnt/setup-chroot.sh echo ' echo "Failed to update grub - $errors"' >> /mnt/setup-chroot.sh
echo " exit 1">> /mnt/setup-chroot.sh echo " exit 1">> /mnt/setup-chroot.sh
echo "fi">> /mnt/setup-chroot.sh echo "fi">> /mnt/setup-chroot.sh
echo "echo \"Done.\"" >> /mnt/setup-chroot.sh echo "echo \"Done.\"" >> /mnt/setup-chroot.sh
echo 'echo ""' >> /mnt/setup-chroot.sh echo 'echo ""' >> /mnt/setup-chroot.sh
echo 'echo "Installing grub UEFI on plex1..."' >> /mnt/setup-chroot.sh echo 'echo "Installing grub UEFI on plex1..."' >> /mnt/setup-chroot.sh
echo "errors=\$(grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck --no-floppy 2>&1 1>/dev/null && umount /boot/efi 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh echo "errors=\$(grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu --recheck --no-floppy 2>&1 1>/dev/null && umount /boot/efi 2>&1 1>/dev/null)" >> /mnt/setup-chroot.sh
echo "if ! [ \"\$?\" = \"0\" ]; then echo \"Failed to install grub UEFI on plex1 - \$errors\"; exit 104; fi" >> /mnt/setup-chroot.sh echo "if ! [ \"\$?\" = \"0\" ]; then echo \"Failed to install grub UEFI on plex1 - \$errors\"; exit 104; fi" >> /mnt/setup-chroot.sh
echo "echo \"Done.\"" >> /mnt/setup-chroot.sh echo "echo \"Done.\"" >> /mnt/setup-chroot.sh
# error check this as one big block # error check this as one big block
echo "zfs set mountpoint=legacy bpool/BOOT/ubuntu" >> /mnt/setup-chroot.sh echo "zfs set mountpoint=legacy bpool/BOOT/ubuntu" >> /mnt/setup-chroot.sh
echo "echo \"bpool/BOOT/ubuntu /boot zfs nodev,relatime,x-systemd.requires=zfs-import-bpool.service 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh echo "echo \"bpool/BOOT/ubuntu /boot zfs nodev,relatime,x-systemd.requires=zfs-import-bpool.service 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh
echo "zfs set mountpoint=legacy rpool/var/log">> /mnt/setup-chroot.sh echo "zfs set mountpoint=legacy rpool/var/log">> /mnt/setup-chroot.sh
echo "echo \"rpool/var/log /var/log zfs nodev,relatime 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh echo "echo \"rpool/var/log /var/log zfs nodev,relatime 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh
echo "zfs set mountpoint=legacy rpool/var/spool">> /mnt/setup-chroot.sh echo "zfs set mountpoint=legacy rpool/var/spool">> /mnt/setup-chroot.sh
echo "echo \"rpool/var/spool /var/spool zfs nodev,relatime 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh echo "echo \"rpool/var/spool /var/spool zfs nodev,relatime 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh
echo "zfs set mountpoint=legacy rpool/var/tmp" >> /mnt/setup-chroot.sh echo "zfs set mountpoint=legacy rpool/var/tmp" >> /mnt/setup-chroot.sh
echo "echo \"rpool/var/tmp /var/tmp zfs nodev,relatime 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh echo "echo \"rpool/var/tmp /var/tmp zfs nodev,relatime 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh
echo "zfs set mountpoint=legacy rpool/tmp" >> /mnt/setup-chroot.sh echo "zfs set mountpoint=legacy rpool/tmp" >> /mnt/setup-chroot.sh
echo "echo \"rpool/tmp /tmp zfs nodev,relatime 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh echo "echo \"rpool/tmp /tmp zfs nodev,relatime 0 0\" >> /etc/fstab" >> /mnt/setup-chroot.sh
echo 'echo ""' >> /mnt/setup-chroot.sh echo 'echo ""' >> /mnt/setup-chroot.sh
echo 'echo "Enabling SSH..."'>> /mnt/setup-chroot.sh echo 'echo "Enabling SSH..."'>> /mnt/setup-chroot.sh
echo "sed -ir 's/^ *#? *ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/g' /etc/ssh/sshd_config" >> /mnt/setup-chroot.sh echo "sed -ir 's/^ *#? *ChallengeResponseAuthentication.*/ChallengeResponseAuthentication no/g' /etc/ssh/sshd_config" >> /mnt/setup-chroot.sh
echo "sed -ir 's/^ *#? *PasswordAuthentication.*/PasswordAuthentication no/g' /etc/ssh/sshd_config" >> /mnt/setup-chroot.sh echo "sed -ir 's/^ *#? *PasswordAuthentication.*/PasswordAuthentication no/g' /etc/ssh/sshd_config" >> /mnt/setup-chroot.sh
echo "sed -ir 's/^ *#? *UsePAM.*/UsePAM no/g' /etc/ssh/sshd_config" >> /mnt/setup-chroot.sh echo "sed -ir 's/^ *#? *UsePAM.*/UsePAM no/g' /etc/ssh/sshd_config" >> /mnt/setup-chroot.sh
echo "sed -ir 's/^ *#? *PermitRootLogin.*/PermitRootLogin no/g' /etc/ssh/sshd_config" >> /mnt/setup-chroot.sh echo "sed -ir 's/^ *#? *PermitRootLogin.*/PermitRootLogin no/g' /etc/ssh/sshd_config" >> /mnt/setup-chroot.sh
echo "errors=\$(systemctl enable ssh 2>&1 1>/dev/null)">> /mnt/setup-chroot.sh echo "errors=\$(systemctl enable ssh 2>&1 1>/dev/null)">> /mnt/setup-chroot.sh
#&& ufw allow in on any from any to any port 22 proto tcp 2>&1 1>/dev/null #&& ufw allow in on any from any to any port 22 proto tcp 2>&1 1>/dev/null
echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh echo 'if ! [ "$?" = "0" ]; then '>> /mnt/setup-chroot.sh
echo ' echo "Failed to enable SSH - $errors"' >> /mnt/setup-chroot.sh echo ' echo "Failed to enable SSH - $errors"' >> /mnt/setup-chroot.sh
echo " exit 101">> /mnt/setup-chroot.sh echo " exit 101">> /mnt/setup-chroot.sh
echo "fi">> /mnt/setup-chroot.sh echo "fi">> /mnt/setup-chroot.sh
echo 'echo "Done."'>> /mnt/setup-chroot.sh echo 'echo "Done."'>> /mnt/setup-chroot.sh
echo 'echo ""'>> /mnt/setup-chroot.sh echo 'echo ""'>> /mnt/setup-chroot.sh
echo 'echo "Creating admin user..."'>> /mnt/setup-chroot.sh echo 'echo "Creating admin user..."'>> /mnt/setup-chroot.sh
# error check this # error check this
echo "useradd $admin" >> /mnt/setup-chroot.sh echo "useradd $admin" >> /mnt/setup-chroot.sh
echo "cp -a /etc/skel/.[!.]* \"/home/$admin\"" >> /mnt/setup-chroot.sh echo "cp -a /etc/skel/.[!.]* \"/home/$admin\"" >> /mnt/setup-chroot.sh
echo "chown -R ${admin}:${admin} \"/home/$admin\"" >> /mnt/setup-chroot.sh echo "chown -R ${admin}:${admin} \"/home/$admin\"" >> /mnt/setup-chroot.sh
echo "usermod -a -G adm,cdrom,dip,plugdev,sudo \"$admin\"" >> /mnt/setup-chroot.sh echo "usermod -a -G adm,cdrom,dip,plugdev,sudo \"$admin\"" >> /mnt/setup-chroot.sh
echo "echo '${admin}:${rootpassword}' | chpasswd" >> /mnt/setup-chroot.sh echo "echo '${admin}:${rootpassword}' | chpasswd" >> /mnt/setup-chroot.sh
echo 'echo "Done."'>> /mnt/setup-chroot.sh echo 'echo "Done."'>> /mnt/setup-chroot.sh
#create swap space, too if necessary #create swap space, too if necessary
#sendemail -t to@example.com -m "Here is the file." -a attachmentFile #sendemail -t to@example.com -m "Here is the file." -a attachmentFile
echo "mkdir \"/home/${admin}/.ssh\"" >> /mnt/setup-chroot.sh echo "mkdir \"/home/${admin}/.ssh\"" >> /mnt/setup-chroot.sh
echo "ssh-keygen -b 4096 -t rsa -q -f \"/home/${admin}/.ssh/id_rsa.pub\" -N '$rootpassword'" >> /mnt/setup-chroot.sh echo "ssh-keygen -b 4096 -t rsa -q -f \"/home/${admin}/.ssh/id_rsa.pub\" -N '$rootpassword'" >> /mnt/setup-chroot.sh
#echo "chmod 600 \"/home/${admin}/.ssh/id_rsa\"" >> /mnt/setup-chroot.sh #echo "chmod 600 \"/home/${admin}/.ssh/id_rsa\"" >> /mnt/setup-chroot.sh
echo "chown -R ${admin}:${admin} \"/home/${admin}\"/.ssh" >> /mnt/setup-chroot.sh echo "chown -R ${admin}:${admin} \"/home/${admin}\"/.ssh" >> /mnt/setup-chroot.sh
echo "mkdir /var/spool/mqueue/ && mkdir /var/spool/mqueue-client/" >> /mnt/setup-chroot.sh echo "mkdir /var/spool/mqueue/ && mkdir /var/spool/mqueue-client/" >> /mnt/setup-chroot.sh
echo "echo \"admin: ${admins}\" >> /etc/aliases" >> /mnt/setup-chroot.sh echo "echo \"admin: ${admins}\" >> /etc/aliases" >> /mnt/setup-chroot.sh
echo "newaliases" >> /mnt/setup-chroot.sh echo "newaliases" >> /mnt/setup-chroot.sh
echo "systemctl enable sendmail" >> /mnt/setup-chroot.sh echo "systemctl enable sendmail" >> /mnt/setup-chroot.sh
echo "chown smmsp:smmsp /var/spool/mqueue" >> /mnt/setup-chroot.sh echo "chown smmsp:smmsp /var/spool/mqueue" >> /mnt/setup-chroot.sh
echo "chmod g+w /var/spool/mqueue" >> /mnt/setup-chroot.sh echo "chmod g+w /var/spool/mqueue" >> /mnt/setup-chroot.sh
echo "chown smmsp:smmsp /var/spool/mqueue-client" >> /mnt/setup-chroot.sh echo "chown smmsp:smmsp /var/spool/mqueue-client" >> /mnt/setup-chroot.sh
echo "chmod g+w /var/spool/mqueue-client" >> /mnt/setup-chroot.sh echo "chmod g+w /var/spool/mqueue-client" >> /mnt/setup-chroot.sh
echo "HOME=\"/root\"" >> /mnt/setup-chroot.sh echo "HOME=\"/root\"" >> /mnt/setup-chroot.sh
echo "HOSTNAME=\"$hostname\"" >> /mnt/setup-chroot.sh echo "HOSTNAME=\"$hostname\"" >> /mnt/setup-chroot.sh
echo "service sendmail start" >> /mnt/setup-chroot.sh echo "service sendmail start" >> /mnt/setup-chroot.sh
echo "cat \"/home/${admin}/.ssh/id_rsa.pub\" | mail -s \"$hostname SSH key\" -A \"/home/${admin}/.ssh/id_rsa.pub\" admin" >> /mnt/setup-chroot.sh echo "cat \"/home/${admin}/.ssh/id_rsa.pub\" | mail -s \"$hostname SSH key\" -A \"/home/${admin}/.ssh/id_rsa.pub\" admin" >> /mnt/setup-chroot.sh
# uuencode test.csv test.csv | mail -v -s "Subject test" -r no-reply@mydomain.co.uk recepient@mydomain.co.uk # uuencode test.csv test.csv | mail -v -s "Subject test" -r no-reply@mydomain.co.uk recepient@mydomain.co.uk
echo "service sendmail stop" >> /mnt/setup-chroot.sh echo "service sendmail stop" >> /mnt/setup-chroot.sh
echo "exit 0" >> /mnt/setup-chroot.sh echo "exit 0" >> /mnt/setup-chroot.sh
errors=`chmod +x /mnt/setup-chroot.sh 2>&1 1>/dev/null` errors=`chmod +x /mnt/setup-chroot.sh 2>&1 1>/dev/null`
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
echo "Failed to set execution permission on chroot script - $errors" echo "Failed to set execution permission on chroot script - $errors"
exit 45 exit 45
fi fi
chroot /mnt /setup-chroot.sh chroot /mnt /setup-chroot.sh
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
exit $? exit $?
fi fi
#exit 0 #exit 0
# commented out for debugging # commented out for debugging
echo "" echo ""
echo "Clearing chroot configuration script..." echo "Clearing chroot configuration script..."
rm /mnt/setup-chroot.sh rm /mnt/setup-chroot.sh
echo "Done." echo "Done."
echo "" echo ""
echo "Unmounting chroot mounts..." echo "Unmounting chroot mounts..."
mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {} mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {}
echo "Done." echo "Done."
echo "" echo ""
echo "Exporting zpools..." echo "Exporting zpools..."
errors=`zpool export -a 2>&1 1>/dev/null` errors=`zpool export -a 2>&1 1>/dev/null`
if ! [ "$?" = "0" ]; then if ! [ "$?" = "0" ]; then
echo "Couldn't export mounted zpools - $errors" echo "Couldn't export mounted zpools - $errors"
exit 8 exit 8
fi fi
echo "Done." echo "Done."
echo "Congratulations! The install was successful. Please reboot and set your boot device using UEFI in the BIOS." echo "Congratulations! The install was successful. Please reboot and set your boot device using UEFI in the BIOS."
exit 0 exit 0
#sed -i -r "s/(^|[^#y])(compress)/\1#\2/" "$file" #sed -i -r "s/(^|[^#y])(compress)/\1#\2/" "$file"