File BLS.patch of Package python-kiwi
commit 0174338e01eaf615eda250a7ac985b29a01e4b1d
Author: Marcus Schäfer <ms@suse.de>
Date: Sun Dec 29 20:48:09 2019 +0100
Fixed grub config if bootloader spec is in use
Distros that implements the grub bootloader spec prefers
GRUB_CMDLINE_LINUX over GRUB_CMDLINE_LINUX_DEFAULT. Details:
https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault
diff --git a/kiwi/bootloader/config/grub2.py b/kiwi/bootloader/config/grub2.py
index 0935109d..4afedb2e 100644
--- a/kiwi/bootloader/config/grub2.py
+++ b/kiwi/bootloader/config/grub2.py
@@ -529,7 +529,7 @@ class BootLoaderConfigGrub2(BootLoaderConfigBase):
* GRUB_USE_LINUXEFI
* GRUB_USE_INITRDEFI
* GRUB_SERIAL_COMMAND
- * GRUB_CMDLINE_LINUX_DEFAULT
+ * GRUB_CMDLINE_LINUX_DEFAULT | GRUB_CMDLINE_LINUX
* GRUB_GFXMODE
* GRUB_TERMINAL
* GRUB_DISTRIBUTOR
@@ -540,8 +540,22 @@ class BootLoaderConfigGrub2(BootLoaderConfigBase):
'GRUB_TERMINAL': '"{0}"'.format(self.terminal),
'GRUB_DISTRIBUTOR': '"{0}"'.format(self.get_menu_entry_title())
}
+ enable_blscfg_implemented = Command.run(
+ [
+ 'grep', '-q', 'GRUB_ENABLE_BLSCFG',
+ Defaults.get_grub_config_tool()
+ ], raise_on_error=False
+ )
if self.cmdline:
- grub_default_entries['GRUB_CMDLINE_LINUX_DEFAULT'] = '"{0}"'.format(
+ if enable_blscfg_implemented.returncode == 0:
+ # As documented in:
+ # https://fedoraproject.org/wiki/Changes/BootLoaderSpecByDefault
+ # Distros implementing BootLoaderSpec (BLS), prefers
+ # GRUB_CMDLINE_LINUX over GRUB_CMDLINE_LINUX_DEFAULT
+ grub_cmdline_key = 'GRUB_CMDLINE_LINUX'
+ else:
+ grub_cmdline_key = 'GRUB_CMDLINE_LINUX_DEFAULT'
+ grub_default_entries[grub_cmdline_key] = '"{0}"'.format(
re.sub(r'root=.* |root=.*$', '', self.cmdline).strip()
)
if self.terminal and 'serial' in self.terminal:
@@ -582,12 +596,6 @@ class BootLoaderConfigGrub2(BootLoaderConfigBase):
if self.custom_args.get('boot_is_crypto'):
grub_default_entries['GRUB_ENABLE_CRYPTODISK'] = 'y'
- enable_blscfg_implemented = Command.run(
- [
- 'grep', '-q', 'GRUB_ENABLE_BLSCFG',
- Defaults.get_grub_config_tool()
- ], raise_on_error=False
- )
if enable_blscfg_implemented.returncode == 0:
grub_default_entries['GRUB_ENABLE_BLSCFG'] = 'true'
diff --git a/test/unit/bootloader/config/grub2_test.py b/test/unit/bootloader/config/grub2_test.py
index 9a4347af..274b7848 100644
--- a/test/unit/bootloader/config/grub2_test.py
+++ b/test/unit/bootloader/config/grub2_test.py
@@ -316,7 +316,11 @@ class TestBootLoaderConfigGrub2:
self, mock_Command_run, mock_sysconfig, mock_exists
):
grep_grub_option = Mock()
+ # mock option lookup in grub toolkit to match
+ # leading to bootloader spec based setup plus
+ # use of special options linuxefi/initrdefi
grep_grub_option.returncode = 0
+
mock_Command_run.return_value = grep_grub_option
grub_default = MagicMock()
mock_sysconfig.return_value = grub_default
@@ -333,7 +337,7 @@ class TestBootLoaderConfigGrub2:
'GRUB_BACKGROUND',
'/boot/grub2/themes/openSUSE/background.png'
),
- call('GRUB_CMDLINE_LINUX_DEFAULT', '"some-cmdline"'),
+ call('GRUB_CMDLINE_LINUX', '"some-cmdline"'),
call('GRUB_DISTRIBUTOR', '"Bob"'),
call('GRUB_ENABLE_BLSCFG', 'true'),
call('GRUB_ENABLE_CRYPTODISK', 'y'),
@@ -350,6 +354,32 @@ class TestBootLoaderConfigGrub2:
call('SUSE_BTRFS_SNAPSHOT_BOOTING', 'true')
]
+ grub_default.reset_mock()
+ # mock option lookup in grub toolkit to not match
+ # leading to default behavior, no bootloader spec
+ # no special linuxefi/initrdefi config
+ grep_grub_option.returncode = 1
+
+ self.bootloader._setup_default_grub()
+ assert grub_default.__setitem__.call_args_list == [
+ call(
+ 'GRUB_BACKGROUND',
+ '/boot/grub2/themes/openSUSE/background.png'
+ ),
+ call('GRUB_CMDLINE_LINUX_DEFAULT', '"some-cmdline"'),
+ call('GRUB_DISTRIBUTOR', '"Bob"'),
+ call('GRUB_ENABLE_CRYPTODISK', 'y'),
+ call('GRUB_GFXMODE', '800x600'),
+ call(
+ 'GRUB_SERIAL_COMMAND',
+ '"serial --speed=38400 --unit=0 --word=8 --parity=no --stop=1"'
+ ),
+ call('GRUB_TERMINAL', '"serial"'),
+ call('GRUB_THEME', '/boot/grub2/themes/openSUSE/theme.txt'),
+ call('GRUB_TIMEOUT', 10),
+ call('SUSE_BTRFS_SNAPSHOT_BOOTING', 'true')
+ ]
+
@patch('os.path.exists')
@patch('kiwi.bootloader.config.grub2.SysConfig')
def test_setup_sysconfig_bootloader(self, mock_sysconfig, mock_exists):