From b3d04825a2612b8b9fb657c9c3753daa3461b2b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Tue, 14 Jul 2015 04:24:44 +0200 Subject: [PATCH] anaconda: generate xen efi configuration --- anaconda/pyanaconda/bootloader.py | 72 ++++++++++++++++++++- anaconda/pyanaconda/installclasses/qubes.py | 1 + 2 files changed, 71 insertions(+), 2 deletions(-) diff --git a/anaconda/pyanaconda/bootloader.py b/anaconda/pyanaconda/bootloader.py index d02afa2..04b9a2e 100644 --- a/anaconda/pyanaconda/bootloader.py +++ b/anaconda/pyanaconda/bootloader.py @@ -24,6 +24,7 @@ import collections import os import re +import shutil import struct from parted import PARTITION_BIOS_GRUB @@ -1710,6 +1711,73 @@ class EFIGRUB(GRUB2): def check(self): return True +class XenEFI(EFIGRUB): + packages = ["efibootmgr"] + _config_file = 'xen.cfg' + + def __init__(self): + super(XenEFI, self).__init__() + self.efi_dir = 'qubes' + + def add_efi_boot_target(self): + if self.stage1_device.type == "partition": + boot_disk = self.stage1_device.disk + boot_part_num = self.stage1_device.partedPartition.number + elif self.stage1_device.type == "mdarray": + # FIXME: I'm just guessing here. This probably needs the full + # treatment, ie: multiple targets for each member. + boot_disk = self.stage1_device.parents[0].disk + boot_part_num = self.stage1_device.parents[0].partedPartition.number + boot_part_num = str(boot_part_num) + + if not os.path.exists( + "{}/{}".format(ROOT_PATH + self.config_dir, "xen.efi")): + xen_efi = [x for x in os.listdir(ROOT_PATH + self.config_dir) if + x.startswith('xen-') and x.endswith('.efi')][0] + shutil.copy("{}/{}".format(ROOT_PATH + self.config_dir, xen_efi), + "{}/{}".format(ROOT_PATH + self.config_dir, "xen.efi")) + rc = self.efibootmgr("-c", "-w", "-L", productName, + "-d", boot_disk.path, "-p", boot_part_num, + "-l", + self.efi_dir_as_efifs_dir + "\\xen.efi", + root=ROOT_PATH) + if rc: + raise BootLoaderError("failed to set new efi boot target") + + def add_image(self, image): + super(XenEFI, self).add_image(image) + shutil.copy("{}/boot/{}".format(ROOT_PATH, image.kernel), + os.path.normpath( + "{}/{}".format(ROOT_PATH + self.config_dir, + image.kernel))) + if image.initrd is not None: + shutil.copy("{}/boot/{}".format(ROOT_PATH, image.initrd), + os.path.normpath( + "{}/{}".format(ROOT_PATH + self.config_dir, + image.initrd))) + + def write_config_header(self, config): + config.write("[global]\n") + config.write("default={}\n".format(self.default.version)) + + def write_config_images(self, config): + for image in self.images: + config.write("\n") + config.write("[{}]\n".format(image.version)) + config.write("options=loglvl=all\n") + config.write("kernel={} root={}\n".format( + image.kernel, + self.stage2_device.path)) + config.write("ramdisk={}\n".format(image.initrd)) + + def write_config_console(self, config): + pass + + def write_config_post(self): + pass + + write_config = BootLoader.write_config + class MacEFIGRUB(EFIGRUB): def mactel_config(self): if os.path.exists(ROOT_PATH + "/usr/libexec/mactel-boot-setup"): @@ -2201,7 +2269,7 @@ class EXTLINUX(BootLoader): # every platform that wants a bootloader needs to be in this dict bootloader_by_platform = {platform.X86: GRUB2, - platform.EFI: EFIGRUB, + platform.EFI: XenEFI, platform.MacEFI: MacEFIGRUB, platform.PPC: GRUB2, platform.IPSeriesPPC: IPSeriesGRUB2, @@ -2227,7 +2295,7 @@ def writeSysconfigKernel(storage, version): kernel_basename = "vmlinuz-" + version kernel_file = "/boot/%s" % kernel_basename if not os.path.isfile(ROOT_PATH + kernel_file): - kernel_file = "/boot/efi/EFI/redhat/%s" % kernel_basename + kernel_file = "/boot/efi/EFI/qubes/%s" % kernel_basename if not os.path.isfile(ROOT_PATH + kernel_file): log.error("failed to recreate path to default kernel image") return diff --git a/anaconda/pyanaconda/installclasses/qubes.py b/anaconda/pyanaconda/installclasses/qubes.py index fe697f6..c4879b8 100644 --- a/anaconda/pyanaconda/installclasses/qubes.py +++ b/anaconda/pyanaconda/installclasses/qubes.py @@ -40,6 +40,7 @@ class InstallClass(BaseInstallClass): _descriptionFields = (productName,) sortPriority = 20000 hidden = 0 + efi_dir = 'qubes' bootloaderTimeoutDefault = 5