From ba8bc65520b36899043d63a115ad43efdf83fe74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Wed, 24 Apr 2024 04:38:27 +0200 Subject: [PATCH] Allow setting "none" kernel to use in-vm kernel in any virt_mode Automatically translate it to appropriate pvgrub flavor. QubesOS/qubes-issues#5212 --- qubes/tests/vm/qubesvm.py | 8 +++++++- qubes/vm/qubesvm.py | 16 ++++++++++++++-- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/qubes/tests/vm/qubesvm.py b/qubes/tests/vm/qubesvm.py index 858852003..a7131c74f 100644 --- a/qubes/tests/vm/qubesvm.py +++ b/qubes/tests/vm/qubesvm.py @@ -504,7 +504,7 @@ def test_220_include_in_backups(self): @unittest.mock.patch('qubes.config.qubes_base_dir', '/tmp/qubes-test') def test_250_kernel(self): - for kver in ("dummy", "dummy2"): + for kver in ("dummy", "dummy2", "pvgrub2", "pvgrub2-pvh"): kernel_dir = '/tmp/qubes-test/vm-kernels/' + kver os.makedirs(kernel_dir, exist_ok=True) open(os.path.join(kernel_dir, 'vmlinuz'), 'w').close() @@ -517,6 +517,12 @@ def test_250_kernel(self): "dummy2") del vm.kernel self.assertPropertyDefaultValue(vm, 'kernel', "dummy") + vm.kernel = None + self.assertEqual(vm.kernel_path, "/tmp/qubes-test/vm-kernels/pvgrub2-pvh/vmlinuz") + vm.virt_mode = "pv" + self.assertEqual(vm.kernel_path, "/tmp/qubes-test/vm-kernels/pvgrub2/vmlinuz") + vm.virt_mode = "hvm" + self.assertIsNone(vm.kernel_path) @qubes.tests.skipUnlessDom0 def test_251_kernel_invalid(self): diff --git a/qubes/vm/qubesvm.py b/qubes/vm/qubesvm.py index 7c68bb618..4a0090cc3 100644 --- a/qubes/vm/qubesvm.py +++ b/qubes/vm/qubesvm.py @@ -1645,6 +1645,18 @@ def is_memory_balancing_possible(self): @property def kernel_path(self): if not self.kernel: + if self.virt_mode == 'pvh': + return os.path.join( + qubes.config.qubes_base_dir, + qubes.config.system_path['qubes_kernels_base_dir'], + "pvgrub2-pvh", + "vmlinuz") + if self.virt_mode == "pv": + return os.path.join( + qubes.config.qubes_base_dir, + qubes.config.system_path['qubes_kernels_base_dir'], + "pvgrub2", + "vmlinuz") return None return self.storage.kernels_dir + "/vmlinuz" @@ -1663,9 +1675,9 @@ def is_kernel_from_vm(self): if self.virt_mode == 'hvm': return not self.kernel if self.virt_mode == 'pvh': - return self.kernel == 'pvgrub2-pvh' + return not self.kernel or self.kernel == 'pvgrub2-pvh' if self.virt_mode == 'pv': - return self.kernel == 'pvgrub2' + return not self.kernel or self.kernel == 'pvgrub2' assert False @property