def post_init(self, custom_args): """ grub2 post initialization method Setup class attributes """ self.custom_args = custom_args arch = platform.machine() if arch == 'x86_64': # grub2 support for bios and efi systems self.arch = arch elif arch.startswith('ppc64'): # grub2 support for ofw and opal systems self.arch = arch elif arch == 'i686' or arch == 'i586': # grub2 support for bios systems self.arch = 'ix86' elif arch == 'aarch64' or arch.startswith('arm'): # grub2 support for efi systems self.arch = arch else: raise KiwiBootLoaderGrubPlatformError( 'host architecture %s not supported for grub2 setup' % arch ) if self.custom_args and 'grub_directory_name' in self.custom_args: self.boot_directory_name = self.custom_args['grub_directory_name'] else: self.boot_directory_name = 'grub' self.terminal = self.xml_state.build_type.get_bootloader_console() \ or 'gfxterm' self.gfxmode = self.get_gfxmode('grub2') self.bootpath = self.get_boot_path() self.theme = self.get_boot_theme() self.timeout = self.get_boot_timeout_seconds() self.failsafe_boot = self.failsafe_boot_entry_requested() self.xen_guest = self.xml_state.is_xen_guest() self.firmware = FirmWare( self.xml_state ) if self.xml_state.is_xen_server(): self.hybrid_boot = False self.multiboot = True elif self.xen_guest: self.hybrid_boot = False self.multiboot = False else: self.hybrid_boot = True self.multiboot = False self.grub2 = BootLoaderTemplateGrub2() self.config = None self.efi_boot_path = None self.cmdline_failsafe = None self.cmdline = None self.iso_boot = False self.shim_fallback_setup = False
def post_init(self, custom_args): """ grub2 post initialization method :param dict custom_args: Contains grub config arguments .. code:: python {'grub_directory_name': 'grub|grub2'} """ self.custom_args = custom_args arch = platform.machine() if arch == 'x86_64': # grub2 support for bios and efi systems self.arch = arch elif arch.startswith('ppc64'): # grub2 support for ofw and opal systems self.arch = arch elif arch == 'i686' or arch == 'i586': # grub2 support for bios systems self.arch = 'ix86' elif arch == 'aarch64' or arch.startswith('arm'): # grub2 support for efi systems self.arch = arch else: raise KiwiBootLoaderGrubPlatformError( 'host architecture %s not supported for grub2 setup' % arch ) if self.custom_args and 'grub_directory_name' in self.custom_args: self.boot_directory_name = self.custom_args['grub_directory_name'] else: self.boot_directory_name = 'grub' self.terminal = self.xml_state.build_type.get_bootloader_console() \ or 'gfxterm' self.gfxmode = self.get_gfxmode('grub2') self.theme = self.get_boot_theme() self.timeout = self.get_boot_timeout_seconds() self.continue_on_timeout = self.get_continue_on_timeout() self.failsafe_boot = self.failsafe_boot_entry_requested() self.mediacheck_boot = self.xml_state.build_type.get_mediacheck() self.xen_guest = self.xml_state.is_xen_guest() self.firmware = FirmWare( self.xml_state ) self.live_type = self.xml_state.build_type.get_flags() if not self.live_type: self.live_type = Defaults.get_default_live_iso_type() self.volume_id = self.xml_state.build_type.get_volid() or \ Defaults.get_volume_id() self.install_volid = self.xml_state.build_type.get_volid() or \ Defaults.get_install_volume_id() self.live_boot_options = [ 'root=live:CDLABEL={0}'.format(self.volume_id), 'rd.live.image' ] self.install_boot_options = [ 'loglevel=0' ] if self.xml_state.get_initrd_system() == 'dracut': self.install_boot_options.append( 'root=install:CDLABEL={0}'.format(self.install_volid) ) if self.xml_state.build_type.get_hybridpersistent(): self.live_boot_options += \ Defaults.get_live_iso_persistent_boot_options( self.xml_state.build_type.get_hybridpersistent_filesystem() ) if self.xml_state.is_xen_server(): self.hybrid_boot = False self.multiboot = True elif self.xen_guest: self.hybrid_boot = False self.multiboot = False else: self.hybrid_boot = True self.multiboot = False self.grub2 = BootLoaderTemplateGrub2() self.config = None self.efi_boot_path = None self.cmdline_failsafe = None self.root_reference = None self.cmdline = None self.iso_boot = False self.shim_fallback_setup = False self.validate_use_of_linuxefi = False
def install(self): """ Install bootloader on disk device """ log.info('Installing grub2 on disk %s', self.device) if self.target_removable: self.install_arguments.append('--removable') if self.arch == 'x86_64' or self.arch == 'i686' or self.arch == 'i586': self.target = 'i386-pc' self.install_device = self.device self.modules = ' '.join( Defaults.get_grub_bios_modules(multiboot=True)) self.install_arguments.append('--skip-fs-probe') elif self.arch.startswith('ppc64'): if not self.custom_args or 'prep_device' not in self.custom_args: raise KiwiBootLoaderGrubInstallError( 'prep device name required for grub2 installation on ppc') self.target = 'powerpc-ieee1275' self.install_device = self.custom_args['prep_device'] self.modules = ' '.join(Defaults.get_grub_ofw_modules()) self.install_arguments.append('--skip-fs-probe') self.install_arguments.append('--no-nvram') else: raise KiwiBootLoaderGrubPlatformError( 'host architecture %s not supported for grub2 installation' % self.arch) self.root_mount = MountManager(device=self.custom_args['root_device']) self.boot_mount = MountManager(device=self.custom_args['boot_device'], mountpoint=self.root_mount.mountpoint + '/boot') self.root_mount.mount() if not self.root_mount.device == self.boot_mount.device: self.boot_mount.mount() if self.volumes: for volume_path in Path.sort_by_hierarchy( sorted(self.volumes.keys())): volume_mount = MountManager( device=self.volumes[volume_path]['volume_device'], mountpoint=self.root_mount.mountpoint + '/' + volume_path) self.volumes_mount.append(volume_mount) volume_mount.mount( options=[self.volumes[volume_path]['volume_options']]) self.device_mount = MountManager( device='/dev', mountpoint=self.root_mount.mountpoint + '/dev') self.proc_mount = MountManager(device='/proc', mountpoint=self.root_mount.mountpoint + '/proc') self.sysfs_mount = MountManager(device='/sys', mountpoint=self.root_mount.mountpoint + '/sys') self.device_mount.bind_mount() self.proc_mount.bind_mount() self.sysfs_mount.bind_mount() # check if a grub installation could be found in the image system grub_directory = Defaults.get_grub_path(self.root_mount.mountpoint + '/usr/lib') if not grub_directory: raise KiwiBootLoaderGrubDataError( 'No grub2 installation found in %s' % self.root_mount.mountpoint) grub_directory = grub_directory.replace(self.root_mount.mountpoint, '') module_directory = grub_directory + '/' + self.target boot_directory = '/boot' # wipe existing grubenv to allow the grub installer to create a new one grubenv_glob = os.sep.join( [self.root_mount.mountpoint, 'boot', '*', 'grubenv']) for grubenv in glob.glob(grubenv_glob): Path.wipe(grubenv) # install grub2 boot code Command.run([ 'chroot', self.root_mount.mountpoint, self._get_grub2_install_tool_name(self.root_mount.mountpoint) ] + self.install_arguments + [ '--directory', module_directory, '--boot-directory', boot_directory, '--target', self.target, '--modules', self.modules, self.install_device ]) if self.firmware and self.firmware.efi_mode() == 'uefi': shim_install = self._get_shim_install_tool_name( self.root_mount.mountpoint) # if shim-install does _not_ exist the fallback mechanism # has applied at the bootloader/config level and we expect # no further tool calls to be required if shim_install: self.efi_mount = MountManager( device=self.custom_args['efi_device'], mountpoint=self.root_mount.mountpoint + '/boot/efi') self.efi_mount.mount() # Before we call shim-install, the grub installer binary is # replaced by a noop. Actually there is no reason for # shim-install to call the grub installer because it should # only setup the system for EFI secure boot which does not # require any bootloader code in the master boot record. # In addition kiwi has called the grub installer right # before self._disable_grub2_install(self.root_mount.mountpoint) Command.run([ 'chroot', self.root_mount.mountpoint, 'shim-install', '--removable', self.install_device ]) # restore the grub installer noop self._enable_grub2_install(self.root_mount.mountpoint)
def install(self): """ Install bootloader on disk device """ log.info('Installing grub2 on disk %s', self.device) if self.target_removable: self.install_arguments.append('--removable') if Defaults.is_x86_arch(self.arch): self.target = 'i386-pc' self.install_device = self.device self.modules = ' '.join( Defaults.get_grub_bios_modules(multiboot=True)) self.install_arguments.append('--skip-fs-probe') elif self.arch.startswith('ppc64'): if not self.custom_args or 'prep_device' not in self.custom_args: raise KiwiBootLoaderGrubInstallError( 'prep device name required for grub2 installation on ppc') self.target = 'powerpc-ieee1275' self.install_device = self.custom_args['prep_device'] self.modules = ' '.join(Defaults.get_grub_ofw_modules()) self.install_arguments.append('--skip-fs-probe') self.install_arguments.append('--no-nvram') elif self.arch.startswith('s390'): self.target = 's390x-emu' self.install_device = self.device self.modules = ' '.join(Defaults.get_grub_s390_modules()) self.install_arguments.append('--skip-fs-probe') self.install_arguments.append('--no-nvram') else: raise KiwiBootLoaderGrubPlatformError( 'host architecture %s not supported for grub2 installation' % self.arch) self._mount_device_and_volumes() # check if a grub installation could be found in the image system module_directory = Defaults.get_grub_path(self.root_mount.mountpoint, self.target, raise_on_error=False) if not module_directory: raise KiwiBootLoaderGrubDataError( 'No grub2 installation found in {0} for target {1}'.format( self.root_mount.mountpoint, self.target)) module_directory = module_directory.replace(self.root_mount.mountpoint, '') boot_directory = '/boot' # wipe existing grubenv to allow the grub installer to create a new one grubenv_glob = os.sep.join( [self.root_mount.mountpoint, 'boot', '*', 'grubenv']) for grubenv in glob.glob(grubenv_glob): Path.wipe(grubenv) # install grub2 boot code if self.firmware.get_partition_table_type() == 'dasd': # On s390 and in CDL mode (4k DASD) the call of grub2-install # does not work because grub2-install is not able to identify # a 4k fdasd partitioned device as a grub supported device # and fails. As grub2-install is only used to invoke # grub2-zipl-setup and has no other job to do we can # circumvent this problem by directly calling grub2-zipl-setup # instead. Command.run([ 'chroot', self.root_mount.mountpoint, 'grub2-zipl-setup', '--keep' ]) zipl_config_file = ''.join( [self.root_mount.mountpoint, '/boot/zipl/config']) zipl2grub_config_file_orig = ''.join([ self.root_mount.mountpoint, '/etc/default/zipl2grub.conf.in.orig' ]) if os.path.exists(zipl2grub_config_file_orig): Command.run([ 'mv', zipl2grub_config_file_orig, zipl2grub_config_file_orig.replace('.orig', '') ]) if os.path.exists(zipl_config_file): Command.run( ['mv', zipl_config_file, zipl_config_file + '.kiwi']) else: Command.run([ 'chroot', self.root_mount.mountpoint, self._get_grub2_install_tool_name(self.root_mount.mountpoint) ] + self.install_arguments + [ '--directory', module_directory, '--boot-directory', boot_directory, '--target', self.target, '--modules', self.modules, self.install_device ])
def install(self): # noqa: C901 """ Install bootloader on disk device """ log.info('Installing grub2 on disk %s', self.device) if self.target_removable: self.install_arguments.append('--removable') if Defaults.is_x86_arch(self.arch): self.target = 'i386-pc' self.install_device = self.device self.modules = ' '.join( Defaults.get_grub_bios_modules(multiboot=True) ) self.install_arguments.append('--skip-fs-probe') elif self.arch.startswith('ppc64'): if not self.custom_args or 'prep_device' not in self.custom_args: raise KiwiBootLoaderGrubInstallError( 'prep device name required for grub2 installation on ppc' ) self.target = 'powerpc-ieee1275' self.install_device = self.custom_args['prep_device'] self.modules = ' '.join(Defaults.get_grub_ofw_modules()) self.install_arguments.append('--skip-fs-probe') self.install_arguments.append('--no-nvram') elif self.arch.startswith('s390'): self.target = 's390x-emu' self.install_device = self.device self.modules = ' '.join(Defaults.get_grub_s390_modules()) self.install_arguments.append('--skip-fs-probe') self.install_arguments.append('--no-nvram') else: raise KiwiBootLoaderGrubPlatformError( 'host architecture %s not supported for grub2 installation' % self.arch ) self.root_mount = MountManager( device=self.custom_args['root_device'] ) if 's390' in self.arch: self.boot_mount = MountManager( device=self.custom_args['boot_device'], mountpoint=self.root_mount.mountpoint + '/boot/zipl' ) else: self.boot_mount = MountManager( device=self.custom_args['boot_device'], mountpoint=self.root_mount.mountpoint + '/boot' ) if self.custom_args.get('efi_device'): self.efi_mount = MountManager( device=self.custom_args['efi_device'], mountpoint=self.root_mount.mountpoint + '/boot/efi' ) self.root_mount.mount() if not self.root_mount.device == self.boot_mount.device: self.boot_mount.mount() if self.efi_mount: self.efi_mount.mount() if self.volumes: for volume_path in Path.sort_by_hierarchy( sorted(self.volumes.keys()) ): volume_mount = MountManager( device=self.volumes[volume_path]['volume_device'], mountpoint=self.root_mount.mountpoint + '/' + volume_path ) self.volumes_mount.append(volume_mount) volume_mount.mount( options=[self.volumes[volume_path]['volume_options']] ) self.device_mount = MountManager( device='/dev', mountpoint=self.root_mount.mountpoint + '/dev' ) self.proc_mount = MountManager( device='/proc', mountpoint=self.root_mount.mountpoint + '/proc' ) self.sysfs_mount = MountManager( device='/sys', mountpoint=self.root_mount.mountpoint + '/sys' ) self.device_mount.bind_mount() self.proc_mount.bind_mount() self.sysfs_mount.bind_mount() # check if a grub installation could be found in the image system module_directory = Defaults.get_grub_path( self.root_mount.mountpoint, self.target, raise_on_error=False ) if not module_directory: raise KiwiBootLoaderGrubDataError( 'No grub2 installation found in {0} for target {1}'.format( self.root_mount.mountpoint, self.target ) ) module_directory = module_directory.replace( self.root_mount.mountpoint, '' ) boot_directory = '/boot' # wipe existing grubenv to allow the grub installer to create a new one grubenv_glob = os.sep.join( [self.root_mount.mountpoint, 'boot', '*', 'grubenv'] ) for grubenv in glob.glob(grubenv_glob): Path.wipe(grubenv) # install grub2 boot code if self.firmware.get_partition_table_type() == 'dasd': # On s390 and in CDL mode (4k DASD) the call of grub2-install # does not work because grub2-install is not able to identify # a 4k fdasd partitioned device as a grub supported device # and fails. As grub2-install is only used to invoke # grub2-zipl-setup and has no other job to do we can # circumvent this problem by directly calling grub2-zipl-setup # instead. Command.run( [ 'chroot', self.root_mount.mountpoint, 'grub2-zipl-setup', '--keep' ] ) zipl_config_file = ''.join( [ self.root_mount.mountpoint, '/boot/zipl/config' ] ) zipl2grub_config_file_orig = ''.join( [ self.root_mount.mountpoint, '/etc/default/zipl2grub.conf.in.orig' ] ) if os.path.exists(zipl2grub_config_file_orig): Command.run( [ 'mv', zipl2grub_config_file_orig, zipl2grub_config_file_orig.replace('.orig', '') ] ) if os.path.exists(zipl_config_file): Command.run( ['mv', zipl_config_file, zipl_config_file + '.kiwi'] ) else: Command.run( [ 'chroot', self.root_mount.mountpoint, self._get_grub2_install_tool_name( self.root_mount.mountpoint ) ] + self.install_arguments + [ '--directory', module_directory, '--boot-directory', boot_directory, '--target', self.target, '--modules', self.modules, self.install_device ] ) if self.firmware and self.firmware.efi_mode() == 'uefi': shim_install = self._get_shim_install_tool_name( self.root_mount.mountpoint ) # if shim-install does _not_ exist the fallback mechanism # has applied at the bootloader/config level and we expect # no further tool calls to be required if shim_install: # Before we call shim-install, the grub installer binary is # replaced by a noop. Actually there is no reason for # shim-install to call the grub installer because it should # only setup the system for EFI secure boot which does not # require any bootloader code in the master boot record. # In addition kiwi has called the grub installer right # before self._disable_grub2_install(self.root_mount.mountpoint) Command.run( [ 'chroot', self.root_mount.mountpoint, 'shim-install', '--removable', self.install_device ] ) # restore the grub installer noop self._enable_grub2_install(self.root_mount.mountpoint)