vm,templates: allow to obtain common kernelopts from a kernel package

If kernel package ships default-kernelopts-common.txt file, use that
instead of hardcoded Linux-specific options.
For Linux kernel it may include xen_scrub_pages=0 option, but only if
initrd shipped with this kernel re-enable this option later.

QubesOS/qubes-issues#4839
QubesOS/qubes-issues#4736
This commit is contained in:
Marek Marczykowski-Górecki 2019-02-25 04:59:46 +01:00
parent e110cbecb3
commit 2de5a8e894
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724
4 changed files with 89 additions and 1 deletions

View File

@ -69,6 +69,8 @@ defaults = {
'hvm_memory': 400, 'hvm_memory': 400,
'kernelopts': "nopat", 'kernelopts': "nopat",
'kernelopts_pcidevs': "nopat iommu=soft swiotlb=8192", 'kernelopts_pcidevs': "nopat iommu=soft swiotlb=8192",
'kernelopts_common': ('root=/dev/mapper/dmroot ro nomodeset console=hvc0 '
'rd_NO_PLYMOUTH rd.plymouth.enable=0 plymouth.enable=0 '),
'dom0_update_check_interval': 6*3600, 'dom0_update_check_interval': 6*3600,

View File

@ -867,6 +867,73 @@ class TC_90_QubesVM(QubesVMTestsMixin, qubes.tests.QubesTestCase):
self.assertXMLEqual(lxml.etree.XML(libvirt_xml), self.assertXMLEqual(lxml.etree.XML(libvirt_xml),
lxml.etree.XML(expected)) lxml.etree.XML(expected))
def test_600_libvirt_xml_hvm_dom0_kernel_kernelopts(self):
expected = '''<domain type="xen">
<name>test-inst-test</name>
<uuid>7db78950-c467-4863-94d1-af59806384ea</uuid>
<memory unit="MiB">500</memory>
<currentMemory unit="MiB">400</currentMemory>
<vcpu placement="static">2</vcpu>
<cpu mode='host-passthrough'>
<!-- disable nested HVM -->
<feature name='vmx' policy='disable'/>
<feature name='svm' policy='disable'/>
<!-- disable SMAP inside VM, because of Linux bug -->
<feature name='smap' policy='disable'/>
</cpu>
<os>
<type arch="x86_64" machine="xenfv">hvm</type>
<!--
For the libxl backend libvirt switches between OVMF (UEFI)
and SeaBIOS based on the loader type. This has nothing to
do with the hvmloader binary.
-->
<loader type="rom">hvmloader</loader>
<boot dev="cdrom" />
<boot dev="hd" />
<cmdline>kernel specific options nopat</cmdline>
</os>
<features>
<pae/>
<acpi/>
<apic/>
<viridian/>
</features>
<clock offset="variable" adjustment="0" basis="localtime" />
<on_poweroff>destroy</on_poweroff>
<on_reboot>destroy</on_reboot>
<on_crash>destroy</on_crash>
<devices>
<!-- server_ip is the address of stubdomain. It hosts it's own DNS server. -->
<emulator type="stubdom-linux" />
<input type="tablet" bus="usb"/>
<video>
<model type="vga"/>
</video>
<graphics type="qubes"/>
</devices>
</domain>
'''
my_uuid = '7db78950-c467-4863-94d1-af59806384ea'
vm = self.get_vm(uuid=my_uuid)
vm.netvm = None
vm.virt_mode = 'hvm'
vm.features['qrexec'] = True
with unittest.mock.patch('qubes.config.qubes_base_dir',
'/tmp/qubes-test'):
kernel_dir = '/tmp/qubes-test/vm-kernels/dummy'
os.makedirs(kernel_dir, exist_ok=True)
open(os.path.join(kernel_dir, 'vmlinuz'), 'w').close()
open(os.path.join(kernel_dir, 'initramfs'), 'w').close()
with open(os.path.join(kernel_dir,
'default-kernelopts-common.txt'), 'w') as f:
f.write('kernel specific options \n')
self.addCleanup(shutil.rmtree, '/tmp/qubes-test')
vm.kernel = 'dummy'
libvirt_xml = vm.create_config_file()
self.assertXMLEqual(lxml.etree.XML(libvirt_xml),
lxml.etree.XML(expected))
def test_600_libvirt_xml_pvh(self): def test_600_libvirt_xml_pvh(self):
expected = '''<domain type="xen"> expected = '''<domain type="xen">
<name>test-inst-test</name> <name>test-inst-test</name>

View File

@ -1983,6 +1983,25 @@ class QubesVM(qubes.vm.mix.net.NetVMMixin, qubes.vm.BaseVM):
return None return None
@property
def kernelopts_common(self):
'''Kernel options which should be used in addition to *kernelopts*
property.
This is specific to kernel (and initrd if any)
'''
if not self.kernel:
return ''
kernels_dir = self.storage.kernels_dir
kernelopts_path = os.path.join(kernels_dir,
'default-kernelopts-common.txt')
if os.path.exists(kernelopts_path):
with open(kernelopts_path) as f_kernelopts:
return f_kernelopts.read().rstrip('\n\r')
else:
return qubes.config.defaults['kernelopts_common']
# #
# helper methods # helper methods
# #

View File

@ -47,7 +47,7 @@
{% if vm.features.check_with_template('no-default-kernelopts', False) -%} {% if vm.features.check_with_template('no-default-kernelopts', False) -%}
<cmdline>{{ vm.kernelopts }}</cmdline> <cmdline>{{ vm.kernelopts }}</cmdline>
{% else -%} {% else -%}
<cmdline>root=/dev/mapper/dmroot ro nomodeset console=hvc0 rd_NO_PLYMOUTH rd.plymouth.enable=0 plymouth.enable=0 {{ vm.kernelopts }}</cmdline> <cmdline>{{ vm.kernelopts_common }}{{ vm.kernelopts }}</cmdline>
{% endif -%} {% endif -%}
{% endif %} {% endif %}
{% endblock %} {% endblock %}