diff --git a/qubes/storage/__init__.py b/qubes/storage/__init__.py
index a39d25a0..ae2f404e 100644
--- a/qubes/storage/__init__.py
+++ b/qubes/storage/__init__.py
@@ -44,8 +44,7 @@ class VMStorage(object):
in mind.
''' # pylint: disable=abstract-class-little-used
- def __init__(self, vm, private_img_size=None, root_img_size=None,
- modules_img=None, modules_img_rw=False):
+ def __init__(self, vm, private_img_size=None, root_img_size=None):
#: Domain for which we manage storage
self.vm = vm
@@ -60,10 +59,6 @@ class VMStorage(object):
if root_img_size is not None \
else qubes.config.defaults['root_img_size']
- # For now compute this path still in QubesVm
- self.modules_img = modules_img
- self.modules_img_rw = modules_img_rw
-
#: Additional drive (currently used only by HVM)
self.drive = None
@@ -87,6 +82,36 @@ class VMStorage(object):
return self.abspath(qubes.config.vm_files['volatile_img'])
+ @property
+ def kernels_dir(self):
+ '''Directory where kernel resides.
+
+ If :py:attr:`self.vm.kernel` is :py:obj:`None`, the this points inside
+ :py:attr:`self.vm.dir_path`
+ '''
+ return os.path.join(qubes.config.system_path['qubes_base_dir'],
+ qubes.config.system_path['qubes_kernels_base_dir'], self.vm.kernel) \
+ if self.vm.kernel is not None \
+ else os.path.join(self.vm.dir_path,
+ qubes.config.vm_files['kernels_subdir'])
+
+
+ @property
+ def modules_img(self):
+ '''Path to image with modules.
+
+ Depending on domain, this may be global or inside domain's dir.
+ '''
+ return os.path.join(self.kernels_dir, 'modules.img')
+
+
+ @property
+ def modules_img_rw(self):
+ ''':py:obj:`True` if module image should be mounted RW, :py:obj:`False`
+ otherwise.'''
+ return self.vm.kernel is None
+
+
def abspath(self, path, rel=None):
'''Make absolute path.
diff --git a/qubes/storage/xen.py b/qubes/storage/xen.py
index ac6455e8..fcc54fc1 100644
--- a/qubes/storage/xen.py
+++ b/qubes/storage/xen.py
@@ -102,6 +102,8 @@ class XenVMStorage(qubes.storage.VMStorage):
args['volatiledev'] = self._format_disk_dev(self.volatile_img,
self.volatile_dev)
+ args['kerneldir'] = self.kernels_dir
+
if self.modules_img is not None:
args['otherdevs'] = self._format_disk_dev(self.modules_img,
self.modules_dev, rw=self.modules_img_rw)
diff --git a/qubes/vm/__init__.py b/qubes/vm/__init__.py
index 03887041..87780550 100644
--- a/qubes/vm/__init__.py
+++ b/qubes/vm/__init__.py
@@ -354,8 +354,6 @@ class BaseVM(qubes.PropertyHolder):
args = {}
args['name'] = self.name
- if hasattr(self, 'kernels_dir'):
- args['kerneldir'] = self.kernels_dir
args['uuid'] = str(self.uuid)
args['vmdir'] = self.dir_path
args['pcidevs'] = ''.join(lxml.etree.tostring(self.lvxml_pci_dev(dev))
diff --git a/qubes/vm/qubesvm.py b/qubes/vm/qubesvm.py
index a94cdf27..7b681a00 100644
--- a/qubes/vm/qubesvm.py
+++ b/qubes/vm/qubesvm.py
@@ -370,20 +370,6 @@ class QubesVM(qubes.vm.BaseVM):
return self.storage.volatile_img
- @property
- def kernels_dir(self):
- '''Directory where kernel resides.
-
- If :py:attr:`self.kernel` is :py:obj:`None`, the this points inside
- :py:attr:`self.dir_path`
- '''
- return os.path.join(qubes.config.system_path['qubes_base_dir'],
- qubes.config.system_path['qubes_kernels_base_dir'], self.kernel) \
- if self.kernel is not None \
- else os.path.join(self.dir_path,
- qubes.config.vm_files['kernels_subdir'])
-
-
# XXX shouldn't this go elsewhere?
@property
def updateable(self):
@@ -525,12 +511,6 @@ class QubesVM(qubes.vm.BaseVM):
# Initialize VM image storage class
self.storage = qubes.storage.get_storage(self)
- # XXX should be moved to defaults in storage class
-# if self.kernels_dir is not None: # it is None for AdminVM
-# self.storage.modules_img = os.path.join(self.kernels_dir,
-# 'modules.img')
-# self.storage.modules_img_rw = self.kernel is None
-
# fire hooks
self.fire_event('domain-init')
@@ -1102,6 +1082,7 @@ class QubesVM(qubes.vm.BaseVM):
p.communicate(input=self.default_user)
+ # TODO move to storage
def create_on_disk(self, source_template=None):
'''Create files needed for VM.
@@ -1117,7 +1098,7 @@ class QubesVM(qubes.vm.BaseVM):
self.storage.create_on_disk(source_template)
if self.updateable:
- kernels_dir = source_template.kernels_dir
+ kernels_dir = source_template.storage.kernels_dir
self.log.info(
'Copying the kernel (unset kernel to use it): {0}'.format(
kernels_dir))
@@ -1125,8 +1106,7 @@ class QubesVM(qubes.vm.BaseVM):
os.mkdir(self.dir_path + '/kernels')
for filename in ("vmlinuz", "initramfs", "modules.img"):
shutil.copy(os.path.join(kernels_dir, filename),
- os.path.join(self.dir_path,
- qubes.config.vm_files["kernels_subdir"], filename))
+ os.path.join(self.storage.kernels_dir, filename))
self.log.info('Creating icon symlink: {} -> {}'.format(
self.icon_path, self.label.icon_path))
@@ -1556,6 +1536,7 @@ class QubesVM(qubes.vm.BaseVM):
return qubes.utils.get_disk_usage(self.dir_path)
+ # TODO move to storage
def verify_files(self):
'''Verify that files accessed by this machine are sane.
@@ -1564,14 +1545,16 @@ class QubesVM(qubes.vm.BaseVM):
self.storage.verify_files()
- if not os.path.exists(os.path.join(self.kernels_dir, 'vmlinuz')):
+ if not os.path.exists(
+ os.path.join(self.storage.kernels_dir, 'vmlinuz')):
raise qubes.QubesException('VM kernel does not exist: {0}'.format(
- os.path.join(self.kernels_dir, 'vmlinuz')))
+ os.path.join(self.storage.kernels_dir, 'vmlinuz')))
- if not os.path.exists(os.path.join(self.kernels_dir, 'initramfs')):
+ if not os.path.exists(
+ os.path.join(self.storage.kernels_dir, 'initramfs')):
raise qubes.QubesException(
'VM initramfs does not exist: {0}'.format(
- os.path.join(self.kernels_dir, 'initramfs')))
+ os.path.join(self.storage.kernels_dir, 'initramfs')))
self.fire_event('verify-files')
diff --git a/vm-config/xen-vm-template-hvm.xml b/vm-config/xen-vm-template-hvm.xml
index 62ccc5ed..836343e6 100644
--- a/vm-config/xen-vm-template-hvm.xml
+++ b/vm-config/xen-vm-template-hvm.xml
@@ -9,6 +9,7 @@
hvmloader
+
{disable_network1}-net lwip,client_ip={ip},server_ip={dns2},dns={dns1},gw={gateway},netmask={netmask}{disable_network2}