diff --git a/archlabs-installer b/archlabs-installer index 9e1e801..93557f1 100755 --- a/archlabs-installer +++ b/archlabs-installer @@ -5,7 +5,7 @@ # Some ideas and code reworked from other resources # AIF, Cnichi, Calamares, Arch Wiki.. Credit where credit is due -VER="2.0.58" # installer version +VER="2.0.59" # installer version DIST="ArchLabs" # linux distributor MNT="/mnt" # install mountpoint ANS="/tmp/ans" # dialog answer file @@ -82,19 +82,11 @@ WARN='' # issued mounting/partitioning warning SEP_BOOT='' # separate boot partition for BIOS AUTOLOGIN='' # enable autologin for xinit CONFIG_DONE='' # basic configuration is finished -BROADCOM_WL='' # fixes for broadcom cards eg. BCM4352 FORMATTED='' # partitions we formatted and should allow skipping AUTO_ROOT_PART='' # root value from auto partition AUTO_BOOT_PART='' # boot value from auto partition -# iso base, pacstrap when running the installer from a stock arch iso -ISO_BASE="b43-firmware b43-fwcutter broadcom-wl clonezilla dhclient dhcpcd ethtool wpa_supplicant " -ISO_BASE+="exfat-utils f2fs-tools gptfdisk vim hdparm ipw2100-fw ipw2200-fw nfs-utils nilfs-utils ntfs-3g " -ISO_BASE+="pacman-contrib parted rsync sdparm smartmontools wget wireless_tools wpa_actiond xl2tpd dialog parted " -ISO_BASE+="alsa-firmware alsa-lib alsa-plugins pulseaudio pulseaudio-alsa networkmanager w3m htop wireless-regdb " -ISO_BASE+="lm_sensors lsb-release p7zip pamixer reflector unrar ranger terminus-font ttf-dejavu archlabs-keyring" - # archlabs base AL_BASE_PKGS="archlabs-skel-base archlabs-fonts archlabs-themes archlabs-dARK archlabs-icons archlabs-wallpapers archlabs-scripts" @@ -220,6 +212,8 @@ declare -A FS_OPTS=( declare -A LOGIN_PKGS=( [xinit]='xorg-xinit' [ly]='archlabs-ly' +[gdm]='gdm' +[sddm]='sddm' [lightdm]='lightdm lightdm-gtk-greeter lightdm-gtk-greeter-settings accountsservice' ) # } @@ -413,31 +407,30 @@ select_login() { [[ $INSTALL_WMS ]] || return 0 + AUTOLOGIN='' # no autologin unless using xinit + if [[ -z $LOGIN_TYPE ]]; then dlg LOGIN_TYPE menu "Login Management" "\nSelect what kind of login management to use." \ "xinit" "Console login without a display manager" \ "ly" "TUI display manager with a ncurses-like interface" \ - "lightdm" "Lightweight display manager with a gtk greeter" || return 1 + "lightdm" "Lightweight display manager with a gtk greeter" \ + "gdm" "Gnome display manager" \ + "sddm" "Simple desktop display manager" || return 1 fi - if [[ $LOGIN_TYPE == 'xinit' ]]; then - EDIT_FILES[login]="/home/$NEWUSER/.xinitrc /home/$NEWUSER/.xprofile" - # define what wm/de to use for xinit - if (( $(wc -w <<< "$INSTALL_WMS") > 1 )); then - dlg LOGIN_WM menu "Login Management" "$_login" $LOGIN_CHOICES || return 1 - LOGIN_WM="${WM_SESSIONS[$LOGIN_WM]}" - fi - [[ -z $LOGIN_WM ]] && LOGIN_WM="${WM_SESSIONS[${INSTALL_WMS%% *}]}" - # autologin - yesno "Autologin" "$(sed "s|USER|$NEWUSER|g; s|RC|$LOGINRC|g" <<< "$_autologin")" && AUTOLOGIN=true || AUTOLOGIN='' - else - AUTOLOGIN='' # no autologin for DMs - if [[ $LOGIN_TYPE == 'lightdm' ]]; then - EDIT_FILES[login]="/etc/lightdm/lightdm.conf /etc/lightdm/lightdm-gtk-greeter.conf" - elif [[ $LOGIN_TYPE == 'ly' ]]; then - EDIT_FILES[login]="/etc/ly/config.ini" - fi - fi + case $LOGIN_TYPE in + ly) EDIT_FILES[login]="/etc/ly/config.ini" ;; + gdm|sddm) EDIT_FILES[login]="" ;; + 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 + dlg LOGIN_WM menu "Login Management" "$_login" $LOGIN_CHOICES || return 1 + LOGIN_WM="${WM_SESSIONS[$LOGIN_WM]}" + fi + [[ -z $LOGIN_WM ]] && LOGIN_WM="${WM_SESSIONS[${INSTALL_WMS%% *}]}" + yesno "Autologin" "$(sed "s|USER|$NEWUSER|g; s|RC|$LOGINRC|g" <<< "$_autologin")" && AUTOLOGIN=true || AUTOLOGIN='' + ;; + esac } select_config() @@ -759,6 +752,7 @@ part_menu() if [[ $devhash != "$(lsblk -f | base64)" ]]; then msg "Probing Partitions" "\nInforming the kernel of partition changes using partprobe.\n" 0 partprobe >/dev/null 2>&1 + [[ $choice == 'auto' ]] && return fi done } @@ -774,21 +768,6 @@ part_show() msg "Device Tree" "\n\n$txt\n\n" } -part_swap() -{ - if [[ $1 == "$MNT/swapfile" && $SWAP_SIZE ]]; then - fallocate -l $SWAP_SIZE "$1" 2>$ERR - errshow "fallocate -l $SWAP_SIZE $1" - chmod 600 "$1" 2>$ERR - errshow "chmod 600 $1" - fi - mkswap "$1" >/dev/null 2>$ERR - errshow "mkswap $1" - swapon "$1" >/dev/null 2>$ERR - errshow "swapon $1" - return 0 -} - part_auto() { local device="$1" table="$2" boot_fs="$3" size="$4" dev_info="" @@ -938,6 +917,21 @@ part_find() return 0 } +part_swap() +{ + if [[ $1 == "$MNT/swapfile" && $SWAP_SIZE ]]; then + fallocate -l $SWAP_SIZE "$1" 2>$ERR + errshow "fallocate -l $SWAP_SIZE $1" + chmod 600 "$1" 2>$ERR + errshow "chmod 600 $1" + fi + mkswap "$1" >/dev/null 2>$ERR + errshow "mkswap $1" + swapon "$1" >/dev/null 2>$ERR + errshow "swapon $1" + return 0 +} + part_mount() { local part="$1" mountp="${MNT}$2" fs="" @@ -1338,7 +1332,6 @@ install_main() install_user install_login chrun "chown -Rf $NEWUSER:users /home/$NEWUSER" - sleep 1 while :; do dlg choice menu "Finalization" "$_edit" \ @@ -1357,7 +1350,7 @@ install_main() if [[ -z $choice || $choice == 'finished' ]]; then [[ $DEBUG == true && -r $DBG ]] && vim $DBG - die 127 + clear && die 127 else local exists='' for f in ${EDIT_FILES[$choice]}; do @@ -1374,29 +1367,14 @@ install_main() install_base() { - if [[ $RSYNC_PID || $MIRROR_PID ]]; then - local oldmsg="" msg="" - if kill -0 "$RSYNC_PID" 2>/dev/null || kill -0 "$MIRROR_PID" 2>/dev/null; then - printf "\nOne or more background install processes are still running, grabbing their output...\n" - while kill -0 "$RSYNC_PID" 2>/dev/null || kill -0 "$MIRROR_PID" 2>/dev/null; do - msg="$(tail -n 1 /tmp/bg_out)" - if [[ "$msg" != "$oldmsg" ]]; then - printf "\n%s" "$msg" - oldmsg="$msg" - else - printf "." - sleep 0.5 - fi - done - fi - trap - EXIT - unset RSYNC_PID MIRROR_PID - else - rsync -ahv /run/archiso/sfs/airootfs/ $MNT/ 2>$ERR - errshow 1 "rsync -ahv /run/archiso/sfs/airootfs/ $MNT/" - install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" - chrun "pacman -Syyu --noconfirm && pacman -S $BASE_PKGS --needed --noconfirm" + if kill -0 "$RSYNC_PID" 2>/dev/null || kill -0 "$MIRROR_PID" 2>/dev/null; then + printf "\nOne or more background install processes are still running, grabbing their output...\n" && cat /tmp/bg_out + while kill -0 "$RSYNC_PID" 2>/dev/null || kill -0 "$MIRROR_PID" 2>/dev/null; do + sleep 1 + done fi + trap - EXIT + unset RSYNC_PID MIRROR_PID rm -rf $MNT/etc/mkinitcpio-archiso.conf find $MNT/usr/lib/initcpio -name 'archiso*' -type f -delete @@ -1426,11 +1404,6 @@ install_base() chrun "locale-gen" chrun "ln -svf /usr/share/zoneinfo/$ZONE/$SUBZ /etc/localtime" - if [[ $BROADCOM_WL ]]; then - echo 'blacklist bcma' >> $MNT/etc/modprobe.d/blacklist.conf - rm -f $MNT/etc/modprobe/ - fi - cat > $MNT/etc/X11/xorg.conf.d/00-keyboard.conf <<- EOF # Use localectl(1) to instruct systemd-localed to update it. Section "InputClass" @@ -1543,86 +1516,61 @@ install_user() sed -i '/nitrogen/d' $MNT/home/$NEWUSER/.xprofile $MNT/root/.xprofile sed -i '/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 } -install_xinit() -{ - - if [[ $INSTALL_WMS ]]; then - if [[ -e $MNT/home/$NEWUSER/.xinitrc ]] && grep -q 'exec' "$MNT/home/$NEWUSER/.xinitrc"; then - sed -i "/exec/ c exec ${LOGIN_WM}" "$MNT/home/$NEWUSER/.xinitrc" - elif [[ $INSTALL_WMS ]]; then - printf "exec %s\n" "$LOGIN_WM" >> "$MNT/home/$NEWUSER/.xinitrc" - else - printf "exec %s\n" "$LOGIN_WM" >> "$MNT/home/$NEWUSER/.xinitrc" - fi - elif [[ -e $MNT/home/$NEWUSER/.xinitrc ]]; then - # no sessions available so remove the exec from ~/.xinitrc and return - sed -i '/exec/d' "$MNT/home/$NEWUSER/.xinitrc" - return 0 - fi - - [[ ${EDIT_FILES[login]} == *"$LOGINRC"* ]] || EDIT_FILES[login]+=" /home/$NEWUSER/$LOGINRC" - - if [[ $AUTOLOGIN ]]; then - sed -i "s/root/${NEWUSER}/g" $SERVICE/autologin.conf - cat > "$MNT/home/$NEWUSER/$LOGINRC" <<- EOF - # ~/$LOGINRC - # sourced by ${MYSHELL##*/} when used as a login shell - - # automatically run startx when logging in on tty1 - [ -z \$DISPLAY ] && [ \$XDG_VTNR -eq 1 ] && exec startx - EOF - else - rm -rf $SERVICE - fi -} - -install_ly() -{ - rm -rf "$SERVICE" "$MNT/home/$NEWUSER"/.{xinitrc,profile,zprofile,bash_profile} - chrun 'systemctl enable ly.service' 2>$ERR - errshow 1 "systemctl enable ly.service" -} - install_login() { + local serv="$MNT/etc/systemd/system/getty@tty1.service.d" + echo "Setting up $LOGIN_TYPE" - SERVICE="$MNT/etc/systemd/system/getty@tty1.service.d" - install_${LOGIN_TYPE:-xinit} -} -install_lightdm() -{ - rm -rf "$SERVICE" "$MNT/home/$NEWUSER"/.{xinitrc,profile,zprofile,bash_profile} - chrun 'systemctl enable lightdm.service' 2>$ERR - errshow 1 "systemctl enable lightdm.service" - cat > $MNT/etc/lightdm/lightdm-gtk-greeter.conf <<- EOF - # LightDM GTK+ Configuration - - [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 + case $LOGIN_TYPE in + ly|sddm|gdm|lightdm) + rm -rf "$serv" "$MNT/home/$NEWUSER/.xinitrc" + chrun "systemctl enable $LOGIN_TYPE.service" 2>$ERR + errshow 1 "systemctl enable $LOGIN_TYPE.service" + if [[ $LOGIN_TYPE == 'lightdm' ]]; then + 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 + fi + ;; + xinit) + if [[ $INSTALL_WMS ]]; then + sed -i "/exec/ c exec ${LOGIN_WM}" "$MNT/home/$NEWUSER/.xinitrc" + elif [[ -e $MNT/home/$NEWUSER/.xinitrc ]]; then + sed -i '/exec/d' "$MNT/home/$NEWUSER/.xinitrc" + return 0 + fi + if [[ $AUTOLOGIN ]]; then + 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 ] && exec startx + EOF + else + rm -rf $serv + fi + ;; + esac } install_packages() { - local rmpkg="" + local rmpkg="archlabs-installer " local inpkg="$BASE_PKGS ${LOGIN_PKGS[$LOGIN_TYPE]} $PACKAGES $USER_PKGS " - if pacman -Qsq 'archlabs-installer' >/dev/null 2>&1; then - rmpkg+="archlabs-installer " - elif [[ -e "$MNT/usr/bin/archlabs-installer" ]]; then - rm -f "$MNT/usr/bin/archlabs-installer" - fi - # add extra packages chosen throughout the install if [[ $MYSHELL == '/usr/bin/zsh' ]]; then inpkg+="zsh-completions " @@ -1630,6 +1578,8 @@ install_packages() rmpkg+="zsh " [[ $MYSHELL == '/usr/bin/mksh' ]] && inpkg+="mksh " fi + + # using a different kernel, remove the stock one if [[ $KERNEL != 'linux' ]]; then inpkg+="$KERNEL " rmpkg+="linux " @@ -1648,7 +1598,7 @@ install_packages() chrun "pacman -Syyu --noconfirm" # remove the packages we don't want on the installed system - [[ $rmpkg ]] && chrun "pacman -Rns $rmpkg --noconfirm" + [[ $rmpkg ]] && chrun "pacman -Rnsc $rmpkg --noconfirm" # reinstalling iputils fixes the network issue for non-root users chrun "pacman -S iputils $UCODE --noconfirm" @@ -1742,15 +1692,11 @@ install_mirrorlist() install_background() { - yesno "Background Install" "\nBegin install in the background?\n" || return 0 - + msg "Background Install" "\nInstall will now begin in the background?\n" 2 rsync -a /run/archiso/sfs/airootfs/ $MNT/ & RSYNC_PID=$! - - mkdir -p $MNT/var/lib/pacman # can help with pacman errors - ( install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" >/dev/null 2>&1 && sleep 1 && chrun "pacman -Syyu $BASE_PKGS --needed --noconfirm" >> /tmp/bg_out 2>&1 ) & + ( install_mirrorlist "$MNT/etc/pacman.d/mirrorlist" >>/tmp/bg_out 2>&1 ) & MIRROR_PID=$! - # end the background processes before exiting trap "kill $RSYNC_PID $MIRROR_PID 2>/dev/null" EXIT } @@ -2202,7 +2148,7 @@ luks_open() [[ $LUKS_PART ]] || return 1 luks_pass "$_luksopen" || return 1 - msg "$_luksopen" "\nOpening encrypted partition: $LUKS_NAME\n\nDevice or volume used: $LUKS_PART\n" 0 + 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 errshow "cryptsetup open --type luks $LUKS_PART $LUKS_NAME" || return 1 LUKS='encrypted'; luks_show @@ -2264,7 +2210,7 @@ luks_pass() luks_show() { sleep 0.5 - msg "$_luksnew" "\nEncrypted partition opened and ready for mounting.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE "$LUKS_PART")\n\n" + msg "$_luksnew" "\nEncrypted partition ready for mounting.\n\n$(lsblk -o NAME,MODEL,SIZE,TYPE,FSTYPE "$LUKS_PART")\n\n" } luks_setup() @@ -2497,13 +2443,6 @@ errshow() return 1 } -load_bcm() -{ - msg "Broadcom Wireless Setup" "\nDetected chipset is Broadcom BCM4352\n\nDisabling bcma/b43 modules and loading wl module.\n" 1 - { rmmod wl; rmmod bcma; rmmod b43; rmmod ssb; modprobe wl; depmod -a; } >/dev/null 2>&1 - BROADCOM_WL=true -} - prechecks() { local i=1 @@ -2638,10 +2577,6 @@ system_devices msg "Welcome to the $DIST Installer" "\nThis will help you get $DIST setup on your system.\nHaving previous GNU/Linux and shell experience will be an asset, however we try our best to keep things simple.\n\nIf you are unsure about an option, a default will be listed or\nthe first selected option will usually be the default (excluding language and timezone).\n\n\nMenu Navigation:\n\n - Select items with the arrow keys or the option number.\n - Use [Space] to toggle options and [Enter] to confirm.\n - Switch between buttons 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" select_keymap || { clear; die 0; } - -# try to fix problematic broadcom wireless chipset before network check -lspci -vnn -d 14e4: | grep -q 'BCM4352' && load_bcm - net_connect || { msg "Not Connected" "\nThis installer requires an active internet connection.\n\nExiting..\n" 2; die 1; } while :; do