diff options
author | Andrew Ammerlaan <andrewammerlaan@gentoo.org> | 2024-06-25 15:08:49 +0200 |
---|---|---|
committer | Andrew Ammerlaan <andrewammerlaan@gentoo.org> | 2024-06-29 10:36:16 +0200 |
commit | e598ba3fe1f5b51c0f0e64cacd950d600b289852 (patch) | |
tree | ecd6ed1fa4965fbaf03553e36a484f6c63d3696f /eclass/mount-boot-utils.eclass | |
parent | app-antivirus/clamav: update tmpfiles configuration (diff) | |
download | gentoo-e598ba3fe1f5b51c0f0e64cacd950d600b289852.tar.gz gentoo-e598ba3fe1f5b51c0f0e64cacd950d600b289852.tar.bz2 gentoo-e598ba3fe1f5b51c0f0e64cacd950d600b289852.zip |
mount-boot.eclass: check for ESP as well as /boot, split eclass
This eclass is used by when the dist-kernel has to re-installed.
Depending on the configuration of sys-kernel/installkernel, the files may be
installed to /boot or to the EFI System partition. Therefore, extend this eclass
to check if the ESP is mounted read-write as well on UEFI platforms.
Split off the main functions into a separate "inherit-safe" eclass so we can
safely use it in dist-kernel-utils.eclass and linux-mod-r1.eclass.
In the process we drop support for EAPI 6, since there are no EAPI 6 consumers
left in ::gentoo.
Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org>
Diffstat (limited to 'eclass/mount-boot-utils.eclass')
-rw-r--r-- | eclass/mount-boot-utils.eclass | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/eclass/mount-boot-utils.eclass b/eclass/mount-boot-utils.eclass new file mode 100644 index 000000000000..39f8e94b84ec --- /dev/null +++ b/eclass/mount-boot-utils.eclass @@ -0,0 +1,109 @@ +# Copyright 1999-2024 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# @ECLASS: mount-boot-utils.eclass +# @MAINTAINER: +# base-system@gentoo.org +# @SUPPORTED_EAPIS: 6 7 8 +# @BLURB: functions for packages that install files into /boot or the ESP +# @DESCRIPTION: +# This eclass is really only useful for bootloaders and kernel installation. +# +# If the live system has a separate /boot partition or ESP configured, then this +# function tries to ensure that it's mounted in rw mode, exiting with an error +# if it can't. It does nothing if /boot and ESP isn't a separate partition. +# +# This eclass provides the functions used by mount-boot.eclass in an "inherit- +# safe" way. This allows these functions to be used in other eclasses cleanly. + +case ${EAPI} in + 7|8) ;; + *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; +esac + +# @FUNCTION: mount-boot_is_disabled +# @INTERNAL +# @DESCRIPTION: +# Detect whether the current environment/build settings are such that we do not +# want to mess with any mounts. +mount-boot_is_disabled() { + # Since this eclass only deals with /boot, skip things when EROOT is active. + if [[ -n ${EROOT} ]]; then + return 0 + fi + + # If we're only building a package, then there's no need to check things. + if [[ ${MERGE_TYPE} == buildonly ]]; then + return 0 + fi + + # The user wants us to leave things be. + if [[ -n ${DONT_MOUNT_BOOT} ]]; then + return 0 + fi + + # OK, we want to handle things ourselves. + return 1 +} + +# @FUNCTION: mount-boot_check_status +# @INTERNAL +# @DESCRIPTION: +# Check if /boot and ESP is sane, i.e., mounted as read-write if on a separate +# partition. Die if conditions are not fulfilled. If nonfatal is used, +# the function will return a non-zero status instead. +mount-boot_check_status() { + # Get out fast if possible. + mount-boot_is_disabled && return 0 + + local partition= + local part_is_not_mounted= + local part_is_read_only= + local candidates=( /boot ) + + # If system is booted with UEFI, check for ESP as well + if [[ -d /sys/firmware/efi ]]; then + # Use same candidates for ESP as installkernel and eclean-kernel + candidates+=( /efi /boot/efi /boot/EFI ) + fi + + for partition in ${candidates[@]}; do + # note that /dev/BOOT is in the Gentoo default /etc/fstab file + local fstabstate=$(awk "!/^[[:blank:]]*#|^\/dev\/BOOT/ && \$2 == \"${partition}\" \ + { print 1; exit }" /etc/fstab || die "awk failed") + + if [[ -z ${fstabstate} ]]; then + einfo "Assuming you do not have a separate ${partition} partition." + else + local procstate=$(awk "\$2 == \"${partition}\" { split(\$4, a, \",\"); \ + for (i in a) if (a[i] ~ /^r[ow]\$/) { print a[i]; break }; exit }" \ + /proc/mounts || die "awk failed") + + if [[ -z ${procstate} ]]; then + eerror "Your ${partition} partition is not mounted" + eerror "Please mount it and retry." + die -n "${partition} not mounted" + part_is_not_mounted=1 + else + if [[ ${procstate} == ro ]]; then + eerror "Your ${partition} partition, was detected as being mounted," \ + "but is mounted read-only." + eerror "Please remount it as read-write and retry." + die -n "${partition} mounted read-only" + part_is_read_only=1 + else + einfo "Your ${partition} partition was detected as being mounted." + einfo "Files will be installed there for ${PN} to function correctly." + fi + fi + fi + done + + if [[ -n ${part_is_not_mounted} ]]; then + return 1 + elif [[ -n ${part_is_read_only} ]]; then + return 2 + else + return 0 + fi +} |