mirror of
https://gitlab.archlinux.org/tpowa/archboot.git
synced 2024-09-20 03:50:37 +02:00
parent
72e3ea7055
commit
248a8d0c2b
9 changed files with 3224 additions and 2 deletions
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -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:
|
|
@ -418,7 +418,7 @@ _mkfs() {
|
|||
if [[ -n "${_CREATE_MOUNTPOINTS}" && "${5}" = "/efi" && ! -d "${3}${5}/EFI" ]]; then
|
||||
mkdir "${3}${5}/EFI"
|
||||
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"
|
||||
fi
|
||||
# check if /boot exists on ROOT DEVICE
|
||||
|
@ -434,7 +434,7 @@ _mkfs() {
|
|||
return 1
|
||||
fi
|
||||
# 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
|
||||
_umountall
|
||||
return 1
|
||||
|
|
Loading…
Reference in a new issue