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.
This commit is contained in:
Marek Marczykowski-Górecki 2015-07-30 14:03:36 +02:00
parent 8f862cdf69
commit 90393c33f2
No known key found for this signature in database
GPG Key ID: 063938BA42CFA724
6 changed files with 40 additions and 1 deletions

View File

@ -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:

View File

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

View File

@ -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"

View File

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

View File

@ -29,6 +29,8 @@ import subprocess
import re
import os
import sys
from qubes.qubes import vmm
def main():
usage = "usage: %prog [options] <vm-name>"
@ -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()

View File

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