hana_shinのLinux技術ブログ

Linuxの技術情報を掲載しています。特にネットワークをメインに掲載していきます。

virshコマンドの使い方(snapshot編)



1 virsh snapshotコマンドとは?

スナップショットは仮想マシンのある時点の状態を保存する機能です。保存した状態は、あとで仮想マシンに復元することができます。たとえば、時刻T1でスナップショット(snapshot1)を取得したとします。そして、時刻T2の時にsnapshot1を仮想マシンに戻すと、仮想マシンを時刻T1の状態に戻すことができます。

       T1                                      T2
-------|---------------------------------------|-----------> 時刻
   snapshot1                               

なお、virshコマンドの使い方については、以下を参照してください。
virshコマンドの使い方 - hana_shinのLinux技術ブログ

2 検証環境

KVMホストのAlmaLinux版数は以下のとおりです。

[root@kvm ~]# cat /etc/redhat-release
AlmaLinux release 8.6 (Sky Tiger)

カーネル版数は以下のとおりです。

[root@kvm ~]# uname -r
4.18.0-372.9.1.el8.x86_64

virshコマンドの版数は以下のとおりです。

[root@kvm ~]# virsh -v
8.0.0

3 オプション一覧

オプションは以下のとおりです。

[root@kvm ~]# virsh help snapshot
 Snapshot (ヘルプのキーワード 'snapshot'):
    snapshot-create                XML によるスナップショットの作成
    snapshot-create-as             一組の引数からのスナップショットの作成
    snapshot-current               カレントスナップショットの取得・設定
    snapshot-delete                ドメインのスナップショットの削除
    snapshot-dumpxml               ドメインのスナップショットの XML 形式ダンプ
    snapshot-edit                  スナップショットの XML の編集
    snapshot-info                  スナップショット情報
    snapshot-list                  ドメインのスナップショットの一覧表示
    snapshot-parent                スナップショットの親の名前の取得
    snapshot-revert                ドメインのスナップショットへの復帰

4 スナップショットを作成する方法(snapshot-create-as)

スナップショットを取得する仮想マシンを確認します。ここでは、vm1のスナップショットを作成します。

[root@kvm ~]# virsh list
 Id   名前   状態
---------------------
 1    vm1    実行中

vm1のスナップショットをvm1-snap1という名前で作成します。

[root@kvm ~]# virsh snapshot-create-as --domain vm1 --name vm1-snap1 --description "snap1"
ドメインのスナップショット vm1-snap1 が作成されました

スナップショットを確認すると、vm1-snap1という名前のスナップショットが作成されたことがわかります。

[root@kvm ~]# virsh snapshot-list --domain vm1
 名前        作成時間                    状態
--------------------------------------------------
 vm1-snap1   2023-01-26 07:29:51 -0500   running

5 スナップショットを削除する方法(snapshot-delete)

スナップショットを確認します。vm1-snap1という名前のスナップショットが存在することがわかります。

[root@kvm ~]# virsh snapshot-list --domain vm1
 名前        作成時間                    状態
--------------------------------------------------
 vm1-snap1   2023-01-26 07:29:51 -0500   running

vm1-snap1という名前のスナップショットを削除します。

[root@kvm ~]# virsh snapshot-delete --domain vm1 --snapshotname vm1-snap1
ドメインのスナップショット vm1-snap1 が削除されました

スナップショットを確認します。vm1-snap1という名前のスナップショットが削除されたことがわかります。

[root@kvm ~]# virsh snapshot-list --domain vm1
 名前   作成時間   状態
-------------------------

[root@kvm ~]#

6 スナップショットを切り替える方法(snapshot-revert)

スナップショットを切り替えると、仮想マシンの状態を切り替えることができます。

6.1 事前準備

スナップショットを取得する仮想マシンを確認します。ここでは、vm1のスナップショットを2つ作成してみます。

[root@kvm ~]# virsh list
 Id   名前   状態
---------------------
 1    vm1    実行中

vm1-snap1という名前のスナップショットを作成します。

[root@kvm ~]# virsh snapshot-create-as --domain vm1 --name vm1-snap1
ドメインのスナップショット vm1-snap1 が作成されました

vm1-snap2という名前のスナップショットを作成します。

[root@kvm ~]# virsh snapshot-create-as --domain vm1 --name vm1-snap2
ドメインのスナップショット vm1-snap2 が作成されました

スナップショットを確認します。スナップショットが2つ作成されたことがわかります。

[root@kvm ~]# virsh snapshot-list --domain vm1
 名前        作成時間                    状態
--------------------------------------------------
 vm1-snap1   2023-01-27 05:58:38 -0500   running
 vm1-snap2   2023-01-27 05:58:47 -0500   running

6.2 スナップショットの切り替え

動作中の仮想マシンが使用しているスナップショットをカレントスナップショットと言います。カレントスナップショットを確認すると、vm1がvm1-snap2を使っていることがわかります。

[root@kvm ~]# virsh snapshot-info --domain vm1 --current
名前:         vm1-snap2
ドメイン:   vm1
カレント:   はい (yes)
状態:         running
場所:         内部
親:            vm1-snap1
子:            0
子孫:         0
メタデータ: はい (yes)

カレントスナップショットをvm1-snap1に切り替えます。

[root@kvm ~]# virsh snapshot-revert --domain vm1 --snapshotname vm1-snap1

カレントスナップショットを確認します。vm1が使用しているスナップショットがvm1-snap1に切り替わったことがわかります。

[root@kvm ~]# virsh snapshot-info --domain vm1 --current
名前:         vm1-snap1
ドメイン:   vm1
カレント:   はい (yes)
状態:         running
場所:         内部
親:            -
子:            1
子孫:         1
メタデータ: はい (yes)

7 スナップショットの実験

スナップショットを利用して、仮想マシンの状態を過去の状態に戻してみます。時刻T2でbcパッケージをインストールしたあと、時刻T3でsnapshot2を作成します。そして、時刻T4でsnapshot1を使って、仮想マシンの状態を時刻T1の状態に戻してみます。

       T1          T2          T3                      T4
-------|-----------------------|-----------------------|---------> 時刻
   snapshot1               snapshot2

スナップショットを取得する仮想マシンを確認します。

[root@kvm ~]# virsh list
 Id   名前   状態
---------------------
 3    vm1    実行中

vm1のスナップショットを作成します。

[root@kvm ~]# virsh snapshot-create-as --domain vm1 --name snapshot1
ドメインのスナップショット snapshot1 が作成されました

作成したスナップショットを確認します。

[root@kvm ~]# virsh snapshot-list --domain vm1
 名前        作成時間                    状態
--------------------------------------------------
 snapshot1   2023-01-27 07:46:09 -0500   running

vm1のコンソールに接続します。なお、コンソールを使うためには、あらかじめvm1のカーネルコマンドラインパラメータに"console=ttyS0,115200"を追加して、grub2-mkconfigコマンドを使って、て、/boot/grub2/grub.cfgに設定変更を反映しておく必要があります。

[root@kvm ~]# virsh console vm1
Connected to domain 'vm1'
Escape character is ^] (Ctrl + ])

CentOS Linux 7 (Core)
Kernel 3.10.0-1160.el7.x86_64 on an x86_64

server login: root
パスワード:
最終ログイン: Fri Jan 27 21:36:11  ttyS0 上

bcコマンドがvm1にインストールされているかどうかを確認します。

[root@server ~]# bc
-bash: /bin/bc: そのようなファイルやディレクトリはありません

bcコマンドをインストールします。

[root@server ~]# yum -y install bc

bcコマンドがvm1にインストールされているかどうかを確認します。

[root@server ~]# bc --version
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

Ctrl+]を押下してkvmホストに戻ります。そして、snapshot2を作成します。snapshot2にはbcパッケージがインストールされています。

[root@kvm ~]# virsh snapshot-create-as --domain vm1 --name snapshot2
ドメインのスナップショット snapshot2 が作成されました

スナップショットの一覧を確認します。

[root@kvm ~]# virsh snapshot-list --domain vm1
 名前        作成時間                    状態
--------------------------------------------------
 snapshot1   2023-01-27 07:46:09 -0500   running
 snapshot2   2023-01-27 07:48:52 -0500   running

スナップショットをsnapshot1に切り替えて、仮想マシンの状態を確認してみます。bcパッケージがインストールされていないことがわかります(期待値)。

[root@kvm ~]# virsh snapshot-revert --domain vm1 --snapshotname snapshot1

カレントのスナップショットを確認すると、snapshot1であることがわかります。

[root@kvm ~]# virsh snapshot-info --domain vm1 --current
名前:         snapshot1
ドメイン:   vm1
カレント:   はい (yes)
状態:         running
場所:         内部
親:            -
子:            1
子孫:         1
メタデータ: はい (yes)

vm1のコンソールに接続します。

[root@kvm ~]# virsh console vm1
Connected to domain 'vm1'
Escape character is ^] (Ctrl + ])

bcコマンドの版数を確認します。bcコマンドがインストールされていないことがわかります。

[root@server ~]# bc --version
-bash: /bin/bc: そのようなファイルやディレクトリはありません

Ctrl+]を押下してkvmホストに戻ります。そして、スナップショットをsnapshot2に切り替えて、仮想マシンの状態を確認してみます。bcパッケージがインストールされていることがわかります

[root@kvm ~]# virsh snapshot-revert --domain vm1 --snapshotname snapshot2

vm1のコンソールに接続します。

[root@kvm ~]# virsh console vm1
Connected to domain 'vm1'
Escape character is ^] (Ctrl + ])

仮想マシンの状態を確認してみます。bcパッケージがインストールされていることがわかります(期待値)

[root@server ~]# bc --version
bc 1.06.95
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.

Z 参考情報

私が業務や記事執筆で参考にした書籍を以下のページに記載します。
Linux技術のスキルアップをしよう! - hana_shinのLinux技術ブログ