diff --git a/usr/lib/archboot/installer/autoconfiguration.sh b/usr/lib/archboot/installer/autoconfiguration.sh index e69de29bb..5cb502d92 100644 --- a/usr/lib/archboot/installer/autoconfiguration.sh +++ b/usr/lib/archboot/installer/autoconfiguration.sh @@ -0,0 +1,239 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-2.0-only +# created by Tobias Powalowski +# preprocess fstab file +# comments out old fields and inserts new ones +# according to partitioning/formatting stage +_auto_fstab(){ + # Modify fstab + if [[ -n "${_S_MKFS}" || -n "${_S_MKFSAUTO}" ]]; then + _dialog --infobox "Create new fstab on installed system..." 3 70 + if [[ -f /tmp/.device-names ]]; then + sort /tmp/.device-names >>"${_DESTDIR}"/etc/fstab + fi + if [[ -f /tmp/.fstab ]]; then + # clean fstab first from entries + sed -i -e '/^\#/!d' "${_DESTDIR}"/etc/fstab + sort /tmp/.fstab >>"${_DESTDIR}"/etc/fstab + fi + sleep 2 + fi +} + +# add udev rule for schedulers by default +_auto_scheduler () { + if [[ ! -f ${_DESTDIR}/etc/udev/rules.d/70-ioschedulers.rules ]]; then + _dialog --infobox "Enable performance ioscheduler settings on installed system..." 3 70 + cp /etc/udev/rules.d/60-ioschedulers.rules "${_DESTDIR}"/etc/udev/rules.d/60-ioschedulers.rules + sleep 2 + fi +} + +# add sysctl file for swaps +_auto_swap () { + if [[ ! -f ${_DESTDIR}/etc/sysctl.d/99-sysctl.conf ]]; then + _dialog --infobox "Enable sysctl swap settings on installed system..." 3 70 + cp /etc/sysctl.d/99-sysctl.conf "${_DESTDIR}"/etc/sysctl.d/99-sysctl.conf + sleep 2 + fi +} + +# add mdadm setup to existing /etc/mdadm.conf +_auto_mdadm() +{ + if [[ -e ${_DESTDIR}/etc/mdadm.conf ]]; then + if grep -q ^md /proc/mdstat 2>"${_NO_LOG}"; then + _dialog --infobox "Enable mdadm settings on installed system..." 3 70 + mdadm -Ds >> "${_DESTDIR}"/etc/mdadm.conf + fi + sleep 2 + fi +} + +# configures network on host system according to installer +_auto_network() +{ + # exit if network wasn't configured in installer + if [[ -z ${_S_NET} ]]; then + return 1 + fi + _dialog --infobox "Enable network and proxy settings on installed system..." 3 70 + # copy iwd keys and enable iwd + if grep -q 'wlan' /tmp/.network-interface; then + cp -r /var/lib/iwd "${_DESTDIR}"/var/lib + chroot "${_DESTDIR}" systemctl enable iwd &>"${_NO_LOG}" + fi + # copy network profiles + if [[ -d ${_DESTDIR}/etc/systemd/network ]]; then + # enable network profiles + cp /etc/systemd/network/* "${_DESTDIR}"/etc/systemd/network/ &>"${_NO_LOG}" + chroot "${_DESTDIR}" systemctl enable systemd-networkd &>"${_NO_LOG}" + chroot "${_DESTDIR}" systemctl enable systemd-resolved &>"${_NO_LOG}" + fi + # copy proxy settings + if [[ -n "${_PROXY}" ]]; then + for i in ${_PROXIES}; do + echo "export ${i}=${_PROXY}" >> "${_DESTDIR}"/etc/profile.d/proxy.sh + chmod a+x "${_DESTDIR}"/etc/profile.d/proxy.sh + done + fi + sleep 2 +} + +_auto_pacman_keyring() +{ + if ! [[ -d ${_DESTDIR}/etc/pacman.d/gnupg ]]; then + _dialog --infobox "Enable pacman's GPG keyring files on installed system..." 3 70 + cp -ar /etc/pacman.d/gnupg "${_DESTDIR}"/etc/pacman.d &>"${_NO_LOG}" + sleep 2 + fi +} + +_auto_testing() +{ + if [[ -n "${_DOTESTING}" ]]; then + _dialog --infobox "Enable [testing] repository on installed system..." 3 70 + sed -i -e '/^#\[testing\]/ { n ; s/^#// }' "${_DESTDIR}"/etc/pacman.conf + sed -i -e '/^#\[community-testing\]/ { n ; s/^#// }' "${_DESTDIR}"/etc/pacman.conf + sed -i -e 's:^#\[testing\]:\[testing\]:g' -e 's:^#\[community-testing\]:\[community-testing\]:g' "${_DESTDIR}"/etc/pacman.conf + sleep 2 + fi +} + +_auto_mkinitcpio() { + _FBPARAMETER="" + _HWPARAMETER="" + _HWDETECTMODULES="" + _HWDETECTHOOKS="" + _HWKVER="" + if [[ -z "${_AUTO_MKINITCPIO}" ]]; then + _printk off + _AUTO_MKINITCPIO="" + # check on nfs + if lsmod | grep -q ^nfs; then + _dialog --defaultno --yesno "Setup detected nfs driver...\nDo you need support for booting from nfs shares?" 0 0 && _HWPARAMETER="${_HWPARAMETER} --nfs" + fi + _dialog --infobox "Preconfiguring mkinitcpio settings on installed system..." 3 70 + # check on framebuffer modules and kms FBPARAMETER + grep -q "^radeon" /proc/modules && _FBPARAMETER="--ati-kms" + grep -q "^amdgpu" /proc/modules && _FBPARAMETER="--amd-kms" + grep -q "^i915" /proc/modules && _FBPARAMETER="--intel-kms" + grep -q "^nouveau" /proc/modules && _FBPARAMETER="--nvidia-kms" + # check on nfs and keymap HWPARAMETER + # check on used keymap, if not us keyboard layout + ! grep -q '^KEYMAP="us"' "${_DESTDIR}"/etc/vconsole.conf && _HWPARAMETER="${_HWPARAMETER} --keymap" + # get kernel version + if [[ "${_RUNNING_ARCH}" == "x86_64" ]]; then + offset=$(hexdump -s 526 -n 2 -e '"%0d"' "${_DESTDIR}/boot/${_VMLINUZ}") + read -r _HWKVER _ < <(dd if="${_DESTDIR}/boot/${_VMLINUZ}" bs=1 count=127 skip=$(( offset + 0x200 )) 2>"${_NO_LOG}") + elif [[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "riscv64" ]]; then + reader="cat" + # try if the image is gzip compressed + [[ $(file -b --mime-type "${_DESTDIR}/boot/${_VMLINUZ}") == 'application/gzip' ]] && reader="zcat" + read -r _ _ _HWKVER _ < <($reader "${_DESTDIR}/boot/${_VMLINUZ}" | grep -m1 -aoE 'Linux version .(\.[-[:alnum:]]+)+') + fi + # arrange MODULES for mkinitcpio.conf + _HWDETECTMODULES="$(hwdetect --kernel_directory="${_DESTDIR}" --kernel_version="${_HWKVER}" --hostcontroller --filesystem ${_FBPARAMETER})" + # arrange HOOKS for mkinitcpio.conf + _HWDETECTHOOKS="$(hwdetect --kernel_directory="${_DESTDIR}" --kernel_version="${_HWKVER}" --rootdevice="${_ROOTDEV}" --hooks-dir="${_DESTDIR}"/usr/lib/initcpio/install "${_HWPARAMETER}" --hooks)" + # change mkinitcpio.conf + [[ -n "${_HWDETECTMODULES}" ]] && sed -i -e "s/^MODULES=.*/${_HWDETECTMODULES}/g" "${_DESTDIR}"/etc/mkinitcpio.conf + [[ -n "${_HWDETECTHOOKS}" ]] && sed -i -e "s/^HOOKS=.*/${_HWDETECTHOOKS}/g" "${_DESTDIR}"/etc/mkinitcpio.conf + # disable fallpack preset + sed -i -e "s# 'fallback'##g" "${_DESTDIR}"/etc/mkinitcpio.d/*.preset + # remove fallback initramfs + [[ -e "${_DESTDIR}/boot/initramfs-linux-fallback.img" ]] && rm -f "${_DESTDIR}/boot/initramfs-linux-fallback.img" + sleep 2 + _AUTO_MKINITCPIO=1 + _run_mkinitcpio + _printk on + fi +} + +_auto_vconsole() { + if [[ ! -f ${_DESTDIR}/etc/vconsole.conf ]]; then + _dialog --infobox "Setting keymap and font on installed system..." 3 70 + cp /etc/vconsole.conf "${_DESTDIR}"/etc/vconsole.conf + sleep 2 + fi +} + +_auto_luks() { + # remove root device from crypttab + if [[ -e /tmp/.crypttab && "$(grep -v '^#' "${_DESTDIR}"/etc/crypttab)" == "" ]]; then + _dialog --infobox "Enable luks settings on installed system..." 3 70 + # add to temp crypttab + sed -i -e "/^$(basename "${_ROOTDEV}") /d" /tmp/.crypttab + cat /tmp/.crypttab >> "${_DESTDIR}"/etc/crypttab + chmod 700 /tmp/passphrase-* 2>"${_NO_LOG}" + cp /tmp/passphrase-* "${_DESTDIR}"/etc/ 2>"${_NO_LOG}" + sleep 2 + fi +} + +_auto_timesetting() { + if [[ -e /etc/localtime && ! -e "${_DESTDIR}"/etc/localtime ]]; then + _dialog --infobox "Enable timezone setting on installed system..." 3 70 + cp -a /etc/localtime "${_DESTDIR}"/etc/localtime + sleep 2 + fi + if [[ -f /etc/adjtime && ! -f "${_DESTDIR}"/etc/adjtime ]]; then + _dialog --infobox "Enable clock setting on installed system..." 3 70 + cp /etc/adjtime "${_DESTDIR}"/etc/adjtime + sleep 2 + fi +} + +_auto_pacman_mirror() { + # /etc/pacman.d/mirrorlist + # add installer-selected mirror to the top of the mirrorlist + if [[ "${_SYNC_URL}" != "" ]]; then + _dialog --infobox "Enable pacman mirror on installed system..." 3 70 + #shellcheck disable=SC2027,SC2086 + awk "BEGIN { printf(\"# Mirror used during installation\nServer = "${_SYNC_URL}"\n\n\") } 1 " "${_DESTDIR}"/etc/pacman.d/mirrorlist > /tmp/inst-mirrorlist + mv /tmp/inst-mirrorlist "${_DESTDIR}/etc/pacman.d/mirrorlist" + sleep 2 + fi +} + +_auto_hostname() { + if [[ ! -f ${_DESTDIR}/etc/hostname ]]; then + _dialog --infobox "Set default hostname on installed system..." 3 70 + echo "myhostname" > "${_DESTDIR}"/etc/hostname + sleep 2 + fi +} + +_auto_locale() { + if [[ ! -f ${_DESTDIR}/etc/locale.conf ]]; then + _dialog --infobox "Set default locale on installed system..." 3 70 + echo "LANG=C.UTF-8" > "${_DESTDIR}"/etc/locale.conf + echo "LC_COLLATE=C" >> "${_DESTDIR}"/etc/locale.conf + sleep 2 + fi +} + +_auto_set_locale() { + # enable glibc locales from locale.conf + _dialog --infobox "Enable glibc locales based on locale.conf on installed system..." 3 70 + #shellcheck disable=SC2013 + for i in $(grep "^LANG" "${_DESTDIR}"/etc/locale.conf | sed -e 's/.*=//g' -e's/\..*//g'); do + sed -i -e "s/^#${i}/${i}/g" "${_DESTDIR}"/etc/locale.gen + done + sleep 2 +} + +_auto_bash(){ + if [[ ! -f ${_DESTDIR}/etc/profile.d/custom-bash-prompt.sh ]]; then + _dialog --infobox "Setup bash with custom options on installed system..." 3 70 + cp "${_DESTDIR}"/etc/skel/.bash* "${_DESTDIR}"/root/ + ! grep -qw 'custom-bash-options.sh' "${_DESTDIR}/etc/skel/.bashrc" &&\ + echo ". /etc/profile.d/custom-bash-options.sh" >> "${_DESTDIR}/etc/skel/.bashrc" + ! grep -qw 'custom-bash-options.sh' "${_DESTDIR}/root/.bashrc" &&\ + echo ". /etc/profile.d/custom-bash-options.sh" >> "${_DESTDIR}/root/.bashrc" + cp /etc/profile.d/custom-bash-options.sh "${_DESTDIR}"/etc/profile.d/ + sleep 2 + fi +} + +# vim: set ft=sh ts=4 sw=4 et: diff --git a/usr/lib/archboot/installer/autoprepare.sh b/usr/lib/archboot/installer/autoprepare.sh index e69de29bb..79aa99e10 100644 --- a/usr/lib/archboot/installer/autoprepare.sh +++ b/usr/lib/archboot/installer/autoprepare.sh @@ -0,0 +1,286 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-2.0-only +# created by Tobias Powalowski +_autoprepare() { + # check on special devices and stop them, else weird things can happen during partitioning! + _stopluks + _stoplvm + _stopmd + _NAME_SCHEME_PARAMETER_RUN="" + # switch for mbr usage + _set_guid + : >/tmp/.device-names + _DISKS=$(_blockdevices) + if [[ "$(echo "${_DISKS}" | wc -w)" -gt 1 ]]; then + #shellcheck disable=SC2046 + _dialog --menu "Select the storage device to use:" 10 40 5 $(_finddisks) 2>"${_ANSWER}" || return 1 + _DISK=$(cat "${_ANSWER}") + else + _DISK="${_DISKS}" + if [[ -z "${_DISK}" ]]; then + _dialog --msgbox "ERROR: Setup cannot find available disk device, please use normal installation routine for partitioning and mounting devices." 0 0 + return 1 + fi + fi + _DEV="" + _DEFAULTFS="" + _CHOSENFS="" + _UEFISYS_BOOTDEV="" + _UEFISYS_MP="" + _UEFISYSDEV_SET="" + _BOOTDEV_SET="" + _SWAPDEV_SET="" + _ROOTDEV_SET="" + _BOOTDEV_SIZE="" + _UEFISYSDEV_SIZE="" + # get just the disk size in 1000*1000 MB + _DISK_SIZE="$(($(${_LSBLK} SIZE -d -b "${_DISK}")/1000000))" + if [[ -z "${_DISK_SIZE}" ]]; then + _dialog --msgbox "ERROR: Setup cannot detect size of your device, please use normal installation routine for partitioning and mounting devices." 0 0 + return 1 + fi + if [[ -z "${_NAME_SCHEME_PARAMETER_RUN}" ]]; then + _set_device_name_scheme || return 1 + fi + if [[ -n "${_GUIDPARAMETER}" ]]; then + _dialog --menu "Select the mountpoint of your\nEFI SYSTEM PARTITION (ESP):" 10 40 7 "/efi" "MULTIBOOT" "/boot" "SINGLEBOOT" 2>"${_ANSWER}" || return 1 + _UEFISYS_MP=$(cat "${_ANSWER}") + fi + if [[ "${_UEFISYS_MP}" == "/boot" ]]; then + _dialog --msgbox "You have chosen to use /boot as the ESP Mountpoint. The minimum partition size is 260 MiB and only FAT32 FS is supported." 0 0 + _UEFISYS_BOOTDEV=1 + fi + while [[ -z "${_DEFAULTFS}" ]]; do + _FSOPTS="" + command -v mkfs.btrfs &>"${_NO_LOG}" && _FSOPTS="${_FSOPTS} btrfs Btrfs" + command -v mkfs.ext4 &>"${_NO_LOG}" && _FSOPTS="${_FSOPTS} ext4 Ext4" + command -v mkfs.xfs &>"${_NO_LOG}" && _FSOPTS="${_FSOPTS} xfs XFS" + command -v mkfs.ext3 &>"${_NO_LOG}" && _FSOPTS="${_FSOPTS} ext3 Ext3" + command -v mkfs.ext2 &>"${_NO_LOG}" && _FSOPTS="${_FSOPTS} ext2 Ext2" + command -v mkfs.f2fs &>"${_NO_LOG}" && _FSOPTS="${_FSOPTS} f2fs F2FS" + command -v mkfs.nilfs2 &>"${_NO_LOG}" && _FSOPTS="${_FSOPTS} nilfs2 Nilfs2" + command -v mkfs.jfs &>"${_NO_LOG}" && _FSOPTS="${_FSOPTS} jfs JFS" + # create 1 MB bios_grub partition for grub BIOS GPT support + if [[ -n "${_GUIDPARAMETER}" ]]; then + _GPT_BIOS_GRUB_DEV_SIZE="2" + _DEV_NUM=1 + _GPT_BIOS_GRUB_DEV_NUM="${_DEV_NUM}" + _DISK_SIZE="$((_DISK_SIZE-_GPT_BIOS_GRUB_DEV_SIZE))" + if [[ -n "${_UEFISYS_BOOTDEV}" ]]; then + while [[ -z "${_UEFISYSDEV_SET}" ]]; do + _dialog --inputbox "Enter the size (MB) of your /boot partition:\nMinimum value is 260.\n\nDisk space left: ${_DISK_SIZE} MB" 11 65 "512" 2>"${_ANSWER}" || return 1 + _UEFISYSDEV_SIZE="$(cat "${_ANSWER}")" + if [[ -z "${_UEFISYSDEV_SIZE}" ]]; then + _dialog --msgbox "ERROR: You have entered a invalid size, please enter again." 0 0 + else + if [[ "${_UEFISYSDEV_SIZE}" -ge "${_DISK_SIZE}" || "${_UEFISYSDEV_SIZE}" -lt "260" || "${_UEFISYSDEV_SIZE}" == "${_DISK_SIZE}" ]]; then + _dialog --msgbox "ERROR: You have entered an invalid size, please enter again." 0 0 + else + _BOOTDEV_SET=1 + _UEFISYSDEV_SET=1 + _DEV_NUM="$((_DEV_NUM+1))" + _UEFISYSDEV_NUM="${_DEV_NUM}" + fi + fi + done + else + while [[ -z "${_UEFISYSDEV_SET}" ]]; do + _dialog --inputbox "Enter the size (MB) of your EFI SYSTEM PARTITION (ESP):\nMinimum value is 260.\n\nDisk space left: ${_DISK_SIZE} MB" 11 65 "1024" 2>"${_ANSWER}" || return 1 + _UEFISYSDEV_SIZE="$(cat "${_ANSWER}")" + if [[ -z "${_UEFISYSDEV_SIZE}" ]]; then + _dialog --msgbox "ERROR: You have entered a invalid size, please enter again." 0 0 + else + if [[ "${_UEFISYSDEV_SIZE}" -ge "${_DISK_SIZE}" || "${_UEFISYSDEV_SIZE}" -lt "260" || "${_UEFISYSDEV_SIZE}" == "${_DISK_SIZE}" ]]; then + _dialog --msgbox "ERROR: You have entered an invalid size, please enter again." 0 0 + else + _UEFISYSDEV_SET=1 + _DEV_NUM="$((_DEV_NUM+1))" + _UEFISYSDEV_NUM="${_DEV_NUM}" + fi + fi + done + fi + _DISK_SIZE="$((_DISK_SIZE-_UEFISYSDEV_SIZE))" + while [[ -z "${_BOOTDEV_SET}" ]]; do + _dialog --inputbox "Enter the size (MB) of your /boot partition:\nMinimum value is 100.\n\nDisk space left: ${_DISK_SIZE} MB" 11 65 "512" 2>"${_ANSWER}" || return 1 + _BOOTDEV_SIZE="$(cat "${_ANSWER}")" + if [[ -z "${_BOOTDEV_SIZE}" ]]; then + _dialog --msgbox "ERROR: You have entered a invalid size, please enter again." 0 0 + else + if [[ "${_BOOTDEV_SIZE}" -ge "${_DISK_SIZE}" || "${_BOOTDEV_SIZE}" -lt "100" || "${_BOOTDEV_SIZE}" == "${_DISK_SIZE}" ]]; then + _dialog --msgbox "ERROR: You have entered an invalid size, please enter again." 0 0 + else + _BOOTDEV_SET=1 + _DEV_NUM="$((_UEFISYSDEV_NUM+1))" + _BOOTDEV_NUM="${_DEV_NUM}" + _DISK_SIZE="$((_DISK_SIZE-_BOOTDEV_SIZE))" + fi + fi + done + else + while [[ -z "${_BOOTDEV_SET}" ]]; do + _dialog --inputbox "Enter the size (MB) of your /boot partition:\nMinimum value is 100.\n\nDisk space left: ${_DISK_SIZE} MB" 11 65 "512" 2>"${_ANSWER}" || return 1 + _BOOTDEV_SIZE="$(cat "${_ANSWER}")" + if [[ -z "${_BOOTDEV_SIZE}" ]]; then + _dialog --msgbox "ERROR: You have entered a invalid size, please enter again." 0 0 + else + if [[ "${_BOOTDEV_SIZE}" -ge "${_DISK_SIZE}" || "${_BOOTDEV_SIZE}" -lt "100" || "${_BOOTDEV_SIZE}" == "${_DISK_SIZE}" ]]; then + _dialog --msgbox "ERROR: You have entered an invalid size, please enter again." 0 0 + else + _BOOTDEV_SET=1 + _DEV_NUM=1 + _BOOTDEV_NUM="${_DEV_NUM}" + _DISK_SIZE="$((_DISK_SIZE-_BOOTDEV_SIZE))" + fi + fi + done + fi + _SWAP_SIZE="256" + [[ "${_DISK_SIZE}" -lt "256" ]] && _SWAP_SIZE="${_DISK_SIZE}" + while [[ -z "${_SWAPDEV_SET}" ]]; do + _dialog --inputbox "Enter the size (MB) of your swap partition:\nMinimum value is > 0.\n\nDisk space left: ${_DISK_SIZE} MB" 11 65 "${_SWAP_SIZE}" 2>"${_ANSWER}" || return 1 + _SWAPDEV_SIZE=$(cat "${_ANSWER}") + if [[ -z "${_SWAPDEV_SIZE}" || "${_SWAPDEV_SIZE}" == 0 ]]; then + _dialog --msgbox "ERROR: You have entered an invalid size, please enter again." 0 0 + else + if [[ "${_SWAPDEV_SIZE}" -ge "${_DISK_SIZE}" ]]; then + _dialog --msgbox "ERROR: You have entered a too large size, please enter again." 0 0 + else + _SWAPDEV_SET=1 + _DEV_NUM="$((_DEV_NUM+1))" + _SWAPDEV_NUM="${_DEV_NUM}" + fi + fi + done + while [[ -z "${_CHOSENFS}" ]]; do + #shellcheck disable=SC2086 + _dialog --menu "Select a filesystem for / and /home:" 16 45 9 ${_FSOPTS} 2>"${_ANSWER}" || return 1 + _FSTYPE=$(cat "${_ANSWER}") + _dialog --yesno "${_FSTYPE} will be used for\n/ and /home. Is this OK?" 0 0 && _CHOSENFS=1 + done + _DISK_SIZE="$((_DISK_SIZE-_SWAPDEV_SIZE))" + _ROOT_SIZE="7500" + # btrfs minimum size is around 400MB + [[ "${_DISK_SIZE}" -lt "7500" ]] && _ROOT_SIZE="$((_DISK_SIZE-450))" + while [[ -z "${_ROOTDEV_SET}" ]]; do + _dialog --inputbox "Enter the size (MB) of your / partition:\nMinimum value is 2000.\nThe /home partition's minimum is > 450 MB remaining space.\n\nDisk space left: $((_DISK_SIZE-450)) MB" 12 65 "${_ROOT_SIZE}" 2>"${_ANSWER}" || return 1 + _ROOTDEV_SIZE=$(cat "${_ANSWER}") + if [[ -z "${_ROOTDEV_SIZE}" || "${_ROOTDEV_SIZE}" == 0 || "${_ROOTDEV_SIZE}" -lt "2000" ]]; then + _dialog --msgbox "ERROR: You have entered an invalid size, please enter again." 0 0 + else + if [[ "${_ROOTDEV_SIZE}" -ge "${_DISK_SIZE}" || "$((_DISK_SIZE-_ROOTDEV_SIZE))" -lt "450" ]]; then + _dialog --msgbox "ERROR: You have entered a too large size, please enter again." 0 0 + else + _dialog --yesno "$((_DISK_SIZE-_ROOTDEV_SIZE)) MB will be used for your /home partition. Is this OK?" 0 0 && _ROOTDEV_SET=1 + fi + fi + done + _DEV_NUM="$((_DEV_NUM+1))" + _ROOTDEV_NUM="${_DEV_NUM}" + _DEV_NUM="$((_DEV_NUM+1))" + _HOMEDEV_NUM="${_DEV_NUM}" + _DEFAULTFS=1 + done + _dialog --defaultno --yesno "${_DISK} will be COMPLETELY ERASED!\nALL DATA ON ${_DISK} WILL BE LOST.\n\nAre you absolutely sure?" 0 0 || return 1 + [[ -e /tmp/.fstab ]] && rm -f /tmp/.fstab + _umountall + # disable swap and all mounted partitions, umount / last! + _printk off + _dialog --infobox "Partitioning ${_DISK}..." 0 0 + _clean_disk "${_DISK}" + # we assume a /dev/sdX,/dev/vdX or /dev/nvmeXnY format + if [[ -n "${_GUIDPARAMETER}" ]]; then + # GPT (GUID) is supported only by 'parted' or 'sgdisk' + # create fresh GPT + sgdisk --clear "${_DISK}" &>"${_NO_LOG}" + # create actual partitions + sgdisk --new="${_GPT_BIOS_GRUB_DEV_NUM}":0:+"${_GPT_BIOS_GRUB_DEV_SIZE}"M --typecode="${_GPT_BIOS_GRUB_DEV_NUM}":EF02 --change-name="${_GPT_BIOS_GRUB_DEV_NUM}":BIOS_GRUB "${_DISK}" >"${_LOG}" + sgdisk --new="${_UEFISYSDEV_NUM}":0:+"${_UEFISYSDEV_SIZE}"M --typecode="${_UEFISYSDEV_NUM}":EF00 --change-name="${_UEFISYSDEV_NUM}":EFI_SYSTEM "${_DISK}" >"${_LOG}" + if [[ -n "${_UEFISYS_BOOTDEV}" ]]; then + # set the legacy BIOS boot 2bit attribute + sgdisk --attributes="${_UEFISYSDEV_NUM}":set:2 "${_DISK}" >"${_LOG}" + else + sgdisk --new="${_BOOTDEV_NUM}":0:+"${_BOOTDEV_SIZE}"M --typecode="${_BOOTDEV_NUM}":EA00 --attributes="${_BOOTDEV_NUM}":set:2 --change-name="${_BOOTDEV_NUM}":ARCH_LINUX_XBOOT "${_DISK}" >"${_LOG}" + fi + sgdisk --new="${_SWAPDEV_NUM}":0:+"${_SWAPDEV_SIZE}"M --typecode="${_SWAPDEV_NUM}":8200 --change-name="${_SWAPDEV_NUM}":ARCH_LINUX_SWAP "${_DISK}" >"${_LOG}" + [[ "${_RUNNING_ARCH}" == "aarch64" ]] && _GUID_TYPE=8305 + [[ "${_RUNNING_ARCH}" == "x86_64" ]] && _GUID_TYPE=8304 + sgdisk --new="${_ROOTDEV_NUM}":0:+"${_ROOTDEV_SIZE}"M --typecode="${_ROOTDEV_NUM}":"${_GUID_TYPE}" --change-name="${_ROOTDEV_NUM}":ARCH_LINUX_ROOT "${_DISK}" >"${_LOG}" + sgdisk --new="${_HOMEDEV_NUM}":0:0 --typecode="${_HOMEDEV_NUM}":8302 --change-name="${_HOMEDEV_NUM}":ARCH_LINUX_HOME "${_DISK}" >"${_LOG}" + sgdisk --print "${_DISK}" >"${_LOG}" + else + # start at sector 1 for 4k drive compatibility and correct alignment + # create DOS MBR with parted + parted -a optimal -s "${_DISK}" unit MiB mktable msdos &>"${_NO_LOG}" + parted -a optimal -s "${_DISK}" unit MiB mkpart primary 1 $((_BOOTDEV_SIZE)) >"${_LOG}" + parted -a optimal -s "${_DISK}" unit MiB set 1 boot on >"${_LOG}" + parted -a optimal -s "${_DISK}" unit MiB mkpart primary $((_BOOTDEV_SIZE)) $((_BOOTDEV_SIZE+_SWAPDEV_SIZE)) >"${_LOG}" + parted -a optimal -s "${_DISK}" unit MiB mkpart primary $((_BOOTDEV_SIZE+_SWAPDEV_SIZE)) $((_BOOTDEV_SIZE+_SWAPDEV_SIZE+_ROOTDEV_SIZE)) >"${_LOG}" + parted -a optimal -s "${_DISK}" unit MiB mkpart primary $((_BOOTDEV_SIZE+_SWAPDEV_SIZE+_ROOTDEV_SIZE)) "$(sgdisk -E "${_DISK}" | grep "^[0-9]")S" >"${_LOG}" + fi + #shellcheck disable=SC2181 + if [[ $? -gt 0 ]]; then + _dialog --msgbox "Error: Partitioning ${_DISK} (see ${_LOG} for details)." 0 0 + _printk on + return 1 + fi + # reread partitiontable for kernel + partprobe "${_DISK}" + _printk on + ## wait until /dev initialized correct devices + udevadm settle + ## FSSPECS - default filesystem specs + ## ::: + ## The partitions in FSSPECS list should be listed in the "mountpoint" order. + ## Make sure the "root" partition is defined first in the FSSPECS list + _FSSPEC_SWAPDEV="${_SWAPDEV_NUM}:swap:swap:ARCH_SWAP" + _FSSPEC_ROOTDEV="${_ROOTDEV_NUM}:${_FSTYPE}:/:ARCH_ROOT" + _FSSPEC_BOOTDEV="${_BOOTDEV_NUM}:ext2:/boot:ARCH_BOOT" + _FSSPEC_HOMEDEV="${_HOMEDEV_NUM}:${_FSTYPE}:/home:ARCH_HOME" + _FSSPEC_UEFISYSDEV="${_UEFISYSDEV_NUM}:vfat:${_UEFISYS_MP}:ESP" + if [[ -n "${_GUIDPARAMETER}" ]]; then + if [[ -n "${_UEFISYS_BOOTDEV}" ]]; then + _FSSPECS="${_FSSPEC_ROOTDEV} ${_FSSPEC_UEFISYSDEV} ${_FSSPEC_HOMEDEV} ${_FSSPEC_SWAPDEV}" + else + _FSSPECS="${_FSSPEC_ROOTDEV} ${_FSSPEC_BOOTDEV} ${_FSSPEC_UEFISYSDEV} ${_FSSPEC_HOMEDEV} ${_FSSPEC_SWAPDEV}" + fi + else + _FSSPECS="${_FSSPEC_ROOTDEV} ${_FSSPEC_BOOTDEV} ${_FSSPEC_HOMEDEV} ${_FSSPEC_SWAPDEV}" + fi + ## make and mount filesystems + for fsspec in ${_FSSPECS}; do + _DEV="${_DISK}$(echo "${fsspec}" | tr -d ' ' | cut -f1 -d:)" + # Add check on nvme or mmc controller: + # NVME uses /dev/nvme0n1pX name scheme + # MMC uses /dev/mmcblk0pX + if echo "${_DISK}" | grep -q "nvme" || echo "${_DISK}" | grep -q "mmc"; then + _DEV="${_DISK}p$(echo "${fsspec}" | tr -d ' ' | cut -f1 -d:)" + fi + _FSTYPE="$(echo "${fsspec}" | tr -d ' ' | cut -f2 -d:)" + _DOMKFS=1 + _MP="$(echo "${fsspec}" | tr -d ' ' | cut -f3 -d:)" + _LABEL_NAME="$(echo "${fsspec}" | tr -d ' ' | cut -f4 -d:)" + _FS_OPTIONS="" + _BTRFS_DEVS="" + _BTRFS_LEVEL="" + _BTRFS_SUBVOLUME="" + _BTRFS_COMPRESS="" + if [[ "${_FSTYPE}" == "btrfs" ]]; then + _BTRFS_DEVS="${_DEV}" + [[ "${_MP}" == "/" ]] && _BTRFS_SUBVOLUME="root" + [[ "${_MP}" == "/home" ]] && _BTRFS_SUBVOLUME="home" + _BTRFS_COMPRESS="compress=zstd" + fi + _mkfs "${_DEV}" "${_FSTYPE}" "${_DESTDIR}" "${_DOMKFS}" "${_MP}" "${_LABEL_NAME}" "${_FS_OPTIONS}" \ + "${_BTRFS_DEVS}" "${_BTRFS_LEVEL}" "${_BTRFS_SUBVOLUME}" "${_BTRFS_COMPRESS}" || return 1 + sleep 1 + # set default subvolume for systemd-gpt-autogenerator + if [[ "${_FSTYPE}" == "btrfs" ]]; then + btrfs subvolume set-default "${_DESTDIR}"/"${_MP}" || return 1 + fi + done + _dialog --infobox "Auto-Prepare was successful.\nContinuing in 5 seconds..." 4 40 + sleep 5 + _S_MKFSAUTO=1 +} +# vim: set ft=sh ts=4 sw=4 et: diff --git a/usr/lib/archboot/installer/base.sh b/usr/lib/archboot/installer/base.sh index e69de29bb..d31548dac 100644 --- a/usr/lib/archboot/installer/base.sh +++ b/usr/lib/archboot/installer/base.sh @@ -0,0 +1,349 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-2.0-only +# created by Tobias Powalowski +_ANSWER="/tmp/.setup" +_NO_LOG="/dev/null" +if pgrep -x Xorg &>"${_NO_LOG}"; then + _LOG="/dev/tty8" +else + _LOG="/dev/tty7" +fi +_VC_NUM="$(basename ${_LOG} | sed -e 's#tty##g')" +_VC="VC${_VC_NUM}" +# install stages +_S_NET="" # network setting +_S_SRC="" # choose mirror +_S_MKFS="" # formatting +_S_MKFSAUTO="" # auto fs part/formatting +# menu item tracker- autoselect the next item +_NEXTITEM="" +# To allow choice in script set EDITOR="" +_EDITOR="" +# programs +_LSBLK="lsblk -rpno" +_BLKID="blkid -c ${_NO_LOG}" +_DLPROG="wget -q" +# use the first VT not dedicated to a running console +# don't use _DESTDIR=/mnt because it's intended to mount other things there! +# check first if bootet in archboot +# don't ask for source and network on booted system +if grep -qw '^archboot' /etc/hostname; then + _DESTDIR="/install" +else + _DESTDIR="/" + _S_NET=1 + _S_SRC=1 +fi + +_set_title() { + if [[ "${_DESTDIR}" == "/" ]]; then + _TITLE="Archboot Arch Linux (System Setup mode) --> https://bit.ly/archboot" + else + if [[ -e "${_LOCAL_DB}" ]]; then + _TITLE="Archboot Arch Linux Installation (Local mode) --> https://bit.ly/archboot" + else + _TITLE="Archboot Arch Linux Installation (Online mode) --> https://bit.ly/archboot" + fi + fi +} + +# _dialog() +# an el-cheapo dialog wrapper +# +# parameters: see dialog(1) +# returns: whatever dialog did +_dialog() { + dialog --backtitle "${_TITLE}" --aspect 15 "$@" + return $? +} + +_printk() +{ + case ${1} in + "on") echo 4 >/proc/sys/kernel/printk ;; + "off") echo 0 >/proc/sys/kernel/printk ;; + esac +} + +_abort_running_system() { + _dialog --msgbox "This function is not available on System Setup mode." 5 60 +} + +_geteditor() { + if ! [[ "${_EDITOR}" ]]; then + _dialog --menu "Select a Text Editor to Use" 9 35 3 \ + "1" "nano (easier)" \ + "2" "neovim" 2>${_ANSWER} || return 1 + case $(cat ${_ANSWER}) in + "1") _EDITOR="nano" + if ! [[ -f "${_DESTDIR}/usr/bin/nano" ]]; then + _PACKAGES="nano" + _run_pacman + _dialog --infobox "Enable nano's syntax highlighting on installed system..." 3 70 + grep -q '^include' "${_DESTDIR}/etc/nanorc" || \ + echo "include \"/usr/share/nano/*.nanorc\"" >> "${_DESTDIR}/etc/nanorc" + sleep 2 + fi + ;; + "2") _EDITOR="nvim" + if ! [[ -f "${_DESTDIR}/usr/bin/nvim" ]]; then + _PACKAGES="nvim" + _run_pacman + fi + ;; + esac + fi +} + +_set_uefi_parameters() { + _UEFI_BOOT="" + _UEFI_SECURE_BOOT="" + _GUIDPARAMETER="" + [[ -e "/sys/firmware/efi" ]] && _UEFI_BOOT=1 + if [[ -n "${_UEFI_BOOT}" ]]; then + _GUIDPARAMETER=1 + _SECUREBOOT_VAR_VALUE="$(efivar -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SecureBoot 2>"${_NO_LOG}" | tail -n -1 | awk '{print $2}')" + _SETUPMODE_VAR_VALUE="$(efivar -n 8be4df61-93ca-11d2-aa0d-00e098032b8c-SetupMode 2>"${_NO_LOG}" | tail -n -1 | awk '{print $2}')" + if [[ "${_SECUREBOOT_VAR_VALUE}" == "01" ]] && [[ "${_SETUPMODE_VAR_VALUE}" == "00" ]]; then + _UEFI_SECURE_BOOT=1 + fi + if [[ "${_RUNNING_ARCH}" == "x86_64" ]]; then + if grep -q '_IA32_UEFI=1' /proc/cmdline; then + _EFI_MIXED=1 + _UEFI_ARCH="IA32" + _SPEC_UEFI_ARCH="ia32" + else + _EFI_MIXED="" + _UEFI_ARCH="X64" + _SPEC_UEFI_ARCH="x64" + fi + fi + if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then + _EFI_MIXED="" + _UEFI_ARCH="AA64" + _SPEC_UEFI_ARCH="aa64" + fi + fi +} + +# set GUID (gpt) usage +_set_guid() { + # all uefi systems should use GUID layout + if [[ -z "${_UEFI_BOOT}" ]]; then + ## Lenovo BIOS-GPT issues - Arch Forum - https://bbs.archlinux.org/viewtopic.php?id=131149 , + ## https://bbs.archlinux.org/viewtopic.php?id=133330 , + ## https://bbs.archlinux.org/viewtopic.php?id=138958 + ## Lenovo BIOS-GPT issues - in Fedora - https://bugzilla.redhat.com/show_bug.cgi?id=735733, + ## https://bugzilla.redhat.com/show_bug.cgi?id=749325, + ## http://git.fedorahosted.org/git/?p=anaconda.git;a=commit;h=ae74cebff312327ce2d9b5ac3be5dbe22e791f09 + #shellcheck disable=SC2034 + _dialog --yesno "$(cat /usr/lib/archboot/installer/help/guid.txt)" 0 0 && _GUIDPARAMETER=1 + fi +} + +_set_vconsole() { + if [[ -e /usr/bin/km ]]; then + km --setup && _NEXTITEM=1 + elif [[ -e /usr/bin/archboot-km.sh ]]; then + archboot-km.sh --setup && _NEXTITEM=1 + else + _dialog --msgbox "Error:\nkm script not found, aborting console and keyboard setting." 0 0 + fi +} + +_select_source() { + _NEXTITEM="2" + _set_title + _S_SRC="" + if [[ -e "${_LOCAL_DB}" ]]; then + _getsource || return 1 + else + if [[ -z ${_S_NET} ]]; then + _check_network || return 1 + fi + if [[ -z ${_S_SRC} ]]; then + [[ "${_RUNNING_ARCH}" == "x86_64" ]] && _enable_testing + _getsource || return 1 + fi + fi + _NEXTITEM="3" +} + +_set_clock() { + if [[ -e /usr/bin/tz ]]; then + tz --setup && _NEXTITEM="4" + elif [[ -e /usr/bin/archboot-tz.sh ]]; then + archboot-tz.sh --setup && _NEXTITEM="4" + else + _dialog --msgbox "Error:\ntz script not found, aborting clock setting" 0 0 + fi +} + +_prepare_storagedrive() { + _S_MKFSAUTO="" + _S_MKFS="" + _DONE="" + _NEXTITEM="" + while [[ -z "${_DONE}" ]]; do + if [[ -n "${_NEXTITEM}" ]]; then + _DEFAULT="--default-item ${_NEXTITEM}" + else + _DEFAULT="" + fi + _CANCEL="" + #shellcheck disable=SC2086 + dialog ${_DEFAULT} --backtitle "${_TITLE}" --menu "Prepare Storage Device" 12 60 5 \ + "1" "Auto-Prepare (erases the ENTIRE storage device)" \ + "2" "Partition Storage Device" \ + "3" "Manage Software Raid, LVM2 and LUKS Encryption" \ + "4" "Set Filesystem Mountpoints" \ + "5" "Return to Main Menu" 2>${_ANSWER} || _CANCEL=1 + _NEXTITEM="$(cat ${_ANSWER})" + [[ "${_S_MKFSAUTO}" = "1" ]] && _DONE=1 + case $(cat ${_ANSWER}) in + "1") + _CREATE_MOUNTPOINTS=1 + _autoprepare + [[ "${_S_MKFSAUTO}" = "1" ]] && _DONE=1 + ;; + "2") + _partition ;; + "3") + _create_special ;; + "4") + _DEVFINISH="" + _CREATE_MOUNTPOINTS=1 + _mountpoints ;; + *) + _DONE=1 ;; + esac + done + if [[ "${_CANCEL}" = "1" ]]; then + _NEXTITEM="4" + else + _NEXTITEM="5" + fi +} + +_configure_system() { + _destdir_mounts || return 1 + _check_root_password || return 1 + _geteditor || return 1 + ## PREPROCESSING ## + _set_locale || return 1 + _auto_mkinitcpio + ## END PREPROCESS ## + _FILE="" + _S_CONFIG="" + # main menu loop + while true; do + if [[ -n "${_FILE}" ]]; then + _DEFAULT="--default-item ${_FILE}" + else + _DEFAULT="" + fi + #shellcheck disable=SC2086 + _dialog ${_DEFAULT} --menu "Configuration" 20 60 16 \ + "/etc/hostname" "System Hostname" \ + "/etc/vconsole.conf" "Virtual Console" \ + "/etc/locale.conf" "Locale Setting" \ + "/etc/fstab" "Filesystem Mountpoints" \ + "/etc/mkinitcpio.conf" "Initramfs Config" \ + "/etc/modprobe.d/modprobe.conf" "Kernel Modules" \ + "/etc/resolv.conf" "DNS Servers" \ + "/etc/hosts" "Network Hosts" \ + "/etc/locale.gen" "Glibc Locales" \ + "/etc/pacman.d/mirrorlist" "Pacman Mirror List" \ + "/etc/pacman.conf" "Pacman Config File" \ + "Root-Password" "Set the root password" \ + "Return" "Return to Main Menu" 2>${_ANSWER} || break + _FILE="$(cat ${_ANSWER})" + if [[ "${_FILE}" = "Return" || -z "${_FILE}" ]]; then + _S_CONFIG=1 + break + elif [[ "${_FILE}" = "/etc/mkinitcpio.conf" ]]; then + _set_mkinitcpio + elif [[ "${_FILE}" = "/etc/locale.gen" ]]; then + _auto_set_locale + ${_EDITOR} "${_DESTDIR}""${_FILE}" + _run_locale_gen + elif [[ "${_FILE}" = "Root-Password" ]]; then + _set_password + else + ${_EDITOR} "${_DESTDIR}""${_FILE}" + fi + done + if [[ ${_S_CONFIG} -eq 1 ]]; then + _NEXTITEM="7" + fi +} + +_mainmenu() { + if [[ -n "${_NEXTITEM}" ]]; then + _DEFAULT="--default-item ${_NEXTITEM}" + else + _DEFAULT="" + fi + #shellcheck disable=SC2086 + dialog ${_DEFAULT} --backtitle "${_TITLE}" --title " MAIN MENU " \ + --menu "Use the UP and DOWN arrows to navigate menus.\nUse TAB to switch between buttons and ENTER to select." 17 58 14 \ + "0" "Set Console Font And Keymap" \ + "1" "Set up Network" \ + "2" "Select Source" \ + "3" "Set Time And Date" \ + "4" "Prepare Storage Device" \ + "5" "Install Packages" \ + "6" "Configure System" \ + "7" "Install Bootloader" \ + "8" "Exit Program" 2>${_ANSWER} + _NEXTITEM="$(cat ${_ANSWER})" + case $(cat ${_ANSWER}) in + "0") + _set_vconsole ;; + "1") + _donetwork ;; + "2") + if [[ "${_DESTDIR}" == "/" ]]; then + _abort_running_system + else + _select_source || return 1 + _update_environment + fi ;; + "3") + _set_clock ;; + "4") + if [[ "${_DESTDIR}" == "/" ]]; then + _abort_running_system + else + _prepare_storagedrive + fi ;; + "5") + if [[ "${_DESTDIR}" == "/" ]]; then + _abort_running_system + else + _install_packages + fi ;; + "6") + _configure_system ;; + "7") + _install_bootloader ;; + "8") + [[ -e /tmp/.setup-running ]] && rm /tmp/.setup-running + clear + if [[ "${_DESTDIR}" == "/install" ]]; then + echo "" + echo "If the install finished successfully, you can now type 'reboot'" + echo "to restart the system." + echo "" + fi + exit 0 ;; + *) + if _dialog --yesno "Abort Program?" 6 40; then + [[ -e /tmp/.setup-running ]] && rm /tmp/.setup-running + clear + exit 1 + fi + ;; + esac +} +# vim: set ft=sh ts=4 sw=4 et: diff --git a/usr/lib/archboot/installer/blockdevices.sh b/usr/lib/archboot/installer/blockdevices.sh index e69de29bb..b0872908a 100644 --- a/usr/lib/archboot/installer/blockdevices.sh +++ b/usr/lib/archboot/installer/blockdevices.sh @@ -0,0 +1,841 @@ +#!/usr/bin/env bash +# SPDX-License-Identifier: GPL-2.0-only +# created by Tobias Powalowski +_getfstype() +{ + ${_LSBLK} FSTYPE "${1}" +} + +_getfsuuid() +{ + ${_LSBLK} UUID "${1}" +} + +_getfslabel() +{ + ${_LSBLK} LABEL "${1}" +} + +_getpartuuid() +{ + ${_LSBLK} PARTUUID "${1}" +} + +_getpartlabel() +{ + ${_LSBLK} PARTLABEL "${1}" +} + +# lists linux blockdevices +_blockdevices() { + # all available block disk devices + for dev in $(${_LSBLK} NAME,TYPE | grep "disk$" | cut -d' ' -f1); do + # exclude checks: + #- iso9660 devices + # (${_LSBLK} FSTYPE ${dev} | grep "iso9660" + #- fakeraid isw devices + # ${_LSBLK} FSTYPE ${dev} | grep "isw_raid_member" + #- fakeraid ddf devices + # ${_LSBLK} FSTYPE ${dev} | grep "ddf_raid_member" + # - zram devices + # echo "${dev}" | grep -q 'zram' + if ! ${_LSBLK} FSTYPE "${dev}" | grep -q "iso9660" &&\ + ! ${_LSBLK} FSTYPE "${dev}" | grep -q "isw_raid_member" &&\ + ! ${_LSBLK} FSTYPE "${dev}" | grep -q "ddf_raid_member" &&\ + ! echo "${dev}" | grep -q 'zram'; then + ${_LSBLK} NAME,SIZE -d "${dev}" + fi + done +} + +# lists linux blockdevice partitions +_blockdevices_partitions() { + # all available block devices partitions + # _printk off needed cause of parted usage + _printk off + for dev in $(${_LSBLK} NAME,TYPE | grep -v '^/dev/md' | grep "part$"| cut -d' ' -f1); do + # exclude checks: + #- part of raid device + # ${_LSBLK} FSTYPE ${dev} | grep "linux_raid_member" + #- part of lvm2 device + # ${_LSBLK} FSTYPE /dev/${dev} | grep "LVM2_member" + #- part of luks device + # ${_LSBLK} FSTYPE /dev/${dev} | grep "crypto_LUKS" + #- extended partition + # sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep "Extended$" + # - extended partition (LBA) + # sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep "(LBA)$" + #- bios_grub partitions + # sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep -q "BIOS boot$" + #- iso9660 devices + # "${_LSBLK} FSTYPE -s ${dev} | grep "iso9660" + if ! ${_LSBLK} FSTYPE "${dev}" | grep -q "linux_raid_member" &&\ + ! ${_LSBLK} FSTYPE "${dev}" | grep -q "LVM2_member" &&\ + ! ${_LSBLK} FSTYPE "${dev}" | grep -q "crypto_LUKS" &&\ + ! ${_LSBLK} FSTYPE -s "${dev}" | grep -q "iso9660" &&\ + ! sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep -q "Extended$" &&\ + ! sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep -q "(LBA)$" &&\ + ! sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep -q "BIOS boot$"; then + ${_LSBLK} NAME,SIZE -d "${dev}" + fi + done + _printk on +} + +# list none partitionable raid md devices +_raid_devices() { + for dev in $(${_LSBLK} NAME,TYPE | grep " raid.*$\| linear$" | cut -d' ' -f 1 | sort -u); do + # exclude checks: + # - part of lvm2 device_found + # ${_LSBLK} FSTYPE ${dev} | grep "LVM2_member" + # - part of luks device + # ${_LSBLK} FSTYPE ${dev} | grep "crypto_LUKS" + # - part of isw fakeraid + # ${_LSBLK} FSTYPE ${dev} -s | grep "isw_raid_member" + # - part of ddf fakeraid + # ${_LSBLK} FSTYPE ${dev} -s | grep "ddf_raid_member" + if ! ${_LSBLK} FSTYPE "${dev}" | grep -q "LVM2_member" &&\ + ! ${_LSBLK} FSTYPE "${dev}" | grep -q "crypto_LUKS" &&\ + ! ${_LSBLK} FSTYPE "${dev}" -s | grep -q "isw_raid_member" &&\ + ! ${_LSBLK} FSTYPE "${dev}" -s | grep -q "ddf_raid_member" &&\ + ! find "$dev"*p* -type f -exec echo {} \; 2>"${_NO_LOG}"; then + ${_LSBLK} NAME,SIZE -d "${dev}" + fi + done +} + +# lists linux partitionable raid devices partitions +_partitionable_raid_devices_partitions() { + for dev in $(${_LSBLK} NAME,TYPE | grep "part$" | grep "^/dev/md.*p" 2>"${_NO_LOG}" | cut -d' ' -f 1 | sort -u) ; do + # exclude checks: + # - part of lvm2 device_found + # ${_LSBLK} FSTYPE ${dev} | grep "LVM2_member" + # - part of luks device + # ${_LSBLK} FSTYPE ${dev} | grep "crypto_LUKS" + # - extended partition + # sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep "Extended$" + # - extended partition (LBA) + # sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep "(LBA)$" + # - part of isw fakeraid + # ${_LSBLK} FSTYPE ${dev} -s | grep "isw_raid_member" + # - part of ddf fakeraid + # ${_LSBLK} FSTYPE ${dev} -s | grep "ddf_raid_member" + if ! ${_LSBLK} FSTYPE "${dev}" | grep -q "LVM2_member" &&\ + ! ${_LSBLK} FSTYPE "${dev}" | grep -q "crypto_LUKS" &&\ + ! sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep -q "Extended$" &&\ + ! sfdisk -l 2>"${_NO_LOG}" | grep "${dev}" | grep -q "(LBA)$" &&\ + ! ${_LSBLK} FSTYPE "${dev}" -s | grep -q "isw_raid_member" &&\ + ! ${_LSBLK} FSTYPE "${dev}" -s | grep -q "ddf_raid_member"; then + ${_LSBLK} NAME,SIZE -d "${dev}" + fi + done +} + +_dmraid_devices() { + # isw_raid_member, managed by mdadm + for dev in $(${_LSBLK} NAME,TYPE 2>"${_NO_LOG}" | grep " raid.*$" | cut -d' ' -f 1 | sort -u); do + if ${_LSBLK} NAME,FSTYPE -s "${dev}" | grep "isw_raid_member$"; then + ${_LSBLK} NAME,SIZE -d "${dev}" + fi + done + # ddf_raid_member, managed by mdadm + for dev in $(${_LSBLK} NAME,TYPE 2>"${_NO_LOG}" | grep " raid.*$" | cut -d' ' -f 1 | sort -u); do + if ${_LSBLK} NAME,FSTYPE -s "${dev}" | grep "ddf_raid_member$"; then + ${_LSBLK} NAME,SIZE -d "${dev}" + fi + done +} + +_dmraid_partitions() { + # isw_raid_member, managed by mdadm + for dev in $(${_LSBLK} NAME,TYPE | grep " md$" | cut -d' ' -f 1 | sort -u); do + if ${_LSBLK} NAME,FSTYPE -s "${dev}" 2>"${_NO_LOG}" | grep "isw_raid_member$" | cut -d' ' -f 1; then + ${_LSBLK} NAME,SIZE -d "${dev}" + fi + done + # ddf_raid_member, managed by mdadm + for dev in $(${_LSBLK} NAME,TYPE | grep " md$" | cut -d' ' -f 1 | sort -u); do + if ${_LSBLK} NAME,FSTYPE -s "${dev}" 2>"${_NO_LOG}" | grep "ddf_raid_member$" | cut -d' ' -f 1; then + ${_LSBLK} NAME,SIZE -d "${dev}" + fi + done +} + +# dm_devices +# - show device mapper devices: +# lvm2 and cryptdevices +_dm_devices() { + for dev in $(${_LSBLK} NAME,TYPE | grep -e "lvm$" -e "crypt$" | cut -d' ' -f1 | sort -u); do + # exclude checks: + # - part of lvm2 device + # ${_LSBLK} FSTYPE ${dev} | grep "LVM2_member" + # - part of luks device + # ${_LSBLK} FSTYPE ${dev} | grep "crypto_LUKS" + # - part of raid device + # ${_LSBLK} FSTYPE ${dev} | grep "linux_raid_member$" + # - part of running raid on encrypted device + # ${_LSBLK} TYPE ${dev} | grep "raid.*$ + if ! ${_LSBLK} FSTYPE "${dev}" | grep -q "crypto_LUKS$" &&\ + ! ${_LSBLK} FSTYPE "${dev}" | grep -q "LVM2_member$" &&\ + ! ${_LSBLK} FSTYPE "${dev}" | grep -q "linux_raid_member$" &&\ + ! ${_LSBLK} TYPE "${dev}" | grep -q "raid.*$"; then + ${_LSBLK} NAME,SIZE -d "${dev}" + fi + done +} + +_finddisks() { + _blockdevices + _dmraid_devices +} + +_finddevices() { + _blockdevices_partitions + _dm_devices + _dmraid_partitions + _raid_devices + _partitionable_raid_devices_partitions +} + +# don't check on raid devices! +_findbootloaderdisks() { + if [[ -z "${_USE_DMRAID}" ]]; then + _blockdevices + else + _dmraid_devices + fi +} + +_activate_lvm2() +{ + _LVM2_READY="" + if [[ -e /usr/bin/lvm ]]; then + _OLD_LVM2_GROUPS=${_LVM2_GROUPS} + _OLD_LVM2_VOLUMES=${_LVM2_VOLUMES} + _dialog --infobox "Scanning logical volumes..." 0 0 + lvm vgscan --ignorelockingfailure &>"${_NO_LOG}" + _dialog --infobox "Activating logical volumes..." 0 0 + lvm vgchange --ignorelockingfailure --ignoremonitoring -ay &>"${_NO_LOG}" + _LVM2_GROUPS="$(vgs -o vg_name --noheading 2>"${_NO_LOG}")" + _LVM2_VOLUMES="$(lvs -o vg_name,lv_name --noheading --separator - 2>"${_NO_LOG}")" + [[ "${_OLD_LVM2_GROUPS}" == "${_LVM2_GROUPS}" && "${_OLD_LVM2_VOLUMES}" == "${_LVM2_VOLUMES}" ]] && _LVM2_READY="1" + fi +} + +_activate_md() +{ + _RAID_READY="" + if [[ -e /usr/bin/mdadm ]]; then + _dialog --infobox "Activating RAID arrays..." 0 0 + mdadm --assemble --scan &>"${_NO_LOG}" || _RAID_READY="1" + fi +} + +_activate_luks() +{ + _LUKS_READY="" + if [[ -e /usr/bin/cryptsetup ]]; then + _dialog --infobox "Scanning for luks encrypted devices..." 0 0 + if ${_LSBLK} FSTYPE | grep -q "crypto_LUKS"; then + for part in $(${_LSBLK} NAME,FSTYPE | grep " crypto_LUKS$" | cut -d' ' -f 1); do + # skip already encrypted devices, device mapper! + if ! ${_LSBLK} TYPE "${part}" | grep -q "crypt$"; then + _RUN_LUKS="" + _dialog --yesno "Setup detected luks encrypted device, do you want to activate ${part} ?" 0 0 && _RUN_LUKS=1 + [[ -n "${_RUN_LUKS}" ]] && _enter_luks_name && _enter_luks_passphrase && _opening_luks + [[ -z "${_RUN_LUKS}" ]] && _LUKS_READY="1" + else + _LUKS_READY="1" + fi + done + else + _LUKS_READY="1" + fi + fi +} + +# activate special devices: +# activate lvm2 and raid devices, if not already activated during bootup! +# run it more times if needed, it can be hidden by each other! +_activate_special_devices() +{ + _RAID_READY="" + _LUKS_READY="" + _LVM2_READY="" + while [[ -n "${_LVM2_READY}" && -n "${_RAID_READY}" && -n "${_LUKS_READY}" ]]; do + _activate_md + _activate_lvm2 + _activate_luks + done +} + +_set_device_name_scheme() { + _NAME_SCHEME_PARAMETER="" + _NAME_SCHEME_LEVELS="" + ## util-linux root=PARTUUID=/root=PARTLABEL= support - https://git.kernel.org/?p=utils/util-linux/util-linux.git;a=commitdiff;h=fc387ee14c6b8672761ae5e67ff639b5cae8f27c;hp=21d1fa53f16560dacba33fffb14ffc05d275c926 + ## mkinitcpio's init root=PARTUUID= support - https://projects.archlinux.org/mkinitcpio.git/tree/init_functions#n185 + if [[ -n "${_UEFI_BOOT}" ]]; then + _NAME_SCHEME_LEVELS="${_NAME_SCHEME_LEVELS} PARTUUID PARTUUID= PARTLABEL PARTLABEL=" + fi + _NAME_SCHEME_LEVELS="${_NAME_SCHEME_LEVELS} FSUUID UUID= FSLABEL LABEL=