diff --git a/dom0/qvm-core/qubes.py b/dom0/qvm-core/qubes.py index a61a62ff..15c398d6 100755 --- a/dom0/qvm-core/qubes.py +++ b/dom0/qvm-core/qubes.py @@ -881,9 +881,15 @@ class QubesVm(object): return args + @property + def uses_custom_config(self): + return self.conf_file != self.absolute_path(self.name + ".conf", None) + def create_config_file(self, file_path = None, source_template = None, prepare_dvm = False): if file_path is None: file_path = self.conf_file + if self.uses_custom_config: + return if source_template is None: source_template = self.template @@ -1622,19 +1628,6 @@ class QubesTemplateVm(QubesVm): return True - def start(self, debug_console = False, verbose = False, preparing_dvm=False): - if dry_run: - return - - self.reset_volatile_storage(verbose=verbose) - - if not self.updateable: - raise QubesException ("Cannot start Template VM that is marked \"nonupdatable\"") - - # TODO?: check if none of running appvms are outdated - - return super(QubesTemplateVm, self).start(debug_console=debug_console, verbose=verbose) - def reset_volatile_storage(self, verbose = False): assert not self.is_running(), "Attempt to clean volatile image of running Template VM!" diff --git a/dom0/qvm-core/qubesutils.py b/dom0/qvm-core/qubesutils.py index 322f3ae8..4089b35f 100644 --- a/dom0/qvm-core/qubesutils.py +++ b/dom0/qvm-core/qubesutils.py @@ -119,16 +119,23 @@ def block_name_to_majorminor(name): major = 0 minor = 0 + dXpY_style = False name_match = re.match(r"([a-z]+)([a-z])([0-9]*)", name) if not name_match: - raise QubesException("Invalid device name: %s" % name) + name_match = re.match(r"([a-z]+)([0-9]*)(?:p([0-9]+)?", name) + if not name_match: + raise QubesException("Invalid device name: %s" % name) + else: + dXpY_style = True disk = True if name_match.group(1) == "xvd": major = 202 elif name_match.group(1) == "sd": major = 8 + elif name_match.group(1) == "mmcblk": + major = 179 elif name.startswith("scd"): disk = False major = 11 @@ -143,7 +150,10 @@ def block_name_to_majorminor(name): return (0, 0) if disk: - minor = (ord(name_match.group(2))-ord('a')) * 16 + if dXpY_style: + minor = int(name_match.group(2))*8 + else: + minor = (ord(name_match.group(2))-ord('a')) * 16 else: minor = 0 if name_match.group(3): diff --git a/dom0/qvm-tools/qvm-start b/dom0/qvm-tools/qvm-start index 5ec3c1c5..9b4f5995 100755 --- a/dom0/qvm-tools/qvm-start +++ b/dom0/qvm-tools/qvm-start @@ -41,6 +41,8 @@ def main(): help="Temporarily attach specified drive as CD/DVD") parser.add_option ("--dvm", action="store_true", dest="preparing_dvm", default=False, help="Do actions necessary when preparing DVM image") + parser.add_option ("--custom-config", action="store", dest="custom_config", default=None, + help="Use custom Xen config instead of Qubes-generated one") (options, args) = parser.parse_args () if (len (args) != 1): @@ -64,6 +66,9 @@ def main(): print >> sys.stderr, "This VM does not support attaching drives" exit (1) + if options.custom_config: + vm.conf_file = options.custom_config + try: vm.verify_files() xid = vm.start(debug_console=options.debug_console, verbose=options.verbose, preparing_dvm=options.preparing_dvm)