From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id 37F2F15802E for ; Sat, 29 Jun 2024 08:39:36 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 7ABC92BC01E; Sat, 29 Jun 2024 08:39:35 +0000 (UTC) Received: from smtp.gentoo.org (woodpecker.gentoo.org [140.211.166.183]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id 525892BC016 for ; Sat, 29 Jun 2024 08:39:35 +0000 (UTC) Received: from oystercatcher.gentoo.org (oystercatcher.gentoo.org [148.251.78.52]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits)) (No client certificate requested) by smtp.gentoo.org (Postfix) with ESMTPS id 4DD9433BF36 for ; Sat, 29 Jun 2024 08:39:34 +0000 (UTC) Received: from localhost.localdomain (localhost [IPv6:::1]) by oystercatcher.gentoo.org (Postfix) with ESMTP id D7B5B1ABE for ; Sat, 29 Jun 2024 08:39:32 +0000 (UTC) From: "Andrew Ammerlaan" To: gentoo-commits@lists.gentoo.org Content-Transfer-Encoding: 8bit Content-type: text/plain; charset=UTF-8 Reply-To: gentoo-dev@lists.gentoo.org, "Andrew Ammerlaan" Message-ID: <1719650176.e598ba3fe1f5b51c0f0e64cacd950d600b289852.andrewammerlaan@gentoo> Subject: [gentoo-commits] repo/gentoo:master commit in: eclass/ X-VCS-Repository: repo/gentoo X-VCS-Files: eclass/mount-boot-utils.eclass eclass/mount-boot.eclass X-VCS-Directories: eclass/ X-VCS-Committer: andrewammerlaan X-VCS-Committer-Name: Andrew Ammerlaan X-VCS-Revision: e598ba3fe1f5b51c0f0e64cacd950d600b289852 X-VCS-Branch: master Date: Sat, 29 Jun 2024 08:39:32 +0000 (UTC) Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-commits@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply X-Archives-Salt: cda3f570-b340-4b57-8682-d350ccdee081 X-Archives-Hash: 94a1ecdf271d4282037982c877d14b54 commit: e598ba3fe1f5b51c0f0e64cacd950d600b289852 Author: Andrew Ammerlaan gentoo org> AuthorDate: Tue Jun 25 13:08:49 2024 +0000 Commit: Andrew Ammerlaan gentoo org> CommitDate: Sat Jun 29 08:36:16 2024 +0000 URL: https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=e598ba3f 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 gentoo.org> eclass/mount-boot-utils.eclass | 109 +++++++++++++++++++++++++++++++++++++++++ eclass/mount-boot.eclass | 85 +++++--------------------------- 2 files changed, 120 insertions(+), 74 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 +} diff --git a/eclass/mount-boot.eclass b/eclass/mount-boot.eclass index 73beb9adea67..ab02b39d6141 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