#! /bin/bash #IFS=$'\n' # fresh update on apt in Ubuntu echo "" echo "Updating local packages..." apt-add-repository universe >/dev/null 2>/dev/null && apt update >/dev/null 2>/dev/null if [ "$?" = "0" ]; then echo "Done." else echo "Failed to add universal repository, update apt repository - possibly bad network connection." exit 1 fi echo "" echo "Installing required setup configuration utilities..." apt install -y dialog net-tools gdisk zfs-initramfs debootstrap >/dev/null 2>/dev/null if [ "$?" = "0" ]; then echo "Done." else echo "Failed to install net-tools, gdisk, zfs-initramfs, or debootstrap." exit 2 fi #calculate width and height of console width=`tput cols` height=`tput lines` window=$((height - 5)) # set line separator 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` raidtype=`dialog --no-items --no-cancel --title "Root pool ZFS RAID" --radiolist "Select root pool ZFS RAID type" 11 35 4 raidz off raidz2 off mirror off none off 2>&1 1>/dev/tty` hostname=""; while [ -z "$hostname" ]; do hostname=`dialog --no-cancel --inputbox "Host name/Server name" 8 100 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 nics=`dialog --separate-output --no-cancel --no-items --title "Network devices for bridge" --checklist "Select the network devices to be bridged" $height $width ${window}$nicdevices 2>&1 1>/dev/tty` for disk in `echo "$disks"`; do # remove echo for testing echo "" echo "Partitioning disk $disk..." # collect the return values, check them for errors and display them 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 echo "Failed to partition disk $disk - $errors" exit 3 fi echo "Done." done # 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 # refresh drives partprobe 2>/dev/null 1>/dev/null # wait for the partitions to show up #for disk in `echo "$disks"` #do# # while ! [ -e "/dev/disk/by-id/${disk}-part3" ]; do # sleep 1s # done #done #ls -l /dev/disk/by-id | grep part3 echo "" 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` if ! [ "$?" = "0" ]; then echo "Failed to create boot pool - $errors" exit 4 fi echo "Done." if [ "$raidtype" = "none" ]; then raidtype="" else raidtype=" $raidtype" fi # test for boot pool creation echo "" 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` if ! [ "$?" = "0" ]; then echo "Failed to create main pool - $errors" exit 5 fi echo "Done." echo "" 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` if ! [ "$?" = "0" ]; then echo "Error setting up ZFS settings - $errors" exit 5 fi echo "Done." echo "" echo "Starting debian bootstrap..." errors=`debootstrap bionic /mnt 2>&1 1>/dev/null` if ! [ "$?" = "0" ]; then echo "Failed to bootstrap root - $errors" exit 6 fi echo "Done." echo "" echo "Disabling ZFS devices..." errors=`zfs set devices=off rpool 2>&1 1>/dev/null` if ! [ "$?" = "0" ]; then echo "Failed to set devices=off for root pool- $errors" exit 7 fi echo "Done." echo "" echo "Setting hostname..." echo HOSTNAME > /mnt/etc/hostname echo "127.0.1.1 $hostname" >> /mnt/etc/hosts echo "Done." echo "" echo "Setting default apt repositories" echo "deb http://archive.ubuntu.com/ubuntu bionic main universe\ndeb-src http://archive.ubuntu.com/ubuntu bionic main universe\ndeb http://security.ubuntu.com/ubuntu bionic-security main universe\ndeb-src http://security.ubuntu.com/ubuntu bionic-security main universe\ndeb http://archive.ubuntu.com/ubuntu bionic-updates main universe\ndeb-src http://archive.ubuntu.com/ubuntu bionic-updates main universe" > /mnt/etc/apt/sources.list echo "Done." # you really need static config here too! echo "" echo "Writing netplan file" macaddr=$(echo $hostname|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/') echo "network:" > /mnt/etc/netplan/bridge.yaml echo " version: 2" >> /mnt/etc/netplan/bridge.yaml echo " renderer: networkd" >> /mnt/etc/netplan/bridge.yaml echo " ethernets:" >> /mnt/etc/netplan/bridge.yaml for nic in "$nicdevices"; do echo " ${nic}:" >> /mnt/etc/netplan/bridge.yaml echo " dhcp4: no" >> /mnt/etc/netplan/bridge.yaml done echo " bridges:" >> /mnt/etc/netplan/bridge.yaml echo " br0:" >> /mnt/etc/netplan/bridge.yaml echo " macaddress: ${macaddr}" >> /mnt/etc/netplan/bridge.yaml echo " dhcp4: yes" >> /mnt/etc/netplan/bridge.yaml echo " parameters:" >> /mnt/etc/netplan/bridge.yaml echo " stp: true" >> /mnt/etc/netplan/bridge.yaml echo " interfaces:" >> /mnt/etc/netplan/bridge.yaml for nic in `echo "$nicdevices"`; do echo " - ${nic}" >> /mnt/etc/netplan/bridge.yaml done echo "Done." echo "" echo "Mounting chroot mounts..." mount --rbind /dev /mnt/dev mount --rbind /proc /mnt/proc mount --rbind /sys /mnt/sys echo "Done." echo "" echo "Downloading chroot configuration script..." wget -qO - https://code.totosearch.org/Sean/ServerSetup/raw/branch/master/setup-chroot.sh > /mnt/setup-chroot.sh chmod +x /mnt/setup-chroot.sh echo "Done." chroot /mnt /setup-chroot.sh --login echo "" echo "Clearing chroot configuration script..." rm /mnt/setup-chroot.sh echo "Done." echo "" echo "Unmounting chroot mounts..." mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {} echo "Done." echo "" echo "Exporting zpools..." errors=`zpool export -a 2>&1 1>/dev/null` if ! [ "$?" = "0" ]; then echo "Couldn't export mounted zpools - $errors" exit 8 fi echo "Done." exit 0 #exit #mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {} #zpool export -a #reboot