OSDN Git Service

Don't allow skipping formatting root
[pacbang-linux/installer-arch.git] / archlabs-installer
index 41a8a8b..9494470 100755 (executable)
@@ -8,14 +8,13 @@
 # check for syntax errors
 # set -n
 
-VER=2.0.89
+VER=2.1.3
 
-# bulk default values {
+# default values {
 
 : ${DIST=ArchLabs}                 # distro name if not set
 MNT=/mnt                           # installation root mountpoint
 ANS=/tmp/ans                       # dialog answer output file
-BOOTDIR=boot                       # location to mount boot partition
 FONT=ter-i16n                      # font used for the linux console
 HOOKS=shutdown                     # additional mkinitcpio HOOKS
 SEL=0                              # currently selected menu item
@@ -26,6 +25,7 @@ RUN=/run/archiso/bootmnt/arch/boot # path for live system /boot
 VM="$(dmesg | grep -i hypervisor)" # system running in a virtual machine
 EXMNTS=""                          # extra partitions that were mounted, used to verify mountpoint and show user
 FORMATTED=""                       # partitions that have been formatted, allows skipping the format step
+USER_CMD=""                        # optional command(s) entered by the user to run in the chroot
 export DIALOGOPTS="--cr-wrap"      # dialog environment variable to hold default options, see `man dialog`
 
 BASE_PKGS="base xorg xorg-drivers sudo git gvfs gtk3 libmad libmatroska tumbler "
@@ -57,13 +57,13 @@ declare -A BCMDS=(
 
 # executable name for each wm/de used in ~/.xinitrc {
 declare -A WM_SESSIONS=(
-[dwm]='dwm' [i3-gaps]='i3' [bspwm]='bspwm' [awesome]='awesome' [plasma]='startkde' [xfce4]='startxfce4'
+[dwm]='dwm' [jwm]='jwm' [i3-gaps]='i3' [bspwm]='bspwm' [awesome]='awesome' [plasma]='startkde' [xfce4]='startxfce4'
 [gnome]='gnome-session' [fluxbox]='startfluxbox' [openbox]='openbox-session' [cinnamon]='cinnamon-session'
 ) # }
 
 # packages installed for each wm/de, most are depends of the skel packages {
 declare -A WM_EXT=(
-[dwm]='' [gnome]='' [cinnamon]='gnome-terminal' [plasma]='kdebase-meta'
+[dwm]='' [jwm]='' [gnome]='' [cinnamon]='gnome-terminal' [plasma]='kdebase-meta'
 [awesome]='archlabs-skel-awesome' [bspwm]='archlabs-skel-bspwm' [fluxbox]='archlabs-skel-fluxbox'
 [i3-gaps]='archlabs-skel-i3-gaps' [openbox]='archlabs-skel-openbox' [xfce4]='archlabs-skel-xfce4 xfce4-goodies'
 ) # }
@@ -104,7 +104,7 @@ declare -A LOGIN_PKGS=(
 # they can be added here eg. [package]="extra"
 declare -A PKG_EXT=(
 [vlc]='qt4' [mpd]='mpc' [mupdf]='mupdf-tools'
-[rxvt-unicode]='urxvt-pearls' [zathura]='zathura-pdf-poppler' [noto-fonts]='noto-fonts-emoji' [cairo-dock]='cairo-dock-plug-ins' [qt5ct]='qt5-styleplugins'
+[rxvt-unicode]='urxvt-perls' [zathura]='zathura-pdf-poppler' [noto-fonts]='noto-fonts-emoji' [cairo-dock]='cairo-dock-plug-ins' [qt5ct]='qt5-styleplugins'
 [vlc]='qt5ct qt5-styleplugins' [qutebrowser]='qt5ct qt5-styleplugins' [qbittorrent]='qt5ct qt5-styleplugins' [transmission-qt]='qt5ct qt5-styleplugins'
 [bluez]='bluez-libs bluez-utils bluez-tools bluez-plugins bluez-hid2hci' [kdenlive]='kdebase-meta dvdauthor frei0r-plugins breeze breeze-gtk qt5ct qt5-styleplugins'
 ) # }
@@ -114,6 +114,7 @@ declare -A PKG_EXT=(
 _welcome="\nThis will help you get $DIST installed and setup on your system.\n\nIf you are unsure about a section the default option will be listed or\nthe first selected item will be the default.\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the option number.\n - Use [Space] to toggle check boxes and [Enter] to accept.\n - Switch between fields using [Tab] or the arrow keys.\n - Use [Page Up] and [Page Down] to jump whole pages\n - Press the highlighted key of an option to select it.\n"
 _keymap="\nPick which keymap to use for the system from the list below\n\nThis is used once a graphical environment is running (Xorg).\n\nSystem default: us"
 _vconsole="\nSelect the console keymap, the console is the tty shell you reach before starting a graphical environment (Xorg).\n\nIts keymap is seperate from the one used by the graphical environments, though many do use the same such as 'us' English.\n\nSystem default: us"
+_prep="\nThis is the installer main menu, once a step is complete you will return here.\n\nOn successful completion of a step the cursor will be advanced to the next step\nOn failure the cursor will be placed on the step required to advance (when possible).\n\nSteps beginning with an asterix (*) are required.\n\nOnce you're happy with the choices and the required steps are complete, selecting the final step will begin the install."
 _device="\nSelect a device to use from the list below.\n\nDevices (/dev) are the available drives on the system. /sda, /sdb, /sdc ..."
 _resize="\nSelect a new filesystem size in MB, a new partition will be created from the free space but will be left unformatted.\nThe lowest size is just enough to fit the currently in use space on the partition while the default is set to split the free space evenly.\n\nUse Tab or the arrow keys move the cursor between the buttons and the value, when the cursor is on the value, you can edit it by:\n\n - left/right cursor movement to select a digit to modify\n - +/-  characters to increment/decrement the digit by one\n - 0 through 9 to set the digit to the given value\n\nSome keys are also recognized in all cursor positions:\n\n - Home/End set the value to its maximum or minimum\n - Pageup/Pagedown increment the value so that the slider moves by one column."
 _mount="\nUse [Space] to toggle mount options from below, press [Enter] when done to confirm selection.\n\nNot selecting any and confirming will run an automatic mount."
@@ -135,6 +136,7 @@ _sessions="\nUse [Space] to toggle available sessions, use [Enter] to accept the
 _login="\nSelect which of your session choices to use for the initial login.\n\nYou can be change this later by editing your ~/.xinitrc"
 _autologin="\nDo you want autologin enabled for USER?\n\nIf so the following two files will be created (disable autologin by removing them):\n\n - /home/USER/RC (run startx when logging in on tty1)\n - /etc/systemd/system/getty@tty1.service.d/autologin.conf (login USER without password)\n"
 _packages="\nUse [Space] to move a package into the selected area and press [Enter] to accept the selection.\n\nPackages may be installed by your DE/WM (if any), or for the packages you select."
+_usercmd="\nEnter command to be run in the newly installed system (chroot) below.\n\nAn example use case would be installing packages or editing files not offered in the menus.\n\nBecause the command will be run in a chroot not every command will function correctly, additionally the command will not be sanity checked, it's your system so exercise caution.\n\nMore than one command may be run using standard bash syntax.\n"
 _edit="\nBefore exiting you can select configuration files to review/change.\n\nIf you need to make other changes with the drives still mounted, use Ctrl-z to pause the installer, when finished type 'fg' and [Enter] to resume the installer, if you want to avoid the automatic reboot using Ctrl-c will cleanly exit."
 
 # LUKS
@@ -174,21 +176,22 @@ _lvmerrlvsize="\nInvalid value Entered.\n\nMust be a numeric value with 'M' (meg
 
 main()
 {
-       (( SEL < 12 )) && (( SEL++ ))
+       (( SEL < 13 )) && (( SEL++ ))
        tput civis
        dialog --backtitle "$DIST Installer - $SYS - v$VER" --title " Prepare " --default-item $SEL --cancel-label 'Exit' --menu "$_prep" 0 0 0 \
                1 "Show device tree" \
-               2 "Partitioning helpers" \
-               3 "LUKS encryption setup" \
-               4 "Logical volume management setup" \
-               5 "* Mount system partitions" \
-               6 "* Select system bootloader" \
-               7 "* Create user and password" \
-               8 "* Basic system configuration" \
+               2 "Partitioning" \
+               3 "LUKS encryption" \
+               4 "Logical volume management" \
+               5 "* Mount partitions" \
+               6 "* Select bootloader" \
+               7 "* Username and password" \
+               8 "* System configuration" \
                9 "Select window manager or desktop" \
                10 "Select additional packages" \
-               11 "View configuration selections" \
-               12 "* Confirm choices and start the installation" 2> "$ANS"
+               11 "Run a command on the installed system" \
+               12 "View configuration and command selections" \
+               13 "* Confirm choices and start the installation" 2> "$ANS"
 
        read -r SEL < "$ANS"
        [[ -z $WARN && $SEL =~ (2|5) ]] && { msg "Data Warning" "$_warn"; WARN=true; }
@@ -203,8 +206,9 @@ main()
                8) prechecks 2 && { select_config || (( SEL-- )); } ;;
                9) prechecks 3 && { select_sessions || (( SEL-- )); } ;;
                10) prechecks 3 && { select_packages || (( SEL-- )); } ;;
-               11) prechecks 3 && select_show ;;
-               12) prechecks 3 && install_main ;;
+               11) prechecks 3 && select_usercmd ;;
+               12) prechecks 3 && select_show ;;
+               13) prechecks 3 && install_main ;;
                *) yesno "Exit" "\nUnmount partitions (if any) and exit the installer?\n" && die 0
        esac
 }
@@ -252,6 +256,8 @@ select_show()
   Hostname: ${MYHOST:-none}
   Timezone: ${ZONE:-none}/${SUBZ:-none}
 
+  Chroot cmd: ${USER_CMD:-none}
+
 ------------ USER CONFIGURATION ---------------
 
   Username:      ${NEWUSER:-none}
@@ -270,8 +276,6 @@ select_show()
 
 select_login()
 {
-       [[ $INSTALL_WMS ]] || return 0
-
        AUTOLOGIN='' # no autologin unless using xinit
 
        dlg LOGIN_TYPE menu "Login Management" "\nSelect what kind of login management to use." \
@@ -282,8 +286,8 @@ select_login()
                "sddm"    "Simple desktop display manager" || return 1
 
        case $LOGIN_TYPE in
-               ly) EDIT_FILES[login]="/etc/ly/config.ini" ;;
                gdm|sddm) EDIT_FILES[login]="" ;;
+               ly) EDIT_FILES[login]="/etc/ly/config.ini" ;;
                lightdm) EDIT_FILES[login]="/etc/lightdm/lightdm.conf /etc/lightdm/lightdm-gtk-greeter.conf" ;;
                xinit) EDIT_FILES[login]="/home/$NEWUSER/.xinitrc /home/$NEWUSER/.xprofile"
                        if (( $(wc -w <<< "$INSTALL_WMS") > 1 )); then
@@ -414,14 +418,20 @@ select_keymap()
        return 0
 }
 
+select_usercmd()
+{
+       dlg USER_CMD input "User Command" "$_usercmd" "$USER_CMD" nolimit
+}
+
 select_sessions()
 {
        LOGIN_CHOICES=''
        dlg INSTALL_WMS check "Sessions" "$_sessions\n" \
-               openbox "A lightweight, powerful, and highly configurable stacking wm" "$(ofn openbox "${INSTALL_WMS[*]}")" \
                i3-gaps "A fork of i3wm with more features including gaps" "$(ofn i3-gaps "${INSTALL_WMS[*]}")" \
+               openbox "A lightweight, powerful, and highly configurable stacking wm" "$(ofn openbox "${INSTALL_WMS[*]}")" \
                dwm "A dynamic WM for X that manages windows in tiled, floating, or monocle layouts" "$(ofn dwm "${INSTALL_WMS[*]}")" \
                bspwm "A tiling wm that represents windows as the leaves of a binary tree" "$(ofn bspwm "${INSTALL_WMS[*]}")" \
+               jwm "A lightweight window manager for Xorg written in C" "$(ofn jwm "${INSTALL_WMS[*]}")" \
                xfce4 "A lightweight and modular desktop environment based on gtk+2/3" "$(ofn xfce4 "${INSTALL_WMS[*]}")" \
                awesome "A customized Awesome WM session created by @elanapan" "$(ofn awesome "${INSTALL_WMS[*]}")" \
                fluxbox "A lightweight and highly-configurable window manager" "$(ofn fluxbox "${INSTALL_WMS[*]}")" \
@@ -430,10 +440,9 @@ select_sessions()
                cinnamon "A desktop environment combining traditional desktop with modern effects" "$(ofn cinnamon "${INSTALL_WMS[*]}")"
 
        [[ $INSTALL_WMS ]] || return 0
-
-       WM_PKGS="${INSTALL_WMS/dwm/}" # remove dwm from package list
-       WM_PKGS="${WM_PKGS//  / }"    # remove double spaces
-       WM_PKGS="${WM_PKGS# }"        # remove leading space
+       WM_PKGS="${INSTALL_WMS/dwm/}"
+       WM_PKGS="${WM_PKGS//  / }"
+       WM_PKGS="${WM_PKGS# }"
 
        for i in $INSTALL_WMS; do
                LOGIN_CHOICES+="$i - "
@@ -566,11 +575,11 @@ part_menu()
                choice=""
                dlg choice menu "Edit Partitions" "$_part\n\n$(lsblk -no NAME,MODEL,SIZE,TYPE,FSTYPE $device)" \
                        "auto"   "Whole device automatic partitioning" \
-                       "shrink" "Shrink an existing ext or ntfs partition" \
                        "cfdisk" "Curses based variant of fdisk" \
                        "parted" "GNU partition editor" \
                        "fdisk"  "Dialog-driven creation and manipulation of partitions" \
                        "done"   "Return to the main menu"
+                       # "shrink" "Shrink an existing ext or ntfs partition" \
 
                if [[ -z $choice || $choice == 'done' ]]; then
                        return 0
@@ -619,20 +628,23 @@ part_auto()
 
        msg "Auto Partition" "\nRemoving partitions on $device and setting table to $table\n" 1
 
-       dev_info="$(parted -s "$device" print)"
+       dev_info="$(parted -s "$device" print 2> /dev/null)"
 
        swapoff -a
        while read -r PART; do
-               parted -s "$device" rm "$PART" > /dev/null 2>&1
+               parted -s "$device" rm "$PART" > /dev/null 2> "$ERR"
+               errshow 0 "parted -s $device rm $PART" || return 1
        done <<< "$(awk '/^ [1-9][0-9]?/ {print $1}' <<< "$dev_info" | sort -r)"
 
-       [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$table" ]] && parted -s "$device" mklabel "$table" > /dev/null 2>&1
+       [[ $(awk '/Table:/ {print $3}' <<< "$dev_info") != "$table" ]] && parted -s "$device" mklabel "$table" > /dev/null 2> "$ERR"
 
        msg "Auto Partition" "\nCreating a 512M $boot_fs boot partition.\n" 1
        if [[ $SYS == "BIOS" ]]; then
-               parted -s "$device" mkpart primary "$boot_fs" 1MiB 513MiB > /dev/null 2>&1
+               parted -s "$device" mkpart primary "$boot_fs" 1MiB 513MiB > /dev/null 2> "$ERR"
+               errshow 0 "parted -s $device mkpart primary $boot_fs 1MiB 513MiB" || return 1
        else
-               parted -s "$device" mkpart ESP "$boot_fs" 1MiB 513MiB > /dev/null 2>&1
+               parted -s "$device" mkpart ESP "$boot_fs" 1MiB 513MiB > /dev/null 2> "$ERR"
+               errshow 0 "parted -s $device mkpart ESP $boot_fs 1MiB 513MiB" || return 1
        fi
 
        sleep 0.5
@@ -640,16 +652,20 @@ part_auto()
        AUTO_BOOT_PART=$(lsblk -lno NAME,TYPE "$device" | awk 'NR==2 {print "/dev/" $1}')
 
        if [[ $SYS == "BIOS" ]]; then
-               mkfs.ext4 -q "$AUTO_BOOT_PART" > /dev/null 2>&1
+               mkfs.ext4 -q "$AUTO_BOOT_PART" > /dev/null 2> "$ERR"
+               errshow 0 "mkfs.ext4 -q $AUTO_BOOT_PART" || return 1
        else
-               mkfs.vfat -F32 "$AUTO_BOOT_PART" > /dev/null 2>&1
+               mkfs.vfat -F32 "$AUTO_BOOT_PART" > /dev/null 2> "$ERR"
+               errshow 0 "mkfs.vfat -F32 $AUTO_BOOT_PART" || return 1
        fi
 
        msg "Auto Partition" "\nCreating a $size ext4 root partition.\n" 0
-       parted -s "$device" mkpart primary ext4 513MiB 100% > /dev/null 2>&1
+       parted -s "$device" mkpart primary ext4 513MiB 100% > /dev/null 2> "$ERR"
+       errshow 0 "parted -s $device mkpart primary ext4 513MiB 100%" || return 1
        sleep 0.5
        AUTO_ROOT_PART="$(lsblk -lno NAME,TYPE "$device" | awk 'NR==3 {print "/dev/" $1}')"
-       mkfs.ext4 -q "$AUTO_ROOT_PART" > /dev/null 2>&1
+       mkfs.ext4 -q "$AUTO_ROOT_PART" > /dev/null 2> "$ERR"
+       errshow 0 "mkfs.ext4 -q $AUTO_ROOT_PART" || return 1
        sleep 0.5
        msg "Auto Partition" "\nProcess complete.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE "$device")\n"
 }
@@ -686,7 +702,7 @@ part_shrink()
                                case "$fs" in
                                        ntfs)
                                                if ntfsresize -fc "$part"; then
-                                                       ntfsresize -ff --size $(( (size * 1024) / 1000 ))k "$part" 2> $ERR # k=10^3 bytes
+                                                       ntfsresize -ff --size $(( (size * 1024) / 1000 ))k "$part" 2> "$ERR" # k=10^3 bytes
                                                        errshow "ntfsresize -f -s $(( (size * 1024) / 1000 ))k $part" || return 1
                                                else
                                                        msg "Resize" "\nThe ntfs partition $part cannot be resized because it is scheduled for a consistency check.\n\nTo do a consistency check in windows open command prompt as admin and run:\n\n\tchkdsk /f /r /x\n"
@@ -695,7 +711,7 @@ part_shrink()
                                                ;;
                                        *)
                                                e2fsck -f "$part"; sleep 0.5
-                                               resize2fs -f "$part" ${size}K 2> $ERR # K=2^10 bytes
+                                               resize2fs -f "$part" ${size}K 2> "$ERR" # K=2^10 bytes
                                                errshow "resize2fs -f $part ${size}K" || return 1
                                                ;;
                                esac
@@ -704,10 +720,10 @@ part_shrink()
                                (( size++ ))
                                sleep 0.5
                                if [[ $devsize == "$end" ]]; then
-                                       parted -s "$device" mkpart primary ext4 ${size}KiB 100% 2> $ERR
+                                       parted -s "$device" mkpart primary ext4 ${size}KiB 100% 2> "$ERR"
                                        errshow "parted -s $device mkpart primary ext4 ${size}KiB 100%" || return 1
                                else
-                                       parted -s "$device" mkpart primary ext4 ${size}KiB ${end}KiB 2> $ERR
+                                       parted -s "$device" mkpart primary ext4 ${size}KiB ${end}KiB 2> "$ERR"
                                        errshow "parted -s $device mkpart primary ext4 ${size}KiB ${end}KiB" || return 1
                                fi
                                msg "Resize Complete" "\n$part has been successfully resized to $((size / 1024))M.\n" 1
@@ -725,6 +741,7 @@ part_shrink()
 part_find()
 {
        local regexp="$1" err=''
+       local pts dev size isize ptcount=0
 
        # string of partitions as /TYPE/PART SIZE.. eg. /dev/sda1 256G
        if [[ $IGNORE_DEV ]]; then
@@ -735,10 +752,19 @@ part_find()
 
        # ensure we have enough partitions for the system and action were trying to do
        COUNT=$(wc -l <<< "$PARTS")
+
+       while read -r dev size; do  # walk partition list and skip ones that are too small
+               [[ $dev && $size ]] || continue
+               size_t="${size: -1:1}"
+               isize=${size:0:-1}
+               isize=${isize%.*}
+               [[ $size_t == 'K' || ($size_t == 'M' && $isize -lt 100) ]] || { pts+="$dev $size "; (( ptcount++ )); }
+       done <<< "$PARTS"
+
        case "$regexp" in
-               'part|lvm|crypt') [[ $COUNT -lt 1 || ($SYS == 'UEFI' && $COUNT -lt 2) ]] && err="$_errpart" ;;
-               'part|crypt') (( COUNT < 1 )) && err="$_lvmerr" ;;
-               'part|lvm') (( COUNT < 2 )) && err="$_lukserr" ;;
+               'part|lvm|crypt') [[ $ptcount -lt 1 || ($SYS == 'UEFI' && $COUNT -lt 2) ]] && err="$_errpart" ;;
+               'part|crypt') (( ptcount < 1 )) && err="$_lvmerr" ;;
+               'part|lvm') (( ptcount < 2 )) && err="$_lukserr" ;;
        esac
 
        if [[ $err ]]; then
@@ -752,14 +778,14 @@ part_find()
 part_swap()
 {
        if [[ $1 == "$MNT/swapfile" && $SWAP_SIZE ]]; then
-               fallocate -l $SWAP_SIZE "$1" 2> $ERR
+               fallocate -l $SWAP_SIZE "$1" 2> "$ERR"
                errshow "fallocate -l $SWAP_SIZE $1"
-               chmod 600 "$1" 2> $ERR
+               chmod 600 "$1" 2> "$ERR"
                errshow "chmod 600 $1"
        fi
-       mkswap "$1" > /dev/null 2> $ERR
+       mkswap "$1" > /dev/null 2> "$ERR"
        errshow "mkswap $1"
-       swapon "$1" > /dev/null 2> $ERR
+       swapon "$1" > /dev/null 2> "$ERR"
        errshow "swapon $1"
        return 0
 }
@@ -787,7 +813,7 @@ part_format()
        local part="$1" fs="$2" delay="$3"
 
        msg "Format" "\nFormatting $part as $fs\n" 0
-       mkfs.$fs ${FS_CMD_FLAGS[$fs]} "$part" > /dev/null 2> $ERR
+       mkfs.$fs ${FS_CMD_FLAGS[$fs]} "$part" > /dev/null 2> "$ERR"
        errshow "mkfs.$fs ${FS_CMD_FLAGS[$fs]} "$part"" || return 1
        FORMATTED+="$part "
        sleep $delay
@@ -899,6 +925,7 @@ part_mountconf()
 
 mount_menu()
 {
+       msg "Mount Menu" "\nGathering device and partition information.\n" 1
        no_bg_install || return 0
        lvm_detect
        umount_dir "$MNT"
@@ -908,7 +935,7 @@ mount_menu()
        select_root_partition || { ROOT_PART=''; return 1; }
        select_boot_partition || { BOOT_PART=''; return 1; }
        if [[ $BOOT_PART ]]; then
-               part_mount "$BOOT_PART" "/$BOOTDIR" && SEP_BOOT=true || return 1
+               part_mount "$BOOT_PART" "/boot" && SEP_BOOT=true || return 1
                part_bootdev
        fi
        select_swap || return 1
@@ -921,12 +948,14 @@ select_swap()
 {
        local pts dev size isize
 
-       while read -r dev size; do  # walk partition list and skip ones that are too small/big for swap
-               size_t="${size: -1:1}"
-               isize=${size:0:-1}
-               isize=${isize%.*}
-               [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 16) || ($size_t == 'M' && $isize -lt 100) ]] || pts+="$dev $size "
-       done <<< "$PARTS"
+       if (( COUNT )) ; then
+               while read -r dev size; do  # walk partition list and skip ones that are too small/big for swap
+                       size_t="${size: -1:1}"
+                       isize=${size:0:-1}
+                       isize=${isize%.*}
+                       [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 16) || ($size_t == 'M' && $isize -lt 100) ]] || pts+="$dev $size "
+               done <<< "$PARTS"
+       fi
 
        dlg SWAP_PART menu "Swap Setup" "\nSelect whether to use a swapfile, swap partition, or none." \
                "none" "Don't allocate any swap space" \
@@ -999,7 +1028,7 @@ select_filesystem()
        [[ $cur && $part == "$AUTO_ROOT_PART" ]] && return 0
 
        until [[ $fs ]]; do
-               if [[ $cur && $FORMATTED == *"$part"* ]]; then
+               if [[ $cur && $part != "$ROOT_PART" ]]; then
                        dlg fs menu "Filesystem" "$txt\nCurrent:  $cur" skip - ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs - || return 1
                else
                        dlg fs menu "Filesystem" "$txt" ext4 - ext3 - ext2 - vfat - ntfs - f2fs - jfs - xfs - nilfs2 - reiserfs - || return 1
@@ -1019,12 +1048,14 @@ select_boot_partition()
                        BOOT_PART="$AUTO_BOOT_PART"
                        return 0
                else
-                       while read -r dev size; do  # walk partition list and skip ones that are too small/big for boot
-                               size_t="${size: -1:1}"
-                               isize=${size:0:-1}
-                               isize=${isize%.*}
-                               [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 2) || ($size_t == 'M' && $isize -lt 100) ]] || { pts+="$dev $size "; (( ptcount++ )); }
-                       done <<< "$PARTS"
+                       if (( COUNT )); then
+                               while read -r dev size; do  # walk partition list and skip ones that are too small/big for boot
+                                       size_t="${size: -1:1}"
+                                       isize=${size:0:-1}
+                                       isize=${isize%.*}
+                                       [[ $size_t =~ [KT] || ($size_t == 'G' && $isize -gt 2) || ($size_t == 'M' && $isize -lt 100) ]] || { pts+="$dev $size "; (( ptcount++ )); }
+                               done <<< "$PARTS"
+                       fi
 
                        case "$SYS" in
                                UEFI)
@@ -1036,11 +1067,15 @@ select_boot_partition()
                                        [[ $BOOT_PART ]] || return 1
                                        ;;
                                BIOS)
-                                       (( ptcount == 0 )) && return 0
                                        if [[ $LUKS && ! $LVM ]]; then
-                                               dlg BOOT_PART menu "Boot Partition" "$_biosluks" $pts
+                                               case "$ptcount" in
+                                                       0) msg "Boot Partition" "\nLUKS without LVM requires a separate boot partition.\nNo partitions available that meet size requirements!!\n\nReturning to the main menu.\n" 2; return 1 ;;
+                                                       1) msg "Boot Partition" "\nOnly one partition available that meets size requirements.\n" 1; BOOT_PART="$(awk 'NF > 0 {print $1}' <<< "$pts")" ;;
+                                                       *) dlg BOOT_PART menu "Boot Partition" "$_biosluks" $pts ;;
+                                               esac
                                                [[ $BOOT_PART ]] || return 1
                                        else
+                                               (( ptcount == 0 )) && return 0
                                                dlg BOOT_PART menu "Boot Partition" "$_bios" "skip" "no separate boot" $pts
                                                [[ -z $BOOT_PART || $BOOT_PART == "skip" ]] && { BOOT_PART=''; return 0; }
                                        fi
@@ -1100,11 +1135,13 @@ select_extra_partitions()
        local part dev size
 
        # walk partition list and skip ones that are too small to be usable
-       while read -r dev size; do
-               [[ ${size: -1:1} =~ [KM] ]] && part_countdec "$dev"
-       done <<< "$PARTS"
+       if (( COUNT )); then
+               while read -r dev size; do
+                       [[ ${size: -1:1} =~ [KM] ]] && part_countdec "$dev"
+               done <<< "$PARTS"
+       fi
 
-       while (( COUNT > 0 )); do
+       while (( COUNT )); do
                part=''
                dlg part menu 'Mount Extra' "$_expart" 'done' 'finish mounting step' $PARTS || break
                if [[ $part == 'done' ]]; then
@@ -1127,18 +1164,22 @@ select_extra_partitions()
 install_main()
 {
        install_base
-       genfstab -U "$MNT" > "$MNT/etc/fstab" 2> $ERR 2>&1
+       genfstab -U "$MNT" > "$MNT/etc/fstab" 2> "$ERR"
        errshow 1 "genfstab -U $MNT > $MNT/etc/fstab"
        [[ -f $MNT/swapfile ]] && sed -i "s~${MNT}~~" "$MNT/etc/fstab"
        install_packages
-       # video driver tearfree configs, MUST be done after package install to support nvidia
-       install_tearfree_conf "$MNT/etc/X11/xorg.conf.d"
+       # tear free configs, MUST be done after package install for nvidia
+       [[ $TEARFREE ]] && install_tearfree_conf "$MNT/etc/X11/xorg.conf.d"
        install_mkinitcpio
        install_boot
        chrun "hwclock --systohc --utc" || chrun "hwclock --systohc --utc --directisa"
        install_user
        install_login
        chrun "chown -Rf $NEWUSER:users /home/$NEWUSER"
+       if [[ "$USER_CMD" ]]; then
+               chrun "$USER_CMD" 2> "$ERR" 2>&1
+               errshow 0 "$USER_CMD"
+       fi
 
        while :; do
                dlg choice menu "Finalization" "$_edit" \
@@ -1156,18 +1197,18 @@ install_main()
                        login      "${EDIT_FILES[login]}"
 
                if [[ -z $choice || $choice == 'finished' ]]; then
-                       [[ $DEBUG == true && -r $DBG ]] && ${EDITOR:-vim} $DBG
-                       clear && die 127
+                       [[ $DEBUG == true && -r $DBG ]] && ${EDITOR:-vim} "$DBG"
+                       clear
+                       die 127
                else
                        local exists=''
                        for f in ${EDIT_FILES[$choice]}; do
-                               [[ -e ${MNT}$f ]] && exists+=" ${MNT}$f"
+                               if [[ -e ${MNT}$f ]]; then
+                                       ${EDITOR:-vim} "${MNT}$f"
+                               else
+                                       msg "File Missing" "\nThe file(s) selected do not exist:\n\n${MNT}$f\n"
+                               fi
                        done
-                       if [[ $exists ]]; then
-                               ${EDITOR:-vim} -O $exists
-                       else
-                               msg "File Missing" "\nThe file(s) selected do not exist:\n\n${EDIT_FILES[$choice]}\n"
-                       fi
                fi
        done
 }
@@ -1200,7 +1241,7 @@ install_base()
        [[ $DIST != "ArchLabs" ]] || sed -i "s/ArchLabs/$DIST/g" "$MNT/etc/"{lsb-release,os-release}
 
        # vmlinuz, if this isn't copied the standard kernel may fail mkinitcpio
-       cp -vf "$RUN/x86_64/vmlinuz" "$MNT/boot/vmlinuz-linux" 2> $ERR 2>&1
+       cp -vf "$RUN/x86_64/vmlinuz" "$MNT/boot/vmlinuz-linux" 2> "$ERR" 2>&1
        errshow 1 "cp -vf $RUN/x86_64/vmlinuz $MNT/boot/vmlinuz-linux"
 
        # copy network settings
@@ -1259,12 +1300,12 @@ install_boot()
        if [[ $SYS == 'UEFI' ]]; then
                # remove our old install and generic BOOT/ dir
                echo "Removing conflicting boot directories"
-               find "$MNT/$BOOTDIR/EFI/" -maxdepth 1 -mindepth 1 -iname "$DIST" -type d -delete -printf "remove %p\n"
-               find "$MNT/$BOOTDIR/EFI/" -maxdepth 1 -mindepth 1 -iname 'BOOT' -type d -delete -printf "remove %p\n"
+               find "$MNT/boot/EFI/" -maxdepth 1 -mindepth 1 -iname "$DIST" -type d -delete -printf "remove %p\n"
+               find "$MNT/boot/EFI/" -maxdepth 1 -mindepth 1 -iname 'BOOT' -type d -delete -printf "remove %p\n"
        fi
 
        prerun_$BOOTLDR
-       chrun "${BCMDS[$BOOTLDR]}" 2> $ERR 2>&1
+       chrun "${BCMDS[$BOOTLDR]}" 2> "$ERR" 2>&1
        errshow 1 "${BCMDS[$BOOTLDR]}"
 
        if [[ -d $MNT/hostrun ]]; then
@@ -1276,12 +1317,12 @@ install_boot()
 
        if [[ $SYS == 'UEFI' ]]; then
                # some UEFI firmware requires a generic esp/BOOT/BOOTX64.EFI
-               mkdir -pv "$MNT/$BOOTDIR/EFI/BOOT"
+               mkdir -pv "$MNT/boot/EFI/BOOT"
                case "$BOOTLDR" in
-                       grub) cp -fv "$MNT/$BOOTDIR/EFI/$DIST/grubx64.efi" "$MNT/$BOOTDIR/EFI/BOOT/BOOTX64.EFI" ;;
-                       syslinux) cp -rf "$MNT/$BOOTDIR/EFI/syslinux/"* "$MNT/$BOOTDIR/EFI/BOOT/" && cp -f "$MNT/$BOOTDIR/EFI/syslinux/syslinux.efi" "$MNT/$BOOTDIR/EFI/BOOT/BOOTX64.EFI" ;;
-                       refind-efi) sed -i '/#extra_kernel_version_strings/ c extra_kernel_version_strings linux-hardened,linux-zen,linux-lts,linux' "$MNT/$BOOTDIR/EFI/refind/refind.conf"
-                               cp -fv "$MNT/$BOOTDIR/EFI/refind/refind_x64.efi" "$MNT/$BOOTDIR/EFI/BOOT/BOOTX64.EFI" ;;
+                       grub) cp -fv "$MNT/boot/EFI/$DIST/grubx64.efi" "$MNT/boot/EFI/BOOT/BOOTX64.EFI" ;;
+                       syslinux) cp -rf "$MNT/boot/EFI/syslinux/"* "$MNT/boot/EFI/BOOT/" && cp -f "$MNT/boot/EFI/syslinux/syslinux.efi" "$MNT/boot/EFI/BOOT/BOOTX64.EFI" ;;
+                       refind-efi) sed -i '/#extra_kernel_version_strings/ c extra_kernel_version_strings linux-hardened,linux-zen,linux-lts,linux' "$MNT/boot/EFI/refind/refind.conf"
+                               cp -fv "$MNT/boot/EFI/refind/refind_x64.efi" "$MNT/boot/EFI/BOOT/BOOTX64.EFI" ;;
                esac
        fi
 
@@ -1291,33 +1332,31 @@ install_boot()
 install_user()
 {
        local groups='audio,video,floppy,log,network,rfkill,scanner,storage,optical,power,wheel'
-       if [[ -e $MNT/etc/X11/xorg.conf.d/20-nvida.conf && -e $MNT/usr/bin/optirun ]]; then
-               groups+=',bumblebee'
-       fi
+       [[ -e $MNT/etc/X11/xorg.conf.d/20-nvida.conf && -e $MNT/usr/bin/optirun ]] && groups+=',bumblebee'
 
        rm -f "$MNT/root/.zlogin"  # remove welcome message
 
-       chrun "chpasswd <<< 'root:$ROOT_PASS'" 2> $ERR 2>&1
+       chrun "chpasswd <<< 'root:$ROOT_PASS'" 2> "$ERR" 2>&1
        errshow 1 "set root password"
        if [[ $MYSHELL != 'zsh' ]]; then # root uses zsh by default
-               chrun "usermod -s /bin/$MYSHELL root" 2> $ERR 2>&1
+               chrun "usermod -s /bin/$MYSHELL root" 2> "$ERR" 2>&1
                errshow 1 "usermod -s /bin/$MYSHELL root"
                # copy the default mkshrc to /root if it was selected
                [[ $MYSHELL == 'mksh' ]] && cp -fv "$MNT/etc/skel/.mkshrc" "$MNT/root/.mkshrc"
        fi
 
        echo "Creating new user $NEWUSER and setting password"
-       chrun "useradd -m -u 1000 -g users -G $groups -s /bin/$MYSHELL $NEWUSER" 2> $ERR 2>&1
+       chrun "useradd -m -u 1000 -g users -G $groups -s /bin/$MYSHELL $NEWUSER" 2> "$ERR" 2>&1
        errshow 1 "useradd -m -u 1000 -g users -G $groups -s /bin/$MYSHELL $NEWUSER"
-       chrun "chpasswd <<< '$NEWUSER:$USER_PASS'" 2> $ERR 2>&1
+       chrun "chpasswd <<< '$NEWUSER:$USER_PASS'" 2> "$ERR" 2>&1
        errshow 1 "set $NEWUSER password"
 
-       if [[ $INSTALL_WMS == *dwm* ]];then
+       if [[ $INSTALL_WMS == *dwm* ]]; then
                install_suckless "/home/$NEWUSER" chroot
                [[ $INSTALL_WMS == 'dwm' ]] && rm -rf "$MNT/home/$NEWUSER/.config/xfce4"
        fi
-
-       [[ $INSTALL_WMS != *bspwm* && $INSTALL_WMS != *openbox* ]] && rm -rf "$MNT/home/$NEWUSER/.config/"{jgmenu,tint2}
+       [[ $INSTALL_WMS == *jwm* ]] && sed '7,14d; s/xlock -mode blank/i3-lock-fancy -p/g; s/root:1/rofi_run/g' "$MNT/etc/system.jwmrc" > "$MNT/home/$NEWUSER/.jwmrc"
+       [[ $INSTALL_WMS =~ (bspwm|openbox) ]] || rm -rf "$MNT/home/$NEWUSER/.config/"{jgmenu,tint2}
        [[ $USER_PKGS != *geany* ]] && rm -rf "$MNT/home/$NEWUSER/.config/geany"
        [[ $MYSHELL != 'bash' ]] && rm -rf "$MNT/home/$NEWUSER/.bash"*
        [[ $MYSHELL != 'zsh' ]] && rm -rf "$MNT/home/$NEWUSER/.z"*
@@ -1329,9 +1368,6 @@ install_user()
                sed -i '/super/d; /compton/d' "$MNT/home/$NEWUSER/.xprofile" "$MNT/root/.xprofile"
        fi
 
-       # create user home directories (Music, Documents, Downloads, etc..)
-       chrun 'xdg-user-dirs-update'
-
        return 0
 }
 
@@ -1353,7 +1389,7 @@ install_login()
                                EOF
                        fi
                        rm -rf "$serv" "$MNT/home/$NEWUSER/.xinitrc"
-                       chrun "systemctl enable $LOGIN_TYPE.service" 2> $ERR 2>&1
+                       chrun "systemctl enable $LOGIN_TYPE.service" 2> "$ERR" 2>&1
                        errshow 1 "systemctl enable $LOGIN_TYPE.service"
                        ${LOGIN_TYPE}_config
                        ;;
@@ -1368,7 +1404,7 @@ install_login()
                                sed -i "s/root/${NEWUSER}/g" $serv/autologin.conf
                                cat > "$MNT/home/$NEWUSER/$LOGINRC" <<- EOF
                                # automatically run startx when logging in on tty1
-                               [ -z "\$DISPLAY" ] && [ \$XDG_VTNR -eq 1 ] && startx
+                               [ \$XDG_VTNR -eq 1 ] && exec startx
                                EOF
                        else
                                rm -rf $serv
@@ -1386,28 +1422,20 @@ install_packages()
                rmpkg+="archlabs-installer "
        fi
 
-       if [[ $VM ]] && dmesg | grep -qi 'vbox'; then
-               inpkg+="virtualbox-guest-utils "
-               case "$KERNEL" in
-                       linux) inpkg+="virtualbox-guest-modules-arch " ;;
-                       *) inpkg+="virtualbox-guest-modules-dkms ${KERNEL}-headers " ;;
-               esac
-       fi
-
        if [[ $MYSHELL == 'zsh' ]]; then
                inpkg+="zsh-completions "
        else
                rmpkg+="zsh "
        fi
 
-       if [[ $INSTALL_WMS =~ (openbox|bspwm|i3-gaps|fluxbox) ]]; then
+       if [[ $INSTALL_WMS =~ (openbox|bspwm|i3-gaps|fluxbox|jwm|awesome) ]]; then
                inpkg+="$WM_BASE_PKGS "
        elif [[ $INSTALL_WMS == 'dwm' ]]; then # dwm only needs a very limited package set
                inpkg+="nitrogen polkit-gnome gnome-keyring dunst "
        fi
 
        # update and install crucial packages first to avoid issues
-       chrun "pacman -Syyu $KERNEL $BASE_PKGS base-devel ${LOGIN_PKGS[$LOGIN_TYPE]} $MYSHELL --noconfirm --needed" 2> $ERR 2>&1
+       chrun "pacman -Syyu $KERNEL $BASE_PKGS base-devel ${LOGIN_PKGS[$LOGIN_TYPE]} $MYSHELL --noconfirm --needed" 2> "$ERR" 2>&1
        errshow 1 "pacman -Syyu $KERNEL $BASE_PKGS base-devel ${LOGIN_PKGS[$LOGIN_TYPE]} $MYSHELL --noconfirm --needed"
 
        # remove the packages we don't want on the installed system
@@ -1417,22 +1445,29 @@ install_packages()
        chrun "pacman -S iputils $UCODE --noconfirm"
 
        # install the packages chosen throughout the install
-       chrun "pacman -S $inpkg --needed --noconfirm" 2> $ERR 2>&1
+       chrun "pacman -S $inpkg --needed --noconfirm" 2> "$ERR" 2>&1
        errshow 1 "pacman -S $inpkg --needed --noconfirm"
 
        # bootloader packages
        if [[ $BOOTLDR == 'grub' ]]; then
                [[ $SYS == 'UEFI' ]] && local efib="efibootmgr"
-               chrun "pacman -S os-prober grub $efib --needed --noconfirm" 2> $ERR 2>&1
+               chrun "pacman -S os-prober grub $efib --needed --noconfirm" 2> "$ERR" 2>&1
                errshow 1 "pacman -S os-prober grub $efib --needed --noconfirm"
        elif [[ $BOOTLDR == 'refind-efi' ]]; then
-               chrun "pacman -S refind-efi efibootmgr --needed --noconfirm" 2> $ERR 2>&1
+               chrun "pacman -S refind-efi efibootmgr --needed --noconfirm" 2> "$ERR" 2>&1
                errshow 1 "pacman -S refind-efi efibootmgr --needed --noconfirm"
        elif [[ $SYS == 'UEFI' ]]; then
-               chrun "pacman -S efibootmgr --needed --noconfirm" 2> $ERR 2>&1
+               chrun "pacman -S efibootmgr --needed --noconfirm" 2> "$ERR" 2>&1
                errshow 1 "pacman -S efibootmgr --needed --noconfirm"
        fi
 
+       if [[ $VM ]] && dmesg | grep -qi 'vbox'; then
+               case "$KERNEL" in
+                       linux) chrun "pacman -S virtualbox-guest-utils virtualbox-guest-modules-arch --needed --noconfirm" ;;
+                       *) chrun "pacman -S virtualbox-guest-utils virtualbox-guest-modules-dkms ${KERNEL}-headers --needed --noconfirm" ;;
+               esac
+       fi
+
        # allow members of the wheel group to run commands as root
        sed -i "s/# %wheel ALL=(ALL) ALL/%wheel ALL=(ALL) ALL/g" "$MNT/etc/sudoers"
 
@@ -1444,7 +1479,7 @@ install_suckless()
        local dir="$1/suckless"
        shift
 
-       if [[ $2 == 'chroot' ]]; then
+       if [[ $1 == 'chroot' ]]; then
                chrun "mkdir -pv '$dir'"
                for i in dwm dmenu st; do
                        if chrun "git clone 'https://git.suckless.org/$i' '$dir/$i'"; then
@@ -1471,7 +1506,7 @@ install_mkinitcpio()
        [[ $LUKS ]] && add="encrypt"
        [[ $LVM ]] && { [[ $add ]] && add+=" lvm2" || add+="lvm2"; }
        sed -i "s/block filesystems/block ${add} filesystems ${HOOKS}/g" "$MNT/etc/mkinitcpio.conf"
-       chrun "mkinitcpio -p $KERNEL" 2> $ERR 2>&1
+       chrun "mkinitcpio -p $KERNEL" 2> "$ERR" 2>&1
        errshow 1 "mkinitcpio -p $KERNEL"
 }
 
@@ -1524,6 +1559,7 @@ install_tearfree_conf()
                        Option      "TearFree" "true"
                EndSection
                EOF
+               cat "$xpath/20-intel.conf"
        elif lspci | grep ' VGA ' | grep -q 'AMD/ATI.*RX\|AMD/ATI.*R[579]'; then # newer RX, R5, R7, and R9 cards can use the amdgpu driver
                echo "Creating AMD Tear Free config /etc/X11/xorg.conf.d/20-amdgpu.conf"
                cat > "$xpath/20-amdgpu.conf" <<- EOF
@@ -1533,6 +1569,7 @@ install_tearfree_conf()
                        Option      "TearFree" "true"
                EndSection
                EOF
+               cat "$xpath/20-amdgpu.conf"
        elif lspci | grep ' VGA ' | grep -q 'AMD/ATI.*HD [2-6][0-9]*'; then # older HD 2xxx-6xxx cards must use the radeon driver
                echo "Creating Radeon Tear Free config /etc/X11/xorg.conf.d/20-radeon.conf"
                cat > "$xpath/20-radeon.conf" <<- EOF
@@ -1542,6 +1579,7 @@ install_tearfree_conf()
                        Option      "TearFree" "on"
                EndSection
                EOF
+               cat "$xpath/20-radeon.conf"
        elif lspci | grep ' VGA ' | grep -q 'NVIDIA'; then # nvidia cards require a bit of checking for notebook gpus
                echo "Trying nvidia driver install"
                if lspci | grep ' VGA ' | grep -q 'Intel\|AMD' && lspci | grep ' VGA ' | grep -q 'NVIDIA.*[6-9][1-8][05]M[X]\?\|NVIDIA.*Quadro.*[KMP][1-6][0-2][0]*M'; then # optimus
@@ -1558,6 +1596,8 @@ install_tearfree_conf()
                        fi
                fi
                if [[ -e $xpath/20-nvidia.conf ]]; then
+                       cat "$xpath/20-radeon.conf"
+                       echo
                        echo "NVIDIA driver installed"
                        if [[ $xpath == *"$MNT"* ]]; then
                                echo "Trying to load the driver for live session"
@@ -1573,6 +1613,14 @@ install_tearfree_conf()
                return 0
        fi
 
+       if lspci | grep ' VGA ' | grep -q 'Intel\|AMD/ATI'; then
+               if [[ $xpath == *"$MNT"* ]]; then
+                       sed -i 's/xrender/glx/g' "$MNT/etc/skel/.config/compton.conf"
+               else
+                       sed -i 's/xrender/glx/g' /etc/skel/.config/compton.conf
+               fi
+       fi
+
        # remove nvidia installer from installed system when not running nvidia gpu
        [[ $xpath == *"$MNT"* ]] && rm -rf "$MNT/usr/bin/nvidia-installer" "$MNT/var/lib/nvidia-installer"
 }
@@ -1582,19 +1630,6 @@ install_tearfree_conf()
 # these are called based on which DM is chosen after it is installed
 # additional config can be  handled here, for now only lightdm has one
 
-lightdm_config()
-{
-       cat > "$MNT/etc/lightdm/lightdm-gtk-greeter.conf" <<- EOF
-       [greeter]
-       default-user-image=/usr/share/icons/ArchLabs-Dark/64x64/places/distributor-logo-archlabs.png
-       background=/usr/share/backgrounds/archlabs/archlabs.jpg
-       theme-name=Adwaita-dark
-       icon-theme-name=Adwaita
-       font-name=DejaVu Sans Mono 11
-       position=30%,end 50%,end
-       EOF
-}
-
 ly_config()
 {
        : #TODO
@@ -1610,6 +1645,19 @@ sddm_config()
        : #TODO
 }
 
+lightdm_config()
+{
+       cat > "$MNT/etc/lightdm/lightdm-gtk-greeter.conf" <<- EOF
+       [greeter]
+       default-user-image=/usr/share/icons/ArchLabs-Dark/64x64/places/distributor-logo-archlabs.png
+       background=/usr/share/backgrounds/archlabs/archlabs.jpg
+       theme-name=Adwaita-dark
+       icon-theme-name=Adwaita
+       font-name=DejaVu Sans Mono 11
+       position=30%,end 50%,end
+       EOF
+}
+
 ###############################################################################
 # bootloader setup
 # prerun_* set up the configs needed before actually running the commands
@@ -1625,7 +1673,7 @@ setup_grub()
                BCMDS[grub]="grub-install --recheck --force --target=i386-pc $BOOT_DEV"
        else
                BCMDS[grub]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1
-               grub-install --recheck --force --target=x86_64-efi --efi-directory=/$BOOTDIR --bootloader-id=$DIST"
+               grub-install --recheck --force --target=x86_64-efi --efi-directory=/boot --bootloader-id=$DIST"
                grep -q /sys/firmware/efi/efivars /proc/mounts || mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1
        fi
 
@@ -1644,12 +1692,12 @@ prerun_grub()
        sed -i "s/GRUB_DISTRIBUTOR=.*/GRUB_DISTRIBUTOR=\"${DIST}\"/g; s/GRUB_CMDLINE_LINUX_DEFAULT=.*/GRUB_CMDLINE_LINUX_DEFAULT=\"\"/g" "$MNT/etc/default/grub"
 
        if [[ $LUKS_DEV ]]; then
-               sed -i "s~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g; s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g" "$MNT/etc/default/grub" 2> $ERR 2>&1
+               sed -i "s~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g; s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g" "$MNT/etc/default/grub" 2> "$ERR" 2>&1
                errshow 1 "sed -i 's~#GRUB_ENABLE_CRYPTODISK~GRUB_ENABLE_CRYPTODISK~g; s~GRUB_CMDLINE_LINUX=.*~GRUB_CMDLINE_LINUX=\"${LUKS_DEV}\"~g' $MNT/etc/default/grub"
        fi
 
        if [[ $SYS == 'BIOS' && $LVM && -z $SEP_BOOT ]]; then
-               sed -i "s/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g" "$MNT/etc/default/grub" 2> $ERR 2>&1
+               sed -i "s/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g" "$MNT/etc/default/grub" 2> "$ERR" 2>&1
                errshow 1 "sed -i 's/GRUB_PRELOAD_MODULES=.*/GRUB_PRELOAD_MODULES=\"lvm\"/g' $MNT/etc/default/grub"
        fi
 
@@ -1668,7 +1716,7 @@ setup_efistub()
 
 prerun_efistub()
 {
-       BCMDS[systemd-boot]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1
+       BCMDS[efistub]="mount -t efivarfs efivarfs /sys/firmware/efi/efivars > /dev/null 2>&1
                efibootmgr -v -d $BOOT_DEV -p $BOOT_PART_NUM -c -L '${DIST} Linux' -l /vmlinuz-${KERNEL} \
                -u 'root=$ROOT_PART_ID rw $([[ $UCODE ]] && printf 'initrd=\%s.img ' "$UCODE")initrd=\initramfs-${KERNEL}.img'"
 }
@@ -1694,11 +1742,11 @@ prerun_syslinux()
                 s="/usr/lib/syslinux/efi64"
                 d='';
        fi
-       mkdir -pv "$c" 2> $ERR 2>&1
+       mkdir -pv "$c" 2> "$ERR" 2>&1
        errshow 1 "mkdir -pv $c"
-       cp -rfv "$s/"* "$c/" 2> $ERR 2>&1
+       cp -rfv "$s/"* "$c/" 2> "$ERR" 2>&1
        errshow 1 "cp -rfv $s/* $c/"
-       cp -fv "$RUN/syslinux/splash.png" "$c/" 2> $ERR 2>&1
+       cp -fv "$RUN/syslinux/splash.png" "$c/" 2> "$ERR" 2>&1
        errshow 0 "cp -fv $RUN/syslinux/splash.png $c/"
        cat > "$c/syslinux.cfg" <<- EOF
        UI vesamenu.c32
@@ -1841,17 +1889,14 @@ lvm_menu()
 
 lvm_detect()
 {
-       local v pv
-       pv="$(pvs -o pv_name --noheading 2> /dev/null)"
-       v="$(lvs -o vg_name,lv_name --noheading --separator - 2> /dev/null)"
-       VGROUP="$(vgs -o vg_name --noheading 2> /dev/null)"
-
-       if [[ $VGROUP && $v && $pv ]]; then
-               msg "LVM Setup" "\nActivating existing logical volume management.\n" 0
-               modprobe dm-mod > /dev/null 2> $ERR
-               errshow 'modprobe dm-mod'
-               vgscan > /dev/null 2>&1
-               vgchange -ay > /dev/null 2>&1
+       if [[ $(vgs -o vg_name --noheading 2> /dev/null) ]]; then
+               if [[ $(lvs -o vg_name,lv_name --noheading --separator - 2> /dev/null) && $(pvs -o pv_name --noheading 2> /dev/null) ]]; then
+                       msg "LVM Setup" "\nActivating existing logical volume management.\n" 0
+                       modprobe dm-mod > /dev/null 2> "$ERR"
+                       errshow 'modprobe dm-mod'
+                       vgscan > /dev/null 2>&1
+                       vgchange -ay > /dev/null 2>&1
+               fi
        fi
 }
 
@@ -1866,7 +1911,7 @@ lvm_create()
        lvm_extra_lvs || return 1
        lvm_volume_name "$_lvmlvname\nNOTE: This LV will use up all remaining space in the volume group (${VGROUP_MB}MB)" || return 1
        msg "$_lvmnew (LV:$VOL_COUNT)" "\nCreating volume $VNAME from remaining space in $VGROUP\n" 0
-       lvcreate -l +100%FREE "$VGROUP" -n "$VNAME" > /dev/null 2> $ERR
+       lvcreate -l +100%FREE "$VGROUP" -n "$VNAME" > /dev/null 2> "$ERR"
        errshow "lvcreate -l +100%FREE $VGROUP -n $VNAME" || return 1
        LVM='logical volume'; sleep 0.5
        txt="\nDone, volume: $VGROUP-$VNAME (${VOLUME_SIZE:-${VGROUP_MB}MB}) has been created.\n"
@@ -1925,7 +1970,7 @@ lvm_mkgroup()
        done
 
        msg "$_lvmnew" "\nCreating volume group: $VGROUP\n" 0
-       vgcreate -f "$VGROUP" $LVM_PARTS > /dev/null 2> $ERR
+       vgcreate -f "$VGROUP" $LVM_PARTS > /dev/null 2> "$ERR"
        errshow "vgcreate -f $VGROUP $LVM_PARTS" || return 1
 
        SIZE=$(vgdisplay "$VGROUP" | awk '/VG Size/ { gsub(/[^0-9.]/, ""); print int($0) }')
@@ -1980,7 +2025,7 @@ lvm_extra_lvs()
        while (( VOL_COUNT > 1 )); do
                lvm_volume_name "$_lvmlvname" && lvm_lv_size || return 1
                msg "$_lvmnew (LV:$VOL_COUNT)" "\nCreating a $VOLUME_SIZE volume $VNAME in $VGROUP\n" 0
-               lvcreate -L "$VOLUME_SIZE" "$VGROUP" -n "$VNAME" > /dev/null 2> $ERR
+               lvcreate -L "$VOLUME_SIZE" "$VGROUP" -n "$VNAME" > /dev/null 2> "$ERR"
                errshow "lvcreate -L $VOLUME_SIZE $VGROUP -n $VNAME" || return 1
                msg "$_lvmnew (LV:$VOL_COUNT)" "\nDone, logical volume (LV) $VNAME ($VOLUME_SIZE) has been created.\n"
                (( VOL_COUNT-- ))
@@ -2066,7 +2111,7 @@ luks_open()
 
        luks_pass "$_luksopen" || return 1
        msg "$_luksopen" "\nOpening encrypted partition: $LUKS_NAME\n\nUsing device/volume: $LUKS_PART\n" 0
-       cryptsetup open --type luks "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2> $ERR
+       cryptsetup open --type luks "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2> "$ERR"
        errshow "cryptsetup open --type luks $LUKS_PART $LUKS_NAME" || return 1
        LUKS='encrypted'; luks_show
        return 0
@@ -2129,9 +2174,9 @@ luks_basic()
 {
        luks_setup || return 1
        msg "$_luksnew" "\nCreating encrypted partition: $LUKS_NAME\n\nDevice or volume used: $LUKS_PART\n" 0
-       cryptsetup -q luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2> $ERR
+       cryptsetup -q luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2> "$ERR"
        errshow "cryptsetup -q luksFormat $LUKS_PART" || return 1
-       cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2> $ERR
+       cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2> "$ERR"
        errshow "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1
        LUKS='encrypted'; luks_show
        return 0
@@ -2144,9 +2189,9 @@ luks_advanced()
                dlg cipher input "LUKS Encryption" "$_lukskey" "-s 512 -c aes-xts-plain64"
                [[ $cipher ]] || return 1
                msg "$_luksadv" "\nCreating encrypted partition: $LUKS_NAME\n\nDevice or volume used: $LUKS_PART\n" 0
-               cryptsetup -q $cipher luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2> $ERR
+               cryptsetup -q $cipher luksFormat "$LUKS_PART" <<< "$LUKS_PASS" 2> "$ERR"
                errshow "cryptsetup -q $cipher luksFormat $LUKS_PART" || return 1
-               cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2> $ERR
+               cryptsetup open "$LUKS_PART" "$LUKS_NAME" <<< "$LUKS_PASS" 2> "$ERR"
                errshow "cryptsetup open $LUKS_PART $LUKS_NAME" || return 1
                luks_show
                return 0
@@ -2173,9 +2218,7 @@ die()
        tput cnorm
        if [[ -d $MNT ]]; then
                umount_dir "$MNT"
-               if (( e == 127 )); then
-                       umount_dir /run/archiso/bootmnt && sleep 0.5 && reboot -f
-               fi
+               (( e == 127 )) && umount_dir /run/archiso/bootmnt && sleep 0.5 && reboot -f
        fi
        exit $e
 }
@@ -2248,20 +2291,20 @@ live()
        mount /run/archiso/cowspace -o remount,size=2G
        install_mirrorlist "/etc/pacman.d/mirrorlist"
        pacman -Syyu --noconfirm || die 1
-       rm -rf "/var/cache/pacman/pkg/"*
+       rm -rf /var/cache/pacman/pkg/*
        pacman -S $BASE_PKGS $AL_BASE_PKGS xorg-xinit --needed --noconfirm || die 1
-       rm -rf "/var/cache/pacman/pkg/"*
+       rm -rf /var/cache/pacman/pkg/*
        case "$ses" in
-               i3-gaps|openbox|fluxbox|bspwm|awesome|xfce4) pacman -S "$ses" $WM_BASE_PKGS ${WM_EXT[$ses]} --needed --noconfirm || die 1 ;;
+               i3-gaps|openbox|fluxbox|bspwm|awesome|xfce4|jwm) pacman -S "$ses" $WM_BASE_PKGS ${WM_EXT[$ses]} --needed --noconfirm || die 1 ;;
                gnome|plasma|cinnamon) pacman -S "$ses" ${WM_EXT[$ses]} --needed --noconfirm || die 1 ;;
                dwm) { pacman -S git --needed --noconfirm || die 1; }; install_suckless "/root" nochroot ;;
        esac
-       rm -rf "/var/cache/pacman/pkg/"*
+       rm -rf /var/cache/pacman/pkg/*
        [[ $VM ]] && dmesg | grep -qi 'vbox' && pacman -S virtualbox-guest-utils virtualbox-guest-modules-arch --needed --noconfirm
        pacman -Scc --noconfirm
-       rm -rf "/var/cache/pacman/pkg/"*
+       rm -rf /var/cache/pacman/pkg/*
        cp -rfT /etc/skel /root
-       install_tearfree_conf "/etc/X11/xorg.conf.d"
+       [[ $TEARFREE ]] && install_tearfree_conf "/etc/X11/xorg.conf.d"
        case "$ses" in
                plasma|gnome|cinnamon) sed -i '/super/d; /nitrogen/d; /compton/d' /root/.xprofile ;;
                dwm) sed -i '/super/d; /compton/d' /root/.xprofile ;;
@@ -2279,9 +2322,12 @@ usage()
        usage: $1 [-hdl] [session]
 
        options:
-               -h, --help     print this message and exit
-               -l, --live     install and setup a live session
-               -d, --debug    enable xtrace and log output to $DBG
+               -h, --help      print this message and exit
+               -l, --live      install and setup a live session
+               -d, --debug     enable xtrace and log output to $DBG
+               -t, --tearfree  install and setup drivers for nvidia or tearfree xorg configs for other vendors
+                                               if you experience boot issues with this option you can remove
+                                                   /etc/X11/xorg.conf.d/20-*.conf
 
        sessions:
                i3-gaps  - A fork of i3wm with more features including gaps
@@ -2492,17 +2538,12 @@ system_identify()
 
        modprobe -q efivarfs > /dev/null 2>&1
 
-       _prep="\nOnce a step is finished a step you will be returned here, if the step was successful the cursor will be advanced to the next step.\nIf a step is unsuccessful the cursor will be placed on the step required to advance (when possible).\n\nSteps beginning with an asterix (*) are required before continuing.\n\nTo begin the install you should have:\n\n  - A root (/) partition mounted."
        if [[ -d /sys/firmware/efi/efivars ]]; then
                export SYS="UEFI"
                grep -q /sys/firmware/efi/efivars /proc/mounts || mount -t efivarfs efivarfs /sys/firmware/efi/efivars
-               _prep+="\n  - An EFI boot partition mounted."
        else
                export SYS="BIOS"
        fi
-       _prep+="\n\nOnce finished mounting, a portion of the install can be done in the background while you continue configuring the system:\n"
-       _prep+="\n  - Choose the system bootloader.\n  - Create a user and password."
-       _prep+="\n  - Basic system configuration, kernel, shell, login, packages, etc..\n\nOnce you're happy with the choices and the required steps are complete, the main install can be started."
 }
 
 ###############################################################################
@@ -2522,10 +2563,11 @@ fi
 # trap ^C to perform cleanup
 trap 'printf "\n^C\n" && die 1' INT
 
-while getopts ":hl:d" OPT; do
+while getopts ":htl:d" OPT; do
        case "$OPT" in
                d) debug ;;
                h) usage "$0" ;;
+               t) TEARFREE=true ;;
                l)
                        if [[ "${!WM_SESSIONS[@]}" =~ $OPTARG ]]; then
                                live "$OPTARG"