From 3cf1af032151a423efd272d6624098ce97549a5e Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Wed, 31 Aug 2011 20:34:56 +0200 Subject: [PATCH] dom0: implement custom kernelopts (#323) --- dom0/qvm-core/qubes.py | 30 ++++++++++++++++++++++-------- dom0/qvm-tools/qvm-prefs | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 8 deletions(-) diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index d1a1e1f6..43e2b40f 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -74,6 +74,9 @@ default_kernels_subdir = "kernels" default_firewall_conf_file = "firewall.xml" default_memory = 400 default_servicevm_vcpus = 1 +default_kernelopts = "" +# TODO: change to iommu=soft when we migrate to pvops in domU +default_kernelopts_pcidevs = "swiotlb=force pci=nomsi" qubes_whitelisted_appmenus = 'whitelisted-appmenus.list' @@ -200,7 +203,9 @@ class QubesVm(object): internal = False, vcpus = None, kernel = None, - uses_default_kernel = True): + uses_default_kernel = True, + kernelopts = "", + uses_default_kernelopts = True): assert qid < qubes_max_qid, "VM id out of bounds!" @@ -312,6 +317,15 @@ class QubesVm(object): else: self.vcpus = vcpus + self.uses_default_kernelopts = uses_default_kernelopts + if self.uses_default_kernelopts: + if len(self.pcidevs) > 0: + self.kernelopts = default_kernelopts_pcidevs + else: + self.kernelopts = default_kernelopts + else: + self.kernelopts = kernelopts + # Internal VM (not shown in qubes-manager, doesn't create appmenus entries self.internal = internal @@ -665,7 +679,7 @@ class QubesVm(object): args['privatedev'] = "'script:file:{dir}/private.img,xvdb,w',".format(dir=self.dir_path) args['volatiledev'] = "'script:file:{dir}/volatile.img,xvdc,w',".format(dir=self.dir_path) args['otherdevs'] = "'script:file:{dir}/modules.img,xvdd,r',".format(dir=self.kernels_dir) - args['kernelopts'] = '' + args['kernelopts'] = self.kernelopts return args @@ -1033,6 +1047,8 @@ class QubesVm(object): attrs["internal"] = str(self.internal) attrs["uses_default_kernel"] = str(self.uses_default_kernel) attrs["kernel"] = str(self.kernel) + attrs["uses_default_kernelopts"] = str(self.uses_default_kernelopts) + attrs["kernelopts"] = str(self.kernelopts) return attrs def create_xml_element(self): @@ -1343,11 +1359,6 @@ class QubesNetVm(QubesVm): assert lo >= 1 and lo <= 254, "Wrong IP address for VM" return self.dispnetprefix + "{0}".format(lo) - def get_config_params(self, source_template=None): - args = super(QubesNetVm, self).get_config_params(source_template) - args['kernelopts'] = ' swiotlb=force pci=nomsi' - return args - def create_xenstore_entries(self, xid): if dry_run: return @@ -2007,7 +2018,7 @@ class QubesVmCollection(dict): "private_img", "root_img", "template_qid", "installed_by_rpm", "updateable", "internal", "uses_default_netvm", "label", "memory", "vcpus", "pcidevs", - "maxmem", "kernel", "uses_default_kernel" ) + "maxmem", "kernel", "uses_default_kernel", "kernelopts", "uses_default_kernel" ) for attribute in common_attr_list: kwargs[attribute] = element.get(attribute) @@ -2055,6 +2066,9 @@ class QubesVmCollection(dict): kwargs["kernel"]=None # for other cases - generic assigment is ok + if "uses_default_kernelopts" in kwargs: + kwargs["uses_default_kernelopts"] = True if kwargs["uses_default_kernelopts"] == "True" else False + return kwargs def set_netvm_dependency(self, element): diff --git a/dom0/qvm-tools/qvm-prefs b/dom0/qvm-tools/qvm-prefs index df4af98e..bb50a1a6 100755 --- a/dom0/qvm-tools/qvm-prefs +++ b/dom0/qvm-tools/qvm-prefs @@ -61,6 +61,10 @@ def do_list(vm): print fmt.format ("kernel", "%s (default)" % vm.kernel) else: print fmt.format ("kernel", vm.kernel) + if vm.uses_default_kernelopts: + print fmt.format ("kernelopts", "%s (default)" % vm.kernelopts) + else: + print fmt.format ("kernelopts", vm.kernelopts) def set_label(vms, vm, args): @@ -262,6 +266,25 @@ def set_vcpus(vms, vm, args): vm.vcpus = vcpus return True +def set_kernelopts(vms, vm, args): + if len (args) != 1: + print "Missing kernel opts argument!" + + if len (args) != 1: + print "Missing kernel opts argument!" + print "Possible values:" + print "1) default" + print "2) " + return False + + if args[0] == 'default': + vm.uses_default_kernelopts = True + else: + vm.uses_default_kernelopts = False + vm.kernelopts = args[0] + + return True + properties = { "updateable": set_updateable, "nonupdateable": set_nonupdateable, @@ -273,6 +296,7 @@ properties = { "kernel" : set_kernel, "template" : set_template, "vcpus" : set_vcpus, + "kernelopts": set_kernelopts, }