From fd9f2428b4f7ab36eaa11c16661b97198046211d Mon Sep 17 00:00:00 2001 From: themylogin Date: Thu, 30 Jan 2025 13:58:14 +0100 Subject: [PATCH 1/2] Do not generate initrd for debug kernel if it is not enabled --- src/freenas/usr/local/bin/truenas-initrd.py | 22 ++++++++++++++----- .../plugins/system_advanced/config.py | 3 +++ .../plugins/system_general/update.py | 4 ++-- tests/api2/test_system_advanced.py | 17 ++++++++++++++ 4 files changed, 39 insertions(+), 7 deletions(-) diff --git a/src/freenas/usr/local/bin/truenas-initrd.py b/src/freenas/usr/local/bin/truenas-initrd.py index f51e3f7d570be..913298af01580 100755 --- a/src/freenas/usr/local/bin/truenas-initrd.py +++ b/src/freenas/usr/local/bin/truenas-initrd.py @@ -217,14 +217,26 @@ def update_zfs_module_config(root, readonly_rootfs, database): try: database = args.database or os.path.join(root, FREENAS_DATABASE[1:]) - if update_required := any(( - args.force, + adv_config = query_config_table("system_advanced", database, "adv_") + debug_kernel = adv_config["debugkernel"] + + update_required = any(( update_zfs_default(root, readonly_rootfs), update_pci_initramfs_config(root, readonly_rootfs, database), update_zfs_module_config(root, readonly_rootfs, database), - )): - readonly_rootfs.make_writeable() - subprocess.run(["chroot", root, "update-initramfs", "-k", "all", "-u"], check=True) + )) + + for kernel in os.listdir(f"{root}/boot"): + if not kernel.startswith("vmlinuz-"): + continue + + kernel_name = kernel.removeprefix("vmlinuz-") + if "debug" in kernel_name and not debug_kernel: + continue + + if args.force or update_required or not os.path.exists(f"{root}/boot/initrd.img-{kernel_name}"): + readonly_rootfs.make_writeable() + subprocess.run(["chroot", root, "update-initramfs", "-k", kernel_name, "-u"], check=True) except Exception: logger.error("Failed to update initramfs", exc_info=True) exit(2) diff --git a/src/middlewared/middlewared/plugins/system_advanced/config.py b/src/middlewared/middlewared/plugins/system_advanced/config.py index 13bb6b5509f54..18f3074ec64e3 100644 --- a/src/middlewared/middlewared/plugins/system_advanced/config.py +++ b/src/middlewared/middlewared/plugins/system_advanced/config.py @@ -297,6 +297,9 @@ async def do_update(self, data): await self.middleware.call('system.advanced.configure_tty', original_data, config_data, generate_grub) + if config_data['debugkernel']: + await self.middleware.call('boot.update_initramfs') + if consolemsg is not None: await self.middleware.call('system.general.update', {'ui_consolemsg': consolemsg}) diff --git a/src/middlewared/middlewared/plugins/system_general/update.py b/src/middlewared/middlewared/plugins/system_general/update.py index 3ba5705c349be..709db78cb5ea3 100644 --- a/src/middlewared/middlewared/plugins/system_general/update.py +++ b/src/middlewared/middlewared/plugins/system_general/update.py @@ -269,7 +269,7 @@ async def do_update(self, data): ) if config['kbdmap'] != new_config['kbdmap']: - await self.set_kbdlayout(new_config['kbdmap']) + await self.set_kbdlayout() if config['timezone'] != new_config['timezone']: await self.middleware.call('zettarepl.update_config', {'timezone': new_config['timezone']}) @@ -299,7 +299,7 @@ async def do_update(self, data): return await self.config() @private - async def set_kbdlayout(self, kbdmap='us'): + async def set_kbdlayout(self): await self.middleware.call('etc.generate', 'keyboard') await run(['setupcon'], check=False) await self.middleware.call('boot.update_initramfs', {'force': True}) diff --git a/tests/api2/test_system_advanced.py b/tests/api2/test_system_advanced.py index 3f0351dd0df26..d846f8c9c0a58 100644 --- a/tests/api2/test_system_advanced.py +++ b/tests/api2/test_system_advanced.py @@ -32,3 +32,20 @@ def test_(key, value, grep_file, sshd_config_cmd, validation_error): with pytest.raises(ValidationErrors) as ve: call('system.advanced.update', {key: value}) assert ve.value.errors == [ValidationError(key, validation_error)] + + +def test_debugkernel_initrd(): + assert not call("system.advanced.config")["debugkernel"] + + initrds = [initrd for initrd in ssh("ls -1 /boot").split() if "initrd" in initrd] + assert len(initrds) == 1 + assert "debug" not in initrds[0] + + try: + call("system.advanced.update", {"debugkernel": True}) + + initrds = [initrd for initrd in ssh("ls -1 /boot").split() if "initrd" in initrd] + assert len(initrds) == 2 + assert any("debug" in initrd for initrd in initrds) + finally: + call("system.advanced.update", {"debugkernel": False}) From 45f321a4c7b3228a17b78af4d96f3facb75f5b8e Mon Sep 17 00:00:00 2001 From: themylogin Date: Thu, 30 Jan 2025 16:19:38 +0100 Subject: [PATCH 2/2] Address review --- src/middlewared/middlewared/plugins/system_advanced/config.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/middlewared/middlewared/plugins/system_advanced/config.py b/src/middlewared/middlewared/plugins/system_advanced/config.py index 18f3074ec64e3..95838fba7840f 100644 --- a/src/middlewared/middlewared/plugins/system_advanced/config.py +++ b/src/middlewared/middlewared/plugins/system_advanced/config.py @@ -297,7 +297,7 @@ async def do_update(self, data): await self.middleware.call('system.advanced.configure_tty', original_data, config_data, generate_grub) - if config_data['debugkernel']: + if config_data['debugkernel'] and not original_data['debugkernel']: await self.middleware.call('boot.update_initramfs') if consolemsg is not None: