Advertisement
Gorian

ZFS_Install_Ubuntu_16.04

Dec 3rd, 2016
50
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 7.98 KB | None | 0 0
  1. #!/bin/bash
  2. #
  3. #
  4. # CONSTANTS
  5. RED=$(tput setaf 1)
  6. GREEN=$(tput setaf 2)
  7. NORMAL=$(tput sgr0)
  8. MSG_STATUS_OKAY="[ OK ]"
  9. MSG_STATUS_FAIL="[ FAIL ]"
  10. COLUMNS=80
  11.  
  12. display_status() {
  13.     local command_exit_value="$1";
  14.     local exit_message="$2"
  15.     local string="$3";
  16.  
  17.     if [[ ${command_exit_value} = "0" ]]; then
  18.         printf '%s%*s%s\n' "${GREEN}" "$(( COLUMNS - ${#line} ))" "${MSG_STATUS_OKAY}" "${NORMAL}";
  19.     else
  20.         printf '%s%*s%s\n' "${RED}" "$(( COLUMNS - ${#line} ))" "${MSG_STATUS_FAIL}" "${NORMAL}";
  21.         printf "%s\n\n" "${exit_message}";
  22.         exit 2;
  23.     fi
  24. }
  25.  
  26.  
  27. main() {
  28.     local args="$@"
  29.     local arg_hostname="$1"
  30.     local arg_disk1="$2"
  31.     local arg_disk2="$3"
  32.     local disk_ids
  33.     # this is currently set to the hostname minus the FQDN
  34.     # currently, we could use this value for parts in the script requiring
  35.     # the hostname, but we want to keep them seperate in case we add support
  36.     # for custom zpool names later
  37.     local ZFS_pool_root=$(printf "${arg_hostname}" | awk -F"." '{print $1}')
  38.     local ZFS_pool_os=${ZFS_pool_root}/ROOT/ubuntu
  39.     local chroot_script=/var/tmp/setup.sh
  40.     local aptserver="http://archive.ubuntu.com/ubuntu";
  41.     local array_status;
  42.     local line;
  43.     local counter;
  44.  
  45.     printf "\n";
  46.     for device in ${arg_disk1} ${arg_disk2}; do
  47.         line="Getting disk ID for ${device}...";
  48.         printf '%s' "${line}";
  49.         for id in /dev/disk/by-id/*; do
  50.             temp=$(printf "${id} "; readlink -f ${id});
  51.             disk_temp=$(printf "${temp}\n" | grep "${device}\$" | awk '{print $1}');
  52.             if [[ ! -z ${disk_temp} ]] &&
  53.                [[ ! $(basename ${disk_temp}) =~ ^wwn.* ]]; then
  54.                 disk_id=$disk_temp;
  55.             fi
  56.         done
  57.         disk_ids="${disk_ids} ${disk_id}";
  58.         display_status "0" '' "${line}";
  59.     done
  60.  
  61.     printf "\n";
  62.     line="Installing required packages...";
  63.     printf '%s' "${line}";
  64.     apt update > /dev/null 2>&1
  65.  
  66.     exit_message="FATAL ERROR: debootstrap failed. Exiting.";
  67.     apt install --yes debootstrap gdisk zfsutils-linux zfs-initramfs > /dev/null 2>&1;
  68.     display_status "$?" "${exit_message}" "${line}";
  69.  
  70.     printf "\n";
  71.     for disk in ${disk_ids}; do
  72.         counter=0;
  73.         line="Partitioning ${disk}..."
  74.         printf '%s' "${line}";
  75.         sgdisk --zap-all ${disk} > /dev/null 2>&1;
  76.         array_status[$counter]="${?}:Failed to wipe disk ${disk}";
  77.         counter=$((counter+1));
  78.         sgdisk -a1 -n2:34:2047  -t2:EF02 ${disk} > /dev/null 2>&1;
  79.         array_status[$counter]="${?}:Failed to write partition 2 on ${disk}";
  80.         counter=$((counter+1));
  81.         sgdisk     -n9:-8M:0    -t9:BF07 ${disk} > /dev/null 2>&1;
  82.         array_status[$counter]="${?}:Failed to write partition 9 on ${disk}";
  83.         counter=$((counter+1));
  84.         sgdisk     -n1:0:0      -t1:BF01 ${disk} > /dev/null 2>&1;
  85.         array_status[$counter]="${?}:Failed to write partition 1 on ${disk}";
  86.         counter=$((counter+1));
  87.         for i in "${array_status[@]}"; do
  88.             if [[ $(echo ${i} | awk -F":" '{print $1}') = "0" ]]; then
  89.                 command_status="0";
  90.             else
  91.                 command_status="1";
  92.                 exit_message=$(echo ${i} | awk -F":" '{print $2}');
  93.             fi
  94.         done
  95.         display_status "${command_status}" "${exit_message}" "${line}";
  96.         unset array_status;
  97.         unset counter;
  98.     done
  99.  
  100.     printf "\n";
  101.     line="Waiting for udev to do it's thing...";
  102.     printf "%s" "${line}";
  103.     sleep 3;
  104.     display_status "$?" "${exit_message}" "${line}";
  105.  
  106.  
  107.     disk_install=$(printf "${disk_ids}\n" | awk '{print $1}');
  108.     disk_mirror=$(printf "${disk_ids}\n" | awk '{print $2}');
  109.     printf "\n";
  110.     line="Creating zpool...";
  111.     printf "%s" "${line}";
  112.     exit_message="FATAL ERROR: Failed to create zpool. Exiting.";
  113.     zpool create -o ashift=12 \
  114.         -O atime=off -O canmount=off -O compression=lz4 -O normalization=formD \
  115.         -O mountpoint=/ \
  116.         -R /mnt \
  117.         ${ZFS_pool_root} mirror ${disk_install}-part1 ${disk_mirror}-part1 -f;
  118.     display_status "$?" "${exit_message}" "${line}";
  119.  
  120.  
  121.     #printf "\n";
  122.     #line="Creating "
  123.     zfs create -o canmount=off -o mountpoint=none ${ZFS_pool_root}/ROOT;
  124.     zfs create -o canmount=noauto -o mountpoint=/ ${ZFS_pool_os};
  125.     zfs mount ${ZFS_pool_os};
  126.  
  127.     zfs create                 -o setuid=off              ${ZFS_pool_root}/home;
  128.     zfs create -o mountpoint=/root                        ${ZFS_pool_root}/home/root;
  129.     zfs create -o canmount=off -o setuid=off  -o exec=off ${ZFS_pool_root}/var;
  130.     zfs create -o com.sun:auto-snapshot=false             ${ZFS_pool_root}/var/cache;
  131.     zfs create                                            ${ZFS_pool_root}/var/log;
  132.     zfs create                                            ${ZFS_pool_root}/var/spool;
  133.     zfs create -o com.sun:auto-snapshot=false -o exec=on  ${ZFS_pool_root}/var/tmp;
  134.     zfs create                                            ${ZFS_pool_root}/opt;
  135.     zfs create                                            ${ZFS_pool_root}/srv;
  136.     zfs create -o com.sun:auto-snapshot=false \
  137.                -o mountpoint=/var/lib/nfs                 ${ZFS_pool_root}/var/nfs;
  138.     zfs create -V 4G -b $(getconf PAGESIZE) -o compression=zle \
  139.                -o logbias=throughput -o sync=always \
  140.                -o primarycache=metadata -o secondarycache=none \
  141.                -o com.sun:auto-snapshot=false             ${ZFS_pool_root}/swap;
  142.  
  143.     chmod 1777 /mnt/var/tmp;
  144.  
  145.     line="Bootstrapping (this will take a while)...";
  146.     printf "%s" "${line}";
  147.     exit_message="FATAL ERROR: debootstrap failed. Exiting.";
  148.     debootstrap xenial /mnt > /dev/null 2>&1
  149.     display_status "$?" "${exit_message}" "${line}";
  150.  
  151.     zfs set devices=off ${ZFS_pool_root};
  152.     printf "${arg_hostname}\n" > /mnt/etc/hostname;
  153.     printf "127.0.1.1 $(printf ${arg_hostname} | awk -F"." '{print $1}') ${arg_hostname}"  >> /mnt/etc/hosts;
  154.     printf "Etc/UTC\n" > /mnt/etc/timezone;
  155.     ln -fs /mnt/usr/share/zoneinfo/${TIMEZONE} /mnt/etc/localtime;
  156.     INTERFACE=$(ip -o addr show scope global | awk '{gsub(/\/.*/,"",$2); print $2}');
  157.     printf "auto $INTERFACE\niface $INTERFACE inet dhcp\n" > /mnt/etc/network/interfaces.d/$INTERFACE;
  158.     cat /dev/null > /mnt/etc/apt/sources.list;
  159.     distrib_codename=$(cat /etc/*release | grep );
  160.     cat >>/mnt/etc/apt/sources.list<<EOF
  161. deb ${aptserver} xenial main universe
  162. deb-src ${aptserver} xenial main universe
  163. deb ${aptserver} xenial-security main universe
  164. deb-src ${aptserver} xenial-security main universe
  165. deb ${aptserver} xenial-updates main universe
  166. deb-src ${aptserver} xenial-updates main universe
  167. EOF
  168.     mount --rbind /dev  /mnt/dev;
  169.     mount --rbind /proc /mnt/proc;
  170.     mount --rbind /sys  /mnt/sys;
  171.  
  172.     printf "%s\n" "#/etc/fstab" > /mnt/etc/fstab;
  173.  
  174.     cat >>/mnt${chroot_script}<<EOF
  175. #!/bin/bash
  176. locale-gen en_US.UTF-8
  177. printf 'LANG="en_US.UTF-8"\n' > /etc/default/locale
  178. ln -s /proc/self/mounts /etc/mtab
  179. dpkg-reconfigure --frontend noninteractive tzdata
  180. apt update
  181. DEBIAN_FRONTEND=noninteractive apt dist-upgrade --yes
  182. apt install --yes --no-install-recommends linux-image-generic
  183. apt install --yes ubuntu-minimal vim zfs-initramfs zfsutils-linux openssh-server curl
  184. DEBIAN_FRONTEND=noninteractive apt install --yes grub-pc
  185. grub-probe /
  186. update-initramfs -c -k all
  187. sed -e "s/\(GRUB_HIDDEN_TIMEOUT=0\)/#\1/" -e 's/\"quiet splash\"/\"\"/' -e 's/.*\(GRUB_TERMINAL=console\).*/\1/' -i "/etc/default/grub"
  188. update-grub
  189. grub-install ${disk_install}
  190. grub-install ${disk_mirror}
  191. printf "Pausing to exit script if there are any errors..."
  192. sleep 5
  193. #password="\$(sed -e s'/[A-Za-z]\{6,\}//g' /usr/share/dict/words | grep -v "'s" | sed '/^\s*$/d' | shuf -n 1)\$(shuf -i 0-9 -n 3 | tr '\n' ' ' | tr -d ' ')"
  194. password=\$(curl "http://www.passwordrandom.com/query?command=password&count=1&format=plain&scheme=CvvCVN")
  195. printf "root:\${password}" | chpasswd
  196. printf "\n\nThe root password has been set to ${GREEN}\${password}${NORMAL}\n\n"
  197. sed -ie 's/\(^PermitRootLogin\).*/\1 yes/' /etc/ssh/sshd_config
  198. systemctl enable ssh
  199. mkswap -f /dev/zvol/${ZFS_pool_root}/swap
  200. printf "%s\n" "/dev/zvol/${ZFS_pool_root}/swap none swap defaults 0 0" >> /etc/fstab
  201. zfs snapshot ${ZFS_pool_os}@install
  202. EOF
  203.     chmod +x /mnt${chroot_script}
  204.     chroot /mnt ${chroot_script}
  205.     rm -f ${chroot_script}
  206.     mount | grep -v zfs | tac | awk '/\/mnt/ {print $3}' | xargs -i{} umount -lf {}
  207.     zpool export ${ZFS_pool_root}
  208.  
  209.     printf "%s\n" "Done. Ready to reboot\n\n"
  210.     exit 0
  211. }
  212.  
  213. main "$@"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement