はじめに
前回の記事「OpenNebula 7.0 Restic Datastoreでバックアップを構築してみた」では、Restic Datastoreの構築とVM全体のバックアップ・リストアを検証しました。
今回は、Backrest(Restic用Web UI)を導入して複数VMのバックアップを一括管理できるか、そしてqcow2形式のディスクイメージ内部のファイルにアクセスできるかを検証します。
検証環境
- Frontend: nebula-f1 (192.168.11.110)
- Computeノード: nebula-n1 (192.168.11.111), nebula-n2 (192.168.11.112)
-
Datastore:
- 108: image-qcow2 (750GB)
- 109: system-qcow2 (750GB)
- 112: RBackups (Restic, 96.4GB)
対象VM(6台)
oneadmin@nebula-f1:~$ onevm list
ID USER GROUP NAME STAT CPU MEM HOST TIME
36 oneadmin oneadmin alpine-persistent-new runn 1 512M 192.168.11.111 19d 20h17
35 oneadmin oneadmin alpine-qcow2-24-cloned runn 1 128M 192.168.11.112 19d 21h25
34 oneadmin oneadmin FreeBSD-test-01 runn 1 1024M 192.168.11.110 33d 18h11
30 oneadmin oneadmin alpine-qcow2-dev-30 runn 1 128M 192.168.11.110 42d 09h39
25 oneadmin oneadmin alpine-shared-test-25 runn 1 128M 192.168.11.111 43d 07h20
24 oneadmin oneadmin alpine-qcow2-24 runn 1 128M 192.168.11.112 43d 07h21
1. 全VMの一括バックアップ
1-1. バックアップスクリプトの作成
6台のVMを一括でバックアップするスクリプトを作成しました。
backup-all-vms.sh:
#!/bin/bash
VM_IDS="24 25 30 34 35 36"
BACKUP_DATASTORE="112"
echo "Date: $(date)"
echo "Starting backup for VMs: ${VM_IDS}"
echo "Backup Datastore: ${BACKUP_DATASTORE}"
echo ""
for VM_ID in ${VM_IDS}; do
echo "----------------------------------------"
echo "Backing up VM ${VM_ID}..."
onevm backup --schedule now -d ${BACKUP_DATASTORE} ${VM_ID}
if [ $? -eq 0 ]; then
echo "✅ VM ${VM_ID} backup scheduled successfully"
else
echo "❌ VM ${VM_ID} backup failed"
fi
echo ""
done
echo "=== Backup jobs submitted ==="
echo ""
echo "Check scheduled actions with: onevm show <VM_ID>"
echo "Check backup images with: oneimage list --backup"
echo ""
echo "Note: Backup execution may take a few minutes."
echo " Monitor progress in Sunstone or with 'onevm show' command."
1-2. 実行結果
oneadmin@nebula-f1:~/work$ chmod +x backup-all-vms.sh
oneadmin@nebula-f1:~/work$ ./backup-all-vms.sh
Date: Mon Jan 26 12:45:05 AM UTC 2026
Starting backup for VMs: 24 25 30 34 35 36
Backup Datastore: 112
----------------------------------------
Backing up VM 24...
VM 24: backup scheduled at 2026-01-26 00:45:06 +0000
✅ VM 24 backup scheduled successfully
----------------------------------------
Backing up VM 25...
VM 25: backup scheduled at 2026-01-26 00:45:08 +0000
✅ VM 25 backup scheduled successfully
(以下、VM 30, 34, 35, 36も同様に成功)
=== Backup jobs submitted ===
1-3. バックアップ確認
oneadmin@nebula-f1:~$ oneimage list --backup
ID USER GROUP NAME DATASTORE SIZE TYPE PER STAT RVMS
24 oneadmin oneadmin 34 26-Jan 00.46.12 RBackups 3.8G BK Yes rdy 1
23 oneadmin oneadmin 25 26-Jan 00.45.33 RBackups 118M BK Yes rdy 1
22 oneadmin oneadmin 30 26-Jan 00.45.32 RBackups 120M BK Yes rdy 1
21 oneadmin oneadmin 36 26-Jan 00.45.32 RBackups 118M BK Yes rdy 1
20 oneadmin oneadmin 35 26-Jan 00.45.32 RBackups 118M BK Yes rdy 1
19 oneadmin oneadmin 24 26-Jan 00.45.12 RBackups 118M BK Yes rdy 1
18 oneadmin oneadmin 36 06-Jan 14.07.58 RBackups 116M BK Yes rdy 1
17 oneadmin oneadmin 24 06-Jan 02.51.57 RBackups 117M BK Yes rdy 1
16 oneadmin oneadmin 24 06-Jan 01.54.06 RBackups 117M BK Yes rdy 1
6台すべてのバックアップが成功しました。
2. Backrestのインストール
2-1. Dockerのインストール
Backrestを動かすためにDockerが必要です。
oneadmin@nebula-f1:~$ docker --version
Command 'docker' not found, but can be installed with:
apt install docker.io
以下の手順でインストールします:
sudo apt-get update
sudo apt-get install -y docker.io docker-compose
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker oneadmin
newgrp docker
確認:
oneadmin@nebula-f1:~$ docker --version
Docker version 28.2.2, build 28.2.2-0ubuntu1~24.04.1
oneadmin@nebula-f1:~$ docker-compose --version
docker-compose version 1.29.2, build unknown
2-2. Docker Composeで構築
作業ディレクトリを作成します:
mkdir -p /var/lib/one/work
cd /var/lib/one/work
docker-compose.yml:
version: '3.8'
services:
backrest:
image: garethgeorge/backrest:latest
container_name: backrest
ports:
- "9898:9898"
volumes:
- ./backrest_data:/data
- ./backrest_config:/config
- /var/lib/one/datastores/112:/repos:rw
environment:
- TZ=Asia/Tokyo
restart: unless-stopped
重要: /reposは:rw(読み書き可能)でマウントします。:ro(読み取り専用)だとBackrestがロックファイルを作成できずエラーになります。
2-3. Backrestの起動
docker-compose down
docker-compose up -d
docker ps
起動確認:
CONTAINER ID IMAGE STATUS PORTS
cadc876b3010 garethgeorge/backrest:latest Up 4 seconds 0.0.0.0:9898->9898/tcp
ブラウザで http://192.168.11.110:9898 にアクセスします。
2-5. 初回セットアップ
Web UIで以下を設定します:
- 認証を無効化
- インスタンスIDを入力(my-backrest-server)
- Saveをクリック
3. リポジトリの登録
3-1. VM 24のリポジトリ登録例
Web UIで「Add Repo」をクリックし、以下を入力します:
-
Repository Name:
vm-24 -
Repository Path:
/repos/24 -
Password:
opennebula-backup-2026
Submit後、リポジトリ詳細画面で「vm-24」をクリックします。
結果: 既存のバックアップスナップショットが認識されました!
[画面キャプチャ箇所]
3-2. 残りのVMも登録
同様の手順で以下を登録しました:
| Repository Name | Repository Path |
|---|---|
| vm-25 | /repos/25 |
| vm-30 | /repos/30 |
| vm-34 | /repos/34 |
| vm-35 | /repos/35 |
| vm-36 | /repos/36 |
[画面キャプチャ: 6個のリポジトリの一覧表示]
4. スナップショットの確認
4-1. ダッシュボード
6つのリポジトリが一覧表示され、以下の情報が確認できます:
- 最終バックアップ日時
- スナップショット数
- 容量
[画面キャプチャ:スナップショット状態]
4-2. VM 36の詳細
リポジトリ「vm-36」をクリックすると、スナップショット詳細が表示されます:
スナップショット ID: 90dd8f2c
日時: 2026/01/26 09:45:
Snapshot Browser:
/var/lib/one/datastores/109/36/backup/
├─ disk.0.0 (118.75MiBMB)
└─ vm.xml (8.47KiB)
[画面キャプチャ]
5. qcow2内部の確認を試みる
5-1. disk.0.0をクリック
disk.0.0をクリックすると…
結果: 「Download」ボタンのみが表示されました。
qcow2内部のファイルシステム(/root/persistent-backup-test.txtなど)は表示されません。
[画面キャプチャ]
5-2. なぜ見えないのか?
Backrest(およびRestic)が扱うのは、あくまでファイルツリーです:
Resticリポジトリの構造:
/repos/36/
└─ snapshots/
└─ 9b19efd9/
└─ var/lib/one/datastores/109/36/backup/
├─ disk.0.0 ← qcow2ファイル(バイナリ)
└─ vm.xml
disk.0.0はqcow2形式のディスクイメージファイルです。その内部には ext4ファイルシステムがありますが、Restic/Backrestはこれを解析しません。
6. 結論:libguestfsが必須
qcow2内部のファイルにアクセスするには、libguestfs(guestfish、virt-copy-outなど)が必要です。
方法1: Backrestからダウンロード
- Backrestで
disk.0.0をダウンロード - ローカルに保存(例:
/tmp/disk.0.0) - libguestfsで抽出
virt-copy-out -a /tmp/disk.0.0 /root/persistent-backup-test.txt /tmp/
方法2: restic mount(推奨)
前回記事の手法が最もシンプルです:
export RESTIC_REPOSITORY=/var/lib/one/datastores/112/36
export RESTIC_PASSWORD=opennebula-backup-2026
restic mount ~/restic-mount &
virt-copy-out -a ~/restic-mount/snapshots/latest/var/lib/one/datastores/109/36/backup/disk.0.0 \
/root/persistent-backup-test.txt /tmp/
詳細は前回記事を参照してください:
https://qiita.com/flathill/items/158c999bdef2c6fb5521
7. Backrestは有用か?
7-1. メリット
- 複数VMの一覧性: 6台のバックアップ状況を一画面で確認できる
- 監視・可視化: 最終バックアップ日時、容量、スナップショット数が一目瞭然
- 非技術者向け: Web UIで直感的に操作可能
7-2. デメリット
- qcow2内部は見えない: 結局libguestfsが必要
- ファイル抽出の手間: 従来手法(restic mount + virt-copy-out)と変わらず
- 追加の複雑性: Docker管理、設定ファイルメンテナンスが必要
7-3. 推奨運用
| VM規模 | Backrest導入 | ファイル抽出 |
|---|---|---|
| 1〜4台 | 不要(Sunstoneで十分) | restic mount + virt-copy-out |
| 5台以上 | 検討(監視用途) | restic mount + virt-copy-out |
結論: Backrestは複数VMの監視・可視化には有効ですが、qcow2内部のファイル抽出は従来手法が必須です。
まとめ
- ✅ 6台のVMを一括バックアップ: スクリプトで自動化成功
- ✅ Backrestで一覧管理: Web UIで全VMの状況を可視化
- ❌ qcow2内部は見えない: Backrest単独では不可能
- ✅ libguestfsが必須:
guestfishまたはvirt-copy-outを併用
Backrest導入の判断基準:
- 単一VM → 不要
- 複数VM(5台以上) → 監視用途として有効
- ファイル抽出 → 従来手法(restic mount + virt-copy-out)を継続





