qubes-doc/user/advanced-topics/managing-vm-kernels.rst
Marek Marczykowski-Górecki b93b3c571e
Convert to RST
2024-05-21 20:59:46 +02:00

499 lines
16 KiB
ReStructuredText
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

=====================
Managing qube kernels
=====================
By default, VMs kernels are provided by dom0. (See
:ref:`here <user/advanced-topics/how-to-install-software-in-dom0:kernel upgrade>` for
information about upgrading kernels in dom0.) This means that:
1. You can select the kernel version (using GUI VM Settings tool or
``qvm-prefs`` commandline tool);
2. You can modify kernel options (using ``qvm-prefs`` commandline tool);
3. You can **not** modify any of the above from inside a VM;
4. Installing additional kernel modules is cumbersome.
*Note* In the examples below, although the specific version numbers
might be old, the commands have been verified on R3.2 and R4.0 with
debian-9 and fedora-26 templates.
To select which kernel a given VM will use, you can either use Qubes
Manager (VM settings, advanced tab), or the ``qvm-prefs`` tool:
.. code:: bash
[user@dom0 ~]$ qvm-prefs -s my-appvm kernel
Missing kernel version argument!
Possible values:
1) default
2) none (kernels subdir in VM)
3) <kernel version>, one of:
- 3.18.16-3
- 3.18.17-4
- 3.19.fc20
- 3.18.10-2
[user@dom0 ~]$ qvm-prefs -s my-appvm kernel 3.18.17-4
[user@dom0 ~]$ qvm-prefs -s my-appvm kernel default
To check/change the default kernel you can either go to “Global
settings” in Qubes Manager, or use the ``qubes-prefs`` tool:
.. code:: bash
[user@dom0 ~]$ qubes-prefs
clockvm : sys-net
default-fw-netvm : sys-net
default-kernel : 3.18.17-4
default-netvm : sys-firewall
default-template : fedora-21
updatevm : sys-firewall
[user@dom0 ~]$ qubes-prefs -s default-kernel 3.19.fc20
To view kernel options, you can use the GUI VM Settings tool; to view
and change them, use ``qvm-prefs`` commandline tool:
.. code:: bash
[user@dom0 ~]$ qvm-prefs -g work kernelopts
nopat
[user@dom0 ~]$ qvm-prefs -s work kernelopts "nopat apparmor=1 security=apparmor"
Installing different kernel using Qubes kernel package
------------------------------------------------------
VM kernels are packages by Qubes team in ``kernel-qubes-vm`` packages.
Generally, the system will keep the three newest available versions. You
can list them with the ``rpm`` command:
.. code:: bash
[user@dom0 ~]$ rpm -qa 'kernel-qubes-vm*'
kernel-qubes-vm-3.18.10-2.pvops.qubes.x86_64
kernel-qubes-vm-3.18.16-3.pvops.qubes.x86_64
kernel-qubes-vm-3.18.17-4.pvops.qubes.x86_64
If you want a more recent version, you can check the
``qubes-dom0-unstable`` repository. There is also the
``kernel-latest-qubes-vm`` package which should provide a more recent
(non-LTS) kernel, but has received much less testing. As the names
suggest, keep in mind that those packages may be less stable than the
default ones.
To check available versions in the ``qubes-dom0-unstable`` repository:
.. code:: bash
[user@dom0 ~]$ sudo qubes-dom0-update --enablerepo=qubes-dom0-unstable --action=list kernel-qubes-vm
Using sys-firewall as UpdateVM to download updates for Dom0; this may take some time...
Running command on VM: 'sys-firewall'...
Loaded plugins: langpacks, post-transaction-actions, yum-qubes-hooks
Installed Packages
kernel-qubes-vm.x86_64 1000:3.18.10-2.pvops.qubes installed
kernel-qubes-vm.x86_64 1000:3.18.16-3.pvops.qubes installed
kernel-qubes-vm.x86_64 1000:3.18.17-4.pvops.qubes installed
Available Packages
kernel-qubes-vm.x86_64 1000:4.1.12-6.pvops.qubes qubes-dom0-unstable
No packages downloaded
Installed Packages
kernel-qubes-vm.x86_64 1000:3.18.10-2.pvops.qubes @anaconda/R3.0
kernel-qubes-vm.x86_64 1000:3.18.16-3.pvops.qubes @/kernel-qubes-vm-3.18.16-3.pvops.qubes.x86_64
kernel-qubes-vm.x86_64 1000:3.18.17-4.pvops.qubes @qubes-dom0-cached
Installing a new version from ``qubes-dom0-unstable`` repository:
.. code:: bash
[user@dom0 ~]$ sudo qubes-dom0-update --enablerepo=qubes-dom0-unstable kernel-qubes-vm
Using sys-firewall as UpdateVM to download updates for Dom0; this may take some time...
Running command on VM: 'sys-firewall'...
Loaded plugins: langpacks, post-transaction-actions, yum-qubes-hooks
Resolving Dependencies
(...)
===========================================================================================
Package Arch Version Repository Size
===========================================================================================
Installing:
kernel-qubes-vm x86_64 1000:4.1.12-6.pvops.qubes qubes-dom0-cached 40 M
Removing:
kernel-qubes-vm x86_64 1000:3.18.10-2.pvops.qubes @anaconda/R3.0 134 M
Transaction Summary
===========================================================================================
Install 1 Package
Remove 1 Package
Total download size: 40 M
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction (shutdown inhibited)
Installing : 1000:kernel-qubes-vm-4.1.12-6.pvops.qubes.x86_64 1/2
mke2fs 1.42.12 (29-Aug-2014)
This kernel version is used by at least one VM, cannot remove
error: %preun(kernel-qubes-vm-1000:3.18.10-2.pvops.qubes.x86_64) scriptlet failed, exit status 1
Error in PREUN scriptlet in rpm package 1000:kernel-qubes-vm-3.18.10-2.pvops.qubes.x86_64
Verifying : 1000:kernel-qubes-vm-4.1.12-6.pvops.qubes.x86_64 1/2
Verifying : 1000:kernel-qubes-vm-3.18.10-2.pvops.qubes.x86_64 2/2
Installed:
kernel-qubes-vm.x86_64 1000:4.1.12-6.pvops.qubes
Failed:
kernel-qubes-vm.x86_64 1000:3.18.10-2.pvops.qubes
Complete!
[user@dom0 ~]$
In the above example, it tries to remove the 3.18.10-2.pvops.qubes
kernel (to keep only three installed), but since some VM uses it, it
fails. Installation of the new package is unaffected by this event.
The newly installed package is set as the default VM kernel.
Installing different VM kernel based on dom0 kernel
---------------------------------------------------
It is possible to package a kernel installed in dom0 as a VM kernel.
This makes it possible to use a VM kernel which is not packaged by Qubes
team. This includes: * using a Fedora kernel package * using a
manually compiled kernel
To prepare such a VM kernel, you need to install the
``qubes-kernel-vm-support`` package in dom0 and also have matching
kernel headers installed (``kernel-devel`` package in the case of a
Fedora kernel package). You can install requirements using
``qubes-dom0-update``:
.. code:: bash
[user@dom0 ~]$ sudo qubes-dom0-update qubes-kernel-vm-support kernel-devel
Using sys-firewall as UpdateVM to download updates for Dom0; this may take some time...
Running command on VM: 'sys-firewall'...
Loaded plugins: langpacks, post-transaction-actions, yum-qubes-hooks
Package 1000:kernel-devel-4.1.9-6.pvops.qubes.x86_64 already installed and latest version
Resolving Dependencies
(...)
================================================================================
Package Arch Version Repository Size
================================================================================
Installing:
qubes-kernel-vm-support x86_64 3.1.2-1.fc20 qubes-dom0-cached 9.2 k
Transaction Summary
================================================================================
Install 1 Package
Total download size: 9.2 k
Installed size: 13 k
Is this ok [y/d/N]: y
Downloading packages:
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction (shutdown inhibited)
Installing : qubes-kernel-vm-support-3.1.2-1.fc20.x86_64 1/1
Creating symlink /var/lib/dkms/u2mfn/3.1.2/source ->
/usr/src/u2mfn-3.1.2
DKMS: add completed.
Verifying : qubes-kernel-vm-support-3.1.2-1.fc20.x86_64 1/1
Installed:
qubes-kernel-vm-support.x86_64 0:3.1.2-1.fc20
Complete!
Then you can call the ``qubes-prepare-vm-kernel`` tool to actually
package the kernel. The first parameter is kernel version (exactly as
seen by the kernel), the second one (optional) is short name. This is
visible in Qubes Manager and the ``qvm-prefs`` tool.
.. code:: bash
[user@dom0 ~]$ sudo qubes-prepare-vm-kernel 4.1.9-6.pvops.qubes.x86_64 4.1.qubes
--> Building files for 4.1.9-6.pvops.qubes.x86_64 in /var/lib/qubes/vm-kernels/4.1.qubes
---> Recompiling kernel module (u2mfn)
---> Generating modules.img
mke2fs 1.42.12 (29-Aug-2014)
---> Generating initramfs
--> Done.
Kernel files structure
----------------------
Kernel for a VM is stored in
``/var/lib/qubes/vm-kernels/KERNEL_VERSION`` directory
(``KERNEL_VERSION`` replaced with actual version). Qubes 4.x supports
the following files there:
- ``vmlinuz`` - kernel binary (may not be a Linux kernel)
- ``initramfs`` - initramfs for the kernel to load
- ``modules.img`` - ext4 filesystem image containing Linux kernel
modules (to be mounted at ``/lib/modules``); additionally it should
contain a copy of ``vmlinuz`` and ``initramfs`` in its root directory
(for loading by qemu inside stubdomain)
- ``default-kernelopts-common.txt`` - default kernel options, in
addition to those specified with ``kernelopts`` qube property (can be
disabled with ``no-default-kernelopts`` feature)
All the files besides ``vmlinuz`` and ``initramfs`` are optional in
Qubes R4.0 or newer.
Using kernel installed in the VM
--------------------------------
Both debian-9 and fedora-26 templates already have grub and related
tools preinstalled so if you want to use one of the distribution
kernels, all you need to do is clone either template to a new one, then:
.. code:: bash
qvm-prefs <clonetemplatename> virt_mode hvm
qvm-prefs <clonetemplatename> kernel ''
If youd like to use a different kernel than default, continue reading.
Installing kernel in Fedora VM
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Install whatever kernel you want. You need to also ensure you have the
``kernel-devel`` package for the same kernel version installed.
If you are using a distribution kernel package (``kernel`` package), the
initramfs and kernel modules may be handled automatically. If you are
using a manually built kernel, you need to handle this on your own. Take
a look at the ``dkms`` documentation, especially the
``dkms autoinstall`` command may be useful. If you did not see the
``kernel`` install rebuild your initramfs, or are using a manually built
kernel, you will need to rebuild it yourself. Replace the version
numbers in the example below with the ones appropriate to the kernel you
are installing:
.. code:: bash
sudo dracut -f /boot/initramfs-4.15.14-200.fc26.x86_64.img 4.15.14-200.fc26.x86_64
Once the kernel is installed, you need to setup ``grub2`` by running:
.. code:: bash
sudo grub2-install /dev/xvda
Finally, you need to create a GRUB configuration. You may want to adjust
some settings in ``/etc/default/grub``; for example, lower
``GRUB_TIMEOUT`` to speed up VM startup. Then, you need to generate the
actual configuration. In Fedora it can be done using the
``grub2-mkconfig`` tool:
.. code:: bash
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
You can safely ignore this error message:
.. code:: bash
grub2-probe: error: cannot find a GRUB drive for /dev/mapper/dmroot. Check your device.map
Then shutdown the VM.
**Notes:**
- You may also use ``PV`` mode instead of ``HVM`` but this is not
recommended for security purposes.
- If you require ``PV`` mode, install ``grub2-xen-pvh`` in dom0 and
change the templates kernel to ``pvgrub2-pvh``.
- Booting to a kernel inside the template is not supported under
``PVH``.
Installing kernel in Debian VM
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Distribution kernel
^^^^^^^^^^^^^^^^^^^
Apply the following instruction in a Debian template or in a Debian
standalone.
Using a distribution kernel package the initramfs and kernel modules
should be handled automatically.
Install distribution kernel image, kernel headers and the grub.
.. code:: bash
sudo apt install linux-image-amd64 linux-headers-amd64 grub2 qubes-kernel-vm-support
If you are doing that on a qube based on “Debian Minimal” template, a
grub gui will popup during the installation, asking you where you want
to install the grub loader. You must select /dev/xvda (check the box
using the space bar, and validate your choice with “Enter”.) If this
popup does not appear during the installation, you must manually setup
``grub2`` by running:
.. code:: bash
sudo grub-install /dev/xvda
You can safely ignore this error message:
``grub2-probe: error: cannot find a GRUB drive for /dev/mapper/dmroot. Check your device.map``
You may want to adjust some settings in ``/etc/default/grub`` (or better
``/etc/default/grub.d``). For example, lower ``GRUB_TIMEOUT`` to speed
up VM startup. You need to re-run ``sudo update-grub`` after making grub
configuration changes.
Then shutdown the VM.
Go to dom0 -> Qubes VM Manger -> right click on the VM -> Qube settings
-> Advanced
Depends on ``Virtualization`` mode setting:
- ``Virtualization`` mode ``PV``: Possible, however use of
``Virtualization`` mode ``PV`` mode is discouraged for security
purposes.
- If you require ``Virtualization`` mode ``PV`` mode, install
``grub2-xen-pvh`` in dom0. This can be done by running command
``sudo qubes-dom0-update pvgrub2-pvh`` in dom0.
- ``Virtualization`` mode ``PVH``: Possible.
- ``Virtualization`` mode ``HVM``: Possible.
The ``Kernel`` setting of the ``Virtualization`` mode setting:
- If ``Virtualization`` is set to ``PVH`` -> ``Kernel`` -> choose
``pvgrub2-pvh`` -> OK
- If ``Virtualization`` is set to ``PV`` -> ``Kernel`` -> choose
``pvgrub2`` -> OK
- If ``Virtualization`` is set to ``HVM`` -> ``Kernel`` -> choose
``none`` -> OK
Start the VM.
The process of using Qubes VM kernel with distribution kernel is
complete.
Custom kernel
^^^^^^^^^^^^^
Any kernel can be installed. Just make sure to install kernel headers as
well.
If you are building the kernel manually, do this using ``dkms`` and
``initramfs-tools``.
Run DKMS. Replace this with actual kernel version.
.. code:: bash
sudo dkms autoinstall -k <kernel-version>
For example.
.. code:: bash
sudo dkms autoinstall -k 4.19.0-6-amd64
Update initramfs.
.. code:: bash
sudo update-initramfs -u
The output should look like this:
.. code:: bash
$ sudo dkms autoinstall -k 3.16.0-4-amd64
u2mfn:
Running module version sanity check.
- Original module
- No original module exists within this kernel
- Installation
- Installing to /lib/modules/3.16.0-4-amd64/updates/dkms/
depmod....
DKMS: install completed.
$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-3.16.0-4-amd64
Troubleshooting
^^^^^^^^^^^^^^^
In case of problems, visit the :ref:`VM Troubleshooting guide <user/troubleshooting/vm-troubleshooting:vm kernel troubleshooting>` to learn
how to access the VM console, view logs and fix a VM kernel
installation.