mirror of
https://github.com/QubesOS/qubes-doc.git
synced 2024-12-18 12:14:42 -05:00
120 lines
4.2 KiB
ReStructuredText
120 lines
4.2 KiB
ReStructuredText
=========================
|
||
Disposable implementation
|
||
=========================
|
||
|
||
|
||
**Note: The content below applies to Qubes R3.2.**
|
||
|
||
DisposableVM image preparation
|
||
------------------------------
|
||
|
||
|
||
DisposableVM is not started like other VMs, by executing equivalent of
|
||
``xl create`` - it would be too slow. Instead, DisposableVM are started
|
||
by restore from a savefile.
|
||
|
||
Preparing a savefile is done by
|
||
``/usr/lib/qubes/qubes_prepare_saved_domain.sh`` script. It takes two
|
||
mandatory arguments, appvm name (APPVM) and the savefile name, and
|
||
optional path to “prerun” script. The script executes the following
|
||
steps:
|
||
|
||
1. APPVM is started by ``qvm-start``
|
||
|
||
2. xenstore key ``/local/domain/appvm_domain_id/qubes_save_request`` is
|
||
created
|
||
|
||
3. if prerun script was specified, copy it to ``qubes_save_script``
|
||
xenstore key
|
||
|
||
4. wait for the ``qubes_used_mem`` key to appear
|
||
|
||
5. (in APPVM) APPVM boots normally, up to the point in
|
||
``/etc/init.d/qubes_core`` script when the presence of
|
||
``qubes_save_request`` key is tested. If it exists, then
|
||
|
||
1. (in APPVM) if exists, prerun script is retrieved from the
|
||
respective xenstore key and executed. This preloads filesystem
|
||
cache with useful applications, so that they will start faster.
|
||
|
||
2. (in APPVM) the amount of used memory is stored to
|
||
``qubes_used_mem`` xenstore key
|
||
|
||
3. (in APPVM) busy-waiting for ``qubes_restore_complete`` xenstore
|
||
key to appear
|
||
|
||
|
||
|
||
6. when ``qubes_used_mem`` key appears, the domain memory is reduced to
|
||
this amount, to make the savefile smaller.
|
||
|
||
7. APPVM private image is detached
|
||
|
||
8. the domain is saved via ``xl save``
|
||
|
||
9. the COW file volatile.img (cow for root fs and swap) is packed to
|
||
``saved_cows.tar`` archive
|
||
|
||
|
||
|
||
The ``qubes_prepare_saved_domain.sh`` script is lowlevel. It is usually
|
||
called by ``qvm-create-default-dvm`` script, that takes care of creating
|
||
a special AppVM (named template_name-dvm) to be passed to
|
||
``qubes_prepare_saved_domain.sh``, as well as copying the savefile to
|
||
/dev/shm (the latter action is not done if the
|
||
``/var/lib/qubes/dvmdata/dont_use_shm`` file exists).
|
||
|
||
Restoring a DisposableVM from the savefile
|
||
------------------------------------------
|
||
|
||
|
||
Normally, disposable VM is created when qubes rpc request with target
|
||
*$dispvm* is received. Then, as a part of rpc connection setup, the
|
||
``qfile-daemon-dvm`` program is executed; it executes
|
||
``/usr/lib/qubes/qubes_restore`` program. It is crucial that this
|
||
program executes quickly, to make DisposableVM creation overhead
|
||
bearable for the user. Its main steps are:
|
||
|
||
1. modify the savefile so that the VM name, VM UUID, MAC address and IP
|
||
address are unique
|
||
|
||
2. restore the COW files from the ``saved_cows.tar``
|
||
|
||
3. create the ``/var/run/qubes/fast_block_attach`` file, whose presence
|
||
tells the ``/etc/xen/scripts/block`` script to bypass some redundant
|
||
checks and execute as fast as possible.
|
||
|
||
4. execute ``xl restore`` in order to restore a domain.
|
||
|
||
5. create the same xenstore keys as normally created when AppVM boots
|
||
(e.g. ``qubes_ip``)
|
||
|
||
6. create the ``qubes_restore_complete`` xenstore key. This allows the
|
||
boot process in DisposableVM to continue.
|
||
|
||
|
||
|
||
The actual passing of files between AppVM and a DisposableVM is
|
||
implemented via qubes rpc.
|
||
|
||
Validating the DisposableVM savefile
|
||
------------------------------------
|
||
|
||
|
||
DisposableVM savefile contains references to template rootfs and to COW
|
||
files. The COW files are restored before each DisposableVM start, so
|
||
they cannot change. On the other hand, if templateVM is started, the
|
||
template rootfs will change, and it may not be coherent with the COW
|
||
files.
|
||
|
||
Therefore, the check for template rootfs modification time being older
|
||
than DisposableVM savefile modification time is required. It is done in
|
||
``qfilexchgd`` daemon, just before restoring DisposableVM. If necessary,
|
||
an attempt is made to recreate the DisposableVM savefile, using the last
|
||
template used (or default template, if run for the first time) and the
|
||
default prerun script, residing at
|
||
``/var/lib/qubes/vm-templates/templatename/dispvm_prerun.sh``.
|
||
Unfortunately, the prerun script takes a lot of time to execute -
|
||
therefore, after template rootfs modification, the next DisposableVM
|
||
creation can be longer by about 2.5 minutes.
|