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}