Blog background

Wie man Qubes OS VMs über die Kommandozeile erstellt

Wie man Qubes OS VMs auf der Kommandozeile erstellt mit den Qubes-Verwaltungstools qvm-create, qvm-clone, qvm-prefs, qubes-prefs, qvm-run und qvm-volume

Dieser Blogpost wurde von einer Maschine aus dem Englischen übersetzt. Die Originalversion finden Sie hier: How to Create Qubes OS VMs Using the Command Line

Bitte kontaktieren Sie uns , wenn etwas nicht klar beschrieben ist, nicht funktioniert, falsch erscheint oder wenn Sie Unterstützung benötigen.

Dieses Tutorial erklärt, wie man Qubes OS VMs auf der Kommandozeile mit den Qubes-Verwaltungstools qvm-create, qvm-clone, qvm-prefs, qubes-prefs, qvm-run und qvm-volume erstellt.

Es erklärt detailliert, wie man die verschiedenen Klassen von Qubes OS VMs erstellt, nämlich TemplateVMs, AppVMs, DispVMs und StandaloneVMs, wie man TemplateVMs durch Installation und Konfiguration von Software anpasst, wie Root- und Private-Disks für jeden VM-Typ verwendet und geklont werden und wie verschiedene Qubes-Prefs verwendet werden können, um die interne Nutzung und das Verhalten von VMs in Qubes zu modifizieren.

Inhaltsverzeichnis

Verschiedene VM-Klassen in Qubes

In Qubes OS läuft jede Anwendung oder Gruppe ähnlicher Anwendungen in ihrer eigenen virtuellen Maschine (VM). Dies bietet robuste Sicherheit durch Kompartimentierung. Dieser Blogpost stellt die verschiedenen Klassen von VMs in Qubes OS vor und führt Sie durch den Prozess der Erstellung jedes Typs mit den Qubes-Kommandozeilen-VM-Verwaltungstools.

Qubes OS kategorisiert VMs in mehrere Klassen:

  • TemplateVM
    ist “einfach eine VM”, kann aber nur für die Erstellung von AppVMs oder StandaloneVMs verwendet werden
  • StandaloneVM
    ist eine Kopie einer TemplateVM, die wie eine reguläre VM verwendet werden kann
  • AppVM
    verwendet einen Disk-Snapshot ihrer TemplateVM beim Ausführen und hat persistente Disks für spezielle Verzeichnisse wie /home/ , verwirft aber Änderungen an allen anderen Verzeichnissen beim Herunterfahren
  • DispVM (Disposable VM)
    ist ein Snapshot einer AppVM, der alle Daten beim Herunterfahren verwirft

Für zusätzliche Informationen siehe das Qubes OS Dokumentations-Glossar.

Die VM-Klasse auf der Kommandozeile anzeigen

Sie können die Klasse einer VM mit folgendem Befehl anzeigen. In diesem Beispiel ist die Klasse der VM “debian-12-xfce”, die standardmäßig mit Qubes 4.2 installiert wird, “TemplateVM”. Dieses Template enthält Debian und eine große Auswahl installierter Anwendungen, wie gnome-terminal, firefox, thunderbird und so weiter.

qvm-ls debian-12-xfce
NAME            STATE    CLASS       LABEL  TEMPLATE  NETVM
debian-12-xfce  Running  TemplateVM  black  -         -

Die work-VM, die der Qubes OS Installer standardmäßig erstellt, ist eine AppVM, die die TemplateVM “fedora-39-xfce” verwendet. Sie können Firefox in der work-VM starten, und ihre Änderungen unterhalb des /home/-Verzeichnisses, zum Beispiel beim Speichern eines Lesezeichens in Firefox oder beim Herunterladen einer Datei nach ~/Downloads/, sind persistent. Wenn Sie etwas außerhalb der Verzeichnisse /home/, /rw/ oder /usr/local/ in einer AppVM speichern, gehen die Änderungen beim Herunterfahren der VM verloren.

qvm-ls work
NAME  STATE    CLASS  LABEL  TEMPLATE        NETVM
work  Running  AppVM  blue   fedora-39-xfce  sys-firewall

AppVMs können auch als Templates für Disposable-VMs dienen. Disposable-VMs bewahren keine Änderungen über Neustarts hinweg, unabhängig davon, in welchem Verzeichnis Sie Dateien speichern oder ändern:

qvm-ls sys-net
NAME         STATE    CLASS   LABEL   TEMPLATE         NETVM
sys-net      Running  DispVM  purple  fedora-39-xfce   -

StandaloneVMs sind Kopien von TemplateVMs. Nach ihrer Erstellung haben sie selbst kein Template mehr, und alle Änderungen unterhalb aller Verzeichnisse werden persistent gespeichert. Es ist im Grunde nur eine normale VM.

qvm-ls code-playground
NAME             STATE    CLASS         LABEL  TEMPLATE  NETVM
code-playground  Running  StandaloneVM  green  -         sys-firewall

Eine neue TemplateVM erstellen

Beim Erstellen neuer VMs in Qubes OS beginnt alles mit der Template-VM. In den meisten Fällen können Sie einfach die Standard-Templates debian-12-xfce verwenden, die bereits eine große Anzahl von Paketen enthalten.

Es wird DRINGEND empfohlen, die Standard-Template-VMs nicht zu modifizieren, außer für apt-Sicherheitsupdates. Wenn den Standard-Templates ein Paket fehlt, das Sie benötigen, sollten Sie eine neue Template-VM erstellen. Eine neue Template-VM wird erstellt, indem eine Kopie einer vorhandenen Template-VM erstellt wird.

Zusätzliche Templates installieren

Die Template-VMs “debian-12-xfce” und “fedora-39-xfce” sind standardmäßig auf Qubes OS installiert.

Wenn Sie kleinere Images möchten, die nur die gewünschte Software enthalten, können Sie mit dem minimalen Debian-Image beginnen, das mit folgendem Befehl installiert werden kann:

sudo qubes-dom0-update --enablerepo=qubes-templates-itl-testing qubes-template-debian-12-minimal

Sie können alle verfügbaren Templates in der Qubes OS Dokumentation zu Templates einsehen.

Eine vorhandene TemplateVM klonen

Angenommen, wir möchten eine VM erstellen, um Firefox auszuführen. Klonen Sie eine vorhandene Template-VM, um eine neue VM namens template-firefox zu erstellen:

qvm-clone debian-12-minimal template-firefox

qvm-prefs für die neue TemplateVM setzen

Qubes-Prefs (Präferenzen) sind Konfigurationseinstellungen, die das Verhalten und die Eigenschaften von virtuellen Maschinen in Qubes OS definieren. Diese Einstellungen steuern verschiedene Aspekte wie Netzwerkoptionen, verfügbaren Speicher, Festplattengrößen und so weiter.

Alle Prefs einer TemplateVM anzeigen

Sie können alle Prefs einer VM mit dem qvm-prefs-Tool anzeigen:

qvm-prefs template-firefox
audiovm             D  dom0
autostart           D  False
backup_timestamp    U
debug               D  False
default_dispvm      D  default-dvm
default_user        D  user
dns                 D  10.139.1.1 10.139.1.2
gateway             D
gateway6            D
guivm               D  dom0
icon                D  templatevm-orange
include_in_backups  D  True
installed_by_rpm    D  False
ip                  D  10.137.0.13
ip6                 D
kernel              D  6.6.29-1.fc37
kernelopts          D  swiotlb=2048
keyboard_layout     D  us++
klass               D  TemplateVM
label               -  orange
mac                 D  00:16:3e:5e:6c:00
management_dispvm   D  default-mgmt-dvm
maxmem              -  4096
memory              -  1024
name                -  template-firefox
netvm               -  sys-firewall
provides_network    D  False
qid                 -  13
qrexec_timeout      D  60
shutdown_timeout    D  60
start_time          D
stubdom_mem         U
stubdom_xid         D  -1
updateable          D  True
uuid                -  d5455b0d-35b7-4d2d-9ded-cc0eb4849c03
vcpus               -  2
virt_mode           -  hvm
visible_gateway     D  10.138.21.233
visible_gateway6    D
visible_ip          D  10.137.0.13
visible_ip6         D
visible_netmask     D  255.255.255.255
xid                 D  -1

Eine bestimmte Pref anzeigen

Um eine bestimmte Pref anzuzeigen, fügen Sie sie einfach am Ende des Befehls hinzu - das k in class ist kein Rechtschreibfehler, so schreibt Qubes OS es.

qvm-prefs template-firefox klass
TemplateVM

Prefs setzen

Sie können Prefs setzen, indem Sie den gewünschten Wert der Pref als drittes Argument angeben:

qvm-prefs template-firefox memory
400

qvm-prefs template-firefox memory 2048

qvm-prefs template-firefox memory
2048

Beachten Sie, dass verschiedene Klassen von VMs einige leicht unterschiedliche Pref-Schlüssel haben - einige Schlüssel wie “memory” sind für alle Arten von VMs verfügbar, während “template_for_dispvms” zum Beispiel nur für AppVMs verfügbar ist.

Um eine detaillierte Erklärung jeder Pref zu erhalten, die für die “template-firefox”-VM verfügbar ist, verwenden Sie folgenden Befehl:

qvm-prefs template-firefox --help-properties

Von der ursprünglichen TemplateVM geerbte Qvm-Prefs

Beim Erstellen einer neuen TemplateVM aus einer vorhandenen TemplateVM erbt die neue TemplateVM alle Prefs der ursprünglichen TemplateVM.

Identische Prefs:

audiovm             dom0
autostart           False
backup_timestamp
debug               False
default_dispvm      default-dvm
default_user        user
dns                 10.139.1.1
gateway
gateway6
guivm               dom0
icon                templatevm-orange
include_in_backups  True
installed_by_rpm    False
ip6
kernel              6.6.29-1.fc37
kernelopts          swiotlb=2048
keyboard_layout     us++
klass               TemplateVM
label               orange
mac                 00:16:3e:5e:6c:00
management_dispvm   default-mgmt-dvm
maxmem              4096
memory              1024
netvm               None
provides_network    False
qrexec_timeout      60
shutdown_timeout    60
start_time
stubdom_mem
stubdom_xid         -1
updateable          True
vcpus               2
virt_mode           hvm
visible_gateway6
visible_ip6
visible_netmask     255.255.255.255
xid                 -1

Unterschiedliche Prefs:

< Prefs der ursprünglichen TemplateVM
> Prefs der neuen TemplateVM

< ip                  10.137.0.13
> ip                  10.137.0.22

< name                debian-12-xfce
> name                template-test

< qid                 13
> qid                 22

< uuid                d5455b0d-35b7-4d2d-9ded-cc0eb4849c03
> uuid                73e8cf04-8827-417d-ad90-6c36e8e5b398

< visible_gateway     10.138.21.233
> visible_gateway     10.137.0.8

< visible_ip          10.137.0.13
> visible_ip          10.137.0.22

Die Root-Disk einer Template-VM vergrößern

Sie können die Disk der VM für das Root-Verzeichnis vergrößern, das standardmäßig 20 GB groß ist. Das /home/-Verzeichnis einer TemplateVM wird nicht verwendet, wenn das /home/-Verzeichnis einer AppVM erstellt wird. Stattdessen wird das /etc/skel-Verzeichnis der TemplateVM verwendet, um das /home/-Verzeichnis in der AppVM zu befüllen. Daher sind alle Änderungen am /home/-Verzeichnis der TemplateVM ziemlich irrelevant.

qvm-volume resize template-firefox:root 50G

Von Template-VMs verwendete LVM-Volumes

Qubes OS verwendet LVM, um logische Volumes für jede VM zu erstellen. So zeigen Sie alle von einer TemplateVM verwendeten Volumes an:

sudo lvdisplay /dev/qubes_dom0/vm-template-firefox-*
  --- Logical volume ---
  LV Path                /dev/qubes_dom0/vm-template-firefox-root
  LV Name                vm-template-firefox-root
  VG Name                qubes_dom0
  LV UUID                ZrYB1S-eEd7-RMeG-uIdA-7OXM-ZszW-fGPJxT
  LV Write Access        read/write
  LV Creation host, time dom0, 2024-05-14 16:12:13 -0400
  LV Pool name           vm-pool
  LV Thin origin name    vm-template-firefox-root-1715717848-back
  LV Status              available
  # open                 0
  LV Size                20.00 GiB
  Mapped size            8.99%
  Current LE             5120
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           253:84

  --- Logical volume ---
  LV Path                /dev/qubes_dom0/vm-template-firefox-private
  LV Name                vm-template-firefox-private
  VG Name                qubes_dom0
  LV UUID                SGON7W-Rg38-De6v-Aufe-ZJ3n-Es0A-TelCXc
  LV Write Access        read/write
  LV Creation host, time dom0, 2024-05-14 16:12:13 -0400
  LV Pool name           vm-pool
  LV Thin origin name    vm-template-firefox-private-1715717848-back
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Mapped size            4.98%
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           253:56

Eine Template-VM durch Installation und Konfiguration von Software wie apt-Paketen anpassen

Im nächsten Schritt nehmen wir Anpassungen an der Template-VM vor, wie die Installation und Konfiguration von apt-Paketen. Dies kann durch Ausführen von Befehlen oder durch Ausführen von Skripten auf der VM erfolgen. Beachten Sie, dass alle Änderungen am /home/-Verzeichnis nicht in AppVMs vorhanden sein werden, die die TemplateVM als Template verwenden, da AppVMs ein neues logisches LVM-Volume erstellen, das in diesem Verzeichnis eingehängt wird. Wenn Sie persistente Änderungen am /home/-Verzeichnis wünschen, tun Sie dies in der AppVM.

Einfache Befehle in einer VM mit qvm-run ausführen

Verwenden Sie qvm-run, um einfache BASH-Befehle auf der VM auszuführen. Beachten Sie, dass dieses Tool ohne ein zusätzliches Argument namens “–pass-io” die Ausgabe der ausgeführten Befehle nicht ausgibt:

qvm-run template-firefox whoami
Running 'whoami' on template-firefox

echo $?
0

Unsicher: Die Ausgabe von qvm-run-Befehlen anzeigen

Um die Ausgabe anzuzeigen, die der Befehl zurückgibt, können wir das qvm-run --pass-io-Argument verwenden. Dieser Ansatz wird jedoch nicht empfohlen, da er verwendet werden kann, um Daten von einer VM in ein Terminal zu senden, das in dom0 läuft!

qvm-run --pass-io template-firefox whoami
user

Sie können Befehle auch direkt als Root-Benutzer ausführen:

qvm-run --user root --pass-io template-firefox whoami
root

Unsicher: qvm-run –pass-io verwenden, um ganze Skripte auszuführen

Führen Sie kleine Skripte direkt auf einer Qubes-VM mit folgendem Befehl aus:

cat << EOF | qvm-run --pass-io --user root --service template-firefox qubes.VMShell
set -x
whoami
hostname
EOF
root
template-firefox

Sicher, aber unpraktisch: Einen grafischen Terminal-Emulator innerhalb der VM verwenden, um Befehle auszuführen

Hinweis: Wenn Sie mit dem minimalen Debian-Template arbeiten, sind standardmäßig zwei grafische Terminal-Emulatoren installiert: xterm und uxterm. Ich persönlich bevorzuge xfce4-terminal, Sie können es mit folgenden Befehlen installieren:

qvm-run -u root template-firefox "apt-get update"
qvm-run -u root template-firefox "apt-get -y install xfce4-terminal"

Der praktischste und sicherste Ansatz zum Ausführen von Befehlen innerhalb einer Qubes-VM besteht darin, einen grafischen Terminal-Emulator wie xterm, gnome-terminal oder xfce4-terminal innerhalb einer VM zu starten, der dann den Befehl ausführt. Auf diese Weise wird die Ausgabe, die die Befehle erzeugen, nur innerhalb des grafischen Terminal-Emulators angezeigt, xfce4-terminal in diesem Beispiel, der INNERHALB der VM läuft. Daher kann dom0 nicht davon betroffen sein, wenn Malware-generierte Ausgabe produziert wird.

qvm-run template-firefox xfce4-terminal --hold --command "whoami"

Die --command-Option von grafischen Terminals wie xfce4-terminal und gnome-terminal ist ziemlich eingeschränkt, und das Starten des Terminal-Emulators als Argument für qvm-run macht das Übergeben von Argumenten an die Tools, die Sie innerhalb des Terminals ausführen möchten, ziemlich problematisch. Der nächste Abschnitt behandelt die beste Lösung.

Sicher: Einen grafischen Terminal-Emulator innerhalb der VM verwenden, um Skripte auszuführen

Da wir eine TemplateVM konfigurieren, ist davon auszugehen, dass mehr als ein Befehl auf der VM ausgeführt werden muss. Wir können alle diese Befehle in ein Skript einfügen, das Skript auf die VM hochladen und das Skript als einzelnes Argument für xfce4-terminal ausführen.

Erstellen Sie dazu ein Skript in dom0 namens new-template-basics.sh mit folgendem Inhalt:

#!/bin/bash
#
# Setup everything we need for the firefox VM
apt-get update
apt-get update
apt-get -y upgrade

# Configure locale
apt-get -y install locales-all
locale-gen en_US.UTF-8

# Install apt packages
apt-get -y install xfce4-terminal firefox curl flatpak

# Add flatpak remote
flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo

# Install libre-wolf, a firefox browser modified for privacy
flatpak install --verbose -y --noninteractive flathub io.gitlab.librewolf-community

Laden Sie jetzt das Skript auf die VM hoch:

qvm-copy-to-vm template-firefox new-template-basics.sh

Das Skript befindet sich jetzt unter template-firefox:/home/user/QubesIncoming/dom0/new-template-basics.sh. Wir können es jetzt ausführbar machen. Denken Sie daran, aus Sicherheitsgründen nicht das --pass-io-Flag zu verwenden!

qvm-run template-firefox "chmod 700 /home/user/QubesIncoming/dom0/new-template-basics.sh"

Wir können jetzt das Skript in einem grafischen Terminal ausführen:

qvm-run template-firefox "xfce4-terminal --hold --command /home/user/QubesIncoming/dom0/new-template-basics.sh"

Wenn Ihre Skripte zusätzliche Dateien benötigen, wie Konfigurationsdateien, können Sie ein ganzes Verzeichnis in die VM kopieren:

qvm-copy-to-vm template-firefox templates/

Das Verzeichnis ist dann auf der VM unter template-firefox:/home/user/QubesIncoming/dom0/templates verfügbar, und Sie können die Dateien in Ihren Setup-Skripten verwenden.

Praktisch und sicher: Ein Skript verwenden, um ein Skript in die VM zu kopieren und dann einen grafischen Terminal-Emulator innerhalb der VM zu starten, der ein Skript ausführt

Das folgende BASH-Skript kopiert BASH-Skripte in VMs und führt sie aus. Verwendung:

# Syntax
qvm-run-script [target-vm] [path-to-script] <user>

# Run dom0:~/scripts/fix-network-manager.sh in sys-net as default user (root)
qvm-run-script sys-net ~/scripts/fix-network-manager.sh

# Run a script as user "user" inside an AppVM
qvm-run-script app-firefox ~/scripts/update-virtualenv-pip-packages.sh user

Sie können das Skript nach dom0 kopieren, indem Sie das Skript als Datei in einer beliebigen VM erstellen, wie der VM, die Sie zum Ausführen eines Browsers verwenden, um diese Website anzuzeigen, und dann den folgenden Befehl ausführen, um die Datei nach dom0 zu kopieren:

qvm-run work --pass-io "cat /home/user/qvm-run-script.sh" | sudo tee /usr/local/bin/qvm-run-script.sh

Speichern Sie das folgende BASH-Skript in dom0 unter /usr/local/bin/qvm-run-script

#!/bin/bash
#
# Ein Skript innerhalb einer Qubes-VM ausführen



# Argumente parsen
myvm=$1
myscript=$2
myuser=${3:-root}

# Argumente überprüfen
if test -z "$myvm"; then
    echo "Ziel-VM als erstes Argument angeben, Abbruch!"
    exit 1
elif ! qvm-ls | grep --quiet $myvm; then
    echo "Keine solche VM: $myvm, Abbruch!"
    exit 1
elif ! test -f "$myscript"; then
    echo "Skript zum Ausführen in der Ziel-VM als zweites Argument angeben, Abbruch!"
    exit 1
fi

# Sicherstellen, dass der Zielpfad auf der VM leer ist und keine Datei vom vorherigen Lauf vorhanden ist
qvm-run --pass-io --user $myuser $myvm "rm -f /home/user/QubesIncoming/dom0/$myscript"

# Das Skript in die VM kopieren
qvm-copy-to-vm $myvm $myscript

# Das Skript ausführbar machen
qvm-run --pass-io --user $myuser $myvm "chmod 500 /home/user/QubesIncoming/dom0/$myscript"

# Das Skript in xfce4-terminal ausführen
# --hold schließt das Terminal nicht, nachdem der letzte Befehl ausgeführt wurde, Sie müssen das Fenster manuell schließen
qvm-run --pass-io --user $myuser $myvm "xfce4-terminal --hold --command /home/user/QubesIncoming/dom0/$myscript"

# Aufräumen: das ausgeführte Skript entfernen
qvm-run --pass-io --user $myuser $myvm "rm /home/user/QubesIncoming/dom0/$myscript"

Vergessen Sie nicht, das Skript ausführbar zu machen:

chmod 750 /usr/local/bin/qvm-run-script

Die TemplateVM herunterfahren

Bevor die Template-VM verwendet werden kann, um App-VMs zu erstellen, muss sie heruntergefahren werden:

qvm-shutdown --wait template-firefox

Eine AppVM aus einer Template-VM erstellen

Jetzt, da wir eine Template-VM mit installiertem Firefox haben, können wir eine AppVM aus dieser TemplateVM erstellen.

Beim Starten einer AppVM in Qubes wird ein temporärer Snapshot der Root-Disk der TemplateVM erstellt, der dann gebootet wird. AppVMs können Daten persistent speichern, wofür ein LVM-Volume in dom0 erstellt wird, das später unter appvm:/rw/ eingehängt wird, wobei /rw/home/ nach /home/ gebunden wird. Die Inhalte des /home/-Verzeichnisses werden durch die Inhalte des /etc/skel/-Verzeichnisses der TemplateVM befüllt. Zusätzlich werden die Inhalte des /usr/local.orig/-Verzeichnisses der TemplateVM verwendet, um das /usr/local/-Verzeichnis der AppVM zu befüllen. Für zusätzliche Informationen siehe die Qubes-Dokumentation zu Vererbung und Persistenz in verschiedenen VM-Typen .

Es gibt drei spezielle Verzeichnisse: /home/user/, /rw/ und /usr/local/, die persistent sind. Alle Dateien in ihnen werden auf einem privaten Volume gespeichert, das mit der AppVM verbunden ist. Alle anderen Dateien und Verzeichnisse, einschließlich derer, die die Betriebssystemdateien enthalten, werden verworfen, da sie aus dem temporären Snapshot des Root-Volumes der TemplateVM geladen werden.

Die persistenten Verzeichnisse werden alle von appvm:/dev/xvdb eingehängt, dem privaten Volume, das mit der AppVM verbunden ist. Diese Gerätedatei wird unter /rw/ eingehängt und enthält ein Verzeichnis namens /rw/home und /rw/usrlocal (wir haben hier keinen Schrägstrich vergessen). Mit /etc/fstab werden diese Verzeichnisse nach /home/ und /usr/local gebunden:

app:/dev/xvdb wird unter /rw/ eingehängt:

grep xvdb /etc/fstab
/dev/xvdb            /rw            auto    noauto,defaults,discard,nosuid,nodev    1 2

Danach werden /rw/home und /rw/usrlocal nach /home und /usr/local gebunden:

grep bind /etc/fstab
/rw/home             /home          none    noauto,bind,defaults,nosuid,nodev        0 0
/rw/usrlocal         /usr/local     none    noauto,bind,defaults        0 0

Auf diese Weise bieten AppVMs persistenten Speicher für Dateien wie Dokumente oder die Konfigurationsdateien Ihres Browsers wie Lesezeichen und so weiter oder SSH-Schlüsselpaare und Konfiguration in ~/.ssh/.

Wenn Sie Firefox verwenden, um eine bösartige Website zu besuchen, und diese Malware irgendwo außerhalb dieser persistenten Verzeichnisse installiert, zum Beispiel in /etc/firefox, dann wird diese Änderung nicht über Neustarts hinweg bestehen bleiben - es sei denn, Sie besuchen die Website erneut.

Um eine AppVM aus einer TemplateVM zu erstellen:

qvm-create --class AppVM --label blue --template template-firefox app-firefox

Beachten Sie, dass qvm-create ein --property-Argument hat, das verwendet werden kann, um Prefs direkt zu setzen. Da dies zu ziemlich langen qvm-create-Befehlen führt, bevorzuge ich persönlich die Verwendung von qvm-prefs nach dem Erstellen der VM.

Häufig verwendete Prefs für AppVMs

Hier sind einige häufig verwendete Qubes-Prefs für AppVMs:

qvm-prefs app-firefox netvm                sys-firewall
qvm-prefs app-firefox template_for_dispvms false
qvm-prefs app-firefox autostart            true
qvm-prefs app-firefox provides_network     false
qvm-prefs app-firefox label                orange
qvm-prefs app-firefox vcpus                4
qvm-prefs app-firefox memory               2048
qvm-prefs app-firefox maxmem               4096

Die Home-Partition einer AppVM vergrößern

Um die Home-Partition einer AppVM zu vergrößern, verwenden Sie folgenden Befehl, der die Größe des privaten LVM-Volumes der AppVM ändert. Siehe unten für zusätzliche Informationen zu den verwendeten LVM-Volumes.

qvm-volume resize app-firefox:private 50G

Von App-VMs verwendete LVM-Volumes

Beim Starten einer AppVM klont Qubes OS die LVM-Volumes der TemplateVM, um Root-Volumes für die AppVM zu erstellen. So zeigen Sie alle von einer AppVM verwendeten Volumes an, die derzeit NICHT läuft. Für laufende AppVMs gibt es zusätzliche Volumes, wie den temporären Klon der Root-Disk der TemplateVM.

sudo lvdisplay /dev/qubes_dom0/vm-app-firefox-*
  --- Logical volume ---
  LV Path                /dev/qubes_dom0/vm-app-firefox-private
  LV Name                vm-app-firefox-private
  VG Name                qubes_dom0
  LV UUID                srQf86-f44I-B31g-8TJU-eDpz-4FTQ-KIYKI0
  LV Write Access        read/write
  LV Creation host, time dom0, 2024-05-14 16:44:24 -0400
  LV Pool name           vm-pool
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Mapped size            0.00%
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           253:79

Persistente Änderungen in AppVMs vornehmen

Wenn Sie Pakete mit apt innerhalb einer AppVM installieren, werden die Änderungen beim Herunterfahren verworfen. Nur Änderungen unterhalb der Verzeichnisse /home/, /usr/local/ und /rw/ bleiben erhalten. Für zusätzliche Informationen siehe die Qubes-Dokumentation zu persistentem Speicher in AppVMs .

Beachten Sie, dass das /home/-Verzeichnis der TemplateVM nicht verwendet wird, um das /home/-Verzeichnis in der AppVM zu befüllen!

qvm-run app-firefox "mkdir /home/user/projects/"

Von der TemplateVM geerbte Qvm-Prefs

Beim Erstellen von AppVMs aus TemplateVMs erbt die AppVM fast alle Prefs von den TemplateVMs. Der Rest stammt von dem, was in den globalen Standardeinstellungen festgelegt ist, die Sie mit dem Befehl qubes-prefs anzeigen und definieren können.

Identische Prefs:

audiovm             dom0
autostart           False
backup_timestamp
debug               False
default_dispvm      default-dvm
default_user        user
dns                 10.139.1.1
gateway
gateway6
guivm               dom0
include_in_backups  True
installed_by_rpm    False
ip6
kernel              6.6.29-1.fc37
kernelopts          swiotlb=2048
keyboard_layout     us++
label               orange
mac                 00:16:3e:5e:6c:00
management_dispvm   default-mgmt-dvm
maxmem              4096
memory              1024
provides_network    False
qrexec_timeout      60
shutdown_timeout    60
start_time
stubdom_mem
stubdom_xid         -1
vcpus               2
virt_mode           hvm
visible_gateway     10.138.21.233
visible_gateway6
visible_ip6
visible_netmask     255.255.255.255
xid                 -1

Unterschiedliche Prefs:

< Pref der TemplateVM
> Pref der AppVM

< icon templatevm-orange
> icon appvm-orange

< ip 10.137.0.13
> ip 10.137.0.35

< klass TemplateVM
> klass AppVM

< name tpl-deb-12
> name app-test

< netvm None
> netvm sys-firewall

< qid 13
> qid 35

< updateable True
> updateable False

< uuid d5455b0d-35b7-4d2d-9ded-cc0eb4849c03
> uuid 3d47bf5f-80d0-4770-8a0a-3a0a3e33332a

< visible_ip 10.137.0.13
> visible_ip 10.137.0.35

Disposable-VMs aus App-VMs erstellen

Keine in einer Disposable-VM geänderten Dateien bleiben erhalten. Alle Volumes, die DispVMs verwenden, werden beim Herunterfahren der VM verworfen. Disposable-VMs benötigen eine AppVM als ihr Template.

Es gibt zwei Arten von Disposable-VMs:

  • Reguläre Disposable-VMs
    erstellt aus einer AppVM mit qvm-run --dispvm zum Starten eines einzelnen Befehls, wie firefox , und wird ein zufälliger Name wie “Disp123” zugewiesen
  • Benannte Disposable-VMs
    werden mit qvm-create --dispvm erstellt und haben einen persistenten Namen. Obwohl sie heruntergefahren werden können, wird die AppVM bei jedem Start vollständig geklont. Am hilfreichsten für systembezogene VMs wie “sys-net”, bei denen Sie einen persistenten Namen für die VM benötigen, um Netzwerk-VMs zu verketten.

Alle Disposable-VMs, sowohl temporäre, die mit qvm-run --dispvm <AppVM> <tool-to-launch-in-disp-vm> erstellt wurden, als auch persistente, die mit qvm-create --class DispVM --label <color> --template <AppVM> <permanent-dispvm-name> erstellt wurden, erben das appvm:/dev/xvdb-Gerät, das zum Einhängen der Verzeichnisse /home/, /rw/ und /usr/local/ verwendet wird. Dies bedeutet, dass alle Dateien in diesen Verzeichnissen in der AppVM auch in der Disposable-VM vorhanden sind.

Damit eine AppVM als Template für eine DisposableVM verwendet werden kann, verwenden Sie folgenden qvm-prefs-Befehl:

qvm-prefs app-firefox template_for_dispvms true

Wie Sie unten sehen können, ist die Pref template_for_disvms nur für AppVMs verfügbar und nicht für TemplateVMs oder StandaloneVMs:

qvm-prefs template-firefox template_for_dispvms
usage: qvm-prefs [--verbose] [--quiet] [--help] [--help-properties] [--hide-default] [--get]
                 [--set] [--default]
                 VMNAME [PROPERTY] [VALUE]
qvm-prefs: error: no such property: 'template_for_dispvms'

Reguläre Disposable-VMs erstellen

Mit app-firefox als Template können wir mehrere Disposable-VMs davon erzeugen - jede erstellte DispVM ist ihre eigene VM, und jede führt den Befehl /usr/bin/firefox aus. Sie können auch einfach firefox eingeben.

qvm-run --dispvm app-firefox /usr/bin/firefox
Running 'firefox' on $dispvm:app-firefox

Die qvm-ls-Ausgabe unten zeigt, dass Qubes der VM den Namen “disp960” zugewiesen hat. Dies ist ein zufälliger Name, der dieser temporären Disposable-VM gegeben wurde. Sie können den obigen qvm-run-Befehl wiederholen, um zusätzliche Instanzen wie diese zu erzeugen.

qvm-ls --running | grep DispVM
disp960        Running  DispVM   orange  app-firefox        -

Nachdem der Befehl abgeschlossen ist, also nachdem Sie Firefox geschlossen haben, wird Qubes die Disposable-VM automatisch herunterfahren und löschen.

Eine benannte Disposable-VM erstellen

Besonders für Netzwerk-VMs wie “sys-net” kann es wünschenswert sein, eine Disposable-VM zu haben - sys-net ist ziemlich risikoreich, da es sich direkt mit “dem Kaffeehaus-WLAN” verbindet. Daher ist es sinnvoll, alle Änderungen beim Herunterfahren zu verwerfen. Der Qubes OS Installer hat sogar eine Funktion während der Installation, um sys-net disposable zu machen.

Wenn Sie eine Disposable-VM mit einem persistenten Namen wie “sys-net” anstelle eines zufälligen Namens wie “disp960” erstellen möchten, verwenden Sie qvm-create mit dem class=DispVM-Argument:

qvm-create --class DispVM --label purple --template app-firefox disposable-firefox

Wenn Sie jetzt Firefox innerhalb der benannten Disposable-VM mit qvm-run starten:

qvm-run disposable-firefox /usr/bin/firefox

Qubes startet Firefox in einer VM namens “disposable-firefox”. Sie können diese VM herunterfahren, und sie wird in den Shutoff-Zustand übergehen, und keine Änderungen, die während ihrer Laufzeit vorgenommen wurden, bleiben bestehen. Das qvm-run --dispvm-Argument wird für persistente Disposable-VMs nicht benötigt.

Siehe die Qubes OS Dokumentation zu benannten Disposable-VMs für zusätzliche Informationen.

Von der TemplateVM geerbte Qvm-Prefs

Beim Erstellen einer regulären oder benannten (persistenten) DispVM aus einer AppVM erbt die neue DispVM einige der Prefs von der AppVM:

Identische Prefs:

audiovm             dom0
autostart           False
backup_timestamp
debug               False
default_user        user
dns                 10.139.1.1
gateway
gateway6
guivm               dom0
include_in_backups  True
installed_by_rpm    False
ip6
kernel              6.6.29-1.fc37
kernelopts          swiotlb=2048
keyboard_layout     us++
mac                 00:16:3e:5e:6c:00
management_dispvm   default-mgmt-dvm
maxmem              4096
memory              1024
netvm               sys-firewall
provides_network    False
qrexec_timeout      60
shutdown_timeout    60
start_time
stubdom_mem
stubdom_xid         -1
updateable          False
vcpus               2
virt_mode           hvm
visible_gateway     10.138.21.233
visible_gateway6
visible_ip6
visible_netmask     255.255.255.255
xid                 -1

Unterschiedliche Prefs:

< Prefs der AppVM
> Prefs der DispVM

< ip 10.137.0.35
> ip 10.138.35.139

< klass AppVM
> klass DispVM

> label black
< label orange

< name app-test
> name dsp-test

< qid 35
> qid 36

< template tpl-deb-12
> template app-test

< uuid 3d47bf5f-80d0-4770-8a0a-3a0a3e33332a
> uuid 138775bb-f46a-44f1-a40b-18603af928b0

< visible_ip 10.137.0.35
> visible_ip 10.138.35.139

Von Disposable-VMs verwendete LVM-Volumes

Beim Starten einer DispVM erstellt Qubes OS Snapshots der LVM-Volumes für die Root-Disk von der TemplateVM, die die AppVM verwendet, und das private Volume, das /home/ enthält, von der AppVM. So zeigen Sie alle von einer DispVM verwendeten Volumes an, die derzeit läuft:

sudo lvdisplay /dev/qubes_dom0/vm-disp834*
  --- Logical volume ---
  LV Path                /dev/qubes_dom0/vm-disp834-volatile
  LV Name                vm-disp834-volatile
  VG Name                qubes_dom0
  LV UUID                J462m5-ebXA-fs6Y-3fhV-e245-8N4i-LyNkBi
  LV Write Access        read/write
  LV Creation host, time dom0, 2024-05-21 17:34:39 -0400
  LV Pool name           vm-pool
  LV Status              available
  # open                 2
  LV Size                12.00 GiB
  Mapped size            0.01%
  Current LE             3072
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           253:132

  --- Logical volume ---
  LV Path                /dev/qubes_dom0/vm-disp834-root-snap
  LV Name                vm-disp834-root-snap
  VG Name                qubes_dom0
  LV UUID                5vTKHJ-tIET-VzVi-EJqm-DTGX-26Uo-7Ec0nd
  LV Write Access        read/write
  LV Creation host, time dom0, 2024-05-21 17:34:39 -0400
  LV Pool name           vm-pool
  LV Thin origin name    vm-template-firefox-root
  LV Status              available
  # open                 2
  LV Size                20.00 GiB
  Mapped size            9.12%
  Current LE             5120
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           253:133

  --- Logical volume ---
  LV Path                /dev/qubes_dom0/vm-disp834-private-snap
  LV Name                vm-disp834-private-snap
  VG Name                qubes_dom0
  LV UUID                dVtXed-7GnK-L13W-f76E-OfvX-aSry-UW3FNv
  LV Write Access        read/write
  LV Creation host, time dom0, 2024-05-21 17:34:39 -0400
  LV Pool name           vm-pool
  LV Thin origin name    vm-app-firefox-private
  LV Status              available
  # open                 2
  LV Size                2.00 GiB
  Mapped size            1.81%
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           253:134

Eine StandaloneVM aus einer TemplateVM erstellen

Eine Standalone-VM ist eine reguläre virtuelle Maschine, wie Sie sie bereits kennen. Alle Änderungen daran sind persistent. Sie wird durch Klonen einer Template-VM erstellt. Alle Änderungen an einer Standalone-VM sind permanent, keine der “Qubes-Magie”, die verwendet wird, um Teile oder alle an VMs vorgenommenen Änderungen nicht-persistent zu machen, wird verwendet.

Um eine Standalone-VM zu erstellen, verwenden Sie folgenden Befehl:

qvm-create --standalone --template debian-12-xfce --label green code-playground
code-playground: Cloning root volume

Starten Sie die VM:

qvm-start --wait code-playground

Um die Klasse für eine Standalone-VM anzuzeigen:

qvm-ls code-playground
NAME             STATE   CLASS         LABEL  TEMPLATE  NETVM
code-playground  Running StandaloneVM  green  -         sys-firewall

Dieser VM-Typ ist am sinnvollsten für Experimente und sollte für den Produktionseinsatz vermieden werden.

Von der TemplateVM geerbte Qvm-Prefs

Beim Erstellen einer StandaloneVM aus einer TemplateVM erbt die neue StandaloneVM fast alle Prefs von der TemplateVM:

Identische Prefs:

audiovm                 dom0
autostart               False
debug                   False
default_dispvm          default-dvm
default_user            user
dns                     10.139.1.1
guivm                   dom0
include_in_backups      True
installed_by_rpm        False
kernel                  6.6.29-1.fc37
kernelopts              swiotlb=2048
keyboard_layout         us++
mac                     00:16:3e:5e:6c:00
management_dispvm       default-mgmt-dvm
maxmem                  4096
memory                  1024
provides_network        False
qrexec_timeout          60
shutdown_timeout        60
stubdom_xid             -1
updateable              True
vcpus                   2
virt_mode               hvm
visible_gateway         10.138.21.233
visible_netmask         255.255.255.255
xid                     -1

Unterschiedliche Prefs:

< icon                    templatevm-orange
> icon                    standalonevm-green

< ip                      10.137.0.13
> ip                      10.137.0.33

< klass                   TemplateVM
> klass                   StandaloneVM

> label                   green
< label                   orange

< name                    debian-12-xfce
> name                    code-playground

< netvm                   None
> netvm                   sys-firewall

< qid                     13
> qid                     33

< uuid                    d5455b0d-35b7-4d2d-9ded-cc0eb4849c03
> uuid                    988f5070-35e9-4b0f-a361-fa0080083a46

< visible_ip              10.137.0.13
> visible_ip              10.137.0.33

Von Disposable-VMs verwendete LVM-Volumes

Eine Standalone-VM hat zwei Volumes, eines für das Root-Dateisystem und eines für Home. Obwohl sie zwei Volumes hat, speichern beide Daten persistent, und alle an ihnen vorgenommenen Änderungen sind permanent.

sudo lvdisplay /dev/qubes_dom0/vm-code-sandbox*
  --- Logical volume ---
  LV Path                /dev/qubes_dom0/vm-code-sandbox-root
  LV Name                vm-code-sandbox-root
  VG Name                qubes_dom0
  LV UUID                vHwtNU-9AUr-APMG-V8cL-IOTc-u1qY-RTFXMI
  LV Write Access        read/write
  LV Creation host, time dom0, 2024-05-15 17:10:21 -0400
  LV Pool name           vm-pool
  LV Thin origin name    vm-code-sandbox-root-1716327722-back
  LV Status              available
  # open                 0
  LV Size                20.00 GiB
  Mapped size            8.73%
  Current LE             5120
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           253:118

  --- Logical volume ---
  LV Path                /dev/qubes_dom0/vm-code-sandbox-private
  LV Name                vm-code-sandbox-private
  VG Name                qubes_dom0
  LV UUID                u3qsKy-nHzc-2MmH-aIfd-dfkK-BLqJ-nNhCmk
  LV Write Access        read/write
  LV Creation host, time dom0, 2024-05-15 17:10:22 -0400
  LV Pool name           vm-pool
  LV Thin origin name    vm-code-sandbox-private-1716327722-back
  LV Status              available
  # open                 0
  LV Size                2.00 GiB
  Mapped size            4.93%
  Current LE             512
  Segments               1
  Allocation             inherit
  Read ahead sectors     auto
  - currently set to     2048
  Block device           253:120