From e3a7fca6f45607adca78420133ee4d02ed72483a Mon Sep 17 00:00:00 2001 From: Philip Date: Fri, 20 Feb 2015 00:28:44 +0100 Subject: [PATCH] [bootloader] join grub module with bootloader --- settings.conf | 3 +- src/modules/bootloader/bootloader.conf | 5 ++ src/modules/bootloader/main.py | 95 +++++++++++++++++--------- src/modules/grub/grub.conf | 11 --- src/modules/grub/main.py | 81 ---------------------- src/modules/grub/module.desc | 5 -- src/modules/grub/test.yaml | 5 -- 7 files changed, 69 insertions(+), 136 deletions(-) delete mode 100644 src/modules/grub/grub.conf delete mode 100644 src/modules/grub/main.py delete mode 100644 src/modules/grub/module.desc delete mode 100644 src/modules/grub/test.yaml diff --git a/settings.conf b/settings.conf index c0db13bea..457a79993 100644 --- a/settings.conf +++ b/settings.conf @@ -49,8 +49,7 @@ install: #- dracut #- initramfs - grubcfg -- grub -#- bootloader +- bootloader - umount # Phase 3 - postinstall. diff --git a/src/modules/bootloader/bootloader.conf b/src/modules/bootloader/bootloader.conf index 6d194123e..9dcc6f2ad 100644 --- a/src/modules/bootloader/bootloader.conf +++ b/src/modules/bootloader/bootloader.conf @@ -16,3 +16,8 @@ timeout: "10" grubInstall: "grub-install" grubMkconfig: "grub-mkconfig" grubCfg: "/boot/grub/grub.cfg" +# Optionally set the --bootloader-id to use for EFI. If not set, this defaults +# to the bootloaderEntryName from branding.desc with problematic characters +# replaced. If an efiBootloaderId is specified here, it is taken to already be a +# valid directory name, so no such postprocessing is done in this case. +# efiBootloaderId: "dirname" diff --git a/src/modules/bootloader/main.py b/src/modules/bootloader/main.py index b832c8bf0..4801a40e0 100644 --- a/src/modules/bootloader/main.py +++ b/src/modules/bootloader/main.py @@ -7,6 +7,7 @@ # Copyright 2014, Anke Boersma # Copyright 2014, Daniel Hillenbrand # Copyright 2014, Benjamin Vaudour +# Copyright 2014, Kevin Kofler # Copyright 2015, Philip Mueller # # Calamares is free software: you can redistribute it and/or modify @@ -93,26 +94,66 @@ def create_loader(loader_path): f.close() -def install_bootloader(boot_loader, fw_type): - if fw_type == 'efi': - install_path = libcalamares.globalstorage.value("rootMountPoint") +def install_gummiboot(efi_directory): + install_path = libcalamares.globalstorage.value("rootMountPoint") + install_efi_directory = install_path + efi_directory + kernel_line = libcalamares.job.configuration["kernelLine"] + fallback_kernel_line = libcalamares.job.configuration["fallbackKernelLine"] + uuid = get_uuid() + distribution = get_bootloader_entry_name() + file_name_sanitizer = str.maketrans(" /", "_-") + distribution_translated = distribution.translate(file_name_sanitizer) + conf_path = os.path.join( + install_efi_directory, "loader", "entries", + "{!s}.conf".format(distribution_translated)) + fallback_path = os.path.join( + install_efi_directory, "loader", "entries", + "{!s}-fallback.conf".format(distribution_translated)) + loader_path = os.path.join( + install_efi_directory, "loader", "loader.conf") + subprocess.call(["gummiboot", "--path={!s}".format(install_efi_directory), "install"]) + print("Configure: \"{!s}\"".format(kernel_line)) + create_conf(uuid, conf_path, kernel_line) + print("Configure: \"{!s}\"".format(fallback_kernel_line)) + create_conf(uuid, fallback_path, fallback_kernel_line) + create_loader(loader_path) + + +def install_grub(efi_directory, fw_type): + if fw_type == "efi": + efi_directory_firmware = efi_directory + "/EFI" + check_chroot_call(["mkdir", "-p", "{!s}".format(efi_directory)]) + if "efiBootloaderId" in libcalamares.job.configuration: + efi_bootloader_id = libcalamares.job.configuration["efiBootloaderId"] + else: + branding = libcalamares.globalstorage.value("branding") + distribution = branding["bootloaderEntryName"] + file_name_sanitizer = str.maketrans(" /", "_-") + efi_bootloader_id = distribution.translate(file_name_sanitizer) + check_chroot_call( + [libcalamares.job.configuration["grubInstall"], "--target=x86_64-efi", + "--efi-directory={!s}".format(efi_directory), + "--bootloader-id={!s}".format(efi_bootloader_id)]) + # Workaround for some UEFI firmwares + check_chroot_call(["mkdir", "-p", "{!s}/boot".format(efi_directory_firmware)]) + check_chroot_call(["cp", "{!s}/{!s}/grubx64.efi".format(efi_directory_firmware, + efi_bootloader_id), + "{!s}/boot/bootx64.efi".format(efi_directory_firmware)]) + else: + boot_loader = libcalamares.globalstorage.value("bootLoader") + check_chroot_call( + [libcalamares.job.configuration["grubInstall"], "--target=i386-pc", + boot_loader["installPath"]]) + + check_chroot_call([libcalamares.job.configuration["grubMkconfig"], "-o", + libcalamares.job.configuration["grubCfg"]]) + + +def prepare_bootloader(fw_type): + if fw_type == "efi": + efi_boot_loader = libcalamares.job.configuration["efiBootLoader"] efi_directory = libcalamares.globalstorage.value("efiSystemPartition") - install_efi_directory = install_path + efi_directory - uuid = get_uuid() - distribution = get_bootloader_entry_name() - file_name_sanitizer = str.maketrans(" /", "_-") - distribution_translated = distribution.translate(file_name_sanitizer) - conf_path = os.path.join( - install_efi_directory, "loader", "entries", - "{!s}.conf".format(distribution_translated)) - fallback_path = os.path.join( - install_efi_directory, "loader", "entries", - "{!s}-fallback.conf".format(distribution_translated)) - loader_path = os.path.join( - install_efi_directory, "loader", "loader.conf") partitions = libcalamares.globalstorage.value("partitions") - kernel_line = libcalamares.job.configuration["kernelLine"] - fallback_kernel_line = libcalamares.job.configuration["fallbackKernelLine"] boot_p = "" device = "" for partition in partitions: @@ -129,23 +170,13 @@ def install_bootloader(boot_loader, fw_type): print("Boot partition: \"{!s}\"".format(boot_p)) print("Boot device: \"{!s}\"".format(device)) subprocess.call(["sgdisk", "--typecode={!s}:EF00".format(boot_p), "{!s}".format(device)]) - subprocess.call(["gummiboot", "--path={!s}".format(install_efi_directory), "install"]) - print("Configure: \"{!s}\"".format(kernel_line)) - create_conf(uuid, conf_path, kernel_line) - print("Configure: \"{!s}\"".format(fallback_kernel_line)) - create_conf(uuid, fallback_path, fallback_kernel_line) - create_loader(loader_path) + if (efi_boot_loader == "gummiboot" and fw_type == "efi"): + install_gummiboot(efi_directory) else: - install_path = boot_loader["installPath"] - check_chroot_call( - [libcalamares.job.configuration["grubInstall"], "--target=i386-pc", - install_path]) - check_chroot_call([libcalamares.job.configuration["grubMkconfig"], "-o", - libcalamares.job.configuration["grubCfg"]]) + install_grub(efi_directory, fw_type) def run(): - boot_loader = libcalamares.globalstorage.value("bootLoader") fw_type = libcalamares.globalstorage.value("firmwareType") - install_bootloader(boot_loader, fw_type) + prepare_bootloader(fw_type) return None diff --git a/src/modules/grub/grub.conf b/src/modules/grub/grub.conf deleted file mode 100644 index ffef6f62e..000000000 --- a/src/modules/grub/grub.conf +++ /dev/null @@ -1,11 +0,0 @@ ---- -# GRUB 2 binary names and boot directory -# Some distributions (e.g. Fedora) use grub2-* (resp. /boot/grub2/) names. -grubInstall: "grub-install" -grubMkconfig: "grub-mkconfig" -grubCfg: "/boot/grub/grub.cfg" -# Optionally set the --bootloader-id to use for EFI. If not set, this defaults -# to the bootloaderEntryName from branding.desc with problematic characters -# replaced. If an efiBootloaderId is specified here, it is taken to already be a -# valid directory name, so no such postprocessing is done in this case. -# efiBootloaderId: "dirname" diff --git a/src/modules/grub/main.py b/src/modules/grub/main.py deleted file mode 100644 index c8293c6e7..000000000 --- a/src/modules/grub/main.py +++ /dev/null @@ -1,81 +0,0 @@ -#!/usr/bin/env python3 -# -*- coding: utf-8 -*- -# -# === This file is part of Calamares - === -# -# Copyright 2014, Aurélien Gâteau -# Copyright 2014, Daniel Hillenbrand -# Copyright 2014, Kevin Kofler -# Copyright 2015, Philip Mueller -# -# Calamares is free software: you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Calamares is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with Calamares. If not, see . - -import libcalamares -from libcalamares.utils import check_chroot_call -import subprocess - - -def install_grub(boot_loader, fw_type): - if fw_type == 'efi': - efi_directory = libcalamares.globalstorage.value("efiSystemPartition") - efi_directory_firmware = efi_directory + "/EFI" - check_chroot_call(["mkdir", "-p", "{!s}".format(efi_directory)]) - if "efiBootloaderId" in libcalamares.job.configuration: - efi_bootloader_id = libcalamares.job.configuration["efiBootloaderId"] - else: - branding = libcalamares.globalstorage.value("branding") - distribution = branding["bootloaderEntryName"] - file_name_sanitizer = str.maketrans(" /", "_-") - efi_bootloader_id = distribution.translate(file_name_sanitizer) - partitions = libcalamares.globalstorage.value("partitions") - boot_p = "" - device = "" - for partition in partitions: - if partition["mountPoint"] == efi_directory: - boot_device = partition["device"] - boot_p = boot_device[-1:] - device = boot_device[:-1] - if (not boot_p or not device): - return ("EFI directory \"{!s}\" not found!", - "Boot partition: \"{!s}\"", - "Boot device: \"{!s}\"".format(efi_directory,boot_p,device)) - else: - print("EFI directory: \"{!s}\"".format(efi_directory)) - print("Boot partition: \"{!s}\"".format(boot_p)) - print("Boot device: \"{!s}\"".format(device)) - subprocess.call(["sgdisk", "--typecode={!s}:EF00".format(boot_p), "{!s}".format(device)]) - check_chroot_call( - [libcalamares.job.configuration["grubInstall"], "--target=x86_64-efi", - "--efi-directory={!s}".format(efi_directory), - "--bootloader-id={!s}".format(efi_bootloader_id)]) - # Workaround for some UEFI firmwares - check_chroot_call(["mkdir", "-p", "{!s}/boot".format(efi_directory_firmware)]) - check_chroot_call(["cp", "{!s}/{!s}/grubx64.efi".format(efi_directory_firmware, - efi_bootloader_id), - "{!s}/boot/bootx64.efi".format(efi_directory_firmware)]) - else: - install_path = boot_loader["installPath"] - check_chroot_call( - [libcalamares.job.configuration["grubInstall"], "--target=i386-pc", - install_path]) - - check_chroot_call([libcalamares.job.configuration["grubMkconfig"], "-o", - libcalamares.job.configuration["grubCfg"]]) - - -def run(): - boot_loader = libcalamares.globalstorage.value("bootLoader") - fw_type = libcalamares.globalstorage.value("firmwareType") - install_grub(boot_loader, fw_type) - return None diff --git a/src/modules/grub/module.desc b/src/modules/grub/module.desc deleted file mode 100644 index aff70df5a..000000000 --- a/src/modules/grub/module.desc +++ /dev/null @@ -1,5 +0,0 @@ ---- -type: "job" -name: "grub" -interface: "python" -script: "main.py" diff --git a/src/modules/grub/test.yaml b/src/modules/grub/test.yaml deleted file mode 100644 index 99ec8a3df..000000000 --- a/src/modules/grub/test.yaml +++ /dev/null @@ -1,5 +0,0 @@ -rootMountPoint: /tmp/mount -bootLoader: - installPath: /dev/sdb -branding: - bootloaderEntryName: "Generic Distro"