#! /bin/bash # fresh update on apt in Ubuntu echo "Updating and upgrading local packages..." apt-add-repository universe && apt update >/dev/null 2>/dev/null && apt upgrade -y >/dev/null 2>/dev/null if [ "$?" = "0" ]; then echo "Done.\n" else echo "Failed to add universal repository, update apt repository, or upgrade - possibly bad network connection" exit 1 fi 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.\n" 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` # set line separator IFS=$'\n' 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` hostname=""; while [ -z "$hostname" ]; do result=`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 "$disks"; do # remove echo for testing echo "Partitioning disk $disk..." # collect the return values, check them for errors and display them echo "sgdisk --zap-all /dev/disk/by-id/$disk >/dev/null 2>&1" echo "sgdisk -n2:1M:+512M -t2:EF00 /dev/disk/by-id/$disk >/dev/null 2>&1" echo "sgdisk -n3:0:+512M -t3:BF01 /dev/disk/by-id/$disk >/dev/null 2>&1" echo "sgdisk -n4:0:0 -t4:BF01 /dev/disk/by-id/$disk >/dev/null 2>&1" echo "Done." done # create boot mirror list bootmirror=""; for disk in "$disks": do bootmirror="$bootmirror /dev/disk/by-id/${disk}-part3"; done rootraidz=""; for disk in "$disks"; do rootraidz="$rootraidz /dev/disk/by-id/${disk}-part4"; done echo "zpool create -f -o ashift=12 -d -o feature@async_destroy=enable -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" 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` if [ "$raidtype" = "none" ]; then raidtype="" else raidtype=" $raidtype" fi # test for boot pool creation echo "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}" #zfs create -o canmount=off -o mountpoint=none rpool/ROOT #zfs create -o canmount=off -o mountpoint=none bpool/BOOT # zfs create -o canmount=noauto -o mountpoint=/ rpool/ROOT/ubuntu # zfs mount rpool/ROOT/ubuntu # zfs create -o canmount=noauto -o mountpoint=/boot bpool/BOOT/ubuntu # zfs mount bpool/BOOT/ubuntu # zfs create rpool/home # zfs create -o mountpoint=/root rpool/home/root # zfs create -o canmount=off rpool/var # zfs create -o canmount=off rpool/var/lib # zfs create rpool/var/log # zfs create rpool/var/spool # zfs create -o com.sun:auto-snapshot=false rpool/var/cache # zfs create -o com.sun:auto-snapshot=false rpool/var/tmp # chmod 1777 /mnt/var/tmp # zfs create rpool/opt # zfs create rpool/srv # zfs create -o canmount=off rpool/usr # zfs create rpool/usr/local # zfs create rpool/var/mail # zfs create -o com.sun:auto-snapshot=false rpool/var/lib/docker # zfs create -o com.sun:auto-snapshot=false rpool/var/lib/nfs # zfs create -o com.sun:auto-snapshot=false rpool/tmp # chmod 1777 /mnt/tmp # debootstrap bionic /mnt # zfs set devices=off rpool # echo HOSTNAME > /mnt/etc/hostname # echo "127.0.1.1 $hostname" >> /mnt/etc/hosts # vi /mnt/etc/hosts # 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 # you really need static config here too! macaddr=$(echo $hostname|md5sum|sed 's/^\(..\)\(..\)\(..\)\(..\)\(..\).*$/02:\1:\2:\3:\4:\5/') network="network:\n version: 2\n renderer: networkd\n ethernets:" for nic in "$nicdevices"; do network="$network\n ${nic}:\n dhcp4: no" done network="$network\n bridges:\n br0:\n macaddress: ${macaddr}\n dhcp4: yes\n parameters:\n stp: true\n interfaces:" for nic in "$nicdevices";l do network="$network\n - ${nic}" done # echo "$network" > /mnt/etc/netplan/bridge.yaml # mount --rbind /dev /mnt/dev # mount --rbind /proc /mnt/proc # mount --rbind /sys /mnt/sys # chroot /mnt /bin/bash --login # ln -s /proc/self/mounts /etc/mtab # apt update #echo -e 'LANG="en_US.UTF-8"\nLANGUAGE="en_US:en"\n' > /etc/default/locale #dpkg-reconfigure tzdata #apt install -y --no-install-recommends linux-image-generic #apt install -y vim bash screen tmux zfs-initramfs dosfstools openssh-server i="0" for disk in "$disks"; do echo "mkdosfs -F 32 -s 1 -n EFI /dev/disk/by-id/${disk}-part2" echo "mkdir /boot/efi${i}" echo "echo PARTUUID=$(blkid -s PARTUUID -o value /dev/disk/by-id/${disk}-part2) /boot/efi${i} vfat nofail,x-systemd.device-timeout=0 0 1 >> /etc/fstab" echo "mount /boot/efi${i}" i=$((i + 1)) done #apt install -y grub-efi-amd64-signed shim-signed #passwd #echo "[Unit]\n DefaultDependencies=no\n Before=zfs-import-scan.service\n Before=zfs-import-cache.service\n \n [Service]\n Type=oneshot\n RemainAfterExit=yes\n ExecStart=/sbin/zpool import -N -o cachefile=none bpool\n [Install]\n WantedBy=zfs-import.target " > /etc/systemd/system/zfs-import-bpool.Service" #systemctl enable zfs-import-bpool.Service #cp /usr/sharesystemd/tmp.mount /etc/systemd/system/ #systemctl enable tmp.mount #addgroup --system lpadmin #addgroup --system sambashare zfscheck=`grub-probe /boot` #update-initramfs -u -k all # you need sed to do this right! # GRUB_CMDLINE_LINUX="root=ZFS=rpool/ROOT/ubuntu" <--- replace this #update-grub i="0" for f in "$disks"; do echo "grub-install --target=x86_64-efi --efi-directory=/boot/efi${i} --botloader-id=ubuntu --recheck --no-floppy" echo "umount /boot/efi${i}" i=$((i + 1)) done #zfs set mountpoint=legacy bpool/BOOT/ubuntu #echo bpool/BOOT/ubuntu /boot zfs nodev,relatime,x-systemd.requires=zfs-import-bpool.service 0 0 >> /etc/fstab #zfs set mountpoint=legacy rpool/var/log #echo rpool/var/log /var/log zfs nodev,relatime 0 0 >> /etc/fstab #zfs set mountpoint=legacy rpool/var/spool #echo rpool/var/spool /var/spool zfs nodev,relatime 0 0 >> /etc/fstab #zfs set mountpoint=legacy rpool/var/tmp #echo rpool/var/tmp /var/tmp zfs nodev,relatime 0 0 >> /etc/fstab #zfs set mountpoint=legacy rpool/tmp #echo rpool/tmp /tmp zfs nodev,relatime 0 0 >> /etc/fstab #systemctl enable openssh-server # create parker user automated way #zfs create rpool/home/YOURUSERNAME # adduser YOURUSERNAME # cp -a /etc/skel/.[!.]* /home/YOURUSERNAME # chown -R YOURUSERNAME:YOURUSERNAME /home/YOURUSERNAME # usermod -a -G adm,cdrom,dip,lpadmin,plugdev,sambashare,sudo YOURUSERNAME #create swap space, too if necessary #exit #mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {} #zpool export -a #reboot