diff --git a/eclass/mount-efi.eclass b/eclass/mount-efi.eclass new file mode 100644 index 00000000..94e32ec9 --- /dev/null +++ b/eclass/mount-efi.eclass @@ -0,0 +1,80 @@ +# Copyright 1999-2008 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/eclass/mount-efi.eclass,v 1.17 2009/10/09 20:57:08 vapier Exp $ +# +# This eclass is really only useful for efi bootloaders. +# +# If the live system has a separate /efi partition configured, then this +# function tries to ensure that it's mounted in rw mode, exiting with an +# error if it cant. It does nothing if /efi isn't a separate partition. +# +# MAINTAINER: base-system@gentoo.org + +EXPORT_FUNCTIONS pkg_preinst pkg_prerm + +mount-efi_mount_efi_partition() { + if [[ -n ${DONT_MOUNT_EFI} ]] ; then + return + else + elog + elog "To avoid automounting and auto(un)installing with /efi," + elog "just export the DONT_MOUNT_EFI variable." + elog + fi + + # note that /dev/EFI is in the Gentoo default /etc/fstab file + local fstabstate=$(awk '!/^#|^[[:blank:]]+#|^\/dev\/EFI/ {print $2}' /etc/fstab | egrep "^/efi$" ) + local procstate=$(awk '$2 ~ /^\/efi$/ {print $2}' /proc/mounts) + local proc_ro=$(awk '{ print $2 " ," $4 "," }' /proc/mounts | sed -n '/\/efi .*,ro,/p') + + if [ -n "${fstabstate}" ] && [ -n "${procstate}" ]; then + if [ -n "${proc_ro}" ]; then + einfo + einfo "Your efi partition, detected as being mounted as /efi, is read-only." + einfo "Remounting it in read-write mode ..." + einfo + mount -o remount,rw /efi + if [ "$?" -ne 0 ]; then + eerror + eerror "Unable to remount in rw mode. Please do it manually!" + eerror + die "Can't remount in rw mode. Please do it manually!" + fi + else + einfo + einfo "Your efi partition was detected as being mounted as /efi." + einfo "Files will be installed there for ${PN} to function correctly." + einfo + fi + elif [ -n "${fstabstate}" ] && [ -z "${procstate}" ]; then + mount /efi -o rw + if [ "$?" -eq 0 ]; then + einfo + einfo "Your efi partition was not mounted as /efi, but portage" + einfo "was able to mount it without additional intervention." + einfo "Files will be installed there for ${PN} to function correctly." + einfo + else + eerror + eerror "Cannot automatically mount your /efi partition." + eerror "Your efi partition has to be mounted rw before the installation" + eerror "can continue. ${PN} needs to install important files there." + eerror + die "Please mount your /efi partition manually!" + fi + else + einfo + einfo "Assuming you do not have a separate /efi partition." + einfo + fi +} + +mount-efi_pkg_preinst() { + mount-efi_mount_efi_partition +} + +mount-efi_pkg_prerm() { + touch "${ROOT}"/efi/.keep 2>/dev/null + mount-efi_mount_efi_partition + touch "${ROOT}"/efi/.keep 2>/dev/null +}