[bootloader] Add zfs support for grub-install

This commit is contained in:
dalto 2021-11-16 13:48:34 -06:00
parent 18307d9f57
commit b65321d80b

View File

@ -368,23 +368,17 @@ def get_grub_efi_parameters():
return None return None
def run_grub_mkconfig(output_file): def run_grub_mkconfig(partitions, output_file):
""" """
Runs grub-mkconfig in the target environment Runs grub-mkconfig in the target environment
:param partitions: The partitions list from global storage
:param output_file: A string containing the path to the generating grub config file :param output_file: A string containing the path to the generating grub config file
:return: :return:
""" """
# get the partition from global storage
partitions = libcalamares.globalstorage.value("partitions")
if not partitions:
libcalamares.utils.error("Failed to run grub-mkconfig, no partitions defined in global storage")
return
# zfs needs an environment variable set for grub-mkconfig # zfs needs an environment variable set for grub-mkconfig
if any([is_zfs_root(partition) for partition in partitions]): if any([is_zfs_root(partition) for partition in partitions]):
check_target_env_call(["sh", "-c", "echo ZPOOL_VDEV_NAME_PATH=1 >> /etc/environment"])
check_target_env_call(["sh", "-c", "ZPOOL_VDEV_NAME_PATH=1 " + check_target_env_call(["sh", "-c", "ZPOOL_VDEV_NAME_PATH=1 " +
libcalamares.job.configuration["grubMkconfig"] + " -o " + output_file]) libcalamares.job.configuration["grubMkconfig"] + " -o " + output_file])
else: else:
@ -393,6 +387,57 @@ def run_grub_mkconfig(output_file):
check_target_env_call([libcalamares.job.configuration["grubMkconfig"], "-o", output_file]) check_target_env_call([libcalamares.job.configuration["grubMkconfig"], "-o", output_file])
def run_grub_install(fw_type, partitions, efi_directory=None):
"""
Runs grub-install in the target environment
:param fw_type: A string which is "efi" for UEFI installs. Any other value results in a BIOS install
:param partitions: The partitions list from global storage
:param efi_directory: The path of the efi directory relative to the root of the install
:return:
"""
is_zfs = any([is_zfs_root(partition) for partition in partitions])
# zfs needs an environment variable set for grub
if is_zfs:
check_target_env_call(["sh", "-c", "echo ZPOOL_VDEV_NAME_PATH=1 >> /etc/environment"])
if fw_type == "efi":
efi_bootloader_id = efi_label()
efi_target, efi_grub_file, efi_boot_file = get_grub_efi_parameters()
if is_zfs:
check_target_env_call(["sh", "-c", "ZPOOL_VDEV_NAME_PATH=1 " + libcalamares.job.configuration["grubInstall"]
+ " --target=" + efi_target + " --efi-directory=" + efi_directory
+ " --bootloader-id=" + efi_bootloader_id + " --force"])
else:
check_target_env_call([libcalamares.job.configuration["grubInstall"],
"--target=" + efi_target,
"--efi-directory=" + efi_directory,
"--bootloader-id=" + efi_bootloader_id,
"--force"])
else:
if libcalamares.globalstorage.value("bootLoader") is None:
return
boot_loader = libcalamares.globalstorage.value("bootLoader")
if boot_loader["installPath"] is None:
return
if is_zfs:
check_target_env_call(["sh", "-c", "ZPOOL_VDEV_NAME_PATH=1 "
+ libcalamares.job.configuration["grubInstall"]
+ " --target=i386-pc --recheck --force "
+ boot_loader["installPath"]])
else:
check_target_env_call([libcalamares.job.configuration["grubInstall"],
"--target=i386-pc",
"--recheck",
"--force",
boot_loader["installPath"]])
def install_grub(efi_directory, fw_type): def install_grub(efi_directory, fw_type):
""" """
Installs grub as bootloader, either in pc or efi mode. Installs grub as bootloader, either in pc or efi mode.
@ -400,6 +445,12 @@ def install_grub(efi_directory, fw_type):
:param efi_directory: :param efi_directory:
:param fw_type: :param fw_type:
""" """
# get the partition from global storage
partitions = libcalamares.globalstorage.value("partitions")
if not partitions:
libcalamares.utils.warning(_("Failed to install grub, no partitions defined in global storage"))
return
if fw_type == "efi": if fw_type == "efi":
libcalamares.utils.debug("Bootloader: grub (efi)") libcalamares.utils.debug("Bootloader: grub (efi)")
install_path = libcalamares.globalstorage.value("rootMountPoint") install_path = libcalamares.globalstorage.value("rootMountPoint")
@ -412,11 +463,7 @@ def install_grub(efi_directory, fw_type):
efi_target, efi_grub_file, efi_boot_file = get_grub_efi_parameters() efi_target, efi_grub_file, efi_boot_file = get_grub_efi_parameters()
check_target_env_call([libcalamares.job.configuration["grubInstall"], run_grub_install(fw_type, partitions, efi_directory)
"--target=" + efi_target,
"--efi-directory=" + efi_directory,
"--bootloader-id=" + efi_bootloader_id,
"--force"])
# VFAT is weird, see issue CAL-385 # VFAT is weird, see issue CAL-385
install_efi_directory_firmware = (vfat_correct_case( install_efi_directory_firmware = (vfat_correct_case(
@ -435,36 +482,21 @@ def install_grub(efi_directory, fw_type):
os.makedirs(install_efi_boot_directory) os.makedirs(install_efi_boot_directory)
# Workaround for some UEFI firmwares # Workaround for some UEFI firmwares
FALLBACK = "installEFIFallback" fallback = "installEFIFallback"
libcalamares.utils.debug("UEFI Fallback: " + str(libcalamares.job.configuration.get(FALLBACK, "<unset>"))) libcalamares.utils.debug("UEFI Fallback: " + str(libcalamares.job.configuration.get(fallback, "<unset>")))
if libcalamares.job.configuration.get(FALLBACK, True): if libcalamares.job.configuration.get(fallback, True):
libcalamares.utils.debug(" .. installing '{!s}' fallback firmware".format(efi_boot_file)) libcalamares.utils.debug(" .. installing '{!s}' fallback firmware".format(efi_boot_file))
efi_file_source = os.path.join(install_efi_directory_firmware, efi_file_source = os.path.join(install_efi_directory_firmware,
efi_bootloader_id, efi_bootloader_id,
efi_grub_file) efi_grub_file)
efi_file_target = os.path.join(install_efi_boot_directory, efi_file_target = os.path.join(install_efi_boot_directory, efi_boot_file)
efi_boot_file)
shutil.copy2(efi_file_source, efi_file_target) shutil.copy2(efi_file_source, efi_file_target)
else: else:
libcalamares.utils.debug("Bootloader: grub (bios)") libcalamares.utils.debug("Bootloader: grub (bios)")
if libcalamares.globalstorage.value("bootLoader") is None: run_grub_install(fw_type, partitions)
return
boot_loader = libcalamares.globalstorage.value("bootLoader") run_grub_mkconfig(partitions, libcalamares.job.configuration["grubCfg"])
if boot_loader["installPath"] is None:
return
check_target_env_call([libcalamares.job.configuration["grubInstall"],
"--target=i386-pc",
"--recheck",
"--force",
boot_loader["installPath"]])
# The input file /etc/default/grub should already be filled out by the
# grubcfg job module.
check_target_env_call([libcalamares.job.configuration["grubMkconfig"],
"-o", libcalamares.job.configuration["grubCfg"]])
def install_secureboot(efi_directory): def install_secureboot(efi_directory):