From 90393c33f2c2bb7f2c8b5f41dd0ef151da4d5d61 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marek=20Marczykowski-G=C3=B3recki?= Date: Thu, 30 Jul 2015 14:03:36 +0200 Subject: [PATCH] core: add offline mode to qvm-create, qvm-prefs This is required to create VMs in process of building Live system, where libvirt isn't running. Additionally there is no udev in the build environment, so needs to manually create /dev/loop*p* based on sysfs info. --- core-modules/000QubesVm.py | 7 ++++++- core-modules/006QubesProxyVm.py | 2 ++ linux/aux-tools/prepare-volatile-img.sh | 12 ++++++++++++ qvm-tools/qubes-prefs | 4 ++++ qvm-tools/qvm-create | 8 ++++++++ qvm-tools/qvm-prefs | 8 ++++++++ 6 files changed, 40 insertions(+), 1 deletion(-) diff --git a/core-modules/000QubesVm.py b/core-modules/000QubesVm.py index c0c52671..c49e178e 100644 --- a/core-modules/000QubesVm.py +++ b/core-modules/000QubesVm.py @@ -848,6 +848,8 @@ class QubesVm(object): return True def is_running(self): + if vmm.offline_mode: + return False try: if self.libvirt_domain.isActive(): return True @@ -1192,7 +1194,10 @@ class QubesVm(object): shutil.copy(self.label.icon_path, self.icon_path) # Make sure that we have UUID allocated - self._update_libvirt_domain() + if not vmm.offline_mode: + self._update_libvirt_domain() + else: + self.uuid = uuid.uuid4() # fire hooks for hook in self.hooks_create_on_disk: diff --git a/core-modules/006QubesProxyVm.py b/core-modules/006QubesProxyVm.py index 88a4781b..b5ae20f8 100644 --- a/core-modules/006QubesProxyVm.py +++ b/core-modules/006QubesProxyVm.py @@ -58,6 +58,8 @@ class QubesProxyVm(QubesNetVm): def _set_netvm(self, new_netvm): old_netvm = self.netvm super(QubesProxyVm, self)._set_netvm(new_netvm) + if vmm.offline_mode: + return if self.netvm is not None: self.netvm.add_external_ip_permission(self.get_xid()) self.write_netvm_domid_entry() diff --git a/linux/aux-tools/prepare-volatile-img.sh b/linux/aux-tools/prepare-volatile-img.sh index 25d9a600..d41a3ce4 100755 --- a/linux/aux-tools/prepare-volatile-img.sh +++ b/linux/aux-tools/prepare-volatile-img.sh @@ -29,6 +29,18 @@ EOF loopdev=`losetup -f --show --partscan "$FILENAME"` udevadm settle +created= +if [ ! -e ${loopdev}p1 ]; then + # device wasn't created automatically, probably udev isn't running; + # create devs manually + for partdev in /sys/block/$(basename ${loopdev})/loop*p*; do + mknod /dev/$(basename ${partdev}) b $(cat ${partdev}/dev | tr : ' ') + done + created=yes +fi mkswap -f ${loopdev}p1 > /dev/null +if [ "$created" = "yes" ]; then + rm -f ${loopdev}p* +fi losetup -d ${loopdev} || : chown --reference `dirname "$FILENAME"` "$FILENAME" diff --git a/qvm-tools/qubes-prefs b/qvm-tools/qubes-prefs index 41a365be..2f6a38aa 100755 --- a/qvm-tools/qubes-prefs +++ b/qvm-tools/qubes-prefs @@ -28,6 +28,8 @@ from optparse import OptionParser import subprocess import os import sys +from qubes.qubes import vmm + def handle_vm(vms, label, new_value = None): functions = { # label: [ getter, setter ], @@ -116,6 +118,8 @@ def main(): else: options.do_set = True + vmm.offline_mode = True + if options.do_set: qvm_collection = QubesVmCollection() qvm_collection.lock_db_for_writing() diff --git a/qvm-tools/qvm-create b/qvm-tools/qvm-create index 1e2ac66a..dc414cf9 100755 --- a/qvm-tools/qvm-create +++ b/qvm-tools/qvm-create @@ -29,6 +29,8 @@ import subprocess import re import os import sys +from qubes.qubes import vmm + def main(): usage = "usage: %prog [options] " @@ -55,6 +57,9 @@ def main(): help="Initial memory size (in MB)") parser.add_option ("-c", "--vcpus", dest="vcpus", default=None, help="VCPUs count") + parser.add_option ("--offline-mode", dest="offline_mode", + action="store_true", default=False, + help="Offline mode") parser.add_option ("-i", "--internal", action="store_true", dest="internal", default=False, help="Create VM for internal use only (hidden in qubes-manager, no appmenus)") parser.add_option ("--force-root", action="store_true", dest="force_root", default=False, @@ -118,6 +123,9 @@ def main(): print >> sys.stderr, "File specified as root.img does not exists" exit (1) + if options.offline_mode: + vmm.offline_mode = True + qvm_collection = QubesVmCollection() qvm_collection.lock_db_for_writing() qvm_collection.load() diff --git a/qvm-tools/qvm-prefs b/qvm-tools/qvm-prefs index 8eac355d..78d09b87 100755 --- a/qvm-tools/qvm-prefs +++ b/qvm-tools/qvm-prefs @@ -30,6 +30,8 @@ import subprocess import os import sys import re +from qubes.qubes import vmm + def do_list(vm): label_width = 19 @@ -541,6 +543,9 @@ def main(): parser.add_option("--force-root", action="store_true", dest="force_root", default=False, help="Force to run, even with root privileges") + parser.add_option ("--offline-mode", dest="offline_mode", + action="store_true", default=False, + help="Offline mode") (options, args) = parser.parse_args () if (len (args) < 1): @@ -560,6 +565,9 @@ def main(): "the same time!" exit(1) + if options.offline_mode: + vmm.offline_mode = True + if options.do_set: qvm_collection = QubesVmCollection() qvm_collection.lock_db_for_writing()