Fix handling of zipl.conf in plain zipl bootloader

When using the plain zipl bootloader kiwi created a /etc/zipl.conf
file. However, this file was only useful during image build as it
points to a loop target device and geometry but does not represent
a proper config file to be used in the running system. In addition
the different distributors provides their own version and layout
of the zipl.conf to be used inside of the system and with their
respective tools. Thus this commit changes the way how kiwi operates
in a way that the zipl.conf used in the initial image only exists
during the image build process. An eventual present /etc/zipl.conf
will not be touched by kiwi. This Fixes #2597
This commit is contained in:
Marcus Schäfer 2024-08-09 12:07:48 +02:00
parent 260c9479d7
commit 4f4e410523
No known key found for this signature in database
GPG Key ID: A16C1128698C8CAC
2 changed files with 20 additions and 22 deletions

View File

@ -25,6 +25,7 @@ from kiwi.boot.image.base import BootImageBase
from kiwi.bootloader.template.zipl import BootLoaderTemplateZipl
from kiwi.bootloader.config.bootloader_spec_base import BootLoaderSpecBase
from kiwi.command import Command
from kiwi.utils.temporary import Temporary
from kiwi.exceptions import (
KiwiTemplateError,
@ -44,7 +45,9 @@ class BootLoaderZipl(BootLoaderSpecBase):
def setup_loader(self, target: str) -> None:
"""
Setup main zipl.conf and install zipl for supported targets
Setup temporary zipl config and install zipl for supported targets.
Please note we are not touching the main zipl.conf file provided
by the distributors
:param str target:
target identifier, one of disk, live(iso) or install(iso)
@ -72,15 +75,19 @@ class BootLoaderZipl(BootLoaderSpecBase):
self.custom_args['initrd'] = \
f'{boot_path}/{kernel_info.initrd_name}'
runtime_zipl_config_file = Temporary(
path=self.root_mount.mountpoint, prefix='kiwi_zipl.conf_'
).new_file()
BootLoaderZipl._write_config_file(
BootLoaderTemplateZipl().get_loader_template(),
f'{self.root_mount.mountpoint}/etc/zipl.conf',
runtime_zipl_config_file.name,
self._get_template_parameters()
)
self.set_loader_entry(
self.root_mount.mountpoint, self.target.disk
)
self._install_zipl(root_dir)
self._install_zipl(root_dir, runtime_zipl_config_file.name)
def set_loader_entry(self, root_dir: str, target: str) -> None:
"""
@ -97,26 +104,18 @@ class BootLoaderZipl(BootLoaderSpecBase):
self._get_template_parameters(entry_name)
)
def _install_zipl(self, root_dir: str) -> None:
def _install_zipl(self, root_dir: str, zipl_config: str) -> None:
"""
Install zipl on target
"""
zipl = [
'chroot', root_dir, 'zipl',
'--noninteractive',
'--config', '/etc/zipl.conf',
'--config', zipl_config.replace(root_dir, ''),
'--blsdir', self.entries_dir,
'--verbose'
]
Command.run(zipl)
# rewrite zipl.conf without loop device reference
template_parameters = self._get_template_parameters()
template_parameters['targetbase'] = ''
BootLoaderZipl._write_config_file(
BootLoaderTemplateZipl().get_loader_template(),
f'{self.root_mount.mountpoint}/etc/zipl.conf',
template_parameters
)
def _get_template_parameters(
self, default_entry: str = ''

View File

@ -56,15 +56,20 @@ class TestBootLoaderZipl:
@patch('kiwi.bootloader.config.zipl.Path.create')
@patch('kiwi.bootloader.config.zipl.Command.run')
@patch('kiwi.bootloader.config.zipl.BootLoaderTemplateZipl')
@patch('kiwi.bootloader.config.zipl.Temporary.new_file')
@patch.object(BootLoaderZipl, '_write_config_file')
@patch.object(BootLoaderZipl, '_get_template_parameters')
@patch.object(BootLoaderSpecBase, 'get_entry_name')
def test_setup_loader(
self, mock_get_entry_name, mock_get_template_parameters,
mock_write_config_file, mock_BootLoaderTemplateZipl, mock_Command_run,
mock_write_config_file, mock_Temporary_new_file,
mock_BootLoaderTemplateZipl, mock_Command_run,
mock_Path_create, mock_Path_wipe, mock_BootImageBase_get_boot_names,
mock_os_path_exists
):
temporary = Mock()
temporary.name = 'system_root_mount/kiwi_zipl.conf_'
mock_Temporary_new_file.return_value = temporary
mock_get_entry_name.return_value = \
'opensuse-leap-5.3.18-59.10-default.conf'
@ -82,7 +87,7 @@ class TestBootLoaderZipl:
call(
mock_BootLoaderTemplateZipl.
return_value.get_loader_template.return_value,
'system_root_mount/etc/zipl.conf',
'system_root_mount/kiwi_zipl.conf_',
mock_get_template_parameters.return_value
),
call(
@ -91,12 +96,6 @@ class TestBootLoaderZipl:
'system_root_mount/boot/loader/entries/'
'opensuse-leap-5.3.18-59.10-default.conf',
mock_get_template_parameters.return_value
),
call(
mock_BootLoaderTemplateZipl.
return_value.get_loader_template.return_value,
'system_root_mount/etc/zipl.conf',
{'targetbase': ''}
)
]
assert self.bootloader._mount_system.called
@ -104,7 +103,7 @@ class TestBootLoaderZipl:
[
'chroot', 'system_root_mount', 'zipl',
'--noninteractive',
'--config', '/etc/zipl.conf',
'--config', '/kiwi_zipl.conf_',
'--blsdir', '/boot/loader/entries',
'--verbose'
]