Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
37 changes: 14 additions & 23 deletions kiwi/bootloader/config/grub2.py
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import glob
import shutil
from collections import OrderedDict
from typing import List

# project
from kiwi.bootloader.config.base import BootLoaderConfigBase
Expand Down Expand Up @@ -291,7 +292,9 @@ def setup_disk_image_config(
]
)
# Setup/Update loader environment
self._setup_loader_variables()
self._setup_loader_variables(
self.xml_state.get_build_type_bootloader_environment_variables()
)

# Disable os-prober, it takes information from the host it
# runs on which is not necessarily matching with the image
Expand Down Expand Up @@ -1572,16 +1575,7 @@ def _fix_grub_root_device_reference(self, config_file, boot_options):
vendor_grubenv_file = \
Defaults.get_vendor_grubenv(self.efi_mount.mountpoint)
if vendor_grubenv_file:
with open(vendor_grubenv_file) as vendor_grubenv:
grubenv = vendor_grubenv.read()
grubenv = grubenv.replace(
'root={0}'.format(
boot_options.get('root_device')
),
self.root_reference
)
with open(vendor_grubenv_file, 'w') as vendor_grubenv:
vendor_grubenv.write(grubenv)
self._setup_loader_variables([self.root_reference])

def _fix_grub_loader_entries_boot_cmdline(self):
if self.cmdline:
Expand Down Expand Up @@ -1753,18 +1747,15 @@ def _has_btrfs_relative_path(self) -> bool:
return True
return False

def _setup_loader_variables(self):
def _setup_loader_variables(self, variable_list: List[str]):
"""
Run grub2-editenv for writing an updated environment blob
"""
if self.root_mount:
variable_list = \
self.xml_state.get_build_type_bootloader_environment_variables()
if variable_list:
log.info(f'Set grub environment variables: {variable_list}')
Command.run(
[
'chroot', self.root_mount.mountpoint,
'grub2-editenv', '-', 'set'
] + variable_list
)
if self.root_mount and variable_list:
log.info(f'Set grub environment variables: {variable_list}')
Command.run(
[
'chroot', self.root_mount.mountpoint,
'grub2-editenv', '-', 'set'
] + variable_list
)
16 changes: 6 additions & 10 deletions test/unit/bootloader/config/grub2_test.py
Original file line number Diff line number Diff line change
Expand Up @@ -1196,29 +1196,23 @@ def test_setup_disk_image_config(
with patch('builtins.open', create=True) as mock_open:
mock_open_grub = MagicMock(spec=io.IOBase)
mock_open_menu = MagicMock(spec=io.IOBase)
mock_open_grubenv = MagicMock(spec=io.IOBase)

def open_file(filename, mode=None):
if filename == 'root_mount_point/boot/grub2/grub.cfg':
return mock_open_grub.return_value
elif filename == 'some_entry.conf':
return mock_open_menu.return_value
elif filename == 'grubenv':
return mock_open_grubenv.return_value

mock_open.side_effect = open_file

file_handle_grub = \
mock_open_grub.return_value.__enter__.return_value
file_handle_menu = \
mock_open_menu.return_value.__enter__.return_value
file_handle_grubenv = \
mock_open_grubenv.return_value.__enter__.return_value

file_handle_grub.read.return_value = \
'root=rootdev nomodeset console=ttyS0 console=tty0\n' \
'root=PARTUUID=xx'
file_handle_grubenv.read.return_value = 'root=rootdev'
file_handle_menu.read.return_value = \
'options foo\nlinux unexpected/boot/vmlinuz\ninitrd /boot/initrd'
self.bootloader.xml_state.\
Expand Down Expand Up @@ -1252,6 +1246,12 @@ def open_file(filename, mode=None):
'bash', '-c',
'cd root_mount_point/boot && rm -f boot && ln -s . boot'
], raise_on_error=False
),
call(
[
'chroot', self.bootloader.root_mount.mountpoint,
'grub2-editenv', '-', 'set', 'root=overlay:UUID=ID'
]
)
]
mock_copy_grub_config_to_efi_path.assert_called_once_with(
Expand All @@ -1262,9 +1262,6 @@ def open_file(filename, mode=None):
'\n'
'root=overlay:UUID=ID'
)
file_handle_grubenv.write.assert_called_once_with(
'root=overlay:UUID=ID'
)
assert 'options some-cmdline root=UUID=foo' in \
file_handle_menu.write.call_args_list[0][0][0].split(os.linesep)
assert 'linux /boot/vmlinuz' in \
Expand Down Expand Up @@ -1304,7 +1301,6 @@ def open_file(filename, mode=None):

# test read-only device
file_handle_grub.write.side_effect = OSError('readonly system')
file_handle_grubenv.write.side_effect = OSError('readonly system')
file_handle_menu.write.side_effect = OSError('readonly system')

with self._caplog.at_level(logging.INFO):
Expand Down
Loading