OSDN Git Service

Update for stable
[pacbang-linux/installer-arch.git] / archlabs-installer
index 8077f6c..c32ecfe 100755 (executable)
@@ -8,14 +8,13 @@
 # check for syntax errors
 # set -n
 
-VER=2.0.92
+VER=2.0.99
 
 # 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
@@ -190,8 +189,8 @@ main()
                8 "* System configuration" \
                9 "Select window manager or desktop" \
                10 "Select additional packages" \
-               11 "View configuration selections" \
-               12 "Run a command on the installed system" \
+               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"
@@ -207,8 +206,8 @@ 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 && select_usercmd ;;
+               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
@@ -257,6 +256,8 @@ select_show()
   Hostname: ${MYHOST:-none}
   Timezone: ${ZONE:-none}/${SUBZ:-none}
 
+  Chroot cmd: ${USER_CMD:-none}
+
 ------------ USER CONFIGURATION ---------------
 
   Username:      ${NEWUSER:-none}
@@ -285,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
@@ -574,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
@@ -627,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
@@ -648,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"
 }
@@ -694,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"
@@ -703,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
@@ -712,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
@@ -733,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
@@ -743,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
@@ -760,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
 }
@@ -795,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
@@ -907,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"
@@ -916,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
@@ -1122,7 +1141,7 @@ select_extra_partitions()
                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
@@ -1145,12 +1164,12 @@ 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"
@@ -1222,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
@@ -1281,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
@@ -1298,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
 
@@ -1332,12 +1351,12 @@ install_user()
        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 == *jwm* ]] && cp -rf "$MNT/etc/system.jwmrc" "$MNT/home/$NEWUSER/.jwmrc"
-       [[ $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"*
@@ -1370,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
                        ;;
@@ -1409,14 +1428,14 @@ install_packages()
                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
@@ -1426,19 +1445,19 @@ 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
 
@@ -1459,7 +1478,8 @@ 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
@@ -1486,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"
 }
 
@@ -1539,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
@@ -1548,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
@@ -1557,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
@@ -1573,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"
@@ -1648,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
 
@@ -1667,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
 
@@ -1717,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
@@ -1864,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
 }
 
@@ -1889,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"
@@ -1948,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) }')
@@ -2003,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-- ))
@@ -2089,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
@@ -2152,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
@@ -2167,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
@@ -2282,7 +2304,7 @@ live()
        pacman -Scc --noconfirm
        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 ;;
@@ -2300,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
@@ -2538,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"