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()