* [gentoo-dev] [PATCH] kernel-build.eclass: identify dist-kernels, and warn users @ 2024-06-26 19:09 Andrew Nowa Ammerlaan 2024-06-26 20:06 ` [gentoo-dev] [PATCH 0/5] mount-boot.eclass: revises /boot checking for dist-kernels, add checks for ESP Andrew Nowa Ammerlaan 0 siblings, 1 reply; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-26 19:09 UTC (permalink / raw To: gentoo-dev Part of https://github.com/gentoo/gentoo/pull/37281 From c88eee66089333fbcee6377b5f580e70a4ec2a8c Mon Sep 17 00:00:00 2001 From: Andrew Ammerlaan <andrewammerlaan@gentoo.org> Date: Mon, 24 Jun 2024 22:18:46 +0200 Subject: [PATCH] kernel-build.eclass: identify dist-kernels, and warn users Many, many, new users at some point make the mistake of running "make ...." in the source directory of a distribution kernel. This returns a vague error due to the absence of the kernel source files: make[2]: *** No rule to make target 'arch/x86/entry/syscalls/syscall_32.tbl', needed by 'arch/x86/include/generated/uapi/asm/unistd_32.h'. Stop. make[1]: *** [arch/x86/Makefile:248: archheaders] Error 2 make: *** [Makefile:234: __sub-make] Error 2 Here we append to the kernel Makefile a warning that should make it more clear what is going wrong. "$(shell [ -t 0 ] && echo 1)" is a trick to show this warning when an user is executing "make" from their shell, but not when they are compiling out-of-tree kernel modules (which is the reason we need to install these makefiles to begin with). We also add a "dist-kernel" file containing the package atom of the ebuild that installed this kernel. This makes it possible for ebuilds/eclasses or whatever other tools to check if a kernel is a Gentoo distribution kernel. This identifier will be overwritten in gentoo-kernel-bin.ebuild. Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org> --- eclass/kernel-build.eclass | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/eclass/kernel-build.eclass b/eclass/kernel-build.eclass index 7922638be6e1c..86c7cd4a172d5 100644 --- a/eclass/kernel-build.eclass +++ b/eclass/kernel-build.eclass @@ -382,6 +382,22 @@ kernel-build_src_install() { local module_ver module_ver=$(<"${relfile}") || die + # warn when trying to "make" a dist-kernel + cat <<-EOF >> "${ED}${kernel_dir}/Makefile" || die + + _GENTOO_IS_USER_SHELL:=\$(shell [ -t 0 ] && echo 1) + ifdef _GENTOO_IS_USER_SHELL + \$(warning !!!! WARNING !!!!) + \$(warning This kernel was configured and installed by the package manager.) + \$(warning "make" should not be run manually here.) + \$(warning See also: https://wiki.gentoo.org/wiki/Project:Distribution_Kernel) + \$(warning See also: https://wiki.gentoo.org/wiki/Kernel/Configuration) + \$(warning !!!! WARNING !!!!) + endif + EOF + # add a dist-kernel identifier file + echo "${CATEGORY}/${PF}:${SLOT}" > "${ED}${kernel_dir}/dist-kernel" || die + # fix source tree and build dir symlinks dosym "../../../${kernel_dir}" "/lib/modules/${module_ver}/build" dosym "../../../${kernel_dir}" "/lib/modules/${module_ver}/source" ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [gentoo-dev] [PATCH 0/5] mount-boot.eclass: revises /boot checking for dist-kernels, add checks for ESP 2024-06-26 19:09 [gentoo-dev] [PATCH] kernel-build.eclass: identify dist-kernels, and warn users Andrew Nowa Ammerlaan @ 2024-06-26 20:06 ` Andrew Nowa Ammerlaan 2024-06-26 20:06 ` [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass Andrew Nowa Ammerlaan 0 siblings, 1 reply; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-26 20:06 UTC (permalink / raw To: gentoo-dev Part of: https://github.com/gentoo/gentoo/pull/37292 This series builds on the previous patch: "kernel-build.eclass: identify dist-kernels, and warn users" Effectively, the change amounts to harmonizing the way ebuilds/eclasses using "dist-kernel_reinstall_initramfs" re-install the dist-kernel with how kernel-install.eclass installs the dist-kernel. Specifically in the area's of a) checking mounting status of /boot and b) handeling failure in /sbin/installkernel. This addresses an annoying issue new users run into where linux-firmware and intel-microcode packages are too strict in enforcing mounted /boot. To achieve this: - Error handling and mount-boot checking is moved from kernel-install.eclass to dist-kerel-utils.eclass - In the above we run into the problem that mount-boot.eclass exports pkg_pretend and pkg_{pre,post}{inst,rm}. Whereas dist-kernel-utils exports nothing. To resolved the problem the bulk of mount-boot.eclass is moved into a new "inherit-safe" mount-boot-utils.eclass, which in turn is inherited by mount-boot.eclass for backwards compatibility. - The new mount-boot-utils.eclass is adjusted to check not only for mounted /boot, but also for a mounted EFI System Partition on UEFI systems. - linux-mod-r1.eclass is adjusted to perform the mount-boot check early for packages that install modules into the initramfs (currently only zfs-kmod). We use pkg_setup instead of the usual pkg_pretend to avoid exporting a new phase. The check is nonfatal, i.e. only informative, the same way it is when installing the kernel (via kernel-install.eclass) - linux-firmware and intel-microcode ebuilds are adjusted to be less strict about mounted /boot in the USE=dist-kernel case. This mirrors how kernel (re-)installation works in kernel-install.eclass/linux-mod-r1.eclass, i.e. nonfatal informative warning early, and only hard fail in pkg_postinst with informative message on how users can trigger kernel re-installation manually. ^ permalink raw reply [flat|nested] 13+ messages in thread
* [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass 2024-06-26 20:06 ` [gentoo-dev] [PATCH 0/5] mount-boot.eclass: revises /boot checking for dist-kernels, add checks for ESP Andrew Nowa Ammerlaan @ 2024-06-26 20:06 ` Andrew Nowa Ammerlaan 2024-06-26 20:07 ` [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass Andrew Nowa Ammerlaan 2024-06-27 4:00 ` [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass Ulrich Mueller 0 siblings, 2 replies; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-26 20:06 UTC (permalink / raw To: gentoo-dev From 53f844361df57d480480b5e0ab0f35d2788ebf6a Mon Sep 17 00:00:00 2001 From: Andrew Ammerlaan <andrewammerlaan@gentoo.org> Date: Tue, 25 Jun 2024 15:08:49 +0200 Subject: [PATCH] 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. Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org> --- eclass/mount-boot-utils.eclass | 109 +++++++++++++++++++++++++++++++++ eclass/mount-boot.eclass | 81 +++--------------------- 2 files changed, 118 insertions(+), 72 deletions(-) create mode 100644 eclass/mount-boot-utils.eclass diff --git a/eclass/mount-boot-utils.eclass b/eclass/mount-boot-utils.eclass new file mode 100644 index 0000000000000..06ea2254b0013 --- /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 +# @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 + 6|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 [[ ${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 +} diff --git a/eclass/mount-boot.eclass b/eclass/mount-boot.eclass index 73beb9adea670..f4626ccb97a9c 100644 --- a/eclass/mount-boot.eclass +++ b/eclass/mount-boot.eclass @@ -1,4 +1,4 @@ -# Copyright 1999-2023 Gentoo Authors +# Copyright 1999-2024 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: mount-boot.eclass @@ -7,84 +7,21 @@ # @SUPPORTED_EAPIS: 6 7 8 # @BLURB: functions for packages that install files into /boot # @DESCRIPTION: -# This eclass is really only useful for bootloaders. +# This eclass is really only useful for bootloaders and kernel installation. # -# If the live system has a separate /boot partition 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 isn't a separate partition. +# 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 exports the functions provided by mount-boot-utils.eclass to +# the pkg_pretend and pkg_{pre,post}{inst,rm} phases. case ${EAPI} in 6|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 [[ ${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 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 - - # note that /dev/BOOT is in the Gentoo default /etc/fstab file - local fstabstate=$(awk '!/^[[:blank:]]*#|^\/dev\/BOOT/ && $2 == "/boot" \ - { print 1; exit }' /etc/fstab || die "awk failed") - - if [[ -z ${fstabstate} ]] ; then - einfo "Assuming you do not have a separate /boot partition." - return 0 - fi - - local procstate=$(awk '$2 == "/boot" { 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 boot partition is not mounted at /boot." - eerror "Please mount it and retry." - die -n "/boot not mounted" - return 1 - fi - - if [[ ${procstate} == ro ]] ; then - eerror "Your boot partition, detected as being mounted at /boot," \ - "is read-only." - eerror "Please remount it as read-write and retry." - die -n "/boot mounted read-only" - return 2 - fi - - einfo "Your boot partition was detected as being mounted at /boot." - einfo "Files will be installed there for ${PN} to function correctly." - return 0 -} +inherit mount-boot-utils mount-boot_pkg_pretend() { mount-boot_check_status ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass 2024-06-26 20:06 ` [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass Andrew Nowa Ammerlaan @ 2024-06-26 20:07 ` Andrew Nowa Ammerlaan 2024-06-26 20:08 ` [gentoo-dev] [PATCH 3/5] linux-mod-r1.eclass: check /boot if we are re-installing, dist-kernel Andrew Nowa Ammerlaan 2024-06-27 4:07 ` [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass Ulrich Mueller 2024-06-27 4:00 ` [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass Ulrich Mueller 1 sibling, 2 replies; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-26 20:07 UTC (permalink / raw To: gentoo-dev From c4c5ef732670f8b23f20b1215af49cdceacd28a3 Mon Sep 17 00:00:00 2001 From: Andrew Ammerlaan <andrewammerlaan@gentoo.org> Date: Tue, 25 Jun 2024 16:12:39 +0200 Subject: [PATCH] kernel-install.eclass: move mount-boot check to dist-kernel-utils.eclass ebuilds and eclasses using dist-kernel_reinstall_initramfs should also have the check for mounted /boot and ESP. We can do this safely via mount-boot-utils.eclass which does not export any phases. Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org> --- eclass/dist-kernel-utils.eclass | 41 +++++++++++++++++++++++++++----- eclass/kernel-install.eclass | 42 +++++++-------------------------- 2 files changed, 43 insertions(+), 40 deletions(-) diff --git a/eclass/dist-kernel-utils.eclass b/eclass/dist-kernel-utils.eclass index 13137f8c863c8..b357cfe6d228c 100644 --- a/eclass/dist-kernel-utils.eclass +++ b/eclass/dist-kernel-utils.eclass @@ -26,7 +26,7 @@ case ${EAPI} in *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac -inherit toolchain-funcs +inherit mount-boot-utils toolchain-funcs # @FUNCTION: dist-kernel_get_image_path # @DESCRIPTION: @@ -79,11 +79,40 @@ dist-kernel_install_kernel() { local image=${2} local map=${3} - ebegin "Installing the kernel via installkernel" - # note: .config is taken relatively to System.map; - # initrd relatively to bzImage - ARCH=$(tc-arch-kernel) installkernel "${version}" "${image}" "${map}" - eend ${?} || die -n "Installing the kernel failed" + local success= + # not an actual loop but allows error handling with 'break' + while :; do + nonfatal mount-boot_check_status || break + + ebegin "Installing the kernel via installkernel" + # note: .config is taken relatively to System.map; + # initrd relatively to bzImage + ARCH=$(tc-arch-kernel) installkernel "${version}" "${image}" "${map}" || break + eend ${?} || die -n "Installing the kernel failed" + + success=1 + break + done + + if [[ ! ${success} ]]; then + # Try to read dist-kernel identifier to more accurately instruct users + local kernel + local k_id_file=${image%$(dist-kernel_get_image_path)}/dist-kernel + if [[ -f ${k_id_file} ]]; then + kernel=\'\=$(<${k_id_file})\' + else + # Fallback string if identifier is not found + kernel="<name of your kernel pakcage>:<kernel version>" + fi + + eerror + eerror "The kernel was not deployed successfully. Inspect the failure" + eerror "in the logs above and once you resolve the problems please" + eerror "run the equivalent of the following command to try again:" + eerror + eerror " emerge --config ${kernel}" + die "Kernel install failed, please fix the problems and run emerge --config" + fi } # @FUNCTION: dist-kernel_reinstall_initramfs diff --git a/eclass/kernel-install.eclass b/eclass/kernel-install.eclass index f512d815fe098..a572597bc6fa3 100644 --- a/eclass/kernel-install.eclass +++ b/eclass/kernel-install.eclass @@ -18,8 +18,6 @@ # location and System.map. # # The eclass exports src_test, pkg_postinst and pkg_postrm. -# Additionally, the inherited mount-boot eclass exports pkg_pretend. -# It also stubs out pkg_preinst and pkg_prerm defined by mount-boot. # @ECLASS_VARIABLE: KERNEL_IUSE_GENERIC_UKI # @PRE_INHERIT @@ -50,7 +48,7 @@ case ${EAPI} in *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac -inherit dist-kernel-utils mount-boot multiprocessing toolchain-funcs +inherit dist-kernel-utils mount-boot-utils multiprocessing toolchain-funcs SLOT="${PV}" IUSE="+initramfs test" @@ -526,6 +524,10 @@ kernel-install_test() { kernel-install_pkg_pretend() { debug-print-function ${FUNCNAME} "${@}" + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + if ! has_version -d sys-kernel/linux-firmware; then ewarn "sys-kernel/linux-firmware not found installed on your system." ewarn "This package provides various firmware files that may be needed" @@ -665,27 +667,8 @@ kernel-install_install_all() { fi fi - local success= - # not an actual loop but allows error handling with 'break' - while :; do - nonfatal mount-boot_check_status || break - - nonfatal dist-kernel_install_kernel "${module_ver}" \ - "${kernel_dir}/${image_path}" "${kernel_dir}/System.map" || break - - success=1 - break - done - - if [[ ! ${success} ]]; then - eerror - eerror "The kernel files were copied to disk successfully but the kernel" - eerror "was not deployed successfully. Once you resolve the problems," - eerror "please run the equivalent of the following command to try again:" - eerror - eerror " emerge --config ${CATEGORY}/${PN}:${SLOT}" - die "Kernel install failed, please fix the problems and run emerge --config ${CATEGORY}/${PN}:${SLOT}" - fi + dist-kernel_install_kernel "${module_ver}" "${kernel_dir}/${image_path}" \ + "${kernel_dir}/System.map" } # @FUNCTION: kernel-install_pkg_postinst @@ -718,15 +701,6 @@ kernel-install_pkg_postinst() { fi } -# @FUNCTION: kernel-install_pkg_prerm -# @DESCRIPTION: -# Stub out mount-boot.eclass. -kernel-install_pkg_prerm() { - debug-print-function ${FUNCNAME} "${@}" - - # (no-op) -} - # @FUNCTION: kernel-install_pkg_postrm # @DESCRIPTION: # Clean up the generated initramfs from the removed kernel directory. @@ -774,5 +748,5 @@ kernel-install_compress_modules() { fi -EXPORT_FUNCTIONS src_test pkg_preinst pkg_postinst pkg_prerm pkg_postrm +EXPORT_FUNCTIONS src_test pkg_preinst pkg_postinst pkg_postrm EXPORT_FUNCTIONS pkg_config pkg_pretend ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [gentoo-dev] [PATCH 3/5] linux-mod-r1.eclass: check /boot if we are re-installing, dist-kernel 2024-06-26 20:07 ` [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass Andrew Nowa Ammerlaan @ 2024-06-26 20:08 ` Andrew Nowa Ammerlaan 2024-06-26 20:08 ` [gentoo-dev] [PATCH 4/5] sys-kernel/linux-firmware: complain less when /boot is not, mounted Andrew Nowa Ammerlaan 2024-06-27 4:07 ` [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass Ulrich Mueller 1 sibling, 1 reply; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-26 20:08 UTC (permalink / raw To: gentoo-dev From 3c5267472fb72223336063007173157a5de3f0cc Mon Sep 17 00:00:00 2001 From: Andrew Ammerlaan <andrewammerlaan@gentoo.org> Date: Tue, 25 Jun 2024 16:15:05 +0200 Subject: [PATCH] linux-mod-r1.eclass: check /boot if we are re-installing dist-kernel Previous commit already adds the check when we call dist-kernel_reinstall_initramfs, but lets do it a bit earlier as well. As in dist-kernel-utils.eclass, make the check nonfatal because when users notice the problem they can correct it and manually re-install the kernel via emerge --config ... We don't have a pkg_pretend phase in this eclass, so we use the pkg_setup phase instead to avoid introducing a new phase here. Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org> --- eclass/linux-mod-r1.eclass | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/eclass/linux-mod-r1.eclass b/eclass/linux-mod-r1.eclass index 43c5a7d7b140b..9911a6ddee123 100644 --- a/eclass/linux-mod-r1.eclass +++ b/eclass/linux-mod-r1.eclass @@ -132,6 +132,7 @@ IDEPEND=" " if [[ ${MODULES_INITRAMFS_IUSE} ]]; then + inherit mount-boot-utils IUSE+=" ${MODULES_INITRAMFS_IUSE}" IDEPEND+=" ${MODULES_INITRAMFS_IUSE#+}? ( @@ -328,9 +329,19 @@ fi # 3. perform various sanity checks to fail early on issues linux-mod-r1_pkg_setup() { debug-print-function ${FUNCNAME[0]} "${@}" - [[ ${MERGE_TYPE} != binary ]] || return 0 _MODULES_GLOBAL[ran:pkg_setup]=1 _modules_check_function ${#} 0 0 || return 0 + + if [[ -z ${ROOT} && ${MODULES_INITRAMFS_IUSE} ]] && + use dist-kernel && use ${MODULES_INITRAMFS_IUSE#+} + then + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + fi + + [[ ${MERGE_TYPE} != binary ]] || return 0 + _modules_check_migration _modules_prepare_kernel ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [gentoo-dev] [PATCH 4/5] sys-kernel/linux-firmware: complain less when /boot is not, mounted 2024-06-26 20:08 ` [gentoo-dev] [PATCH 3/5] linux-mod-r1.eclass: check /boot if we are re-installing, dist-kernel Andrew Nowa Ammerlaan @ 2024-06-26 20:08 ` Andrew Nowa Ammerlaan 2024-06-26 20:09 ` [gentoo-dev] [PATCH 5/5] sys-firmware/intel-microcode: " Andrew Nowa Ammerlaan 0 siblings, 1 reply; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-26 20:08 UTC (permalink / raw To: gentoo-dev From 45a34aecafa64a666976e3d3d7944f8c8ff1e058 Mon Sep 17 00:00:00 2001 From: Andrew Ammerlaan <andrewammerlaan@gentoo.org> Date: Tue, 25 Jun 2024 16:32:42 +0200 Subject: [PATCH] sys-kernel/linux-firmware: complain less when /boot is not mounted when using dist-kernel we can correct the problem and then emerge --config ... Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org> --- .../linux-firmware-20240410.ebuild | 21 +++++++++++++------ .../linux-firmware-20240513.ebuild | 21 +++++++++++++------ .../linux-firmware-20240610.ebuild | 21 +++++++++++++------ .../linux-firmware-99999999.ebuild | 21 +++++++++++++------ 4 files changed, 60 insertions(+), 24 deletions(-) diff --git a/sys-kernel/linux-firmware/linux-firmware-20240410.ebuild b/sys-kernel/linux-firmware/linux-firmware-20240410.ebuild index 1bb6954d00c88..b8bbed17f1a6d 100644 --- a/sys-kernel/linux-firmware/linux-firmware-20240410.ebuild +++ b/sys-kernel/linux-firmware/linux-firmware-20240410.ebuild @@ -69,7 +69,15 @@ QA_PREBUILT="*" PATCHES=( "${FILESDIR}"/${PN}-copy-firmware-r4.patch ) pkg_pretend() { - use initramfs && mount-boot_pkg_pretend + if use initramfs; then + if [[ -z ${ROOT} ]] && use dist-kernel; then + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + else + mount-boot_pkg_pretend + fi + fi } pkg_setup() { @@ -379,7 +387,7 @@ pkg_preinst() { fi # Make sure /boot is available if needed. - use initramfs && mount-boot_pkg_preinst + use initramfs && ! use dist-kernel && mount-boot_pkg_preinst } pkg_postinst() { @@ -397,21 +405,22 @@ pkg_postinst() { fi done - # Don't forget to umount /boot if it was previously mounted by us. if use initramfs; then if [[ -z ${ROOT} ]] && use dist-kernel; then dist-kernel_reinstall_initramfs "${KV_DIR}" "${KV_FULL}" + else + # Don't forget to umount /boot if it was previously mounted by us. + mount-boot_pkg_postinst fi - mount-boot_pkg_postinst fi } pkg_prerm() { # Make sure /boot is mounted so that we can remove /boot/amd-uc.img! - use initramfs && mount-boot_pkg_prerm + use initramfs && ! use dist-kernel && mount-boot_pkg_prerm } pkg_postrm() { # Don't forget to umount /boot if it was previously mounted by us. - use initramfs && mount-boot_pkg_postrm + use initramfs && ! use dist-kernel && mount-boot_pkg_postrm } diff --git a/sys-kernel/linux-firmware/linux-firmware-20240513.ebuild b/sys-kernel/linux-firmware/linux-firmware-20240513.ebuild index 1bb6954d00c88..b8bbed17f1a6d 100644 --- a/sys-kernel/linux-firmware/linux-firmware-20240513.ebuild +++ b/sys-kernel/linux-firmware/linux-firmware-20240513.ebuild @@ -69,7 +69,15 @@ QA_PREBUILT="*" PATCHES=( "${FILESDIR}"/${PN}-copy-firmware-r4.patch ) pkg_pretend() { - use initramfs && mount-boot_pkg_pretend + if use initramfs; then + if [[ -z ${ROOT} ]] && use dist-kernel; then + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + else + mount-boot_pkg_pretend + fi + fi } pkg_setup() { @@ -379,7 +387,7 @@ pkg_preinst() { fi # Make sure /boot is available if needed. - use initramfs && mount-boot_pkg_preinst + use initramfs && ! use dist-kernel && mount-boot_pkg_preinst } pkg_postinst() { @@ -397,21 +405,22 @@ pkg_postinst() { fi done - # Don't forget to umount /boot if it was previously mounted by us. if use initramfs; then if [[ -z ${ROOT} ]] && use dist-kernel; then dist-kernel_reinstall_initramfs "${KV_DIR}" "${KV_FULL}" + else + # Don't forget to umount /boot if it was previously mounted by us. + mount-boot_pkg_postinst fi - mount-boot_pkg_postinst fi } pkg_prerm() { # Make sure /boot is mounted so that we can remove /boot/amd-uc.img! - use initramfs && mount-boot_pkg_prerm + use initramfs && ! use dist-kernel && mount-boot_pkg_prerm } pkg_postrm() { # Don't forget to umount /boot if it was previously mounted by us. - use initramfs && mount-boot_pkg_postrm + use initramfs && ! use dist-kernel && mount-boot_pkg_postrm } diff --git a/sys-kernel/linux-firmware/linux-firmware-20240610.ebuild b/sys-kernel/linux-firmware/linux-firmware-20240610.ebuild index 1bb6954d00c88..b8bbed17f1a6d 100644 --- a/sys-kernel/linux-firmware/linux-firmware-20240610.ebuild +++ b/sys-kernel/linux-firmware/linux-firmware-20240610.ebuild @@ -69,7 +69,15 @@ QA_PREBUILT="*" PATCHES=( "${FILESDIR}"/${PN}-copy-firmware-r4.patch ) pkg_pretend() { - use initramfs && mount-boot_pkg_pretend + if use initramfs; then + if [[ -z ${ROOT} ]] && use dist-kernel; then + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + else + mount-boot_pkg_pretend + fi + fi } pkg_setup() { @@ -379,7 +387,7 @@ pkg_preinst() { fi # Make sure /boot is available if needed. - use initramfs && mount-boot_pkg_preinst + use initramfs && ! use dist-kernel && mount-boot_pkg_preinst } pkg_postinst() { @@ -397,21 +405,22 @@ pkg_postinst() { fi done - # Don't forget to umount /boot if it was previously mounted by us. if use initramfs; then if [[ -z ${ROOT} ]] && use dist-kernel; then dist-kernel_reinstall_initramfs "${KV_DIR}" "${KV_FULL}" + else + # Don't forget to umount /boot if it was previously mounted by us. + mount-boot_pkg_postinst fi - mount-boot_pkg_postinst fi } pkg_prerm() { # Make sure /boot is mounted so that we can remove /boot/amd-uc.img! - use initramfs && mount-boot_pkg_prerm + use initramfs && ! use dist-kernel && mount-boot_pkg_prerm } pkg_postrm() { # Don't forget to umount /boot if it was previously mounted by us. - use initramfs && mount-boot_pkg_postrm + use initramfs && ! use dist-kernel && mount-boot_pkg_postrm } diff --git a/sys-kernel/linux-firmware/linux-firmware-99999999.ebuild b/sys-kernel/linux-firmware/linux-firmware-99999999.ebuild index dc02d051d7ea4..88c5398099a38 100644 --- a/sys-kernel/linux-firmware/linux-firmware-99999999.ebuild +++ b/sys-kernel/linux-firmware/linux-firmware-99999999.ebuild @@ -84,7 +84,15 @@ pkg_setup() { } pkg_pretend() { - use initramfs && mount-boot_pkg_pretend + if use initramfs; then + if [[ -z ${ROOT} ]] && use dist-kernel; then + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + else + mount-boot_pkg_pretend + fi + fi } src_unpack() { @@ -379,7 +387,7 @@ pkg_preinst() { fi # Make sure /boot is available if needed. - use initramfs && mount-boot_pkg_preinst + use initramfs && ! use dist-kernel && mount-boot_pkg_preinst } pkg_postinst() { @@ -397,21 +405,22 @@ pkg_postinst() { fi done - # Don't forget to umount /boot if it was previously mounted by us. if use initramfs; then if [[ -z ${ROOT} ]] && use dist-kernel; then dist-kernel_reinstall_initramfs "${KV_DIR}" "${KV_FULL}" + else + # Don't forget to umount /boot if it was previously mounted by us. + mount-boot_pkg_postinst fi - mount-boot_pkg_postinst fi } pkg_prerm() { # Make sure /boot is mounted so that we can remove /boot/amd-uc.img! - use initramfs && mount-boot_pkg_prerm + use initramfs && ! use dist-kernel && mount-boot_pkg_prerm } pkg_postrm() { # Don't forget to umount /boot if it was previously mounted by us. - use initramfs && mount-boot_pkg_postrm + use initramfs && ! use dist-kernel && mount-boot_pkg_postrm } ^ permalink raw reply related [flat|nested] 13+ messages in thread
* [gentoo-dev] [PATCH 5/5] sys-firmware/intel-microcode: complain less when /boot is not, mounted 2024-06-26 20:08 ` [gentoo-dev] [PATCH 4/5] sys-kernel/linux-firmware: complain less when /boot is not, mounted Andrew Nowa Ammerlaan @ 2024-06-26 20:09 ` Andrew Nowa Ammerlaan 0 siblings, 0 replies; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-26 20:09 UTC (permalink / raw To: gentoo-dev From c5cf62a41038e344312d8758a4ba232fcd726053 Mon Sep 17 00:00:00 2001 From: Andrew Ammerlaan <andrewammerlaan@gentoo.org> Date: Tue, 25 Jun 2024 16:36:46 +0200 Subject: [PATCH] sys-firmware/intel-microcode: complain less when /boot is not mounted When using dist-kernel users can correct the problem and then emerge --config ... Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org> --- .../intel-microcode-20240312_p20240312.ebuild | 21 +++++++++++++------ .../intel-microcode-20240514_p20240514.ebuild | 21 +++++++++++++------ .../intel-microcode-20240531_p20240526.ebuild | 21 +++++++++++++------ 3 files changed, 45 insertions(+), 18 deletions(-) diff --git a/sys-firmware/intel-microcode/intel-microcode-20240312_p20240312.ebuild b/sys-firmware/intel-microcode/intel-microcode-20240312_p20240312.ebuild index 957da662f92e3..5e2d305fc9ed6 100644 --- a/sys-firmware/intel-microcode/intel-microcode-20240312_p20240312.ebuild +++ b/sys-firmware/intel-microcode/intel-microcode-20240312_p20240312.ebuild @@ -83,7 +83,15 @@ MICROCODE_SIGNATURES_DEFAULT="" # exclude specific CPU: MICROCODE_SIGNATURES="-s !0x00000686" pkg_pretend() { - use initramfs && mount-boot_pkg_pretend + if use initramfs; then + if [[ -z ${ROOT} ]] && use dist-kernel; then + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + else + mount-boot_pkg_pretend + fi + fi } src_prepare() { @@ -181,7 +189,7 @@ pkg_preinst() { fi # Make sure /boot is available if needed. - use initramfs && mount-boot_pkg_preinst + use initramfs && ! use dist-kernel && mount-boot_pkg_preinst local _initramfs_file="${ED}/boot/intel-uc.img" @@ -274,21 +282,22 @@ pkg_preinst() { pkg_prerm() { # Make sure /boot is mounted so that we can remove /boot/intel-uc.img! - use initramfs && mount-boot_pkg_prerm + use initramfs && ! use dist-kernel && mount-boot_pkg_prerm } pkg_postrm() { # Don't forget to umount /boot if it was previously mounted by us. - use initramfs && mount-boot_pkg_postrm + use initramfs && ! use dist-kernel && mount-boot_pkg_postrm } pkg_postinst() { - # Don't forget to umount /boot if it was previously mounted by us. if use initramfs; then if [[ -z ${ROOT} ]] && use dist-kernel; then dist-kernel_reinstall_initramfs "${KV_DIR}" "${KV_FULL}" + else + # Don't forget to umount /boot if it was previously mounted by us. + mount-boot_pkg_postinst fi - mount-boot_pkg_postinst fi # We cannot give detailed information if user is affected or not: diff --git a/sys-firmware/intel-microcode/intel-microcode-20240514_p20240514.ebuild b/sys-firmware/intel-microcode/intel-microcode-20240514_p20240514.ebuild index c33321a94497a..656f5a519b913 100644 --- a/sys-firmware/intel-microcode/intel-microcode-20240514_p20240514.ebuild +++ b/sys-firmware/intel-microcode/intel-microcode-20240514_p20240514.ebuild @@ -83,7 +83,15 @@ MICROCODE_SIGNATURES_DEFAULT="" # exclude specific CPU: MICROCODE_SIGNATURES="-s !0x00000686" pkg_pretend() { - use initramfs && mount-boot_pkg_pretend + if use initramfs; then + if [[ -z ${ROOT} ]] && use dist-kernel; then + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + else + mount-boot_pkg_pretend + fi + fi } src_prepare() { @@ -181,7 +189,7 @@ pkg_preinst() { fi # Make sure /boot is available if needed. - use initramfs && mount-boot_pkg_preinst + use initramfs && ! use dist-kernel && mount-boot_pkg_preinst local _initramfs_file="${ED}/boot/intel-uc.img" @@ -274,21 +282,22 @@ pkg_preinst() { pkg_prerm() { # Make sure /boot is mounted so that we can remove /boot/intel-uc.img! - use initramfs && mount-boot_pkg_prerm + use initramfs && ! use dist-kernel && mount-boot_pkg_prerm } pkg_postrm() { # Don't forget to umount /boot if it was previously mounted by us. - use initramfs && mount-boot_pkg_postrm + use initramfs && ! use dist-kernel && mount-boot_pkg_postrm } pkg_postinst() { - # Don't forget to umount /boot if it was previously mounted by us. if use initramfs; then if [[ -z ${ROOT} ]] && use dist-kernel; then dist-kernel_reinstall_initramfs "${KV_DIR}" "${KV_FULL}" + else + # Don't forget to umount /boot if it was previously mounted by us. + mount-boot_pkg_postinst fi - mount-boot_pkg_postinst fi # We cannot give detailed information if user is affected or not: diff --git a/sys-firmware/intel-microcode/intel-microcode-20240531_p20240526.ebuild b/sys-firmware/intel-microcode/intel-microcode-20240531_p20240526.ebuild index c33321a94497a..656f5a519b913 100644 --- a/sys-firmware/intel-microcode/intel-microcode-20240531_p20240526.ebuild +++ b/sys-firmware/intel-microcode/intel-microcode-20240531_p20240526.ebuild @@ -83,7 +83,15 @@ MICROCODE_SIGNATURES_DEFAULT="" # exclude specific CPU: MICROCODE_SIGNATURES="-s !0x00000686" pkg_pretend() { - use initramfs && mount-boot_pkg_pretend + if use initramfs; then + if [[ -z ${ROOT} ]] && use dist-kernel; then + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + else + mount-boot_pkg_pretend + fi + fi } src_prepare() { @@ -181,7 +189,7 @@ pkg_preinst() { fi # Make sure /boot is available if needed. - use initramfs && mount-boot_pkg_preinst + use initramfs && ! use dist-kernel && mount-boot_pkg_preinst local _initramfs_file="${ED}/boot/intel-uc.img" @@ -274,21 +282,22 @@ pkg_preinst() { pkg_prerm() { # Make sure /boot is mounted so that we can remove /boot/intel-uc.img! - use initramfs && mount-boot_pkg_prerm + use initramfs && ! use dist-kernel && mount-boot_pkg_prerm } pkg_postrm() { # Don't forget to umount /boot if it was previously mounted by us. - use initramfs && mount-boot_pkg_postrm + use initramfs && ! use dist-kernel && mount-boot_pkg_postrm } pkg_postinst() { - # Don't forget to umount /boot if it was previously mounted by us. if use initramfs; then if [[ -z ${ROOT} ]] && use dist-kernel; then dist-kernel_reinstall_initramfs "${KV_DIR}" "${KV_FULL}" + else + # Don't forget to umount /boot if it was previously mounted by us. + mount-boot_pkg_postinst fi - mount-boot_pkg_postinst fi # We cannot give detailed information if user is affected or not: ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass 2024-06-26 20:07 ` [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass Andrew Nowa Ammerlaan 2024-06-26 20:08 ` [gentoo-dev] [PATCH 3/5] linux-mod-r1.eclass: check /boot if we are re-installing, dist-kernel Andrew Nowa Ammerlaan @ 2024-06-27 4:07 ` Ulrich Mueller 2024-06-27 14:26 ` [gentoo-dev] [PATCH 2/5 v2] " Andrew Nowa Ammerlaan 1 sibling, 1 reply; 13+ messages in thread From: Ulrich Mueller @ 2024-06-27 4:07 UTC (permalink / raw To: Andrew Nowa Ammerlaan; +Cc: gentoo-dev [-- Attachment #1: Type: text/plain, Size: 5290 bytes --] >>>>> On Wed, 26 Jun 2024, Andrew Nowa Ammerlaan wrote: > --- a/eclass/dist-kernel-utils.eclass > +++ b/eclass/dist-kernel-utils.eclass > @@ -26,7 +26,7 @@ case ${EAPI} in > *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; > esac > > -inherit toolchain-funcs > +inherit mount-boot-utils toolchain-funcs > > # @FUNCTION: dist-kernel_get_image_path > # @DESCRIPTION: > @@ -79,11 +79,40 @@ dist-kernel_install_kernel() { > local image=${2} > local map=${3} > > - ebegin "Installing the kernel via installkernel" > - # note: .config is taken relatively to System.map; > - # initrd relatively to bzImage > - ARCH=$(tc-arch-kernel) installkernel "${version}" "${image}" "${map}" > - eend ${?} || die -n "Installing the kernel failed" > + local success= > + # not an actual loop but allows error handling with 'break' > + while :; do IMHO "while true" would be better readable. > + nonfatal mount-boot_check_status || break > + > + ebegin "Installing the kernel via installkernel" > + # note: .config is taken relatively to System.map; > + # initrd relatively to bzImage > + ARCH=$(tc-arch-kernel) installkernel "${version}" > "${image}" "${map}" || break > + eend ${?} || die -n "Installing the kernel failed" > + > + success=1 > + break > + done > + > + if [[ ! ${success} ]]; then > + # Try to read dist-kernel identifier to more accurately instruct users > + local kernel > + local k_id_file=${image%$(dist-kernel_get_image_path)}/dist-kernel > + if [[ -f ${k_id_file} ]]; then > + kernel=\'\=$(<${k_id_file})\' > + else > + # Fallback string if identifier is not found > + kernel="<name of your kernel pakcage>:<kernel version>" > + fi > + > + eerror > + eerror "The kernel was not deployed successfully. Inspect the failure" > + eerror "in the logs above and once you resolve the problems please" > + eerror "run the equivalent of the following command to try again:" > + eerror > + eerror " emerge --config ${kernel}" > + die "Kernel install failed, please fix the problems > and run emerge --config" > + fi > } > > # @FUNCTION: dist-kernel_reinstall_initramfs > diff --git a/eclass/kernel-install.eclass b/eclass/kernel-install.eclass > index f512d815fe098..a572597bc6fa3 100644 > --- a/eclass/kernel-install.eclass > +++ b/eclass/kernel-install.eclass > @@ -18,8 +18,6 @@ > # location and System.map. > # > # The eclass exports src_test, pkg_postinst and pkg_postrm. > -# Additionally, the inherited mount-boot eclass exports pkg_pretend. > -# It also stubs out pkg_preinst and pkg_prerm defined by mount-boot. > > # @ECLASS_VARIABLE: KERNEL_IUSE_GENERIC_UKI > # @PRE_INHERIT > @@ -50,7 +48,7 @@ case ${EAPI} in > *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; > esac > > -inherit dist-kernel-utils mount-boot multiprocessing toolchain-funcs > +inherit dist-kernel-utils mount-boot-utils multiprocessing toolchain-funcs > > SLOT="${PV}" > IUSE="+initramfs test" > @@ -526,6 +524,10 @@ kernel-install_test() { > kernel-install_pkg_pretend() { > debug-print-function ${FUNCNAME} "${@}" > > + # Check, but don't die because we can fix the problem and then > + # emerge --config ... to re-run installation. > + nonfatal mount-boot_check_status > + > if ! has_version -d sys-kernel/linux-firmware; then > ewarn "sys-kernel/linux-firmware not found installed on your system." > ewarn "This package provides various firmware files that may be needed" > @@ -665,27 +667,8 @@ kernel-install_install_all() { > fi > fi > > - local success= > - # not an actual loop but allows error handling with 'break' > - while :; do > - nonfatal mount-boot_check_status || break > - > - nonfatal dist-kernel_install_kernel "${module_ver}" \ > - "${kernel_dir}/${image_path}" "${kernel_dir}/System.map" || break > - > - success=1 > - break > - done > - > - if [[ ! ${success} ]]; then > - eerror > - eerror "The kernel files were copied to disk successfully but the kernel" > - eerror "was not deployed successfully. Once you resolve the problems," > - eerror "please run the equivalent of the following command to try again:" > - eerror > - eerror " emerge --config ${CATEGORY}/${PN}:${SLOT}" > - die "Kernel install failed, please fix the problems > and run emerge --config ${CATEGORY}/${PN}:${SLOT}" > - fi > + dist-kernel_install_kernel "${module_ver}" "${kernel_dir}/${image_path}" \ > + "${kernel_dir}/System.map" > } > > # @FUNCTION: kernel-install_pkg_postinst > @@ -718,15 +701,6 @@ kernel-install_pkg_postinst() { > fi > } > > -# @FUNCTION: kernel-install_pkg_prerm > -# @DESCRIPTION: > -# Stub out mount-boot.eclass. > -kernel-install_pkg_prerm() { > - debug-print-function ${FUNCNAME} "${@}" > - > - # (no-op) > -} > - > # @FUNCTION: kernel-install_pkg_postrm > # @DESCRIPTION: > # Clean up the generated initramfs from the removed kernel directory. > @@ -774,5 +748,5 @@ kernel-install_compress_modules() { > > fi > > -EXPORT_FUNCTIONS src_test pkg_preinst pkg_postinst pkg_prerm pkg_postrm > +EXPORT_FUNCTIONS src_test pkg_preinst pkg_postinst pkg_postrm > EXPORT_FUNCTIONS pkg_config pkg_pretend [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 507 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [gentoo-dev] [PATCH 2/5 v2] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass 2024-06-27 4:07 ` [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass Ulrich Mueller @ 2024-06-27 14:26 ` Andrew Nowa Ammerlaan 0 siblings, 0 replies; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-27 14:26 UTC (permalink / raw To: Ulrich Mueller; +Cc: gentoo-dev On 27/06/2024 06:07, Ulrich Mueller wrote: > IMHO "while true" would be better readable. Adjusted, here's v2: From 422fcc5fb53c3f2adf25256fb7d18a65e4036496 Mon Sep 17 00:00:00 2001 From: Andrew Ammerlaan <andrewammerlaan@gentoo.org> Date: Tue, 25 Jun 2024 16:12:39 +0200 Subject: [PATCH] kernel-install.eclass: move mount-boot check to dist-kernel-utils.eclass ebuilds and eclasses using dist-kernel_reinstall_initramfs should also have the check for mounted /boot and ESP. We can do this safely via mount-boot-utils.eclass which does not export any phases. Signed-off-by: Andrew Ammerlaan <andrewammerlaan@gentoo.org> --- eclass/dist-kernel-utils.eclass | 39 ++++++++++++++++++++++++----- eclass/kernel-install.eclass | 44 +++++++-------------------------- 2 files changed, 42 insertions(+), 41 deletions(-) diff --git a/eclass/dist-kernel-utils.eclass b/eclass/dist-kernel-utils.eclass index 13137f8c863c8..4bc3fab44aae9 100644 --- a/eclass/dist-kernel-utils.eclass +++ b/eclass/dist-kernel-utils.eclass @@ -26,7 +26,7 @@ case ${EAPI} in *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac -inherit toolchain-funcs +inherit mount-boot-utils toolchain-funcs # @FUNCTION: dist-kernel_get_image_path # @DESCRIPTION: @@ -79,11 +79,38 @@ dist-kernel_install_kernel() { local image=${2} local map=${3} - ebegin "Installing the kernel via installkernel" - # note: .config is taken relatively to System.map; - # initrd relatively to bzImage - ARCH=$(tc-arch-kernel) installkernel "${version}" "${image}" "${map}" - eend ${?} || die -n "Installing the kernel failed" + local success= + # not an actual loop but allows error handling with 'break' + while true; do + nonfatal mount-boot_check_status || break + + ebegin "Installing the kernel via installkernel" + # note: .config is taken relatively to System.map; + # initrd relatively to bzImage + ARCH=$(tc-arch-kernel) installkernel "${version}" "${image}" "${map}" || break + eend ${?} || die -n "Installing the kernel failed" + + success=1 + break + done + + if [[ ! ${success} ]]; then + # Fallback string, if the identifier file is not found + local kernel="<name of your kernel pakcage>:<kernel version>" + # Try to read dist-kernel identifier to more accurately instruct users + local k_id_file=${image%$(dist-kernel_get_image_path)}/dist-kernel + if [[ -f ${k_id_file} ]]; then + kernel=\'\=$(<${k_id_file})\' + fi + + eerror + eerror "The kernel was not deployed successfully. Inspect the failure" + eerror "in the logs above and once you resolve the problems please" + eerror "run the equivalent of the following command to try again:" + eerror + eerror " emerge --config ${kernel}" + die "Kernel install failed, please fix the problems and run emerge --config" + fi } # @FUNCTION: dist-kernel_reinstall_initramfs diff --git a/eclass/kernel-install.eclass b/eclass/kernel-install.eclass index f512d815fe098..77570a905ce11 100644 --- a/eclass/kernel-install.eclass +++ b/eclass/kernel-install.eclass @@ -17,9 +17,7 @@ # /usr/src/linux-${PV} containing the kernel image in its standard # location and System.map. # -# The eclass exports src_test, pkg_postinst and pkg_postrm. -# Additionally, the inherited mount-boot eclass exports pkg_pretend. -# It also stubs out pkg_preinst and pkg_prerm defined by mount-boot. +# The eclass exports src_test, pkg_preinst, pkg_postinst and pkg_postrm. # @ECLASS_VARIABLE: KERNEL_IUSE_GENERIC_UKI # @PRE_INHERIT @@ -50,7 +48,7 @@ case ${EAPI} in *) die "${ECLASS}: EAPI ${EAPI:-0} not supported" ;; esac -inherit dist-kernel-utils mount-boot multiprocessing toolchain-funcs +inherit dist-kernel-utils mount-boot-utils multiprocessing toolchain-funcs SLOT="${PV}" IUSE="+initramfs test" @@ -526,6 +524,10 @@ kernel-install_test() { kernel-install_pkg_pretend() { debug-print-function ${FUNCNAME} "${@}" + # Check, but don't die because we can fix the problem and then + # emerge --config ... to re-run installation. + nonfatal mount-boot_check_status + if ! has_version -d sys-kernel/linux-firmware; then ewarn "sys-kernel/linux-firmware not found installed on your system." ewarn "This package provides various firmware files that may be needed" @@ -665,27 +667,8 @@ kernel-install_install_all() { fi fi - local success= - # not an actual loop but allows error handling with 'break' - while :; do - nonfatal mount-boot_check_status || break - - nonfatal dist-kernel_install_kernel "${module_ver}" \ - "${kernel_dir}/${image_path}" "${kernel_dir}/System.map" || break - - success=1 - break - done - - if [[ ! ${success} ]]; then - eerror - eerror "The kernel files were copied to disk successfully but the kernel" - eerror "was not deployed successfully. Once you resolve the problems," - eerror "please run the equivalent of the following command to try again:" - eerror - eerror " emerge --config ${CATEGORY}/${PN}:${SLOT}" - die "Kernel install failed, please fix the problems and run emerge --config ${CATEGORY}/${PN}:${SLOT}" - fi + dist-kernel_install_kernel "${module_ver}" "${kernel_dir}/${image_path}" \ + "${kernel_dir}/System.map" } # @FUNCTION: kernel-install_pkg_postinst @@ -718,15 +701,6 @@ kernel-install_pkg_postinst() { fi } -# @FUNCTION: kernel-install_pkg_prerm -# @DESCRIPTION: -# Stub out mount-boot.eclass. -kernel-install_pkg_prerm() { - debug-print-function ${FUNCNAME} "${@}" - - # (no-op) -} - # @FUNCTION: kernel-install_pkg_postrm # @DESCRIPTION: # Clean up the generated initramfs from the removed kernel directory. @@ -774,5 +748,5 @@ kernel-install_compress_modules() { fi -EXPORT_FUNCTIONS src_test pkg_preinst pkg_postinst pkg_prerm pkg_postrm +EXPORT_FUNCTIONS src_test pkg_preinst pkg_postinst pkg_postrm EXPORT_FUNCTIONS pkg_config pkg_pretend ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass 2024-06-26 20:06 ` [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass Andrew Nowa Ammerlaan 2024-06-26 20:07 ` [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass Andrew Nowa Ammerlaan @ 2024-06-27 4:00 ` Ulrich Mueller 2024-06-27 14:24 ` [gentoo-dev] [PATCH 1/5 v2] " Andrew Nowa Ammerlaan 1 sibling, 1 reply; 13+ messages in thread From: Ulrich Mueller @ 2024-06-27 4:00 UTC (permalink / raw To: Andrew Nowa Ammerlaan; +Cc: gentoo-dev [-- Attachment #1: Type: text/plain, Size: 161 bytes --] >>>>> On Wed, 26 Jun 2024, Andrew Nowa Ammerlaan wrote: > +# @SUPPORTED_EAPIS: 6 7 8 AFAICS, no EAPI 6 ebuild inherits mount-boot, so EAPI 6 could be dropped? [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 507 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [gentoo-dev] [PATCH 1/5 v2] mount-boot.eclass: check for ESP as well as /boot, split, eclass 2024-06-27 4:00 ` [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass Ulrich Mueller @ 2024-06-27 14:24 ` Andrew Nowa Ammerlaan 2024-06-28 6:33 ` Ulrich Mueller 0 siblings, 1 reply; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-27 14:24 UTC (permalink / raw To: gentoo-dev On 27/06/2024 06:00, Ulrich Mueller wrote: > AFAICS, no EAPI 6 ebuild inherits mount-boot, so EAPI 6 could be > dropped? Yes, might as well drop that now. Here's v2: From 9f6e912237bf1f67b3bb5341e64449a6b02703bc Mon Sep 17 00:00:00 2001 From: Andrew Ammerlaan <andrewammerlaan@gentoo.org> Date: Tue, 25 Jun 2024 15:08:49 +0200 Subject: [PATCH] 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> --- eclass/mount-boot-utils.eclass | 109 +++++++++++++++++++++++++++++++++ eclass/mount-boot.eclass | 85 ++++--------------------- 2 files changed, 120 insertions(+), 74 deletions(-) create mode 100644 eclass/mount-boot-utils.eclass diff --git a/eclass/mount-boot-utils.eclass b/eclass/mount-boot-utils.eclass new file mode 100644 index 0000000000000..600b60a20d89d --- /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 [[ ${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 +} diff --git a/eclass/mount-boot.eclass b/eclass/mount-boot.eclass index 73beb9adea670..ab02b39d6141e 100644 --- a/eclass/mount-boot.eclass +++ b/eclass/mount-boot.eclass @@ -1,90 +1,27 @@ -# Copyright 1999-2023 Gentoo Authors +# Copyright 1999-2024 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: mount-boot.eclass # @MAINTAINER: # base-system@gentoo.org # @SUPPORTED_EAPIS: 6 7 8 -# @BLURB: functions for packages that install files into /boot +# @BLURB: eclass for packages that install files into /boot or the ESP # @DESCRIPTION: -# This eclass is really only useful for bootloaders. +# This eclass is really only useful for bootloaders and kernel installation. # -# If the live system has a separate /boot partition 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 isn't a separate partition. +# 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 exports the functions provided by mount-boot-utils.eclass to +# the pkg_pretend and pkg_{pre,post}{inst,rm} phases. case ${EAPI} in - 6|7|8) ;; + 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 [[ ${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 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 - - # note that /dev/BOOT is in the Gentoo default /etc/fstab file - local fstabstate=$(awk '!/^[[:blank:]]*#|^\/dev\/BOOT/ && $2 == "/boot" \ - { print 1; exit }' /etc/fstab || die "awk failed") - - if [[ -z ${fstabstate} ]] ; then - einfo "Assuming you do not have a separate /boot partition." - return 0 - fi - - local procstate=$(awk '$2 == "/boot" { 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 boot partition is not mounted at /boot." - eerror "Please mount it and retry." - die -n "/boot not mounted" - return 1 - fi - - if [[ ${procstate} == ro ]] ; then - eerror "Your boot partition, detected as being mounted at /boot," \ - "is read-only." - eerror "Please remount it as read-write and retry." - die -n "/boot mounted read-only" - return 2 - fi - - einfo "Your boot partition was detected as being mounted at /boot." - einfo "Files will be installed there for ${PN} to function correctly." - return 0 -} +inherit mount-boot-utils mount-boot_pkg_pretend() { mount-boot_check_status ^ permalink raw reply related [flat|nested] 13+ messages in thread
* Re: [gentoo-dev] [PATCH 1/5 v2] mount-boot.eclass: check for ESP as well as /boot, split, eclass 2024-06-27 14:24 ` [gentoo-dev] [PATCH 1/5 v2] " Andrew Nowa Ammerlaan @ 2024-06-28 6:33 ` Ulrich Mueller 2024-06-28 9:18 ` [gentoo-dev] [PATCH 1/5 v3] " Andrew Nowa Ammerlaan 0 siblings, 1 reply; 13+ messages in thread From: Ulrich Mueller @ 2024-06-28 6:33 UTC (permalink / raw To: Andrew Nowa Ammerlaan; +Cc: gentoo-dev [-- Attachment #1: Type: text/plain, Size: 1083 bytes --] >>>>> On Thu, 27 Jun 2024, Andrew Nowa Ammerlaan wrote: > On 27/06/2024 06:00, Ulrich Mueller wrote: >> AFAICS, no EAPI 6 ebuild inherits mount-boot, so EAPI 6 could be >> dropped? > Yes, might as well drop that now. Here's v2: > +# @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 [[ ${EROOT:-/} != / ]] ; then This could be simplified to [[ -n ${EROOT} ]], because EROOT is guaranteed not to end in a slash in EAPI 7 and later. (Sorry, I had missed this one in v1.) > + 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 > +} [-- Attachment #2: signature.asc --] [-- Type: application/pgp-signature, Size: 507 bytes --] ^ permalink raw reply [flat|nested] 13+ messages in thread
* Re: [gentoo-dev] [PATCH 1/5 v3] mount-boot.eclass: check for ESP as well as /boot, split, eclass 2024-06-28 6:33 ` Ulrich Mueller @ 2024-06-28 9:18 ` Andrew Nowa Ammerlaan 0 siblings, 0 replies; 13+ messages in thread From: Andrew Nowa Ammerlaan @ 2024-06-28 9:18 UTC (permalink / raw To: gentoo-dev On 28/06/2024 08:33, Ulrich Mueller wrote: >>>>>> On Thu, 27 Jun 2024, Andrew Nowa Ammerlaan wrote: > >> On 27/06/2024 06:00, Ulrich Mueller wrote: >>> AFAICS, no EAPI 6 ebuild inherits mount-boot, so EAPI 6 could be >>> dropped? > >> Yes, might as well drop that now. Here's v2: > > This could be simplified to [[ -n ${EROOT} ]], because EROOT is > guaranteed not to end in a slash in EAPI 7 and later. > > (Sorry, I had missed this one in v1.) > Fixed! And also made the use of "]] ; then" versus "]]; then" consistent here. From bcbffbe3c691156e5e7d64dedf42fb5eb4dd02d0 Mon Sep 17 00:00:00 2001 From: Andrew Ammerlaan <andrewammerlaan@gentoo.org> Date: Tue, 25 Jun 2024 15:08:49 +0200 Subject: [PATCH] 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> --- eclass/mount-boot-utils.eclass | 109 +++++++++++++++++++++++++++++++++ eclass/mount-boot.eclass | 85 ++++--------------------- 2 files changed, 120 insertions(+), 74 deletions(-) create mode 100644 eclass/mount-boot-utils.eclass diff --git a/eclass/mount-boot-utils.eclass b/eclass/mount-boot-utils.eclass new file mode 100644 index 0000000000000..39f8e94b84ec7 --- /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 +} diff --git a/eclass/mount-boot.eclass b/eclass/mount-boot.eclass index 73beb9adea670..ab02b39d6141e 100644 --- a/eclass/mount-boot.eclass +++ b/eclass/mount-boot.eclass @@ -1,90 +1,27 @@ -# Copyright 1999-2023 Gentoo Authors +# Copyright 1999-2024 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 # @ECLASS: mount-boot.eclass # @MAINTAINER: # base-system@gentoo.org # @SUPPORTED_EAPIS: 6 7 8 -# @BLURB: functions for packages that install files into /boot +# @BLURB: eclass for packages that install files into /boot or the ESP # @DESCRIPTION: -# This eclass is really only useful for bootloaders. +# This eclass is really only useful for bootloaders and kernel installation. # -# If the live system has a separate /boot partition 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 isn't a separate partition. +# 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 exports the functions provided by mount-boot-utils.eclass to +# the pkg_pretend and pkg_{pre,post}{inst,rm} phases. case ${EAPI} in - 6|7|8) ;; + 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 [[ ${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 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 - - # note that /dev/BOOT is in the Gentoo default /etc/fstab file - local fstabstate=$(awk '!/^[[:blank:]]*#|^\/dev\/BOOT/ && $2 == "/boot" \ - { print 1; exit }' /etc/fstab || die "awk failed") - - if [[ -z ${fstabstate} ]] ; then - einfo "Assuming you do not have a separate /boot partition." - return 0 - fi - - local procstate=$(awk '$2 == "/boot" { 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 boot partition is not mounted at /boot." - eerror "Please mount it and retry." - die -n "/boot not mounted" - return 1 - fi - - if [[ ${procstate} == ro ]] ; then - eerror "Your boot partition, detected as being mounted at /boot," \ - "is read-only." - eerror "Please remount it as read-write and retry." - die -n "/boot mounted read-only" - return 2 - fi - - einfo "Your boot partition was detected as being mounted at /boot." - einfo "Files will be installed there for ${PN} to function correctly." - return 0 -} +inherit mount-boot-utils mount-boot_pkg_pretend() { mount-boot_check_status ^ permalink raw reply related [flat|nested] 13+ messages in thread
end of thread, other threads:[~2024-06-28 9:19 UTC | newest] Thread overview: 13+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-06-26 19:09 [gentoo-dev] [PATCH] kernel-build.eclass: identify dist-kernels, and warn users Andrew Nowa Ammerlaan 2024-06-26 20:06 ` [gentoo-dev] [PATCH 0/5] mount-boot.eclass: revises /boot checking for dist-kernels, add checks for ESP Andrew Nowa Ammerlaan 2024-06-26 20:06 ` [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass Andrew Nowa Ammerlaan 2024-06-26 20:07 ` [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass Andrew Nowa Ammerlaan 2024-06-26 20:08 ` [gentoo-dev] [PATCH 3/5] linux-mod-r1.eclass: check /boot if we are re-installing, dist-kernel Andrew Nowa Ammerlaan 2024-06-26 20:08 ` [gentoo-dev] [PATCH 4/5] sys-kernel/linux-firmware: complain less when /boot is not, mounted Andrew Nowa Ammerlaan 2024-06-26 20:09 ` [gentoo-dev] [PATCH 5/5] sys-firmware/intel-microcode: " Andrew Nowa Ammerlaan 2024-06-27 4:07 ` [gentoo-dev] [PATCH 2/5] kernel-install.eclass: move mount-boot check to, dist-kernel-utils.eclass Ulrich Mueller 2024-06-27 14:26 ` [gentoo-dev] [PATCH 2/5 v2] " Andrew Nowa Ammerlaan 2024-06-27 4:00 ` [gentoo-dev] [PATCH 1/5] mount-boot.eclass: check for ESP as well as /boot, split, eclass Ulrich Mueller 2024-06-27 14:24 ` [gentoo-dev] [PATCH 1/5 v2] " Andrew Nowa Ammerlaan 2024-06-28 6:33 ` Ulrich Mueller 2024-06-28 9:18 ` [gentoo-dev] [PATCH 1/5 v3] " Andrew Nowa Ammerlaan
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox