SJ blog
Qubes OS
Z

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

Qubes OS テンプレートVMをカスタマイズする

FedoraやDebianのテンプレートVMへのパッケージ追加、カスタムテンプレートの作成、/rw/config を使った永続的な設定方法を解説します。

一言結論

テンプレートVMへの変更は全AppVMに即時反映されるという特性を理解すると、用途別に独立したカスタムテンプレートを作ることで環境汚染を防ぎつつAppVM間の一貫性を保てる。

テンプレートVMの仕組み

AppVM はテンプレートVMのルートファイルシステムを読み取り専用でマウントして起動します。

TemplateVM
  │(/usr, /etc などを読み取り専用で共有)
  ├── work AppVM
  ├── personal AppVM
  └── untrusted AppVM
       各VMは /home, /rw だけが独自のデータ

テンプレートに変更を加えること = 全AppVMに変更が反映される

テンプレートVMでのパッケージインストール

# テンプレートを起動
qvm-start fedora-40  # または qubes-manager から起動

# テンプレートのターミナルを開く
qvm-run fedora-40 "xterm"

# Fedora の場合
sudo dnf install -y vim htop git curl wget nmap

# Debian の場合
sudo apt update && sudo apt install -y vim htop git curl wget

# インストール後、テンプレートをシャットダウン
sudo poweroff

重要: パッケージのインストールはテンプレートVMで行います。AppVMで行っても再起動すると消えます。

AppVM で永続的な変更を行う(/rw/config)

AppVM の /rw 以下は再起動後も保持されます。起動時に実行したいスクリプトは /rw/config/rc.local に記述します。

# work AppVM のターミナルで
cat /rw/config/rc.local
#!/bin/bash
# /rw/config/rc.local - AppVM 起動時に実行される

# ネームサーバーを変更
echo "nameserver 1.1.1.1" > /etc/resolv.conf

# 特定のサービスを起動
/usr/local/bin/my-service &
chmod +x /rw/config/rc.local

カスタムテンプレートの作成

既存テンプレートをクローンして新しいテンプレートを作る

# dom0 ターミナルで
qvm-clone fedora-40 fedora-40-dev

# クローンしたテンプレートで開発ツールをインストール
qvm-run fedora-40-dev "xterm"
# fedora-40-dev のターミナルで
sudo dnf install -y java-17-openjdk eclipse nodejs npm python3-pip
sudo poweroff
# クローンテンプレートを使う AppVM を作成
qvm-create --template fedora-40-dev --label blue dev-work

Debian テンプレートの追加

# dom0 ターミナルで
sudo qubes-dom0-update qubes-template-debian-12

Minimal テンプレートの使用

Fedora/Debian の Minimal テンプレートは最小限のパッケージしか入っていません。メモリ使用量が少なく、攻撃面も小さいです。

sudo qubes-dom0-update qubes-template-fedora-40-minimal

# Minimal でよく必要なパッケージ
qvm-run fedora-40-minimal "xterm"
sudo dnf install -y qubes-core-agent-networking qubes-core-agent-nautilus
sudo dnf install -y qubes-usb-proxy qubes-pdf-converter

bind-dirs で追加のディレクトリを永続化する

/rw/config/qubes-bind-dirs.d/ で指定したディレクトリを永続化できます。

# /rw/config/qubes-bind-dirs.d/50_user.conf
# (AppVM の) 追加で永続化したいディレクトリ

binds+=( '/etc/ssh' )          # SSH設定を保持
binds+=( '/opt/myapp' )        # カスタムアプリを保持

このファイルを作成して AppVM を再起動すると、指定したディレクトリが /rw/bind-dirs/ 以下にバックアップされ、起動時に元の場所にマウントされます。

テンプレートのアップデート

# テンプレートのアップデート(dom0 から)
qubes-dom0-update  # dom0 自体のアップデート

# GUI ツール
# Q メニュー → System Tools → Qubes Update

# 手動で各テンプレートをアップデート
qvm-run --auto fedora-40 "sudo dnf upgrade -y && sudo poweroff"
qvm-run --auto debian-12 "sudo apt update && sudo apt upgrade -y && sudo poweroff"

テンプレートのスクリーンショットの整理

# テンプレートの一覧
qvm-ls --type TemplateVM

# 不要なテンプレートを削除(このテンプレートを使っているVMがないことを確認)
qvm-remove fedora-39  # 古いバージョン

よくある間違い

# NG: AppVM でパッケージをインストールしても消える
qvm-run work "sudo dnf install -y vim"  # 再起動で消える

# OK: テンプレートでインストールする
qvm-run fedora-40 "sudo dnf install -y vim"
qvm-shutdown fedora-40

# その後 work を再起動すると vim が使える
qvm-shutdown work
qvm-start work

まとめ

変更の種類保存場所
アプリのインストールTemplateVM で dnf/apt install
起動時スクリプトAppVM の /rw/config/rc.local
設定ファイルの永続化AppVM の /rw/config/qubes-bind-dirs.d/
ユーザーデータAppVM の /home

テンプレートを適切に管理することが、Qubes OS を効率よく運用するコツです。