Revert "silence check"

This reverts commit 72e3ea7055.
This commit is contained in:
Tobias Powalowski 2023-02-03 12:44:45 +01:00
parent 72e3ea7055
commit 248a8d0c2b
9 changed files with 3224 additions and 2 deletions

View file

@ -0,0 +1,239 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
# 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:

View file

@ -0,0 +1,286 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
_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
## <partnum>:<fstype>:<mountpoint>:<labelname>
## 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:

View file

@ -0,0 +1,349 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
_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:

View file

@ -0,0 +1,841 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
_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=<partuuid> PARTLABEL PARTLABEL=<partlabel>"
fi
_NAME_SCHEME_LEVELS="${_NAME_SCHEME_LEVELS} FSUUID UUID=<uuid> FSLABEL LABEL=<label> KERNEL /dev/<kernelname>"
#shellcheck disable=SC2086
_dialog --menu "Select the device name scheme you want to use in config files.\nPARTUUID is recommended on GPT disks.\nFSUUID is recommended on MBR/MSDOS disks." 14 70 8 ${_NAME_SCHEME_LEVELS} 2>"${_ANSWER}" || return 1
_NAME_SCHEME_PARAMETER=$(cat "${_ANSWER}")
_NAME_SCHEME_PARAMETER_RUN=1
}
_clean_disk() {
# clear all magic strings/signatures - mdadm, lvm, partition tables etc
wipefs -a -f "${1}" &>"${_NO_LOG}"
partprobe "${1}" &>"${_NO_LOG}"
}
# Disable swap and all mounted partitions for the destination system. Unmount
# the destination root partition last!
_umountall()
{
if [[ "${_DESTDIR}" == "/install" ]] && mountpoint -q "${_DESTDIR}"; then
swapoff -a &>"${_NO_LOG}"
for dev in $(findmnt --list --submounts "${_DESTDIR}" -o TARGET -n | tac); do
umount "${dev}"
done
_dialog --infobox "Disabled swapspace,\nunmounted already mounted disk devices in ${_DESTDIR}...\nContinuing in 5 seconds..." 5 60
sleep 5
fi
}
_stopmd()
{
_DISABLEMD=""
if grep -q ^md /proc/mdstat 2>"${_NO_LOG}"; then
_dialog --defaultno --yesno "Setup detected already running software raid device(s)...\n\nDo you want to delete ALL of them completely?\nWARNING: ALL DATA ON THEM WILL BE LOST!" 0 0 && _DISABLEMD=1
if [[ -n "${_DISABLEMD}" ]]; then
_umountall
# shellcheck disable=SC2013
for dev in $(grep ^md /proc/mdstat | sed -e 's# :.*##g'); do
wipefs -a -f "/dev/${dev}" &>"${_NO_LOG}"
mdadm --manage --stop "/dev/${dev}" &>"${_LOG}"
done
_dialog --infobox "Removing software raid device(s) done.\nContinuing in 5 seconds..." 0 0
sleep 5
fi
fi
_DISABLEMDSB=""
if ${_LSBLK} FSTYPE | grep -q "linux_raid_member"; then
_dialog --defaultno --yesno "Setup detected superblock(s) of software raid devices...\n\nDo you want to delete the superblock on ALL of them?\nWARNING: ALL DATA ON THEM WILL BE LOST!" 0 0 && _DISABLEMDSB=1
if [[ -n "${_DISABLEMDSB}" ]]; then
_umountall
fi
fi
if [[ -n "${_DISABLEMD}" || -n "${_DISABLEMDSB}" ]]; then
for dev in $(${_LSBLK} NAME,FSTYPE | grep "linux_raid_member$" | cut -d' ' -f 1); do
_clean_disk "${dev}"
done
_dialog --infobox "Removing superblock(s) on software raid devices done.\nContinuing in 5 seconds..." 4 60
sleep 5
fi
}
_stoplvm()
{
_DISABLELVM=""
_DETECTED_LVM=""
_LV_VOLUMES="$(lvs -o vg_name,lv_name --noheading --separator - 2>"${_NO_LOG}")"
_LV_GROUPS="$(vgs -o vg_name --noheading 2>"${_NO_LOG}")"
_LV_PHYSICAL="$(pvs -o pv_name --noheading 2>"${_NO_LOG}")"
[[ -n "${_LV_VOLUMES}" ]] && _DETECTED_LVM=1
[[ -n "${_LV_GROUPS}" ]] && _DETECTED_LVM=1
[[ -n "${_LV_PHYSICAL}" ]] && _DETECTED_LVM=1
if [[ -n "${_DETECTED_LVM}" ]]; then
_dialog --defaultno --yesno "Setup detected lvm volume(s), volume group(s) or physical device(s)...\n\nDo you want to delete ALL of them completely?\nWARNING: ALL DATA ON THEM WILL BE LOST!" 0 0 && _DISABLELVM=1
fi
if [[ -n "${_DISABLELVM}" ]]; then
_umountall
for dev in ${_LV_VOLUMES}; do
lvremove -f "/dev/mapper/${dev}" 2>"${_NO_LOG}">"${_LOG}"
done
for dev in ${_LV_GROUPS}; do
vgremove -f "${dev}" 2>"${_NO_LOG}" >"${_LOG}"
done
for dev in ${_LV_PHYSICAL}; do
pvremove -f "${dev}" 2>"${_NO_LOG}" >"${_LOG}"
done
_dialog --infobox "Removing logical volume(s), logical group(s)\nand physical volume(s) done.\nContinuing in 5 seconds..." 5 50
sleep 5
fi
}
_stopluks()
{
_DISABLELUKS=""
_DETECTED_LUKS=""
_LUKSDEV=""
# detect already running luks devices
_LUKSDEV="$(${_LSBLK} NAME,TYPE | grep " crypt$" | cut -d' ' -f1)"
[[ -z "${_LUKSDEV}" ]] || _DETECTED_LUKS=1
if [[ -n "${_DETECTED_LUKS}" ]]; then
_dialog --defaultno --yesno "Setup detected running luks encrypted device(s)...\n\nDo you want to delete ALL of them completely?\nWARNING: ALL DATA ON THEM WILL BE LOST!" 0 0 && _DISABLELUKS=1
fi
if [[ -n "${_DISABLELUKS}" ]]; then
_umountall
for dev in ${_LUKSDEV}; do
_LUKS_REAL_DEV="$(${_LSBLK} NAME,FSTYPE -s "${_LUKSDEV}" | grep " crypto_LUKS$" | cut -d' ' -f1)"
cryptsetup remove "${dev}" >"${_LOG}"
# delete header from device
wipefs -a "${_LUKS_REAL_DEV}" &>"${_NO_LOG}"
done
_dialog --infobox "Removing luks encrypted device(s) done.\nContinuing in 5 seconds..." 0 0
sleep 5
fi
_DISABLELUKS=""
_DETECTED_LUKS=""
# detect not running luks devices
${_LSBLK} FSTYPE | grep -q "crypto_LUKS" && _DETECTED_LUKS=1
if [[ -n "${_DETECTED_LUKS}" ]]; then
_dialog --defaultno --yesno "Setup detected not running luks encrypted device(s)...\n\nDo you want to delete ALL of them completely?\nWARNING: ALL DATA ON THEM WILL BE LOST!" 0 0 && _DISABLELUKS=1
fi
if [[ -n "${_DISABLELUKS}" ]]; then
for dev in $(${_LSBLK} NAME,FSTYPE | grep "crypto_LUKS$" | cut -d' ' -f1); do
# delete header from device
wipefs -a "${dev}" &>"${_NO_LOG}"
done
_dialog --infobox "Removing not running luks encrypted device(s) done.\nContinuing in 5 seconds..." 0 0
sleep 5
fi
[[ -e /tmp/.crypttab ]] && rm /tmp/.crypttab
}
_helpmd()
{
_dialog --msgbox "$(cat /usr/lib/archboot/installer/help/md.txt)" 0 0
}
_createmd()
{
_MDFINISH=""
while [[ "${_MDFINISH}" != "DONE" ]]; do
_activate_special_devices
: >/tmp/.raid
: >/tmp/.raid-spare
# check for devices
# Remove all raid devices with children
_dialog --infobox "Scanning blockdevices... This may need some time." 3 60
_RAID_BLACKLIST="$(_raid_devices;_partitionable_raid_devices_partitions)"
#shellcheck disable=SC2119
_DEVS="$(_finddevices)"
if [[ -n "${_RAID_BLACKLIST}" ]]; then
for dev in ${_RAID_BLACKLIST}; do
_DEVS="${_DEVS//$(${_LSBLK} NAME,SIZE -d "${dev}")/}"
done
fi
# break if all devices are in use
if [[ -z "${_DEVS}" ]]; then
_dialog --msgbox "All devices in use. No more devices left for new creation." 0 0
return 1
fi
# enter raid device name
_RAIDDEV=""
while [[ -z "${_RAIDDEV}" ]]; do
_dialog --inputbox "Enter the node name for the raiddevice:\n/dev/md[number]\n/dev/md0\n/dev/md1\n\n" 12 50 "/dev/md0" 2>"${_ANSWER}" || return 1
_RAIDDEV=$(cat "${_ANSWER}")
if grep -q "^${_RAIDDEV//\/dev\//}" /proc/mdstat; then
_dialog --msgbox "ERROR: You have defined 2 identical node names! Please enter another name." 8 65
_RAIDDEV=""
fi
done
_RAIDLEVELS="linear - raid0 - raid1 - raid4 - raid5 - raid6 - raid10 -"
#shellcheck disable=SC2086
_dialog --menu "Select the raid level you want to use:" 14 50 7 ${_RAIDLEVELS} 2>"${_ANSWER}" || return 1
_LEVEL=$(cat "${_ANSWER}")
# raid5 and raid10 support parity parameter
_PARITY=""
if [[ "${_LEVEL}" == "raid5" || "${_LEVEL}" == "raid6" || "${_LEVEL}" == "raid10" ]]; then
_PARITYLEVELS="left-asymmetric - left-symmetric - right-asymmetric - right-symmetric -"
#shellcheck disable=SC2086
_dialog --menu "Select the parity layout you want to use (default is left-symmetric):" 21 50 13 ${_PARITYLEVELS} 2>"${_ANSWER}" || return 1
_PARITY=$(cat "${_ANSWER}")
fi
# select the first device to use, no missing option available!
_RAIDNUMBER=1
#shellcheck disable=SC2086
_dialog --menu "Select device ${_RAIDNUMBER}:" 21 50 13 ${_DEVS} 2>"${_ANSWER}" || return 1
_DEV=$(cat "${_ANSWER}")
echo "${_DEV}" >>/tmp/.raid
while [[ "${_DEV}" != "DONE" ]]; do
_RAIDNUMBER=$((_RAIDNUMBER + 1))
# clean loop from used partition and options
_DEVS="$(echo "${_DEVS}" | sed -e "s#$(${_LSBLK} NAME,SIZE -d "${_DEV}")##g" -e 's#MISSING\ _##g' -e 's#SPARE\ _##g')"
# raid0 doesn't support missing devices
! [[ "${_LEVEL}" == "raid0" || "${_LEVEL}" == "linear" ]] && _MDEXTRA="MISSING _"
# add more devices
#shellcheck disable=SC2086
_dialog --menu "Select additional device ${_RAIDNUMBER}:" 21 50 13 ${_DEVS} ${_MDEXTRA} DONE _ 2>"${_ANSWER}" || return 1
_DEV=$(cat "${_ANSWER}")
_SPARE=""
! [[ "${_LEVEL}" == "raid0" || "${_LEVEL}" == "linear" ]] && _dialog --yesno --defaultno "Would you like to use ${_DEV} as spare device?" 0 0 && _SPARE=1
[[ "${_DEV}" == "DONE" ]] && break
if [[ "${_DEV}" == "MISSING" ]]; then
_dialog --yesno "Would you like to create a degraded raid on ${_RAIDDEV}?" 0 0 && _DEGRADED="missing"
echo "${_DEGRADED}" >>/tmp/.raid
else
if [[ -n "${_SPARE}" ]]; then
echo "${_DEV}" >>/tmp/.raid-spare
else
echo "${_DEV}" >>/tmp/.raid
fi
fi
done
# final step ask if everything is ok?
# shellcheck disable=SC2028
_dialog --yesno "Would you like to create ${_RAIDDEV} like this?\n\nLEVEL:\n${_LEVEL}\n\nDEVICES:\n$(while read -r dev;do echo "${dev}\n"; done < /tmp/.raid)\nSPARES:\n$(while read -r dev;do echo "${dev}\n"; done < tmp/.raid-spare)" 0 0 && _MDFINISH="DONE"
done
_umountall
_DEVS="$(echo -n "$(cat /tmp/.raid)")"
_SPARES="$(echo -n "$(cat /tmp/.raid-spare)")"
# combine both if spares are available, spares at the end!
[[ -n ${_SPARES} ]] && _DEVS="${_DEVS} ${_SPARES}"
# get number of devices
_RAID_DEVS="$(wc -l < /tmp/.raid)"
_SPARE_DEVS="$(wc -l < /tmp/.raid-spare)"
# generate options for mdadm
_RAIDOPTIONS="--force --run --level=${_LEVEL}"
! [[ "${_RAID_DEVS}" == 0 ]] && _RAIDOPTIONS="${_RAIDOPTIONS} --raid-devices=${_RAID_DEVS}"
! [[ "${_SPARE_DEVS}" == 0 ]] && _RAIDOPTIONS="${_RAIDOPTIONS} --spare-devices=${_SPARE_DEVS}"
[[ -n "${_PARITY}" ]] && _RAIDOPTIONS="${_RAIDOPTIONS} --layout=${_PARITY}"
#shellcheck disable=SC2086
if mdadm --create ${_RAIDDEV} ${_RAIDOPTIONS} ${_DEVS} &>"${_LOG}"; then
_dialog --infobox "${_RAIDDEV} created successfully.\nContinuing in 5 seconds..." 4 50
sleep 5
else
_dialog --msgbox "Error while creating ${_RAIDDEV} (see ${_LOG} for details)." 0 0
return 1
fi
if [[ -n "${_RAID_PARTITION}" ]]; then
# switch for mbr usage
_set_guid
if [[ -z "${_GUIDPARAMETER}" ]]; then
_dialog --msgbox "Now you'll be put into the cfdisk program where you can partition your raiddevice to your needs." 6 70
cfdisk "${_RAIDDEV}"
else
_DISK="${_RAIDDEV}"
_RUN_CFDISK=1
_CHECK_BIOS_BOOT_GRUB=""
_CHECK_UEFISYSDEV=""
_check_gpt
fi
fi
}
_helplvm()
{
_dialog --msgbox "$(cat /usr/lib/archboot/installer/help/lvm2.txt)" 0 0
}
_createpv()
{
_PVFINISH=""
while [[ "${_PVFINISH}" != "DONE" ]]; do
_activate_special_devices
: >/tmp/.pvs-create
_dialog --infobox "Scanning blockdevices... This may need some time." 3 60
# Remove all lvm devices with children
_LVM_BLACKLIST="$(for dev in $(${_LSBLK} NAME,TYPE | grep " lvm$" | cut -d' ' -f1 | sort -u); do
echo "${dev}"
done)"
#shellcheck disable=SC2119
_DEVS="$(_finddevices)"
if [[ -n "${_LVM_BLACKLIST}" ]]; then
for dev in ${_LVM_BLACKLIST}; do
_DEVS="${_DEVS//$(${_LSBLK} NAME,SIZE -d "${dev}")/}"
done
fi
# break if all devices are in use
if [[ -z "${_DEVS}" ]]; then
_dialog --msgbox "No devices left for physical volume creation." 0 0
return 1
fi
# select the first device to use
_DEVNUMBER=1
#shellcheck disable=SC2086
_dialog --menu "Select device number ${_DEVNUMBER} for physical volume:" 15 50 12 ${_DEVS} 2>"${_ANSWER}" || return 1
_DEV=$(cat "${_ANSWER}")
echo "${_DEV}" >>/tmp/.pvs-create
while [[ "${_DEV}" != "DONE" ]]; do
_DEVNUMBER="$((_DEVNUMBER + 1))"
# clean loop from used partition and options
_DEVS="${_DEVS//$(${_LSBLK} NAME,SIZE -d "${_DEV}")/}"
# add more devices
#shellcheck disable=SC2086
_dialog --menu "Select additional device number ${_DEVNUMBER} for physical volume:" 15 60 12 ${_DEVS} DONE _ 2>"${_ANSWER}" || return 1
_DEV=$(cat "${_ANSWER}")
[[ "${_DEV}" == "DONE" ]] && break
echo "${_DEV}" >>/tmp/.pvs-create
done
# final step ask if everything is ok?
_dialog --yesno "Would you like to create physical volume on devices below?\n$(sed -e 's#$#\\n#g' /tmp/.pvs-create)" 0 0 && _PVFINISH="DONE"
done
_DEV="$(echo -n "$(cat /tmp/.pvs-create)")"
#shellcheck disable=SC2028,SC2086
_umountall
#shellcheck disable=SC2086
if pvcreate -y ${_DEV} &>"${_LOG}"; then
_dialog --infobox "Creating physical volume on ${_DEV} was successful.\nContinuing in 5 seconds..." 4 75
sleep 5
else
_dialog --msgbox "Error while creating physical volume on ${_DEV} (see ${_LOG} for details)." 0 0; return 1
fi
# run udevadm to get values exported
udevadm trigger
udevadm settle
}
#find physical volumes that are not in use
_findpv()
{
for dev in $(${_LSBLK} NAME,FSTYPE | grep " LVM2_member$" | cut -d' ' -f1 | sort -u); do
# exclude checks:
#- not part of running lvm2
# ! "$(${_LSBLK} TYPE ${dev} | grep "lvm")"
#- not part of volume group
# $(pvs -o vg_name --noheading ${dev} | grep " $")
if ! ${_LSBLK} TYPE "${dev}" | grep "lvm" && pvs -o vg_name --noheading "${dev}" | grep -q " $"; then
${_LSBLK} NAME,SIZE "${dev}"
fi
done
}
#find volume groups that are not already full in use
_findvg()
{
for dev in $(vgs -o vg_name --noheading); do
if ! vgs -o vg_free --noheading --units m "${dev}" | grep -q " 0m$"; then
#shellcheck disable=SC2028
echo "${dev} $(vgs -o vg_free --noheading --units m "${dev}")"
fi
done
}
_createvg()
{
_VGFINISH=""
while [[ "${_VGFINISH}" != "DONE" ]]; do
: >/tmp/.pvs
_VGDEV=""
_PVS=$(_findpv)
# break if all devices are in use
if [[ -z "${_PVS}" ]]; then
_dialog --msgbox "No devices left for Volume Group creation." 0 0
return 1
fi
# enter volume group name
_VGDEV=""
while [[ -z "${_VGDEV}" ]]; do
_dialog --inputbox "Enter the Volume Group name:\nfoogroup\n<yourvolumegroupname>\n\n" 11 40 "foogroup" 2>"${_ANSWER}" || return 1
_VGDEV=$(cat "${_ANSWER}")
if vgs -o vg_name --noheading | grep -q "^ ${_VGDEV}"; then
_dialog --msgbox "ERROR: You have defined 2 identical Volume Group names! Please enter another name." 8 65
_VGDEV=""
fi
done
# show all devices with sizes, which are not in use
# select the first device to use, no missing option available!
_PVNUMBER=1
#shellcheck disable=SC2086
_dialog --menu "Select Physical Volume ${_PVNUMBER} for ${_VGDEV}:" 13 50 10 ${_PVS} 2>"${_ANSWER}" || return 1
_PV=$(cat "${_ANSWER}")
echo "${_PV}" >>/tmp/.pvs
while [[ "${_PVS}" != "DONE" ]]; do
_PVNUMBER=$((_PVNUMBER + 1))
# clean loop from used partition and options
#shellcheck disable=SC2001,SC2086
_PVS="${_PVS//$(${_LSBLK} NAME,SIZE -d "${_PV}")/}"
# add more devices
#shellcheck disable=SC2086
_dialog --menu "Select additional Physical Volume ${_PVNUMBER} for ${_VGDEV}:" 13 50 10 ${_PVS} DONE _ 2>"${_ANSWER}" || return 1
_PV=$(cat "${_ANSWER}")
[[ "${_PV}" == "DONE" ]] && break
echo "${_PV}" >>/tmp/.pvs
done
# final step ask if everything is ok?
_dialog --yesno "Would you like to create Volume Group like this?\n\n${_VGDEV}\n\nPhysical Volumes:\n$(sed -e 's#$#\\n#g' /tmp/.pvs)" 0 0 && _VGFINISH="DONE"
done
_PV="$(echo -n "$(cat /tmp/.pvs)")"
_umountall
#shellcheck disable=SC2086
if vgcreate ${_VGDEV} ${_PV} &>"${_LOG}"; then
_dialog --infobox "Creating Volume Group ${_VGDEV} was successful.\nContinuing in 5 seconds..." 4 60
sleep 5
else
_dialog --msgbox "Error while creating Volume Group ${_VGDEV} (see ${_LOG} for details)." 0 0
return 1
fi
}
_createlv()
{
_LVFINISH=""
while [[ "${_LVFINISH}" != "DONE" ]]; do
_LVDEV=""
_LV_SIZE_SET=""
_LVS=$(_findvg)
# break if all devices are in use
if [[ -z "${_LVS}" ]]; then
_dialog --msgbox "No Volume Groups with free space available for Logical Volume creation." 0 0
return 1
fi
# show all devices with sizes, which are not 100% in use!
#shellcheck disable=SC2086
_dialog --menu "Select Volume Group:" 11 50 5 ${_LVS} 2>"${_ANSWER}" || return 1
_LV=$(cat "${_ANSWER}")
# enter logical volume name
_LVDEV=""
while [[ -z "${_LVDEV}" ]]; do
_dialog --inputbox "Enter the Logical Volume name:\nfooname\n<yourvolumename>\n\n" 10 65 "fooname" 2>"${_ANSWER}" || return 1
_LVDEV=$(cat "${_ANSWER}")
if lvs -o lv_name,vg_name --noheading | grep -q " ${_LVDEV} ${_LV}$"; then
_dialog --msgbox "ERROR: You have defined 2 identical Logical Volume names! Please enter another name." 8 65
_LVDEV=""
fi
done
while [[ -z "${_LV_SIZE_SET}" ]]; do
_LV_ALL=""
_dialog --inputbox "Enter the size (MB) of your Logical Volume,\nMinimum value is > 0.\n\nVolume space left: $(vgs -o vg_free --noheading --units m "${_LV}")B\n\nIf you enter no value, all free space left will be used." 12 65 "" 2>"${_ANSWER}" || return 1
_LV_SIZE=$(cat "${_ANSWER}")
if [[ -z "${_LV_SIZE}" ]]; then
_LV_ALL=1
_LV_SIZE_SET=1
elif [[ "${_LV_SIZE}" == 0 ]]; then
_dialog --msgbox "ERROR: You have entered a invalid size, please enter again." 0 0
else
if [[ "${_LV_SIZE}" -ge "$(vgs -o vg_free --noheading --units m | sed -e 's#m##g')" ]]; then
_dialog --msgbox "ERROR: You have entered a too large size, please enter again." 0 0
else
_LV_SIZE_SET=1
fi
fi
done
#Contiguous doesn't work with +100%FREE
_LV_CONTIGUOUS=""
[[ -z "${_LV_ALL}" ]] && _dialog --defaultno --yesno "Would you like to create Logical Volume as a contiguous partition, that means that your space doesn't get partitioned over one or more disks nor over non-contiguous physical extents.\n(usefull for swap space etc.)?" 0 0 && _LV_CONTIGUOUS=1
if [[ -n "${_LV_CONTIGUOUS}" ]]; then
_CONTIGUOUS=yes
_LV_EXTRA="-W y -C y -y"
else
_CONTIGUOUS=no
_LV_EXTRA="-W y -y"
fi
[[ -z "${_LV_SIZE}" ]] && _LV_SIZE="All free space left"
# final step ask if everything is ok?
_dialog --yesno "Would you like to create Logical Volume ${_LVDEV} like this?\nVolume Group: ${_LV}\nVolume Size: ${_LV_SIZE}\nContiguous Volume: ${_CONTIGUOUS}" 0 0 && _LVFINISH="DONE"
done
_umountall
if [[ -n "${_LV_ALL}" ]]; then
#shellcheck disable=SC2086
if lvcreate ${_LV_EXTRA} -l +100%FREE ${_LV} -n ${_LVDEV} &>"${_LOG}"; then
_dialog --infobox "Creating Logical Volume ${_LVDEV} was successful.\nContinuing in 5 seconds..." 4 60
sleep 5
else
_dialog --msgbox "Error while creating Logical Volume ${_LVDEV} (see ${_LOG} for details)." 0 0
return 1
fi
else
#shellcheck disable=SC2086
if lvcreate ${_LV_EXTRA} -L ${_LV_SIZE} ${_LV} -n ${_LVDEV} &>"${_LOG}"; then
_dialog --infobox "Creating Logical Volume ${_LVDEV} was successful.\nContinuing in 5 seconds..." 4 60
sleep 5
else
_dialog --msgbox "Error while creating Logical Volume ${_LVDEV} (see ${_LOG} for details)." 0 0
return 1
fi
fi
}
_enter_luks_name() {
_LUKSDEV=""
while [[ -z "${_LUKSDEV}" ]]; do
_dialog --inputbox "Enter the name for luks encrypted device ${_DEV}:\nfooname\n<yourname>\n\n" 10 65 "fooname" 2>"${_ANSWER}" || return 1
_LUKSDEV=$(cat "${_ANSWER}")
if ! cryptsetup status "${_LUKSDEV}" | grep -q inactive; then
_dialog --msgbox "ERROR: You have defined 2 identical luks encryption device names! Please enter another name." 8 65
_LUKSDEV=""
fi
done
}
_enter_luks_passphrase () {
_LUKSPASSPHRASE=""
while [[ -z "${_LUKSPASSPHRASE}" ]]; do
_dialog --insecure --passwordbox "Enter passphrase for luks encrypted device ${_LUKSDEV}:" 7 60 2>"${_ANSWER}" || return 1
_LUKSPASS=$(cat "${_ANSWER}")
_dialog --insecure --passwordbox "Retype passphrase for luks encrypted device ${_LUKSDEV}:" 7 60 2>"${_ANSWER}" || return 1
_LUKSPASS2=$(cat "${_ANSWER}")
if [[ -n "${_LUKSPASS}" && -n "${_LUKSPASS2}" && "${_LUKSPASS}" == "${_LUKSPASS2}" ]]; then
_LUKSPASSPHRASE=${_LUKSPASS}
echo "${_LUKSPASSPHRASE}" > "/tmp/passphrase-${_LUKSDEV}"
_LUKSPASSPHRASE="/tmp/passphrase-${_LUKSDEV}"
else
_dialog --msgbox "Passphrases didn't match or was empty, please enter again." 0 0
fi
done
}
_opening_luks() {
_dialog --infobox "Opening encrypted ${_DEV}..." 0 0
_LUKSOPEN_SUCCESS=""
while [[ -z "${_LUKSOPEN_SUCCESS}" ]]; do
cryptsetup luksOpen "${_DEV}" "${_LUKSDEV}" <"${_LUKSPASSPHRASE}" >"${_LOG}" && _LUKSOPEN_SUCCESS=1
if [[ -z "${_LUKSOPEN_SUCCESS}" ]]; then
_dialog --msgbox "Error: Passphrase didn't match, please enter again." 0 0
_enter_luks_passphrase || return 1
fi
done
_dialog --yesno "Would you like to save the passphrase of luks device in /etc/$(basename "${_LUKSPASSPHRASE}")?\nName:${_LUKSDEV}" 0 0 || _LUKSPASSPHRASE="ASK"
echo "${_LUKSDEV}" "${_DEV}" "/etc/$(basename "${_LUKSPASSPHRASE}")" >> /tmp/.crypttab
}
_helpluks()
{
_dialog --msgbox "$(cat /usr/lib/archboot/installer/help/luks.txt)" 0 0
}
_createluks()
{
_NAME_SCHEME_PARAMETER_RUN=""
_LUKSFINISH=""
while [[ "${_LUKSFINISH}" != "DONE" ]]; do
_activate_special_devices
_dialog --infobox "Scanning blockdevices... This may need some time." 3 60
# Remove all crypt devices with children
_LUKS_BLACKLIST="$(for dev in $(${_LSBLK} NAME,TYPE | grep " crypt$" | cut -d' ' -f1 | sort -u); do
echo "${dev}"
done)"
#shellcheck disable=SC2119
_DEVS="$(_finddevices)"
if [[ -n "${_LUKS_BLACKLIST}" ]]; then
for dev in ${_LUKS_BLACKLIST}; do
_DEVS="${_DEVS//$(${_LSBLK} NAME,SIZE -d "${dev}")/}"
done
fi
# break if all devices are in use
if [[ -z "${_DEVS}" ]]; then
_dialog --msgbox "No devices left for luks encryption." 0 0
return 1
fi
# show all devices with sizes
#shellcheck disable=SC2086
_dialog --menu "Select device for luks encryption:" 15 50 12 ${_DEVS} 2>"${_ANSWER}" || return 1
_DEV=$(cat "${_ANSWER}")
# enter luks name
_enter_luks_name || return 1
### TODO: offer more options for encrypt!
### defaults are used only
# final step ask if everything is ok?
_dialog --yesno "Would you like to encrypt luks device below?\nName:${_LUKSDEV}\nDevice:${_DEV}\n" 0 0 && _LUKSFINISH="DONE"
done
_enter_luks_passphrase || return 1
_umountall
_dialog --infobox "Encrypting ${_DEV}..." 0 0
cryptsetup -q luksFormat "${_DEV}" <"${_LUKSPASSPHRASE}" >"${_LOG}"
_opening_luks
}
# vim: set ft=sh ts=4 sw=4 et:

View file

@ -0,0 +1,985 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
if [[ "${_RUNNING_ARCH}" == "x86_64" ]] && grep -q 'Intel' /proc/cpuinfo; then
_UCODE="intel-ucode.img"
_UCODE_PKG="intel-ucode"
fi
if [[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "x86_64" ]]; then
if grep -q 'AMD' /proc/cpuinfo; then
_UCODE="amd-ucode.img"
_UCODE_PKG="amd-ucode"
fi
fi
# name of the initramfs filesystem
_INITRAMFS="initramfs-${_KERNELPKG}.img"
_getrootfstype() {
_ROOTFS="$(_getfstype "${_ROOTDEV}")"
}
_getrootflags() {
_ROOTFLAGS="$(findmnt -m -n -o options -T "${_DESTDIR}")"
[[ -n "${_ROOTFLAGS}" ]] && _ROOTFLAGS="rootflags=${_ROOTFLAGS}"
}
_getraidarrays() {
_RAIDARRAYS=""
if [[ -f "${_DESTDIR}/etc/mdadm.conf" ]] && ! grep -q '^ARRAY' "${_DESTDIR}"/etc/mdadm.conf 2>"${_NO_LOG}"; then
_RAIDARRAYS="$(echo -n "$(grep ^md /proc/mdstat 2>"${_NO_LOG}" | sed -e 's#\[[0-9]\]##g' -e 's# :.* raid[0-9]##g' -e 's#md#md=#g' -e 's# #,/dev/#g' -e 's#_##g')")"
fi
}
_getcryptsetup() {
_LUKSSETUP=""
if ! cryptsetup status "$(basename "${_ROOTDEV}")" | grep -q inactive; then
if cryptsetup status "$(basename "${_ROOTDEV}")"; then
if [[ "${_NAME_SCHEME_PARAMETER}" == "FSUUID" ]]; then
_LUKSDEV="UUID=$(${_LSBLK} UUID "$(cryptsetup status "$(basename "${_ROOTDEV}")" | grep device: | sed -e 's#device:##g')")"
elif [[ "${_NAME_SCHEME_PARAMETER}" == "FSLABEL" ]]; then
_LUKSDEV="LABEL=$(${_LSBLK} LABEL "$(cryptsetup status "$(basename "${_ROOTDEV}")" | grep device: | sed -e 's#device:##g')")"
else
_LUKSDEV="$(cryptsetup status "$(basename "${_ROOTDEV}")" | grep device: | sed -e 's#device:##g'))"
fi
_LUKSNAME="$(basename "${_ROOTDEV}")"
_LUKSSETUP="cryptdevice=${_LUKSDEV}:${_LUKSNAME}"
fi
fi
}
_getrootpartuuid() {
_PARTUUID="$(_getpartuuid "${_ROOTDEV}")"
if [[ -n "${_PARTUUID}" ]]; then
_ROOTDEV="PARTUUID=${_PARTUUID}"
fi
}
_getrootpartlabel() {
_PARTLABEL="$(_getpartlabel "${_ROOTDEV}")"
if [[ -n "${_PARTLABEL}" ]]; then
_ROOTDEV="PARTLABEL=${_PARTLABEL}"
fi
}
_getrootfsuuid() {
_FSUUID="$(_getfsuuid "${_ROOTDEV}")"
if [[ -n "${_FSUUID}" ]]; then
_ROOTDEV="UUID=${_FSUUID}"
fi
}
_getrootfslabel() {
_FSLABEL="$(_getfslabel "${_ROOTDEV}")"
if [[ -n "${_FSLABEL}" ]]; then
_ROOTDEV="LABEL=${_FSLABEL}"
fi
}
# freeze and unfreeze xfs, as hack for grub(2) installing
_freeze_xfs() {
sync
if [[ -x /usr/bin/xfs_freeze ]]; then
if grep -q "${_DESTDIR}/boot " /proc/mounts | grep -q " xfs "; then
xfs_freeze -f "${_DESTDIR}"/boot &>"${_NO_LOG}"
xfs_freeze -u "${_DESTDIR}"/boot &>"${_NO_LOG}"
fi
if grep -q "${_DESTDIR} " /proc/mounts | grep -q " xfs "; then
xfs_freeze -f "${_DESTDIR}" &>"${_NO_LOG}"
xfs_freeze -u "${_DESTDIR}" &>"${_NO_LOG}"
fi
fi
}
## Setup kernel cmdline parameters to be added to bootloader configs
_bootloader_kernel_parameters() {
if [[ -n "${_UEFI_BOOT}" ]]; then
[[ "${_NAME_SCHEME_PARAMETER}" == "PARTUUID" ]] && _getrootpartuuid
[[ "${_NAME_SCHEME_PARAMETER}" == "PARTLABEL" ]] && _getrootpartlabel
fi
[[ "${_NAME_SCHEME_PARAMETER}" == "FSUUID" ]] && _getrootfsuuid
[[ "${_NAME_SCHEME_PARAMETER}" == "FSLABEL" ]] && _getrootfslabel
_KERNEL_PARAMS_COMMON_UNMOD="root=${_ROOTDEV} rootfstype=${_ROOTFS} rw ${_ROOTFLAGS} ${_RAIDARRAYS} ${_LUKSSETUP}"
_KERNEL_PARAMS_MOD="$(echo "${_KERNEL_PARAMS_COMMON_UNMOD}" | sed -e 's# # #g' | sed -e 's# # #g')"
}
_common_bootloader_checks() {
_activate_special_devices
_getrootfstype
_getraidarrays
_getcryptsetup
_getrootflags
_bootloader_kernel_parameters
}
_check_bootpart() {
_SUBDIR=""
_BOOTDEV="$(mount | grep "${_DESTDIR}/boot " | cut -d' ' -f 1)"
if [[ -z "${_BOOTDEV}" ]]; then
_SUBDIR="/boot"
_BOOTDEV="${_ROOTDEV}"
fi
}
# only allow ext2/3/4 and vfat on uboot bootloader
_abort_uboot(){
_FSTYPE="$(${_LSBLK} FSTYPE "${_BOOTDEV}" 2>"${_NO_LOG}")"
if ! [[ "${_FSTYPE}" == "ext2" || "${_FSTYPE}" == "ext3" || "${_FSTYPE}" == "ext4" || "${_FSTYPE}" == "vfat" ]]; then
_dialog --msgbox "Error:\nYour selected bootloader cannot boot from none ext2/3/4 or vfat /boot on it." 0 0
return 1
fi
}
_abort_nilfs_bootpart() {
_FSTYPE="$(${_LSBLK} FSTYPE "${_BOOTDEV}" 2>"${_NO_LOG}")"
if [[ "${_FSTYPE}" == "nilfs2" ]]; then
_dialog --msgbox "Error:\nYour selected bootloader cannot boot from nilfs2 partition with /boot on it." 0 0
return 1
fi
}
_abort_f2fs_bootpart() {
_FSTYPE="$(${_LSBLK} FSTYPE "${_BOOTDEV}" 2>"${_NO_LOG}")"
if [[ "${_FSTYPE}" == "f2fs" ]]; then
_dialog --msgbox "Error:\nYour selected bootloader cannot boot from f2fs partition with /boot on it." 0 0
return 1
fi
}
_do_uefi_common() {
_PACKAGES=""
_DEV=""
[[ -f "${_DESTDIR}/usr/bin/mkfs.vfat" ]] || _PACKAGES="${_PACKAGES} dosfstools"
[[ -f "${_DESTDIR}/usr/bin/efivar" ]] || _PACKAGES="${_PACKAGES} efivar"
[[ -f "${_DESTDIR}/usr/bin/efibootmgr" ]] || _PACKAGES="${_PACKAGES} efibootmgr"
if [[ -n "${_UEFI_SECURE_BOOT}" ]]; then
[[ -f "${_DESTDIR}/usr/bin/mokutil" ]] || _PACKAGES="${_PACKAGES} mokutil"
[[ -f "${_DESTDIR}/usr/bin/efi-readvar" ]] || _PACKAGES="${_PACKAGES} efitools"
[[ -f "${_DESTDIR}/usr/bin/sbsign" ]] || _PACKAGES="${_PACKAGES} sbsigntools"
fi
if [[ -n "${_PACKAGES}" ]]; then
_run_pacman
fi
_check_efisys_part || return 1
}
_do_uefi_efibootmgr() {
for _bootnum in $(efibootmgr | grep '^Boot[0-9]' | grep -F -i "${_BOOTMGR_LABEL}" | cut -b5-8) ; do
efibootmgr --quiet -b "${_bootnum}" -B
done
_BOOTMGRDEV=$(${_LSBLK} PKNAME "${_UEFISYSDEV}")
_BOOTMGRNUM=$(echo "${_UEFISYSDEV}" | sed -e "s#${_BOOTMGRDEV}##g" | sed -e 's#p##g')
efibootmgr --quiet --create --disk "${_BOOTMGRDEV}" --part "${_BOOTMGRNUM}" --loader "${_BOOTMGR_LOADER_PATH}" --label "${_BOOTMGR_LABEL}"
}
_do_apple_efi_hfs_bless() {
## Grub upstream bzr mactel branch => http://bzr.savannah.gnu.org/lh/grub/branches/mactel/changes
## Fedora's mactel-boot => https://bugzilla.redhat.com/show_bug.cgi?id=755093
_dialog --msgbox "TODO: Apple Mac EFI Bootloader Setup" 0 0
}
_do_uefi_bootmgr_setup() {
if [[ "$(cat "/sys/class/dmi/id/sys_vendor")" == 'Apple Inc.' ]] || [[ "$(cat "/sys/class/dmi/id/sys_vendor")" == 'Apple Computer, Inc.' ]]; then
_do_apple_efi_hfs_bless
else
_do_uefi_efibootmgr
fi
}
_do_uefi_secure_boot_efitools() {
_do_uefi_common || return 1
# install helper tools and create entries in UEFI boot manager, if not present
if [[ -n "${_UEFI_SECURE_BOOT}" ]]; then
if [[ ! -f "${_UEFISYS_MP}/EFI/BOOT/HashTool.efi" ]]; then
cp "${_DESTDIR}/usr/share/efitools/efi/HashTool.efi" "${_UEFISYS_MP}/EFI/BOOT/HashTool.efi"
_BOOTMGR_LABEL="HashTool (Secure Boot)"
_BOOTMGR_LOADER_PATH="/EFI/BOOT/HashTool.efi"
_do_uefi_bootmgr_setup
fi
if [[ ! -f "${_UEFISYS_MP}/EFI/BOOT/KeyTool.efi" ]]; then
cp "${_DESTDIR}/usr/share/efitools/efi/KeyTool.efi" "${_UEFISYS_MP}/EFI/BOOT/KeyTool.efi"
_BOOTMGR_LABEL="KeyTool (Secure Boot)"
_BOOTMGR_LOADER_PATH="/EFI/BOOT/KeyTool.efi"
_do_uefi_bootmgr_setup
fi
fi
}
_do_secureboot_keys() {
_CN=""
_MOK_PW=""
_KEYDIR=""
while [[ -z "${_KEYDIR}" ]]; do
_dialog --inputbox "Setup keys:\nEnter the directory to store the keys on ${_DESTDIR}." 9 65 "/etc/secureboot/keys" 2>"${_ANSWER}" || return 1
_KEYDIR=$(cat "${_ANSWER}")
#shellcheck disable=SC2086,SC2001
_KEYDIR="$(echo ${_KEYDIR} | sed -e 's#^/##g')"
done
if [[ ! -d "${_DESTDIR}/${_KEYDIR}" ]]; then
while [[ -z "${_CN}" ]]; do
_dialog --inputbox "Setup keys:\nEnter a common name(CN) for your keys, eg. Your Name" 8 65 "" 2>"${_ANSWER}" || return 1
_CN=$(cat "${_ANSWER}")
done
secureboot-keys.sh -name="${_CN}" "${_DESTDIR}/${_KEYDIR}" &>"${_LOG}" || return 1
_dialog --infobox "Setup keys created:\n\nCommon name(CN) ${_CN}\nused for your keys in ${_DESTDIR}/${_KEYDIR}\n\nContinuing in 10 seconds..." 8 60
sleep 10
else
_dialog --infobox "Setup keys:\n-Directory ${_DESTDIR}/${_KEYDIR} exists\n-assuming keys are already created\n-trying to use existing keys now\n\nContinuing in 10 seconds..." 8 50
sleep 10
fi
}
_do_mok_sign () {
_UEFI_BOOTLOADER_DIR="${_UEFISYS_MP}/EFI/BOOT"
_INSTALL_MOK=""
_MOK_PW=""
_dialog --yesno "Do you want to install the MOK certificate to the UEFI keys?" 5 65 && _INSTALL_MOK=1
if [[ -n "${_INSTALL_MOK}" ]]; then
while [[ -z "${_MOK_PW}" ]]; do
_dialog --insecure --passwordbox "Enter a one time MOK password for SHIM on reboot:" 8 65 2>"${_ANSWER}" || return 1
_PASS=$(cat "${_ANSWER}")
_dialog --insecure --passwordbox "Retype one time MOK password:" 8 65 2>"${_ANSWER}" || return 1
_PASS2=$(cat "${_ANSWER}")
if [[ "${_PASS}" == "${_PASS2}" && -n "${_PASS}" ]]; then
_MOK_PW=${_PASS}
echo "${_MOK_PW}" > /tmp/.password
echo "${_MOK_PW}" >> /tmp/.password
_MOK_PW=/tmp/.password
else
_dialog --msgbox "Password didn't match or was empty, please enter again." 6 65
fi
done
mokutil -i "${_DESTDIR}"/"${_KEYDIR}"/MOK/MOK.cer < ${_MOK_PW} >"${_LOG}"
rm /tmp/.password
_dialog --infobox "MOK keys have been installed successfully.\nContinuing in 5 seconds..." 4 50
sleep 5
fi
_SIGN_MOK=""
_dialog --yesno "Do you want to sign with the MOK certificate?\n\n/boot/${_VMLINUZ} and ${_UEFI_BOOTLOADER_DIR}/grub${_SPEC_UEFI_ARCH}.efi" 7 55 && _SIGN_MOK=1
if [[ -n "${_SIGN_MOK}" ]]; then
if [[ "${_DESTDIR}" == "/install" ]]; then
systemd-nspawn -q -D "${_DESTDIR}" sbsign --key /"${_KEYDIR}"/MOK/MOK.key --cert /"${_KEYDIR}"/MOK/MOK.crt --output /boot/"${_VMLINUZ}" /boot/"${_VMLINUZ}" &>"${_LOG}"
systemd-nspawn -q -D "${_DESTDIR}" sbsign --key /"${_KEYDIR}"/MOK/MOK.key --cert /"${_KEYDIR}"/MOK/MOK.crt --output "${_UEFI_BOOTLOADER_DIR}"/grub"${_SPEC_UEFI_ARCH}".efi "${_UEFI_BOOTLOADER_DIR}"/grub"${_SPEC_UEFI_ARCH}".efi &>"${_LOG}"
else
sbsign --key /"${_KEYDIR}"/MOK/MOK.key --cert /"${_KEYDIR}"/MOK/MOK.crt --output /boot/"${_VMLINUZ}" /boot/"${_VMLINUZ}" &>"${_LOG}"
sbsign --key /"${_KEYDIR}"/MOK/MOK.key --cert /"${_KEYDIR}"/MOK/MOK.crt --output "${_UEFI_BOOTLOADER_DIR}"/grub"${_SPEC_UEFI_ARCH}".efi "${_UEFI_BOOTLOADER_DIR}"/grub"${_SPEC_UEFI_ARCH}".efi &>"${_LOG}"
fi
_dialog --infobox "/boot/${_VMLINUZ} and ${_UEFI_BOOTLOADER_DIR}/grub${_SPEC_UEFI_ARCH}.efi\n\nbeen signed successfully.\nContinuing in 5 seconds..." 6 60
sleep 5
fi
}
_do_pacman_sign() {
_SIGN_KERNEL=""
_dialog --yesno "Do you want to install a pacman hook\nfor automatic signing /boot/${_VMLINUZ} on updates?" 6 60 && _SIGN_KERNEL=1
if [[ -n "${_SIGN_KERNEL}" ]]; then
[[ ! -d "${_DESTDIR}/etc/pacman.d/hooks" ]] && mkdir -p "${_DESTDIR}"/etc/pacman.d/hooks/
_HOOKNAME="${_DESTDIR}/etc/pacman.d/hooks/999-sign_kernel_for_secureboot.hook"
cat << EOF > "${_HOOKNAME}"
[Trigger]
Operation = Install
Operation = Upgrade
Type = Package
Target = linux
[Action]
Description = Signing kernel with Machine Owner Key for Secure Boot
When = PostTransaction
Exec = /usr/bin/find /boot/ -maxdepth 1 -name 'vmlinuz-*' -exec /usr/bin/sh -c 'if ! /usr/bin/sbverify --list {} 2>"${_NO_LOG}" | /usr/bin/grep -q "signature certificates"; then /usr/bin/sbsign --key /${_KEYDIR}/MOK/MOK.key --cert /${_KEYDIR}/MOK/MOK.crt --output {} {}; fi' ;
Depends = sbsigntools
Depends = findutils
Depends = grep
EOF
_dialog --infobox "Pacman hook for automatic signing has been installed successfully:\n\n${_HOOKNAME}\nContinuing in 5 seconds..." 6 70
sleep 5
fi
}
_do_efistub_parameters() {
_BOOTDEV=""
_FAIL_COMPLEX=""
_RAID_ON_LVM=""
_UEFISYS_PATH="EFI/archlinux"
# automounted /boot and ESP needs to be mounted first
findmnt -vno SOURCE "${_DESTDIR}/boot" | grep -qw 'systemd-1' && \
ls "${_DESTDIR}/boot" &>"${_NO_LOG}"
_BOOTDEV="$(findmnt -vno SOURCE "${_DESTDIR}/boot}" | grep -vw 'systemd-1')"
findmnt -vno SOURCE "${_DESTDIR}/efi" | grep -qw 'systemd-1' && \
ls "${_DESTDIR}/efi" &>"${_NO_LOG}"
if mountpoint -q "${_DESTDIR}/efi" ; then
_UEFISYS_MP=efi
else
_UEFISYS_MP=boot
fi
_UEFISYSDEV="$(findmnt -vno SOURCE "${_DESTDIR}/${_UEFISYS_MP}" | grep -vw 'systemd-1')"
_UEFISYSDEV_FS_UUID="$(_getfsuuid "${_UEFISYSDEV}")"
if [[ "${_UEFISYS_MP}" == "boot" ]]; then
if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then
_KERNEL="${_VMLINUZ_EFISTUB}"
else
_KERNEL="${_VMLINUZ}"
fi
if [[ -n "${_UCODE}" ]]; then
_INITRD_UCODE="${_UCODE}"
fi
_INITRD="${_INITRAMFS}"
else
# name .efi for uefisys partition
if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then
_KERNEL="${_UEFISYS_PATH}/${_VMLINUZ_EFISTUB}"
else
_KERNEL="${_UEFISYS_PATH}/${_VMLINUZ}"
fi
if [[ -n "${_UCODE}" ]]; then
_INITRD_UCODE="${_UEFISYS_PATH}/${_UCODE}"
fi
_INITRD="${_UEFISYS_PATH}/${_INITRAMFS}"
fi
}
_do_efistub_copy_to_efisys() {
if ! [[ "${_UEFISYS_MP}" == "boot" ]]; then
# clean and copy to efisys
_dialog --infobox "Copying kernel, ucode and initramfs\nto EFI SYSTEM PARTITION (ESP) now..." 4 65
! [[ -d "${_DESTDIR}/${_UEFISYS_MP}/${_UEFISYS_PATH}" ]] && mkdir -p "${_DESTDIR}/${_UEFISYS_MP}/${_UEFISYS_PATH}"
rm -f "${_DESTDIR}/${_UEFISYS_MP}/${_KERNEL}"
cp -f "${_DESTDIR}/boot/${_VMLINUZ}" "${_DESTDIR}/${_UEFISYS_MP}/${_KERNEL}"
rm -f "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD}"
cp -f "${_DESTDIR}/boot/${_INITRAMFS}" "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD}"
if [[ -n "${_INITRD_UCODE}" ]]; then
rm -f "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD_UCODE}"
cp -f "${_DESTDIR}/boot/${_UCODE}" "${_DESTDIR}/${_UEFISYS_MP}/${_INITRD_UCODE}"
fi
sleep 5
_dialog --infobox "Enable automatic copying of system files\nto EFI SYSTEM PARTITION (ESP) on installed system..." 4 65
cat << CONFEOF > "${_DESTDIR}/etc/systemd/system/efistub_copy.path"
[Unit]
Description=Copy EFISTUB Kernel and Initramfs files to EFI SYSTEM PARTITION
[Path]
PathChanged=/boot/${_VMLINUZ}
PathChanged=/boot/${_INITRAMFS}
CONFEOF
if [[ -n "${_UCODE}" ]]; then
echo "PathChanged=/boot/${_UCODE}" >> "${_DESTDIR}/etc/systemd/system/efistub_copy.path"
fi
cat << CONFEOF >> "${_DESTDIR}/etc/systemd/system/efistub_copy.path"
Unit=efistub_copy.service
[Install]
WantedBy=multi-user.target
CONFEOF
cat << CONFEOF > "${_DESTDIR}/etc/systemd/system/efistub_copy.service"
[Unit]
Description=Copy EFISTUB Kernel and Initramfs files to EFI SYSTEM PARTITION
[Service]
Type=oneshot
ExecStart=/usr/bin/cp -f /boot/${_VMLINUZ} /${_UEFISYS_MP}/${_KERNEL}
ExecStart=/usr/bin/cp -f /boot/${_INITRAMFS} /${_UEFISYS_MP}/${_INITRD}
CONFEOF
if [[ -n "${_INITRD_UCODE}" ]]; then
echo "ExecStart=/usr/bin/cp -f /boot/${_UCODE} /${_UEFISYS_MP}/${_INITRD_UCODE}" \
>> "${_DESTDIR}/etc/systemd/system/efistub_copy.service"
fi
if [[ "${_DESTDIR}" == "/install" ]]; then
systemd-nspawn -q -D "${_DESTDIR}" systemctl enable efistub_copy.path &>"${_NO_LOG}"
else
systemctl enable efistub_copy.path &>"${_NO_LOG}"
fi
sleep 5
fi
}
_do_efistub_uefi() {
_do_uefi_common || return 1
_do_efistub_parameters
_common_bootloader_checks
if [[ "${_RUNNING_ARCH}" == "x86_64" ]]; then
_ADDITIONAL_BOOTLOADER="rEFInd"
_ADDITIONAL_BOOTLOADER_DESC="rEFInd for ${_UEFI_ARCH} UEFI"
fi
_dialog --menu "Select FIRMWARE boot or an UEFI Boot Manager\nto provide a menu for the EFISTUB kernels?" 11 60 3 \
"FIRMWARE" "Unified Kernel Image for ${_UEFI_ARCH} UEFI" \
"SYSTEMD-BOOT" "SYSTEMD-BOOT for ${_UEFI_ARCH} UEFI" \
"${_ADDITIONAL_BOOTLOADER}" "${_ADDITIONAL_BOOTLOADER_DESC}" 2>"${_ANSWER}"
case $(cat "${_ANSWER}") in
"FIRMWARE") _do_uki_uefi;;
"SYSTEMD-BOOT") _do_systemd_boot_uefi ;;
"rEFInd") _do_refind_uefi ;;
esac
}
_do_systemd_boot_uefi() {
_dialog --infobox "Setting up SYSTEMD-BOOT now..." 3 40
# create directory structure, if it doesn't exist
! [[ -d "${_DESTDIR}/${_UEFISYS_MP}/loader/entries" ]] && mkdir -p "${_DESTDIR}/${_UEFISYS_MP}/loader/entries"
echo "title Arch Linux" > "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
echo "linux /${_KERNEL}" >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
if [[ -n "${_INITRD_UCODE}" ]]; then
echo "initrd /${_INITRD_UCODE}" >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
fi
cat << GUMEOF >> "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
initrd /${_INITRD}
options ${_KERNEL_PARAMS_MOD}
GUMEOF
cat << GUMEOF > "${_DESTDIR}/${_UEFISYS_MP}/loader/loader.conf"
timeout 5
default archlinux-core-main
GUMEOF
_chroot_mount
chroot "${_DESTDIR}" bootctl --path="/${_UEFISYS_MP}" install &>"${_LOG}"
chroot "${_DESTDIR}" bootctl --path="/${_UEFISYS_MP}" update &>"${_LOG}"
_chroot_umount
if [[ -e "${_DESTDIR}/${_UEFISYS_MP}/EFI/systemd/systemd-boot${_SPEC_UEFI_ARCH}.efi" ]]; then
rm -f "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/BOOT${_UEFI_ARCH}.EFI"
cp -f "${_DESTDIR}/${_UEFISYS_MP}/EFI/systemd/systemd-boot${_SPEC_UEFI_ARCH}.efi" \
"${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/BOOT${_UEFI_ARCH}.EFI"
_BOOTMGR_LABEL="SYSTEMD-BOOT"
_BOOTMGR_LOADER_PATH="/EFI/systemd/systemd-boot${_SPEC_UEFI_ARCH}.efi"
_do_uefi_bootmgr_setup
_dialog --msgbox "You will now be put into the editor to edit:\nloader.conf and menu entry files\n\nAfter you save your changes, exit the editor." 8 50
_geteditor || return 1
"${_EDITOR}" "${_DESTDIR}/${_UEFISYS_MP}/loader/entries/archlinux-core-main.conf"
"${_EDITOR}" "${_DESTDIR}/${_UEFISYS_MP}/loader/loader.conf"
_do_efistub_copy_to_efisys
_dialog --infobox "SYSTEMD-BOOT has been setup successfully.\nContinuing in 5 seconds..." 4 50
sleep 5
_S_BOOTLOADER=1
else
_dialog --msgbox "Error installing SYSTEMD-BOOT." 0 0
fi
}
_do_refind_uefi() {
if [[ ! -f "${_DESTDIR}/usr/bin/refind-install" ]]; then
_PACKAGES="refind"
_run_pacman
fi
_dialog --infobox "Setting up rEFInd now. This needs some time..." 3 60
! [[ -d "${_DESTDIR}/${_UEFISYS_MP}/EFI/refind" ]] && mkdir -p "${_DESTDIR}/${_UEFISYS_MP}/EFI/refind/"
cp -f "${_DESTDIR}/usr/share/refind/refind_${_SPEC_UEFI_ARCH}.efi" "${_DESTDIR}/${_UEFISYS_MP}/EFI/refind/"
cp -r "${_DESTDIR}/usr/share/refind/icons" "${_DESTDIR}/${_UEFISYS_MP}/EFI/refind/"
cp -r "${_DESTDIR}/usr/share/refind/fonts" "${_DESTDIR}/${_UEFISYS_MP}/EFI/refind/"
cp -r "${_DESTDIR}/usr/share/refind/drivers_${_SPEC_UEFI_ARCH}" "${_DESTDIR}/${_UEFISYS_MP}/EFI/refind/"
_REFIND_CONFIG="${_DESTDIR}/${_UEFISYS_MP}/EFI/refind/refind.conf"
cat << CONFEOF > "${_REFIND_CONFIG}"
timeout 20
use_nvram false
resolution 1024 768
scanfor manual,internal,external,optical,firmware
menuentry "Arch Linux" {
icon /EFI/refind/icons/os_arch.png
loader /${_KERNEL}
CONFEOF
if [[ -n "${_INITRD_UCODE}" ]]; then
echo " initrd /${_INITRD_UCODE}" >> "${_REFIND_CONFIG}"
fi
cat << CONFEOF >> "${_REFIND_CONFIG}"
initrd /${_INITRD}
options "${_KERNEL_PARAMS_MOD}"
}
CONFEOF
if [[ -e "${_DESTDIR}/${_UEFISYS_MP}/EFI/refind/refind_${_SPEC_UEFI_ARCH}.efi" ]]; then
_BOOTMGR_LABEL="rEFInd"
_BOOTMGR_LOADER_PATH="/EFI/refind/refind_${_SPEC_UEFI_ARCH}.efi"
_do_uefi_bootmgr_setup
mkdir -p "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT"
rm -f "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/BOOT${_UEFI_ARCH}.EFI"
cp -f "${_DESTDIR}/${_UEFISYS_MP}/EFI/refind/refind_${_SPEC_UEFI_ARCH}.efi" "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/BOOT${_UEFI_ARCH}.EFI"
_dialog --msgbox "You will now be put into the editor to edit:\nrefind.conf\n\nAfter you save your changes, exit the editor." 8 50
_geteditor || return 1
"${_EDITOR}" "${_REFIND_CONFIG}"
cp -f "${_REFIND_CONFIG}" "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/"
_do_efistub_copy_to_efisys
_dialog --infobox "rEFInd has been setup successfully.\nContinuing in 5 seconds..." 4 50
sleep 5
_S_BOOTLOADER=1
else
_dialog --msgbox "Error setting up rEFInd." 3 40
fi
}
_do_uki_uefi() {
_CMDLINE="${_DESTDIR}/etc/kernel/cmdline"
if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then
_MKINITCPIO_PRESET="${_DESTDIR}/etc/mkinitcpio.d/${_KERNELPKG}-${_RUNNING_ARCH}.preset"
else
_MKINITCPIO_PRESET="${_DESTDIR}/etc/mkinitcpio.d/${_KERNELPKG}.preset"
fi
_dialog --infobox "Setting up Unified Kernel Image now. This needs some time..." 3 70
sleep 5
echo "${_KERNEL_PARAMS_MOD}" > "${_CMDLINE}"
grep -q '^ALL_microcode=(/boot/\*-ucode.img)' "${_MKINITCPIO_PRESET}" || \
echo "ALL_microcode=(/boot/*-ucode.img)" >> "${_MKINITCPIO_PRESET}"
grep -q "default_uki=\"${_UEFISYS_MP}/EFI/Linux/archlinux-linux.efi\"" "${_MKINITCPIO_PRESET}" || \
echo "default_uki=\"${_UEFISYS_MP}/EFI/Linux/archlinux-linux.efi\"" >> "${_MKINITCPIO_PRESET}"
grep -q "default_options=\"--splash /usr/share/systemd/bootctl/splash-arch.bmp\"" "${_MKINITCPIO_PRESET}" || \
echo "default_options=\"--splash /usr/share/systemd/bootctl/splash-arch.bmp\"" >> "${_MKINITCPIO_PRESET}"
[[ -d ${_DESTDIR}/${_UEFISYS_MP}/EFI/Linux ]] || mkdir -p "${_DESTDIR}/${_UEFISYS_MP}/EFI/Linux"
_run_mkinitcpio
if [[ -e "${_DESTDIR}/${_UEFISYS_MP}/EFI/Linux/archlinux-linux.efi" ]]; then
_BOOTMGR_LABEL="Arch Linux - Unified Kernel Image"
_BOOTMGR_LOADER_PATH="/EFI/Linux/archlinux-linux.efi"
_do_uefi_bootmgr_setup
mkdir -p "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT"
rm -f "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/BOOT${_UEFI_ARCH}.EFI"
cp -f "${_DESTDIR}/${_UEFISYS_MP}/EFI/Linux/archlinux-linux.efi" "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/BOOT${_UEFI_ARCH}.EFI"
_dialog --infobox "Unified Kernel Image has been setup successfully.\nContinuing in 5 seconds..." 4 60
sleep 5
_S_BOOTLOADER=1
else
_dialog --msgbox "Error setting up Unified Kernel Image." 3 40
fi
}
_do_grub_common_before() {
##### Check whether the below limitations still continue with ver 2.00~beta4
### Grub(2) restrictions:
## - Encryption is not recommended for grub(2) /boot!
_BOOTDEV=""
_FAIL_COMPLEX=""
_RAID_ON_LVM=""
_common_bootloader_checks
_abort_f2fs_bootpart || return 1
if [[ ! -d "${_DESTDIR}/usr/lib/grub" ]]; then
_PACKAGES="grub"
_run_pacman
fi
if [[ ! -f "${_DESTDIR}/usr/share/grub/ter-u16n.pf2" ]]; then
_PACKAGES=terminus-font
_run_pacman
fi
}
_do_grub_config() {
_chroot_mount
_GRUB_PROBE="chroot ${_DESTDIR} grub-probe"
_BOOTDEV_FS_UUID="$(${_GRUB_PROBE} --target="fs_uuid" "/boot" 2>"${_NO_LOG}")"
_BOOTDEV_FS_LABEL="$(${_GRUB_PROBE} --target="fs_label" "/boot" 2>"${_NO_LOG}")"
_BOOTDEV_HINTS_STRING="$(${_GRUB_PROBE} --target="hints_string" "/boot" 2>"${_NO_LOG}")"
_BOOTDEV_FS="$(${_GRUB_PROBE} --target="fs" "/boot" 2>"${_NO_LOG}")"
_BOOTDEV_DRIVE="$(${_GRUB_PROBE} --target="drive" "/boot" 2>"${_NO_LOG}")"
_ROOTDEV_FS_UUID="$(${_GRUB_PROBE} --target="fs_uuid" "/" 2>"${_NO_LOG}")"
_ROOTDEV_HINTS_STRING="$(${_GRUB_PROBE} --target="hints_string" "/" 2>"${_NO_LOG}")"
_ROOTDEV_FS="$(${_GRUB_PROBE} --target="fs" "/" 2>"${_NO_LOG}")"
_USRDEV_FS_UUID="$(${_GRUB_PROBE} --target="fs_uuid" "/usr" 2>"${_NO_LOG}")"
_USRDEV_HINTS_STRING="$(${_GRUB_PROBE} --target="hints_string" "/usr" 2>"${_NO_LOG}")"
_USRDEV_FS="$(${_GRUB_PROBE} --target="fs" "/usr" 2>"${_NO_LOG}")"
if [[ -n "${_GRUB_UEFI}" ]]; then
_UEFISYSDEV_FS_UUID="$(chroot "${_DESTDIR}" grub-probe --target="fs_uuid" "/${_UEFISYS_MP}" 2>"${_NO_LOG}")"
_UEFISYSDEV_HINTS_STRING="$(chroot "${_DESTDIR}" grub-probe --target="hints_string" "/${_UEFISYS_MP}" 2>"${_NO_LOG}")"
fi
if [[ "${_ROOTDEV_FS_UUID}" == "${_BOOTDEV_FS_UUID}" ]]; then
_SUBDIR="/boot"
# on btrfs we need to check on subvol
if mount | grep "${_DESTDIR} " | grep btrfs | grep subvol; then
_SUBDIR="/$(btrfs subvolume show "${_DESTDIR}/" | grep Name | cut -c 11-60)"/boot
fi
if mount | grep "${_DESTDIR}/boot " | grep btrfs | grep subvol; then
_SUBDIR="/$(btrfs subvolume show "${_DESTDIR}/boot" | grep Name | cut -c 11-60)"
fi
else
_SUBDIR=""
# on btrfs we need to check on subvol
if mount | grep "${_DESTDIR}/boot " | grep btrfs | grep subvol; then
_SUBDIR="/$(btrfs subvolume show "${_DESTDIR}/boot" | grep Name | cut -c 11-60)"
fi
fi
## Move old config file, if any
if [[ -n "${_UEFI_SECURE_BOOT}" ]]; then
_GRUB_CFG="grub${_SPEC_UEFI_ARCH}.cfg"
else
_GRUB_CFG="grub.cfg"
fi
[[ -f "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}" ]] && (mv "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}" "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}.bak" || true)
## Ignore if the insmod entries are repeated - there are possibilities of having /boot in one disk and root-fs in altogether different disk
## with totally different configuration.
cat << EOF > "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
# Include modules - required for boot
insmod part_gpt
insmod part_msdos
insmod fat
insmod ${_BOOTDEV_FS}
insmod ${_ROOTDEV_FS}
insmod ${_USRDEV_FS}
insmod search_fs_file
insmod search_fs_uuid
insmod search_label
insmod linux
insmod chain
set pager=1
# set debug="all"
set locale_dir="\${prefix}/locale"
EOF
[[ -n "${_USE_RAID}" ]] && echo "insmod raid" >> "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
[[ -n "${_RAID_ON_LVM}" ]] && echo "insmod lvm" >> "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
#shellcheck disable=SC2129
cat << EOF >> "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
if [ -e "\${prefix}/\${grub_cpu}-\${grub_platform}/all_video.mod" ]; then
insmod all_video
else
if [ "\${grub_platform}" == "efi" ]; then
insmod efi_gop
insmod efi_uga
fi
if [ "\${grub_platform}" == "pc" ]; then
insmod vbe
insmod vga
fi
insmod video_bochs
insmod video_cirrus
fi
insmod font
search --fs-uuid --no-floppy --set=usr_part ${_USRDEV_HINTS_STRING} ${_USRDEV_FS_UUID}
search --fs-uuid --no-floppy --set=root_part ${_ROOTDEV_HINTS_STRING} ${_ROOTDEV_FS_UUID}
if [ -e "\${prefix}/fonts/ter-u16n.pf2" ]; then
set _fontfile="\${prefix}/fonts/ter-u16n.pf2"
else
if [ -e "(\${root_part})/usr/share/grub/ter-u16n.pf2" ]; then
set _fontfile="(\${root_part})/usr/share/grub/ter-u16n.pf2"
else
if [ -e "(\${usr_part})/share/grub/ter-u16n.pf2" ]; then
set _fontfile="(\${usr_part})/share/grub/ter-u16n.pf2"
fi
fi
fi
if loadfont "\${_fontfile}" ; then
insmod gfxterm
set gfxmode="auto"
terminal_input console
terminal_output gfxterm
fi
EOF
[[ -e "/tmp/.device-names" ]] && sort "/tmp/.device-names" >> "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
if [[ "${_NAME_SCHEME_PARAMETER}" == "PARTUUID" ]] || [[ "${_NAME_SCHEME_PARAMETER}" == "FSUUID" ]] ; then
_GRUB_ROOT_DRIVE="search --fs-uuid --no-floppy --set=root ${_BOOTDEV_HINTS_STRING} ${_BOOTDEV_FS_UUID}"
else
if [[ "${_NAME_SCHEME_PARAMETER}" == "PARTLABEL" ]] || [[ "${_NAME_SCHEME_PARAMETER}" == "FSLABEL" ]] ; then
_GRUB_ROOT_DRIVE="search --label --no-floppy --set=root ${_BOOTDEV_HINTS_STRING} ${_BOOTDEV_FS_LABEL}"
else
_GRUB_ROOT_DRIVE="set root=${_BOOTDEV_DRIVE}"
fi
fi
if [[ -n "${_GRUB_UEFI}" ]]; then
_LINUX_UNMOD_COMMAND="linux ${_SUBDIR}/${_VMLINUZ} ${_KERNEL_PARAMS_MOD}"
else
_LINUX_UNMOD_COMMAND="linux ${_SUBDIR}/${_VMLINUZ} ${_KERNEL_PARAMS_MOD}"
fi
_LINUX_MOD_COMMAND=$(echo "${_LINUX_UNMOD_COMMAND}" | sed -e 's# # #g' | sed -e 's# # #g')
## create default kernel entry
_NUMBER=0
if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then
cat << EOF >> "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
# (${_NUMBER}) Arch Linux
menuentry "Arch Linux" {
set gfxpayload="keep"
${_GRUB_ROOT_DRIVE}
${_LINUX_MOD_COMMAND}
initrd ${_SUBDIR}/${_UCODE} ${_SUBDIR}/${_INITRAMFS}
}
EOF
_NUMBER=$((_NUMBER+1))
else
cat << EOF >> "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
# (${_NUMBER}) Arch Linux
menuentry "Arch Linux" {
set gfxpayload="keep"
${_GRUB_ROOT_DRIVE}
${_LINUX_MOD_COMMAND}
initrd ${_SUBDIR}/${_UCODE} ${_SUBDIR}/${_UCODE} ${_SUBDIR}/${_INITRAMFS}
}
EOF
if [[ -n "${_UEFI_BOOT}" ]]; then
_NUMBER=$((_NUMBER+1))
cat << EOF >> "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
if [ "\${grub_platform}" == "efi" ]; then
if [ "\${grub_cpu}" == "x86_64" ]; then
## (${_NUMBER}) Microsoft Windows 10/11 via x86_64 UEFI
#menuentry Microsoft Windows 10/11 x86_64 UEFI-GPT {
# insmod part_gpt
# insmod fat
# insmod search_fs_uuid
# insmod chain
# search --fs-uuid --no-floppy --set=root ${_UEFISYSDEV_HINTS_STRING} ${_UEFISYSDEV_FS_UUID}
# chainloader /EFI/Microsoft/Boot/bootmgfw.efi
#}
fi
fi
EOF
else
_NUMBER=$((_NUMBER+1))
## TODO: Detect actual Windows installation if any
## create example file for windows
cat << EOF >> "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
if [ "\${grub_platform}" == "pc" ]; then
## (${_NUMBER}) Microsoft Windows 10/11 BIOS
#menuentry Microsoft Windows 10/11 BIOS-MBR {
# insmod part_msdos
# insmod ntfs
# insmod search_fs_uuid
# insmod ntldr
# search --fs-uuid --no-floppy --set=root <FS_UUID of Windows SYSTEM Partition>
# ntldr /bootmgr
#}
fi
EOF
fi
fi
## copy ter-u16n.pf2 font file
cp -f "${_DESTDIR}/usr/share/grub/ter-u16n.pf2" "${_DESTDIR}/${_GRUB_PREFIX_DIR}/fonts/ter-u16n.pf2"
_chroot_umount
## Edit grub.cfg config file
_dialog --msgbox "You must now review the GRUB(2) configuration file.\n\nYou will now be put into the editor.\nAfter you save your changes, exit the editor." 8 55
_geteditor || return 1
"${_EDITOR}" "${_DESTDIR}/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
}
_do_uboot() {
_common_bootloader_checks
_check_bootpart
_abort_uboot
[[ -d "${_DESTDIR}/boot/extlinux" ]] || mkdir -p "${_DESTDIR}/boot/extlinux"
_KERNEL_PARAMS_COMMON_UNMOD="root=${_ROOTDEV} rootfstype=${_ROOTFS} rw ${_ROOTFLAGS} ${_RAIDARRAYS} ${_LUKSSETUP}"
_KERNEL_PARAMS_COMMON_MOD="$(echo "${_KERNEL_PARAMS_COMMON_UNMOD}" | sed -e 's# # #g' | sed -e 's# # #g')"
[[ "${_RUNNING_ARCH}" == "aarch64" ]] && _TITLE="ARM 64"
[[ "${_RUNNING_ARCH}" == "riscv64" ]] && _TITLE="RISC-V 64"
# write extlinux.conf
_dialog --infobox "Installing UBOOT..." 0 0
cat << EOF >> "${_DESTDIR}/boot/extlinux/extlinux.conf"
menu title Welcome Arch Linux ${_TITLE}
timeout 100
default linux
label linux
menu label Boot System (automatic boot in 10 seconds...)
kernel ${_SUBDIR}/${_VMLINUZ}
initrd ${_SUBDIR}/${_INITRAMFS}
append ${_KERNEL_PARAMS_COMMON_MOD}
EOF
_dialog --infobox "UBOOT has been installed successfully.\nContinuing in 5 seconds..." 4 55
sleep 5
}
_do_grub_bios() {
_do_grub_common_before
# try to auto-configure GRUB(2)...
_check_bootpart
# check if raid, raid partition, or device devicemapper is used
if echo "${_BOOTDEV}" | grep -q /dev/md || echo "${_BOOTDEV}" | grep /dev/mapper; then
# boot from lvm, raid, partitioned and raid devices is supported
_FAIL_COMPLEX=""
if cryptsetup status "${_BOOTDEV}"; then
# encryption devices are not supported
_FAIL_COMPLEX=1
fi
fi
if [[ -z "${_FAIL_COMPLEX}" ]]; then
# check if mapper is used
if echo "${_BOOTDEV}" | grep -q /dev/mapper; then
_RAID_ON_LVM=""
#check if mapper contains a md device!
for devpath in $(pvs -o pv_name --noheading); do
if echo "${devpath}" | grep -v "/dev/md.p" | grep /dev/md; then
_DETECTEDVOLUMEGROUP="$(pvs -o vg_name --noheading "${devpath}")"
if echo /dev/mapper/"${_DETECTEDVOLUMEGROUP}"-* | grep "${_BOOTDEV}"; then
# change _BOOTDEV to md device!
_BOOTDEV=$(pvs -o pv_name --noheading "${devpath}")
_RAID_ON_LVM=1
break
fi
fi
done
fi
#check if raid is used
_USE_RAID=""
if echo "${_BOOTDEV}" | grep -q /dev/md; then
_USE_RAID=1
fi
fi
# A switch is needed if complex ${_BOOTDEV} is used!
# - LVM and RAID ${_BOOTDEV} needs the MBR of a device and cannot be used itself as ${_BOOTDEV}
# - grub BIOS install to partition is not supported
_DEVS="$(_findbootloaderdisks _)"
if [[ -z "${_DEVS}" ]]; then
_dialog --msgbox "No storage drives were found" 0 0
return 1
fi
#shellcheck disable=SC2086
_dialog --menu "Select the boot device where the GRUB(2) bootloader will be installed." 14 55 7 ${_DEVS} 2>"${_ANSWER}" || return 1
_BOOTDEV=$(cat "${_ANSWER}")
if [[ "$(${_BLKID} -p -i -o value -s PTTYPE "${_BOOTDEV}")" == "gpt" ]]; then
_CHECK_BIOS_BOOT_GRUB=1
_CHECK_UEFISYSDEV=""
_RUN_CFDISK=""
_DEV="${_BOOTDEV}"
_check_gpt
else
if [[ -z "${_FAIL_COMPLEX}" ]]; then
_dialog --defaultno --yesno "Warning:\nSetup detected no GUID (gpt) partition table.\n\nGrub(2) has only space for approx. 30k core.img file. Depending on your setup, it might not fit into this gap and fail.\n\nDo you really want to install GRUB(2) to a msdos partition table?" 0 0 || return 1
fi
fi
if [[ -n "${_FAIL_COMPLEX}" ]]; then
_dialog --msgbox "Error:\nGRUB(2) cannot boot from ${_BOOTDEV}, which contains /boot!\n\nPossible error sources:\n- encrypted devices are not supported" 0 0
return 1
fi
_dialog --infobox "Setting up GRUB(2) BIOS. This needs some time..." 3 55
# freeze and unfreeze xfs filesystems to enable grub(2) installation on xfs filesystems
_freeze_xfs
_chroot_mount
chroot "${_DESTDIR}" grub-install \
--directory="/usr/lib/grub/i386-pc" \
--target="i386-pc" \
--boot-directory="/boot" \
--recheck \
--debug \
"${_BOOTDEV}" &>"/tmp/grub_bios_install.log"
_chroot_umount
mkdir -p "${_DESTDIR}/boot/grub/locale"
cp -f "${_DESTDIR}/usr/share/locale/en@quot/LC_MESSAGES/grub.mo" "${_DESTDIR}/boot/grub/locale/en.mo"
if [[ -e "${_DESTDIR}/boot/grub/i386-pc/core.img" ]]; then
_GRUB_PREFIX_DIR="/boot/grub/"
_do_grub_config
_dialog --infobox "GRUB(2) BIOS has been installed successfully.\nContinuing in 5 seconds..." 4 55
sleep 5
_S_BOOTLOADER=1
else
_dialog --msgbox "Error installing GRUB(2) BIOS.\nCheck /tmp/grub_bios_install.log for more info.\n\nYou probably need to install it manually by chrooting into ${_DESTDIR}.\nDon't forget to bind mount /dev and /proc into ${_DESTDIR} before chrooting." 0 0
return 1
fi
}
_do_grub_uefi() {
_do_uefi_common || return 1
[[ "${_UEFI_ARCH}" == "X64" ]] && _GRUB_ARCH="x86_64"
[[ "${_UEFI_ARCH}" == "IA32" ]] && _GRUB_ARCH="i386"
[[ "${_UEFI_ARCH}" == "AA64" ]] && _GRUB_ARCH="arm64"
_do_grub_common_before
_dialog --infobox "Setting up GRUB(2) UEFI. This needs some time..." 3 55
_chroot_mount
if [[ -n "${_UEFI_SECURE_BOOT}" ]]; then
# install fedora shim
[[ ! -d ${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT ]] && mkdir -p "${_DESTDIR}"/"${_UEFISYS_MP}"/EFI/BOOT/
cp -f /usr/share/archboot/bootloader/shim"${_SPEC_UEFI_ARCH}".efi "${_DESTDIR}"/"${_UEFISYS_MP}"/EFI/BOOT/BOOT"${_UEFI_ARCH}".EFI
cp -f /usr/share/archboot/bootloader/mm"${_SPEC_UEFI_ARCH}".efi "${_DESTDIR}"/"${_UEFISYS_MP}"/EFI/BOOT/
_GRUB_PREFIX_DIR="${_UEFISYS_MP}/EFI/BOOT/"
else
## Install GRUB
chroot "${_DESTDIR}" grub-install \
--directory="/usr/lib/grub/${_GRUB_ARCH}-efi" \
--target="${_GRUB_ARCH}-efi" \
--efi-directory="/${_UEFISYS_MP}" \
--bootloader-id="grub" \
--boot-directory="/boot" \
--no-nvram \
--recheck \
--debug &> "/tmp/grub_uefi_${_UEFI_ARCH}_install.log"
cat "/tmp/grub_uefi_${_UEFI_ARCH}_install.log" >>"${_LOG}"
_GRUB_PREFIX_DIR="/boot/grub/"
fi
_chroot_umount
_GRUB_UEFI=1
_do_grub_config
_GRUB_UEFI=""
if [[ -n "${_UEFI_SECURE_BOOT}" ]]; then
# generate GRUB with config embeded
#remove existing, else weird things are happening
[[ -f "${_DESTDIR}/${_GRUB_PREFIX_DIR}/grub${_SPEC_UEFI_ARCH}.efi" ]] && rm "${_DESTDIR}"/"${_GRUB_PREFIX_DIR}"/grub"${_SPEC_UEFI_ARCH}".efi
### Hint: https://src.fedoraproject.org/rpms/grub2/blob/rawhide/f/grub.macros#_407
# add -v for verbose
if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then
if [[ "${_DESTDIR}" == "/install" ]]; then
systemd-nspawn -q -D "${_DESTDIR}" grub-mkstandalone -d /usr/lib/grub/"${_GRUB_ARCH}"-efi -O "${_GRUB_ARCH}"-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd chain tpm" --fonts="ter-u16n" --locales="en@quot" --themes="" -o "${_GRUB_PREFIX_DIR}/grub${_SPEC_UEFI_ARCH}.efi" "boot/grub/grub.cfg=/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
else
grub-mkstandalone -d /usr/lib/grub/"${_GRUB_ARCH}"-efi -O "${_GRUB_ARCH}"-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd chain tpm" --fonts="ter-u16n" --locales="en@quot" --themes="" -o "${_GRUB_PREFIX_DIR}/grub${_SPEC_UEFI_ARCH}.efi" "boot/grub/grub.cfg=/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
fi
elif [[ "${_RUNNING_ARCH}" == "x86_64" ]]; then
if [[ "${_DESTDIR}" == "/install" ]]; then
systemd-nspawn -q -D "${_DESTDIR}" grub-mkstandalone -d /usr/lib/grub/"${_GRUB_ARCH}"-efi -O "${_GRUB_ARCH}"-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efi_uga efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd backtrace chain tpm usb usbserial_common usbserial_pl2303 usbserial_ftdi usbserial_usbdebug keylayouts at_keyboard" --fonts="ter-u16n" --locales="en@quot" --themes="" -o "${_GRUB_PREFIX_DIR}/grub${_SPEC_UEFI_ARCH}.efi" "boot/grub/grub.cfg=/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
else
grub-mkstandalone -d /usr/lib/grub/"${_GRUB_ARCH}"-efi -O "${_GRUB_ARCH}"-efi --sbat=/usr/share/grub/sbat.csv --modules="all_video boot btrfs cat configfile cryptodisk echo efi_gop efi_uga efifwsetup efinet ext2 f2fs fat font gcry_rijndael gcry_rsa gcry_serpent gcry_sha256 gcry_twofish gcry_whirlpool gfxmenu gfxterm gzio halt hfsplus http iso9660 loadenv loopback linux lvm lsefi lsefimmap luks luks2 mdraid09 mdraid1x minicmd net normal part_apple part_msdos part_gpt password_pbkdf2 pgp png reboot regexp search search_fs_uuid search_fs_file search_label serial sleep syslinuxcfg test tftp video xfs zstd backtrace chain tpm usb usbserial_common usbserial_pl2303 usbserial_ftdi usbserial_usbdebug keylayouts at_keyboard" --fonts="ter-u16n" --locales="en@quot" --themes="" -o "${_GRUB_PREFIX_DIR}/grub${_SPEC_UEFI_ARCH}.efi" "boot/grub/grub.cfg=/${_GRUB_PREFIX_DIR}/${_GRUB_CFG}"
fi
fi
cp /"${_GRUB_PREFIX_DIR}"/"${_GRUB_CFG}" "${_UEFISYS_MP}"/EFI/BOOT/grub"${_SPEC_UEFI_ARCH}".cfg
fi
if [[ -e "${_DESTDIR}/${_UEFISYS_MP}/EFI/grub/grub${_SPEC_UEFI_ARCH}.efi" && -z "${_UEFI_SECURE_BOOT}" && -e "${_DESTDIR}/boot/grub/${_GRUB_ARCH}-efi/core.efi" ]]; then
_BOOTMGR_LABEL="GRUB"
_BOOTMGR_LOADER_PATH="/EFI/grub/grub${_SPEC_UEFI_ARCH}.efi"
_do_uefi_bootmgr_setup
mkdir -p "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT"
rm -f "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/BOOT${_UEFI_ARCH}.EFI"
cp -f "${_DESTDIR}/${_UEFISYS_MP}/EFI/grub/grub${_SPEC_UEFI_ARCH}.efi" "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/BOOT${_UEFI_ARCH}.EFI"
_dialog --infobox "GRUB(2) for ${_UEFI_ARCH} UEFI has been installed successfully.\nContinuing in 5 seconds..." 4 60
sleep 5
_S_BOOTLOADER=1
elif [[ -e "${_DESTDIR}/${_UEFISYS_MP}/EFI/BOOT/grub${_SPEC_UEFI_ARCH}.efi" && -n "${_UEFI_SECURE_BOOT}" ]]; then
_do_secureboot_keys || return 1
_do_mok_sign
_do_pacman_sign
_do_uefi_secure_boot_efitools
_BOOTMGR_LABEL="SHIM with GRUB Secure Boot"
_BOOTMGR_LOADER_PATH="/EFI/BOOT/BOOT${_UEFI_ARCH}.EFI"
_do_uefi_bootmgr_setup
_dialog --infobox "SHIM and GRUB(2) Secure Boot for ${_UEFI_ARCH} UEFI\nhas been installed successfully.\nContinuing in 5 seconds..." 5 50
sleep 5
_S_BOOTLOADER=1
else
_dialog --msgbox "Error installing GRUB(2) for ${_UEFI_ARCH} UEFI.\nCheck /tmp/grub_uefi_${_UEFI_ARCH}_install.log for more info.\n\nYou probably need to install it manually by chrooting into ${_DESTDIR}.\nDon't forget to bind mount /dev, /sys and /proc into ${_DESTDIR} before chrooting." 0 0
return 1
fi
}
_install_bootloader_uefi() {
if [[ -n "${_EFI_MIXED}" ]]; then
_EFISTUB_MENU_LABEL=""
_EFISTUB_MENU_TEXT=""
else
_EFISTUB_MENU_LABEL="EFISTUB"
_EFISTUB_MENU_TEXT="EFISTUB for ${_UEFI_ARCH} UEFI"
fi
if [[ -n "${_UEFI_SECURE_BOOT}" ]]; then
_do_grub_uefi
else
_dialog --menu "Which ${_UEFI_ARCH} UEFI bootloader would you like to use?" 9 55 3 \
"${_EFISTUB_MENU_LABEL}" "${_EFISTUB_MENU_TEXT}" \
"GRUB_UEFI" "GRUB(2) for ${_UEFI_ARCH} UEFI" 2>"${_ANSWER}"
case $(cat "${_ANSWER}") in
"EFISTUB")
_do_efistub_uefi ;;
"GRUB_UEFI")
_do_grub_uefi ;;
esac
fi
}
_install_bootloader() {
_S_BOOTLOADER=""
_destdir_mounts || return 1
if [[ -z "${_NAME_SCHEME_PARAMETER_RUN}" ]]; then
_set_device_name_scheme || return 1
fi
if [[ -z "${_S_SRC}" ]]; then
_select_source || return 1
fi
_prepare_pacman
if [[ -n "${_UCODE}" ]]; then
if ! [[ -f "${_DESTDIR}/boot/${_UCODE}" ]]; then
_PACKAGES="${_UCODE_PKG}"
_run_pacman
fi
fi
if [[ -n "${_UEFI_BOOT}" ]]; then
_install_bootloader_uefi
else
if [[ "${_RUNNING_ARCH}" == "aarch64" || "${_RUNNING_ARCH}" == "riscv64" ]]; then
_do_uboot
else
_do_grub_bios
fi
fi
if [[ -z "${_S_BOOTLOADER}" ]]; then
_NEXTITEM="7"
else
_NEXTITEM="8"
fi
}
# vim: set ft=sh ts=4 sw=4 et:

View file

@ -0,0 +1,265 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
# scan and update btrfs devices
_btrfs_scan() {
btrfs device scan &>"${_NO_LOG}"
}
# mount btrfs for checks
_mount_btrfs() {
_btrfs_scan
_BTRFSMP="$(mktemp -d /tmp/btrfsmp.XXXX)"
mount "${_DEV}" "${_BTRFSMP}"
}
# unmount btrfs after checks done
_umount_btrfs() {
umount "${_BTRFSMP}"
rm -r "${_BTRFSMP}"
}
# Set _BTRFS_DEVS on detected btrfs devices
_find_btrfsraid_devices() {
_btrfs_scan
if [[ -z "${_DETECT_CREATE_FILESYSTEM}" && "${_FSTYPE}" == "btrfs" ]]; then
for i in $(btrfs filesystem show "${_DEV}" | cut -d " " -f 11); do
_BTRFS_DEVS="${_BTRFS_DEVS}#${i}"
done
fi
}
_find_btrfsraid_bootloader_devices() {
_btrfs_scan
_BTRFS_COUNT=1
if [[ "$(${_LSBLK} FSTYPE "${_BOOTDEV}")" == "btrfs" ]]; then
_BTRFS_DEVS=""
for i in $(btrfs filesystem show "${_BOOTDEV}" | cut -d " " -f 11); do
_BTRFS_DEVS="${_BTRFS_DEVS}#${i}"
_BTRFS_COUNT=$((_BTRFS_COUNT+1))
done
fi
}
# find btrfs subvolume
_find_btrfs_subvolume() {
if [[ -z "${_DETECT_CREATE_FILESYSTEM}" ]]; then
# existing btrfs subvolumes
_mount_btrfs
for i in $(btrfs subvolume list "${_BTRFSMP}" | cut -d " " -f 9 | grep -v 'var/lib/machines' | grep -v 'var/lib/portables'); do
echo "${i}"
[[ "${1}" ]] && echo "${1}"
done
_umount_btrfs
fi
}
_find_btrfs_bootloader_subvolume() {
if [[ "$(${_LSBLK} FSTYPE "${_BOOTDEV}")" == "btrfs" ]]; then
_BTRFS_SUBVOLUMES=""
_DEV="${_BOOTDEV}"
_mount_btrfs
for i in $(btrfs subvolume list "${_BTRFSMP}" | cut -d " " -f 7); do
_BTRFS_SUBVOLUMES="${_BTRFS_SUBVOLUMES}#${i}"
done
_umount_btrfs
fi
}
# subvolumes already in use
_subvolumes_in_use() {
_SUBVOLUME_IN_USE=""
while read -r i; do
echo "${i}" | grep -q ":btrfs:" && _SUBVOLUME_IN_USE="${_SUBVOLUME_IN_USE} $(echo "${i}" | cut -d: -f 9)"
done < /tmp/.parts
}
# do not ask for btrfs filesystem creation, if already prepared for creation!
_check_btrfs_filesystem_creation() {
_DETECT_CREATE_FILESYSTEM=""
_SKIP_FILESYSTEM=""
#shellcheck disable=SC2013
for i in $(grep "${_DEV}[:#]" /tmp/.parts); do
if echo "${i}" | grep -q ":btrfs:"; then
_FSTYPE="btrfs"
_SKIP_FILESYSTEM=1
# check on filesystem creation, skip subvolume asking then!
echo "${i}" | cut -d: -f 4 | grep -q 1 && _DETECT_CREATE_FILESYSTEM=1
fi
done
}
# remove devices with no subvolume from list and generate raid device list
_btrfs_parts() {
if [[ -s /tmp/.btrfs-devices ]]; then
_BTRFS_DEVS=""
while read -r i; do
_BTRFS_DEVS="${_BTRFS_DEVS}#${i}"
# remove device if no subvolume is used!
[[ "${_BTRFS_SUBVOLUME}" == "NONE" ]] && _DEVS="${_DEVS//${i}\ _/}"
done < /tmp/.btrfs-devices
else
[[ "${_BTRFS_SUBVOLUME}" == "NONE" ]] && _DEVS="${_DEVS//${_DEV}\ _/}"
fi
}
# choose raid level to use on btrfs device
_btrfsraid_level() {
_BTRFS_RAIDLEVELS="NONE - raid0 - raid1 - raid5 - raid6 - raid10 - single -"
_BTRFS_RAID_FINISH=""
_BTRFS_LEVEL=""
_BTRFS_DEV="${_DEV}"
: >/tmp/.btrfs-devices
while [[ "${_BTRFS_RAID_FINISH}" != "DONE" ]]; do
#shellcheck disable=SC2086
_dialog --menu "Select the raid data level you want to use:" 14 50 10 ${_BTRFS_RAIDLEVELS} 2>"${_ANSWER}" || return 1
_BTRFS_LEVEL=$(cat "${_ANSWER}")
if [[ "${_BTRFS_LEVEL}" == "NONE" ]]; then
echo "${_BTRFS_DEV}" >>/tmp/.btrfs-devices
break
else
if [[ "${_BTRFS_LEVEL}" == "raid5" || "${_BTRFS_LEVEL}" == "raid6" ]]; then
_dialog --msgbox "BTRFS DATA RAID OPTIONS:\n\nRAID5/6 are for testing purpose. Use with extreme care!" 0 0
fi
# take selected device as 1st device, add additional devices in part below.
_select_btrfsraid_devices
fi
done
}
# select btrfs raid devices
_select_btrfsraid_devices () {
# select the second device to use, no missing option available!
: >/tmp/.btrfs-devices
echo "${_BTRFS_DEV}" >>/tmp/.btrfs-devices
#shellcheck disable=SC2001,SC2086
_BTRFS_DEVS=${_DEVS//${_BTRFS_DEV}\ _/}
_RAIDNUMBER=2
#shellcheck disable=SC2086
_dialog --menu "Select device ${_RAIDNUMBER}:" 13 50 10 ${_BTRFS_DEVS} 2>"${_ANSWER}" || return 1
_BTRFS_DEV=$(cat "${_ANSWER}")
echo "${_BTRFS_DEV}" >>/tmp/.btrfs-devices
while [[ "${_BTRFS_DEV}" != "DONE" ]]; do
_BTRFS_DONE=""
_RAIDNUMBER=$((_RAIDNUMBER + 1))
# RAID5 needs 3 devices
# RAID6, RAID10 need 4 devices!
[[ "${_RAIDNUMBER}" -ge 3 && ! "${_BTRFS_LEVEL}" == "raid10" && ! "${_BTRFS_LEVEL}" == "raid6" && ! "${_BTRFS_LEVEL}" == "raid5" ]] && _BTRFS_DONE="DONE _"
[[ "${_RAIDNUMBER}" -ge 4 && "${_BTRFS_LEVEL}" == "raid5" ]] && _BTRFS_DONE="DONE _"
[[ "${_RAIDNUMBER}" -ge 5 && "${_BTRFS_LEVEL}" == "raid10" || "${_BTRFS_LEVEL}" == "raid6" ]] && _BTRFS_DONE="DONE _"
# clean loop from used partition and options
_BTRFS_DEVS=${_BTRFS_DEVS//${_BTRFS_DEV}\ _/}
# add more devices
#shellcheck disable=SC2086
_dialog --menu "Select device ${_RAIDNUMBER}:" 13 50 10 ${_BTRFS_DEVS} ${_BTRFS_DONE} 2>"${_ANSWER}" || return 1
_BTRFS_DEV=$(cat "${_ANSWER}")
[[ "${_BTRFS_DEV}" == "DONE" ]] && break
echo "${_BTRFS_DEV}" >>/tmp/.btrfs-devices
done
# final step ask if everything is ok?
#shellcheck disable=SC2028
_dialog --yesno "Would you like to create btrfs raid data like this?\n\nLEVEL:\n${_BTRFS_LEVEL}\n\nDEVICES:\n$(while read -r i; do echo "${i}\n"; done </tmp/.btrfs-devices)" 0 0 && _BTRFS_RAID_FINISH="DONE"
}
# prepare new btrfs device
_prepare_btrfs() {
_btrfsraid_level || return 1
_prepare_btrfs_subvolume || return 1
}
# prepare btrfs subvolume
_prepare_btrfs_subvolume() {
_BTRFS_SUBVOLUME="NONE"
while [[ "${_BTRFS_SUBVOLUME}" == "NONE" ]]; do
_dialog --inputbox "Enter the SUBVOLUME name on ${_DEV}, keep it short\nand use no spaces or special ncharacters." 9 60 2>"${_ANSWER}" || return 1
_BTRFS_SUBVOLUME=$(cat "${_ANSWER}")
_check_btrfs_subvolume
done
_btrfs_compress || return 1
}
# check btrfs subvolume
_check_btrfs_subvolume(){
[[ -n "${_DOMKFS}" && "${_FSTYPE}" == "btrfs" ]] && _DETECT_CREATE_FILESYSTEM=1
if [[ -z "$(cat "${_ANSWER}")" ]]; then
_dialog --msgbox "ERROR: You have defined an empty name!\nPlease enter another name." 6 50
_BTRFS_SUBVOLUME="NONE"
fi
if [[ -z "${_DETECT_CREATE_FILESYSTEM}" && -z "${_CREATE_MOUNTPOINTS}" ]]; then
_mount_btrfs
for i in $(btrfs subvolume list "${_BTRFSMP}" | cut -d " " -f 9); do
if echo "${i}" | grep -q "${_BTRFS_SUBVOLUME}"; then
_dialog --msgbox "ERROR: You have defined 2 identical SUBVOLUME names!\nPlease enter another name." 6 60
_BTRFS_SUBVOLUME="NONE"
fi
done
_umount_btrfs
else
# existing subvolumes
_subvolumes_in_use
if echo "${_SUBVOLUME_IN_USE}" | grep -Eq "${_BTRFS_SUBVOLUME}"; then
_dialog --msgbox "ERROR: You have defined 2 identical SUBVOLUME names!\nPlease enter another name." 6 60
_BTRFS_SUBVOLUME="NONE"
fi
fi
}
# create btrfs subvolume
_create_btrfs_subvolume() {
_mount_btrfs
if ! btrfs subvolume list "${_BTRFSMP}" | grep -q "${_BTRFS_SUBVOLUME}$"; then
btrfs subvolume create "${_BTRFSMP}"/"${_BTRFS_SUBVOLUME}" >"${_LOG}"
fi
_umount_btrfs
}
# choose btrfs subvolume from list
_choose_btrfs_subvolume () {
_BTRFS_SUBVOLUME="NONE"
_SUBVOLUMES_DETECTED=""
_SUBVOLUMES=$(_find_btrfs_subvolume _)
# check if subvolumes are present
[[ -n "${_SUBVOLUMES}" ]] && _SUBVOLUMES_DETECTED=1
_subvolumes_in_use
for i in ${_SUBVOLUME_IN_USE}; do
#shellcheck disable=SC2001,SC2086
_SUBVOLUMES="${_SUBVOLUMES}//${i} _/}"
done
if [[ -n "${_SUBVOLUMES}" ]]; then
#shellcheck disable=SC2086
_dialog --menu "Select the subvolume to mount:" 15 50 13 ${_SUBVOLUMES} 2>"${_ANSWER}" || return 1
_BTRFS_SUBVOLUME=$(cat "${_ANSWER}")
_btrfs_compress || return 1
else
if [[ -n "${_SUBVOLUMES_DETECTED}" ]]; then
_dialog --msgbox "ERROR: All subvolumes of the device are already in use. Switching to create a new one now." 8 65
_prepare_btrfs_subvolume || return 1
fi
fi
}
# btrfs subvolume menu
_btrfs_subvolume() {
if [[ "${_FSTYPE}" == "btrfs" && -z "${_CREATE_MOUNTPOINTS}" ]]; then
_choose_btrfs_subvolume || return 1
else
if [[ -n "${_SKIP_FILESYSTEM}" && -z ${_DETECT_CREATE_FILESYSTEM}"" ]]; then
_choose_btrfs_subvolume || return 1
else
_prepare_btrfs_subvolume || return 1
fi
fi
}
# ask for btrfs compress option
_btrfs_compress() {
_BTRFS_COMPRESSLEVELS="zstd - lzo - zlib - NONE -"
#shellcheck disable=SC2086
_dialog --menu "Select the compression method you want to use:\nDevice -> ${_DEV} subvolume=${_BTRFS_SUBVOLUME}" 12 50 10 ${_BTRFS_COMPRESSLEVELS} 2>"${_ANSWER}" || return 1
if [[ "$(cat "${_ANSWER}")" == "NONE" ]]; then
_BTRFS_COMPRESS="NONE"
else
_BTRFS_COMPRESS="compress=$(cat "${_ANSWER}")"
fi
}
# vim: set ft=sh ts=4 sw=4 et:

View file

@ -0,0 +1,140 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
# we rely on some output which is parsed in english!
LANG=C.UTF8
_LOCAL_DB="/var/cache/pacman/pkg/archboot.db"
_RUNNING_ARCH="$(uname -m)"
_KERNELPKG="linux"
# name of the kernel image
[[ "${_RUNNING_ARCH}" == "x86_64" || "${_RUNNING_ARCH}" == "riscv64" ]] && _VMLINUZ="vmlinuz-${_KERNELPKG}"
if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then
_VMLINUZ="Image.gz"
#shellcheck disable=SC2034
_VMLINUZ_EFISTUB="Image"
fi
# abstract the common pacman args
_PACMAN="pacman --root ${_DESTDIR} ${_PACMAN_CONF} --cachedir=${_DESTDIR}/var/cache/pacman/pkg --noconfirm --noprogressbar"
_MIRRORLIST="/etc/pacman.d/mirrorlist"
_linux_firmware() {
_PACKAGES="${_PACKAGES//\ linux-firmware\ / }"
#shellcheck disable=SC2013
for i in $(cut -d ' ' -f1</proc/modules); do
if modinfo "${i}" | grep -qw 'firmware:'; then
_PACKAGES="${_PACKAGES} linux-firmware"
break
fi
done
}
_marvell_firmware() {
_MARVELL=""
_PACKAGES="${_PACKAGES//\ linux-firmware-marvell\ / }"
for i in $(find /lib/modules/"$(uname -r)" | grep -w wireless | grep -w marvell); do
[[ -f $i ]] && _MARVELL="${_MARVELL} $(basename "${i}" | sed -e 's#\..*$##g')"
done
# check marvell modules if already loaded
for i in ${_MARVELL}; do
if lsmod | grep -qw "${i}"; then
_PACKAGES="${_PACKAGES} linux-firmware-marvell"
break
fi
done
}
# prepares target system as a chroot
_chroot_mount()
{
if grep -qw '^archboot' /etc/hostname; then
[[ -e "${_DESTDIR}/proc" ]] || mkdir -m 555 "${_DESTDIR}/proc"
[[ -e "${_DESTDIR}/sys" ]] || mkdir -m 555 "${_DESTDIR}/sys"
[[ -e "${_DESTDIR}/dev" ]] || mkdir -m 755 "${_DESTDIR}/dev"
mount proc "${_DESTDIR}/proc" -t proc -o nosuid,noexec,nodev
mount sys "${_DESTDIR}/sys" -t sysfs -o nosuid,noexec,nodev,ro
mount udev "${_DESTDIR}/dev" -t devtmpfs -o mode=0755,nosuid
mount devpts "${_DESTDIR}/dev/pts" -t devpts -o mode=0620,gid=5,nosuid,noexec
mount shm "${_DESTDIR}/dev/shm" -t tmpfs -o mode=1777,nosuid,nodev
fi
}
# tears down chroot in target system
_chroot_umount()
{
if grep -qw '^archboot' /etc/hostname; then
umount -R "${_DESTDIR}/proc"
umount -R "${_DESTDIR}/sys"
umount -R "${_DESTDIR}/dev"
fi
}
_local_pacman_conf() {
_PACMAN_CONF="$(mktemp /tmp/pacman.conf.XXX)"
#shellcheck disable=SC2129
echo "[options]" >> "${_PACMAN_CONF}"
echo "Architecture = auto" >> "${_PACMAN_CONF}"
echo "SigLevel = Required DatabaseOptional" >> "${_PACMAN_CONF}"
echo "LocalFileSigLevel = Optional" >> "${_PACMAN_CONF}"
echo "[archboot]" >> "${_PACMAN_CONF}"
echo "Server = file:///var/cache/pacman/pkg" >> "${_PACMAN_CONF}"
_PACMAN_CONF="--config ${_PACMAN_CONF}"
}
_auto_packages() {
# Add filesystem packages
if lsblk -rnpo FSTYPE | grep -q btrfs; then
! echo "${_PACKAGES}" | grep -qw btrfs-progs && _PACKAGES="${_PACKAGES} btrfs-progs"
fi
if lsblk -rnpo FSTYPE | grep -q nilfs2; then
! echo "${_PACKAGES}" | grep -qw nilfs-utils && _PACKAGES="${_PACKAGES} nilfs-utils"
fi
if lsblk -rnpo FSTYPE | grep -q ext; then
! echo "${_PACKAGES}" | grep -qw e2fsprogs && _PACKAGES="${_PACKAGES} e2fsprogs"
fi
if lsblk -rnpo FSTYPE | grep -q xfs; then
! echo "${_PACKAGES}" | grep -qw xfsprogs && _PACKAGES="${_PACKAGES} xfsprogs"
fi
if lsblk -rnpo FSTYPE | grep -q jfs; then
! echo "${_PACKAGES}" | grep -qw jfsutils && _PACKAGES="${_PACKAGES} jfsutils"
fi
if lsblk -rnpo FSTYPE | grep -q f2fs; then
! echo "${_PACKAGES}" | grep -qw f2fs-tools && _PACKAGES="${_PACKAGES} f2fs-tools"
fi
if lsblk -rnpo FSTYPE | grep -q vfat; then
! echo "${_PACKAGES}" | grep -qw dosfstools && _PACKAGES="${_PACKAGES} dosfstools"
fi
# Add packages for complex blockdevices
if lsblk -rnpo FSTYPE | grep -qw 'linux_raid_member'; then
! echo "${_PACKAGES}" | grep -qw mdadm && _PACKAGES="${_PACKAGES} mdadm"
fi
if lsblk -rnpo FSTYPE | grep -qw 'LVM2_member'; then
! echo "${_PACKAGES}" | grep -qw lvm2 && _PACKAGES="${_PACKAGES} lvm2"
fi
if lsblk -rnpo FSTYPE | grep -qw 'crypto_LUKS'; then
! echo "${_PACKAGES}" | grep -qw cryptsetup && _PACKAGES="${_PACKAGES} cryptsetup"
fi
#shellcheck disable=SC2010
# Add iwd, if wlan is detected
if ls /sys/class/net | grep -q wlan; then
! echo "${_PACKAGES}" | grep -qw iwd && _PACKAGES="${_PACKAGES} iwd"
fi
# Add broadcom-wl, if module is detected
if lsmod | grep -qw wl; then
! echo "${_PACKAGES}" | grep -qw broadcom-wl && _PACKAGES="${_PACKAGES} broadcom-wl"
fi
grep -q '^FONT=ter' /etc/vconsole.conf && _PACKAGES="${_PACKAGES} terminus-font"
# only add firmware if already used
_linux_firmware
_marvell_firmware
}
# /etc/locale.gen
# enable at least C.UTF-8 if nothing was changed, else weird things happen on reboot!
_locale_gen() {
if [[ "${_DESTDIR}" == "/install" ]]; then
systemd-nspawn -q -D "${_DESTDIR}" locale-gen &>"${_NO_LOG}"
else
locale-gen &>"${_NO_LOG}"
fi
}
# vim: set ft=sh ts=4 sw=4 et:

View file

@ -0,0 +1,117 @@
#!/usr/bin/env bash
# SPDX-License-Identifier: GPL-2.0-only
# created by Tobias Powalowski <tpowa@archlinux.org>
_check_root_password() {
# check if empty password is set
if chroot "${_DESTDIR}" passwd -S root | cut -d ' ' -f2 | grep -q NP; then
_dialog --msgbox "Setup detected no password set for root user,\nplease set new password now." 6 50
_set_password || return 1
fi
# check if account is locked
if chroot "${_DESTDIR}" passwd -S root | cut -d ' ' -f2 | grep -q L; then
_dialog --msgbox "Setup detected locked account for root user,\nplease set new password to unlock account now." 6 50
_set_password || return 1
fi
}
_set_mkinitcpio() {
_HOOK_ERROR=""
${_EDITOR} "${_DESTDIR}""${_FILE}"
#shellcheck disable=SC2013
for i in $(grep ^HOOKS "${_DESTDIR}"/etc/mkinitcpio.conf | sed -e 's/"//g' -e 's/HOOKS=\(//g' -e 's/\)//g'); do
[[ -e ${_DESTDIR}/usr/lib/initcpio/install/${i} ]] || _HOOK_ERROR=1
done
if [[ -n "${_HOOK_ERROR}" ]]; then
_dialog --msgbox "ERROR: Detected error in 'HOOKS=' line, please correct HOOKS= in /etc/mkinitcpio.conf!" 18 70
else
_run_mkinitcpio
fi
}
_set_locale() {
if [[ -z ${_S_LOCALE} ]]; then
_LOCALES="en_US English de_DE German es_ES Spanish fr_FR French pt_PT Portuguese ru_RU Russian OTHER More"
_CHECK_LOCALES="$(grep 'UTF' "${_DESTDIR}"/etc/locale.gen | sed -e 's:#::g' -e 's: UTF-8.*$::g')"
_OTHER_LOCALES=""
for i in ${_CHECK_LOCALES}; do
_OTHER_LOCALES="${_OTHER_LOCALES} ${i} -"
done
#shellcheck disable=SC2086
_dialog --menu "Select A System-Wide Locale:" 14 40 8 ${_LOCALES} 2>${_ANSWER} || return 1
_SET_LOCALE=$(cat "${_ANSWER}")
if [[ "${_SET_LOCALE}" == "OTHER" ]]; then
#shellcheck disable=SC2086
_dialog --menu "Select A System-Wide Locale:" 18 40 12 ${_OTHER_LOCALES} 2>${_ANSWER} || return 1
_SET_LOCALE=$(cat "${_ANSWER}")
fi
sed -i -e "s#LANG=.*#LANG=${_SET_LOCALE}.UTF-8#g" "${_DESTDIR}"/etc/locale.conf
_dialog --infobox "Setting locale LANG=${_SET_LOCALE}.UTF-8 on installed system..." 3 70
_S_LOCALE=1
sleep 2
_auto_set_locale
_run_locale_gen
fi
}
_set_password() {
_PASSWORD=""
_PASS=""
_PASS2=""
while [[ -z "${_PASSWORD}" ]]; do
while [[ -z "${_PASS}" ]]; do
_dialog --insecure --passwordbox "Enter new root password:" 8 50 2>"${_ANSWER}" || return 1
_PASS=$(cat "${_ANSWER}")
done
while [[ -z "${_PASS2}" ]]; do
_dialog --insecure --passwordbox "Retype new root password:" 8 50 2>"${_ANSWER}" || return 1
_PASS2=$(cat "${_ANSWER}")
done
if [[ "${_PASS}" == "${_PASS2}" ]]; then
_PASSWORD=${_PASS}
echo "${_PASSWORD}" > /tmp/.password
echo "${_PASSWORD}" >> /tmp/.password
_PASSWORD=/tmp/.password
else
_dialog --msgbox "Error:\nPassword didn't match, please enter again." 6 50
_PASSWORD=""
_PASS=""
_PASS2=""
fi
done
chroot "${_DESTDIR}" passwd root < /tmp/.password &>"${_NO_LOG}"
rm /tmp/.password
}
_run_mkinitcpio() {
_dialog --infobox "Rebuilding initramfs on installed system..." 3 70
_chroot_mount
echo "Initramfs progress..." > /tmp/mkinitcpio.log
if [[ "${_RUNNING_ARCH}" == "aarch64" ]]; then
chroot "${_DESTDIR}" mkinitcpio -p "${_KERNELPKG}"-"${_RUNNING_ARCH}" |& tee -a "${_LOG}" /tmp/mkinitcpio.log &>"${_NO_LOG}"
else
chroot "${_DESTDIR}" mkinitcpio -p "${_KERNELPKG}" |& tee -a "${_LOG}" /tmp/mkinitcpio.log &>"${_NO_LOG}"
fi
echo $? > /tmp/.mkinitcpio-retcode
if [[ $(cat /tmp/.mkinitcpio-retcode) -ne 0 ]]; then
echo -e "\nMkinitcpio FAILED." >>/tmp/mkinitcpio.log
else
echo -e "\nMkinitcpio Complete." >>/tmp/mkinitcpio.log
fi
local _result=''
# mkinitcpio finished, display scrollable output on error
if [[ $(cat /tmp/.mkinitcpio-retcode) -ne 0 ]]; then
_result="Mkinitcpio Failed (see errors below)"
_dialog --title "${_result}" --exit-label "Continue" \
--textbox "/tmp/mkinitcpio.log" 18 70 || return 1
fi
rm /tmp/.mkinitcpio-retcode
_chroot_umount
sleep 2
}
_run_locale_gen() {
_dialog --infobox "Rebuilding glibc locales on installed system..." 3 70
_locale_gen
sleep 2
}
# vim: set ft=sh ts=4 sw=4 et:

View file

@ -418,7 +418,7 @@ _mkfs() {
if [[ -n "${_CREATE_MOUNTPOINTS}" && "${5}" = "/efi" && ! -d "${3}${5}/EFI" ]]; then if [[ -n "${_CREATE_MOUNTPOINTS}" && "${5}" = "/efi" && ! -d "${3}${5}/EFI" ]]; then
mkdir "${3}${5}/EFI" mkdir "${3}${5}/EFI"
fi fi
if [[ -n "${_CREATE_MOUNTPOINTS}" && "${5}" = "/boot" && -n "${_UEFI_BOOT}" && ! $(mountpoint "${3}/efi" &>"${_NO_LOG}") && ! -d "${3}${5}/EFI" ]]; then if [[ -n "${_CREATE_MOUNTPOINTS}" && "${5}" = "/boot" && -n "${_UEFI_BOOT}" && ! $(mountpoint "${3}/efi" > "${_NO_LOG}") && ! -d "${3}${5}/EFI" ]]; then
mkdir "${3}${5}/EFI" mkdir "${3}${5}/EFI"
fi fi
# check if /boot exists on ROOT DEVICE # check if /boot exists on ROOT DEVICE
@ -434,7 +434,7 @@ _mkfs() {
return 1 return 1
fi fi
# check on /EFI on /boot # check on /EFI on /boot
if [[ -z "${_CREATE_MOUNTPOINTS}" && "${5}" = "/boot" && -n "${_UEFI_BOOT}" && ! $(mountpoint "${3}/efi" &>"${_NO_LOG}") && ! -d "${3}${5}/EFI" ]]; then if [[ -z "${_CREATE_MOUNTPOINTS}" && "${5}" = "/boot" && -n "${_UEFI_BOOT}" && ! $(mountpoint "${3}/efi" > "${_NO_LOG}") && ! -d "${3}${5}/EFI" ]]; then
_dialog --msgbox "Error: EFI SYSTEM PARTITION (ESP) ${3}${5} does not contain /EFI directory." 0 0 _dialog --msgbox "Error: EFI SYSTEM PARTITION (ESP) ${3}${5} does not contain /EFI directory." 0 0
_umountall _umountall
return 1 return 1