VM ゲスト の起動や停止など、ほとんどの管理作業はグラフィカルなアプリケーションである 仮想マシンマネージャ とコマンドラインである virsh
の両方で実施することができます。ただし、 VNC 経由でのグラフィカルコンソールへのアクセスは、グラフィカルユーザインターフェイスでのみアクセスすることができます。
VM ホストサーバ 内で動作させる場合、 libvirt
のツールである 仮想マシンマネージャ, virsh
, virt-viewer
の各ツールを利用することで、ホスト内で動作する VM ゲスト を管理することができます。ただし、リモートの VM ホストサーバ にある VM ゲスト を管理することもできます。この場合、 libvirt
にリモートから接続できるように設定する必要があります。詳しくは 第11章 「接続と認可」 をお読みください。
仮想マシンマネージャ でリモートのホストに接続するには、まずは 11.2.2項 「仮想マシンマネージャ による接続の管理」 での説明に従って、接続を設定する必要があります。また、 virsh
や virt-viewer
でリモートのホストに接続する場合は、 -c
オプションで接続 URI を指定する必要があります (たとえば virsh -c qemu+tls://saturn.example.com/system
や virsh -c xen+ssh://
など) 。接続 URI の書式は、使用する接続の種類とハイパーバイザによって異なります。詳しくは 11.2項 「VM ホストサーバ への接続」 をお読みください。
なお、本章内でのコマンド例では、いずれも接続 URI を略しています。
VM ホストサーバ 内で libvirt
を利用して管理されている全 VM ゲスト の一覧表示
仮想マシンマネージャ のメインウインドウには、接続している VM ホストサーバ 内にある全ての VM ゲスト が一覧表示されています。それぞれの行にはマシンの名前のほか、状態 (
, , ) がアイコンとテキストで、そして CPU の使用率を表すバーも表示されています。virsh
による VM ゲスト の一覧表示 #Edit sourceVM ゲスト の一覧を表示するには、 virsh
list
コマンドを使用します:
>
virsh list
>
virsh list --all
詳細およびさらなるオプションについては、 virsh help list
または man 1 virsh
で表示されるマニュアルページをお読みください。
VM ゲスト は VNC 接続でアクセスすることができる (グラフィカルコンソールの場合) ほか、ゲスト側のオペレーティングシステムで対応している必要がありますが、シリアルコンソール経由でアクセスすることもできます。
VM ゲスト のグラフィカルコンソールを表示することで、物理マシンに VNC 接続しているのと同じように仮想マシンを扱うことができるようになります。また、接続先の VNC サーバで認証を求めるよう設定している場合、ユーザ名 (必要であれば) とパスワードの入力を求められます。
VNC コンソール内でマウスのボタンを押すと、マウスカーソルは 「捕捉」 状態になり、コンソールの外側には移動できなくなります。捕捉を解除するには、 Alt–Ctrl を押してください。
マウスカーソルがコンソール内に捕捉されず、 VM ゲスト のウインドウの内側と外側を自由に行き来できるようにしたい場合は、 VM ゲスト にタブレット入力デバイスを追加してください。詳しくは 13.5項 「入力デバイス」 をお読みください。
Ctrl–Alt–Del などの特殊なキー入力は、ホスト側で処理されてしまい、 VM ゲスト には配送されません。これらの特殊なキー入力を VM ゲスト 側に受け渡すには、 VNC ウインドウ内にある メニューの中から、送信したいキーを選択してください。なお、 メニューは 仮想マシンマネージャ と virt-viewer
を利用している場合にのみ使用することができます。 仮想マシンマネージャ では、 ヒント: 仮想マシンに対する特殊キーの送信について で説明している手順で、 「sticky key」 を使用することもできます。
仕様上は VNC に対応していれば、全てのビューアから VM ゲスト に接続することができます。ただし、ゲストへのアクセスに際して SASL 認証を使用している場合や TLS/SSL 接続を設定しているような場合、利用できる VNC ビューアは限られてきます。 tightvnc
や tigervnc
などの一般的な VNC ビューアには、 SASL 認証の機能も、 TLS/SSL 接続への対応も用意されていません。 仮想マシンマネージャ と virt-viewer
の組み合わせ以外で唯一対応しているものは、 Remmina (詳しくは4.2項 「Remmina: リモートデスクトップクライアント」 をお読みください) のみとなります。
仮想マシンマネージャ 内にある VM ゲスト の項目を選択して、マウスの右ボタンを押します。
ポップアップメニューから
を選択します。virt-viewer
を利用したグラフィカルコンソールの表示 #Edit sourcevirt-viewer
はシンプルな VNC ビューアで、 VM ゲスト のコンソール用にいくつかの機能が追加されています。たとえば 「wait」 モードを指定して起動すると、接続を行う前に VM ゲスト が開始されるのを待つようになります。また、 VM ゲスト が再起動された場合、自動的に再接続する機能も用意されています。
virt-viewer
では、 VM ゲスト の指定を名前のほか、 ID や UUID で指定することができます。 virsh
list --all
を実行すると、これらのデータを表示することができます。
実行中や一時停止中のゲストに接続する場合は、 ID や UUID 、もしくは名前で選択することができます。シャットオフされている VM ゲスト の場合は、 ID が付与されていませんので、 UUID や名前で選択してください。
8
のゲストに接続:>
virt-viewer 8
sles12
という名前の停止中のゲストに接続; ゲストの起動が行われるまで待機する設定:>
virt-viewer --wait sles12
--wait
オプションを指定すると、 VM ゲスト が実行中でない場合、接続が保留状態になります。ゲストが起動すると、ビューアが表示されるようになります。
詳しくは virt-viewer
--help
もしくは man 1 virt-viewer
をお読みください。
SSH 経由で接続しているホストに対して virt-viewer
で接続を開く場合、 SSH のパスワードは 2 回入力する必要があります。最初の 1 回は libvirt
での認証に、もう 1 回は VNC サーバとの認証になります。なお、 2 回目のパスワードは、 virt-viewer の開始時にコマンドラインで指定する必要があります。
仮想マシンのグラフィカルコンソールに接続するには、 VM ゲスト にアクセスするクライアント側でも、グラフィカル環境を用意する必要があります。グラフィカルな環境を必要としない場合や、使用したくない場合は、 virsh
でシリアルコンソール経由を介してシェルにアクセスすることができます。 VM ゲスト のシリアルコンソールにアクセスするには、下記のようなコマンドを入力して実行します:
>
virsh console sles12
virsh console
には 2 種類のオプションフラグが存在しています。 --safe
を指定すると、コンソールに対して排他アクセスを行おうとします。 --force
を指定すると、接続を行う前に既存の接続を全て切断します。いずれの機能とも、ゲスト側のオペレーティングシステムでの対応が必要となります。
VM ゲスト に対してシリアルコンソール経由でアクセスするには、ゲスト側のオペレーティングシステムがシリアルコンソールに対応し、適切に設定されている必要があります。詳しくはゲスト側のオペレーティングシステムのマニュアルをお読みください。
SUSE Linux Enterprise や openSUSE の場合、シリアルコンソールへのアクセスは既定で無効化されています。有効化したい場合は、下記のようにします:
YaST ブートローダモジュールを起動して、 console=ttyS0
を追加します。
YaST ブートローダモジュールを起動して、シリアルコンソールを有効化したい起動項目を選択します。選択を行ったら console=ttyS0
を追加します。これに加えて、 /etc/inittab
ファイルを編集し、下記の行のコメント文字を外します:
#S0:12345:respawn:/sbin/agetty -L 9600 ttyS0 vt102
VM ゲスト の開始や停止、一時停止は、 仮想マシンマネージャ もしくは virsh
で行うことができます。また、 VM ホストサーバ の起動時に VM ゲスト を自動的に開始するように設定することもできます。
なお、 VM ゲスト をシャットダウンする際は、正常な手順でシャットダウンを行うか、もしくは強制的にシャットダウンを行うかを選択することができます。強制的なシャットダウンはコンピュータの電源を抜く行為と同じであり、正常な手順でシャットダウンができない場合にのみ実施すべきものです。また、強制的なシャットダウンを行うと、 VM ゲスト 内のファイルシステムを破壊してしまうことがあるほか、データを失ってしまうこともあります。
正常にシャットダウンを行うには、 VM ゲスト 側が ACPI に対応するよう設定されていなければなりません。 仮想マシンマネージャ でゲストを作成している場合、 VM ゲスト の ACPI 対応は自動的に設定されます。
ゲスト側のオペレーティングシステムにも依存しますが、 ACPI が利用できれば正常にシャットダウンできるというわけではありません。本番環境で使用する場合は、あらかじめ正常にシャットダウンできること、および再起動できることを確認してからご使用ください。なお、 openSUSE や SUSE Linux Enterprise Desktop などでは、シャットダウンや再起動を行うのに Polkit による認可を必要とするように設定することもできます。このポリシーが全ての VM ゲスト で無効化されていることを確認してください。
Windows XP や Windows Server 2003 のゲストインストール時に ACPI を有効化した場合、 VM ゲスト の設定のみを変更しただけでは設定不足となります。詳しくは下記をお読みください:
なお、 VM ゲスト 側の設定にかかわらず、ゲスト側のオペレーティングシステム内からシャットダウンを行うことで、正常なシャットダウンを実現することができます。
VM ゲスト の状態変更は 仮想マシンマネージャ のメインウインドウのほか、 VNC ウインドウからも行うことができます。
VM ゲスト の項目を選択して、マウスの右ボタンを押します。
表示されたポップアップメニューから、
, のいずれか、もしくは 内にある選択肢のいずれかを選択します。10.2.1.1項 「仮想マシンマネージャ を利用したグラフィカルコンソールの表示」 に示されている手順に従って、 VNC ウインドウを表示します。
ツールバー内、もしくは
メニュー内にある , のいずれか、もしくは 内にある選択肢のいずれかを選択します。VM ホストサーバ の起動時にゲストを自動的に開始するように設定することができます。この機能は既定では有効化されておらず、それぞれの VM ゲスト に対して個別に設定する必要があります。全ての仮想マシンを一括で有効化することはできません。
仮想マシンマネージャ で設定したい VM ゲスト の項目を選んでダブルクリックし、コンソールを表示します。
› を選んで、 VM ゲスト の設定ウインドウを表示します。
を選択し、表示された を選択します。
を押して新しい設定を保存します。
virsh
を利用した VM ゲスト の状態変更 #Edit source下記の例では、 「sles12」 という名前の VM ゲスト の状態を変更しています。
>
virsh start sles12
>
virsh suspend sles12
>
virsh resume sles12
>
virsh reboot sles12
>
virsh shutdown sles12
>
virsh destroy sles12
>
virsh autostart sles12
>
virsh autostart --disable sles12
VM ゲスト の状態保存を行うことで、ゲストのメモリの内容を保存することができます。この操作はコンピュータの ハイバネーション (休止状態) に似た操作です。状態保存された VM ゲスト の復元を行うことで、その時点の状態に戻すこともできます。
状態保存を行うと、 VM ゲスト は一時停止状態になり、その時点でのメモリ内容をディスクに保存したあと、 VM ゲスト が停止されます。ただし、この操作では VM ゲスト のディスクのコピーが作成されるわけではありません。また、仮想マシンの状態保存にかかる時間は、割り当てているメモリ量に依存して決まります。状態保存を行うと、 VM ゲスト に割り当てていたメモリが VM ホストサーバ 側に戻され、利用できるようになります。
状態復元の操作は、以前に状態保存しておいた VM ゲスト のメモリ状態を読み込んで、実行中の状態に戻す操作です。ここではゲストの起動処理は発生せず、状態を保存した時点の状態に戻します。この操作は、ハイバネーションからの復帰に似ています。
なお、 VM ゲスト の状態は専用のファイルに保存されます。そのため、保存先のディスクには十分な空き容量があることを確認してください。下記のコマンドをゲスト内で実行すると、おおよそ必要な容量を計算することができます (メガバイト単位で表示されます):
>
free -mh | awk '/^Mem:/ {print $3}'
VM ゲスト の状態保存を行った後は、必ず状態復元を行うものとし、通常の起動や開始は行ってはなりません。通常の起動や開始を行ってしまうと、マシンの仮想ディスクが途中の状態のまま起動することになってしまうほか、状態保存のファイルとも整合性が取れなくなってしまうため、状態復元を行うと致命的なエラーが発生することになります。
状態保存された VM ゲスト を正しく使用し続けるには、状態復元を忘れずに実施してください。また、 virsh
で状態保存を行った場合は、 仮想マシンマネージャ で状態を復元することができません。この場合は virsh
で復元を行ってください。
VM ゲスト の状態を保存してから長い時間 (2〜3時間以上) が経過した後に復元を行った場合、時刻同期サービスが正しく時刻を修正できなくなったりする場合があります。このような場合は、 VM ゲスト の時刻を手作業で修正してください。たとえば KVM ホストであれば、 QEMU のゲストエージェントを利用することで、 guest-set-time
コマンドでゲスト側の時刻を修正することができます。詳しくは 第19章 「QEMU ゲストエージェント」 をお読みください。
raw
, qcow2
のいずれかでなければならない件についてVM ゲスト の状態保存や状態復元を行うには、 VM ゲスト が raw
( .img
) もしくは qcow2 の種類の仮想ディスクを使用している必要があります。
VM ゲスト の VNC 接続ウインドウを表示します。また、ゲストが動作中であることを確認します。
› › を選択します。
VM ゲスト の VNC 接続ウインドウを表示します。また、ゲストが動作中でないことを確認します。
› を選択します。
VM ゲスト を 仮想マシンマネージャ から状態保存していると、ゲストの 警告: 保存後の復元作業について で説明しているとおり、 virsh
で状態保存を行っている場合に注意してください。
virsh
による状態保存と状態復元 #Edit sourceVM ゲスト の状態保存を行うには、 virsh
save
に続いて 仮想マシン名 (もしくは ID) と保存先のファイルを指定します。
opensuse13
という名前のゲストを状態保存>
virsh save opensuse13 /virtual/saves/opensuse13.vmsav
37
のゲストを状態保存>
virsh save 37 /virtual/saves/opensuse13.vmsave
VM ゲスト の状態を復元するには、 virsh
restore
コマンドを使用します:
>
virsh restore /virtual/saves/opensuse13.vmsave
VM ゲスト のスナップショット機能は、 CPU やメモリ、デバイスの状態のほか、書き込み可能な全てのディスクの内容を含む、完全な仮想マシンのスナップショットです。仮想マシンのスナップショット機能を使用するには、接続されている全てのハードディスクが qcow2 形式である必要があるほか、少なくとも 1 つ以上のディスクが書き込み可能である必要があります。
スナップショットを使用することで、その時点でのマシンの状態を自由に復元できるようになります。これは特に、設定を誤ってしまった場合の巻き戻しや、多数のパッケージを誤ってインストールしてしまった場合の取り消しに便利な仕組みです。また、 VM ゲスト がシャットオフ中に採取されたスナップショットを適用した場合は、適用後に起動を行う必要があります。また、スナップショットの適用を行うと、現時点での状態が破棄されます。
スナップショット機能は KVM の VM ホストサーバ にのみ対応しています。
スナップショットの種類を説明するにあたって、下記のいくつかの用語を使用しています:
スナップショットを元の VM ゲスト の qcow2 ファイル内に保存する方式です。このファイルには、スナップショットで保存された情報と、スナップショットを採取してからの変更点の両方が記録されます。内部スナップショットの利点としては、必要な全ての情報が 1 つのファイル内に保存されていて、マシン間で複製や移動を行う手間が省けるという点にあります。
外部スナップショットでは、元の qcow2 ファイルを保存して読み込み専用とし、それとは別に新しく qcow2 ファイルを作成してそこに変更点を記録します。元のファイルは バッキング もしくは ベース ファイルと呼ばれ、新しく作成したほうのファイルは オーバーレイ もしくは 派生 ファイルと呼ばれます。外部スナップショットは、 VM ゲスト のバックアップを作成する際に便利です。ただし、外部スナップショットは 仮想マシンマネージャ ではサポートしておらず、 virsh
でも直接削除することができません。 QEMU での外部スナップショットについて、詳しくは 33.2.4項 「ディスクイメージの効率的な使用」 をお読みください。
VM ゲスト の動作中に採取するスナップショットを意味します。内部スナップショット形式での動作中スナップショットの場合、デバイスとメモリ、ディスクの各状態を保存することができます。 virsh
を利用した外部スナップショット形式での動作中スナップショットの場合は、メモリとディスクのうちいずれか、もしくはその両方の状態を保存することができます。
VM ゲスト がシャットオフ (シャットダウン) されている間に採取するスナップショットを意味します。ゲストが動作していない状態で採取することから、メモリも使用されていない状態になりますので、矛盾を一切発生させずに採取することができるようになります。
仮想マシンマネージャ では動作中スナップショットであってもオフラインスナップショットであっても、内部スナップショットにしか対応していません。
仮想マシンマネージャ でスナップショットの管理ビューを表示するには、まず 10.2.1.1項 「仮想マシンマネージャ を利用したグラフィカルコンソールの表示」 の手順で VNC のウインドウを表示します。その後、 › を選択するか、ツールバーから を選択します。
選択した VM ゲスト に対する既存のスナップショットの一覧が、ウインドウの左側に表示されます。現時点での最新のスナップショットには、緑色のチェックマークが付けられます。ウインドウの右側には、左側で選択しているスナップショットの詳細が表示されます。詳細にはスナップショットのタイトルとタイムスタンプのほか、採取時点での VM ゲスト の状態や説明などが表示されます。また、動作中スナップショットである場合には、その時点でのスクリーンショットも表示されます。なお、
の内容については、この表示から変更することができます。それ以外のスナップショットデータについては、変更できません。VM ゲスト に対して新しいスナップショットを採取するには、下記の手順を実施します:
オフラインスナップショットを採取する場合は、まず VM ゲスト をシャットダウンします。
VNC ウインドウ内の左下にある
ボタンを押します。ウインドウが表示されます。
欄にスナップショットの名前を入力します。必要であれば、 欄に詳細を記述します。名前は作成後に変更することはできません。後からスナップショットの状況がわかるような名前を入力してください。
を押すと採取が行われます。
選択した VM ゲスト のスナップショットを削除するには、下記の手順を実施します:
VNC ウインドウ内の左下にある
ボタンを押します。削除の確認メッセージが表示されますので、
を押します。選択したスナップショットで開始するには、下記の手順を実施します:
VNC ウインドウ内の左下にある
ボタンを押します。開始の確認メッセージが表示されますので、
を押します。virsh
を利用したスナップショットの作成と管理 #Edit source特定の VM ゲスト (下記では admin_server) に対するスナップショットの全一覧を表示するには、 snapshot-list
コマンドを使用します:
>
virsh snapshot-list --domain admin_server
名前 作成時間 状態
--------------------------------------------------------------------
sleha_12_sp2_b2_two_node_cluster 2016-06-06 15:04:31 +0200 shutoff
sleha_12_sp2_b3_two_node_cluster 2016-07-04 14:01:41 +0200 shutoff
sleha_12_sp2_b4_two_node_cluster 2016-07-14 10:44:51 +0200 shutoff
sleha_12_sp2_rc3_two_node_cluster 2016-10-10 09:40:12 +0200 shutoff
sleha_12_sp2_gmc_two_node_cluster 2016-10-24 17:00:14 +0200 shutoff
sleha_12_sp3_gm_two_node_cluster 2017-08-02 12:19:37 +0200 shutoff
sleha_12_sp3_rc1_two_node_cluster 2017-06-13 13:34:19 +0200 shutoff
sleha_12_sp3_rc2_two_node_cluster 2017-06-30 11:51:24 +0200 shutoff
sleha_15_b6_two_node_cluster 2018-02-07 15:08:09 +0100 shutoff
sleha_15_rc1_one-node 2018-03-09 16:32:38 +0100 shutoff
現時点での最新のスナップショットを表示するには、 snapshot-current
コマンドを使用します:
>
virsh snapshot-current --domain admin_server
Basic installation incl. SMT for CLOUD4
特定のスナップショットに関する詳細を表示するには、 snapshot-info
コマンドを使用します:
>
virsh snapshot-info --domain admin_server \
-name "Basic installation incl. SMT for CLOUD4"
名前: Basic installation incl. SMT for CLOUD4
ドメイン: admin_server
カレント: はい (yes)
状態: shutoff
場所: 内部
親: Basic installation incl. SMT for CLOUD3-HA
子: 0
子孫: 0
メタデータ: はい (yes)
VM ゲスト に対して内部スナップショットを採取するには、それが動作中スナップショットであってもオフラインスナップショットであっても、 snapshot-create-as
コマンドを使用します:
>
virsh snapshot-create-as --domain admin_server1 --name "Snapshot 1"2 \
--description "First snapshot"3
virsh
を使用することで、ゲストのメモリ状態またはディスク状態、もしくはその両方を外部スナップショットとして採取することができます。
ゲストのディスク状態の外部スナップショットを採取するには、それが動作中であってもオフラインであっても、 --disk-only
オプションを指定します:
>
virsh snapshot-create-as --domain admin_server --name \
"Offline external snapshot" --disk-only
--diskspec
オプションを指定することで、外部スナップショットのファイル作成方法を制御することができます:
>
virsh snapshot-create-as --domain admin_server --name \
"Offline external snapshot" \
--disk-only --diskspec vda,snapshot=external,file=/path/to/snapshot_file
ゲストのメモリ状態の外部スナップショットを採取するには、 --live
および --memspec
オプションを指定します:
>
virsh snapshot-create-as --domain admin_server --name \
"Offline external snapshot" --live \
--memspec snapshot=external,file=/path/to/snapshot_file
ゲストのディスクとメモリ状態の両方を外部スナップショットとして採取するには、 --live
, --diskspec
, --memspec
の各オプションを組み合わせて指定します:
>
virsh snapshot-create-as --domain admin_server --name \
"Offline external snapshot" --live \
--memspec snapshot=external,file=/path/to/snapshot_file
--diskspec vda,snapshot=external,file=/path/to/snapshot_file
詳しくは man 1 virsh
内の SNAPSHOT COMMANDS セクション (英語) をお読みください。
外部スナップショットは virsh
では削除できません。 VM ゲスト の内部スナップショットを削除し、占有していたディスク領域を解放するには、 snapshot-delete
コマンドを使用します:
>
virsh snapshot-delete --domain admin_server --snapshotname "Snapshot 2"
指定したスナップショットで開始するには、 snapshot-revert
コマンドを使用します:
>
virsh snapshot-revert --domain admin_server --snapshotname "Snapshot 1"
現在のスナップショット (VM ゲスト を最後にシャットダウンした状態) を開始する場合は、スナップショットの名前ではなく、 --current
オプションを指定すれば十分です:
>
virsh snapshot-revert --domain admin_server --current
既定では、 virsh
による VM ゲスト の削除では、 XML 形式の設定ファイルのみを削除します。接続されているストレージは既定では削除されませんので、他の VM ゲスト に接続しなおして使用することもできます。 仮想マシンマネージャ を使用する場合は、同時にストレージファイルも削除することができます。
仮想マシンマネージャ 内にある VM ゲスト の項目を選択して、マウスの右ボタンを押します。
表示されたコンテキストメニューから、
を選択します。確認メッセージが表示されますので、再度
ボタンを押します。これにより、 VM ゲスト を恒久的に削除することができます。また、削除は取り消すことができません。仮想ディスクについても同時に削除したい場合は、
を選択します。こちらについても削除を取り消すことはできません。virsh
を利用した VM ゲスト の削除 #Edit sourceVM ゲスト を削除するには、まずシャットダウンしておく必要があります。動作中の場合、ゲストを削除することができません。シャットダウンに関する情報については、 10.3項 「VM ゲスト の状態変更 (開始/停止/一時停止)」 をお読みください。
virsh
を使用して VM ゲスト を削除するには、 virsh
undefine
VM_名 のように入力して実行します。
>
virsh undefine sles12
接続されているストレージファイルを自動的に削除するオプションは用意されていません。 libvirt でストレージファイルを管理している場合は、 8.2.1.4項 「ストレージプールからのボリュームの削除」 の手順に従って削除を行ってください。
仮想化を利用する際の大きな利点のうちの 1 つとして、 VM ゲスト の可搬性があげられます。 VM ホストサーバ をメンテナンスなどの理由でダウンさせる必要がある場合や、ホストの負荷が大きすぎるような場合や、容易にゲストを他の VM ホストサーバ に移行させることができます。なお、 KVM と Xen の両方が 「ライブ」 マイグレーションに対応し、 VM ゲスト を動作させ続けながら移行を行うことができます。
VM ゲスト を他の VM ホストサーバ に移行させる場合、下記の要件を満たす必要があります:
事後にコピーする種類のライブマイグレーション (サポート対象外であるほか、本番環境では推奨しません) を実行する場合、カーネルバージョンが 5.11 もしくはそれ以降では、 unprivileged_userfaultfd
のシステム変数を 1
に設定する必要があります:
>
sudo
sysctl -w vm.unprivileged_userfaultfd=1
カーネルバージョン 5.11 以前のバージョンを使用している場合は、事後コピーを使用する際に unprivileged_userfaultfd を設定する必要はありません。 libvirt
側では以前と同じ動作になるよう、 /usr/lib/sysctl.d/60-qemu-postcopy-migration.conf
ファイルで設定を行っています。
移行元と移行先のシステムが、同じアーキテクチャでなければなりません。
移行元と移行先の両方のマシンから、同じストレージデバイスにアクセスできなければなりません (たとえば NFS や iSCSI などを使用します) 。また、両方のマシンでストレージプールを設定しなければなりません。詳しくは 第12章 「高度なストレージ設定」 をお読みください。
移行時に CD-ROM やフロッピィディスクのメディアが挿入されている場合は、それらも両方のマシンからアクセスできなければなりません。ただし、この場合は移行時に前もって 13.11項 「仮想マシンマネージャ を利用したフロッピィもしくは CD/DVD-ROM メディアの取り出しと交換」 の手順に従い、メディアを取り出しておくことができます。
libvirtd
を両方の VM ホストサーバ で動作させる必要があるほか、移行元と移行先の間で libvirt
の接続ができる環境でなければなりません (双方向での接続が必要です) 。詳しくは 11.3項 「リモート接続の設定」 をお読みください。
移行先のホストでファイアウオール機能が動作している場合、移行を許可するためにポートを開いておく必要があります。移行処理時にポートを指定しなかった場合、 libvirt
は 49152 から 49215 までの範囲でポートを選択します。 移行先のホスト でファイアウオールを設定し、この範囲のポートを開いておくか、移行時に明示的に指定するポートを開いておいてください。
移行元と移行先のマシンがネットワーク内の同じサブネットに属している必要があります。そうでないと、移行後にネットワークが正しく動作しなくなってしまいます。
移行に参加する全ての VM ホストサーバ の qemu ユーザの UID が同じ値でなければならないほか、 kvm, qemu, libvirt の各グループについて GID が同じ値でなければなりません。
移行先のホストで、同じ名前の実行中もしくは一時停止中の VM ゲスト が存在していてはなりません。また、同じ名前のシャットダウン済みの VM ゲスト が存在した場合、設定は上書きされます。
ホスト CPU を除く全ての CPU モデルが VM ゲスト の移行に対応しています。
ディスクデバイスの種類が SATA である場合、移行を行うことができません。
ファイルシステムのパススルー機能を使用している場合、移行を行うことができません。
VM ホストサーバ と VM ゲスト の両方で、適切な時刻維持を設定する必要があります。詳しくは 第17章 「VM ゲスト の時刻設定」 をお読みください。
ホストからゲストに対して、物理的なデバイスを受け渡していてはなりません。具体的には、 PCI パススルーや SR-IOV を利用している場合、移行を行うことができません。ライブマイグレーションに対応させる必要がある場合は、ソフトウエアによる仮想化 (準仮想化もしくは完全仮想化) をお使いください。
キャッシュモードの設定は、移行処理に際して重要な設定となります。詳しくは 16.6項 「キャッシュモードとライブマイグレーションの関係」 をお読みください。
両方のホストでイメージディレクトリが同じパスである必要があります。
全てのホストで同じレベルのマイクロコードを適用している必要があります (特に spectre マイクロコードアップデート) 。これは全てのホストで最新の openSUSE Leap の更新を適用することで、容易に解決することができます。
仮想マシンマネージャ を利用して VM ゲスト の移行を行う場合、どのマシンからそれを実施してもかまいません。移行元のマシンで 仮想マシンマネージャ を動作させて移行してもかまいませんし、移行先や全く無関係なコンピュータで 仮想マシンマネージャ を利用して移行してもかまいません。ただし、無関係なコンピュータを利用する場合は、移行元と移行先の両方にリモート接続できる環境を用意する必要があります。
まずは 仮想マシンマネージャ を起動し、移行元のホストと移行先のホストの両方に接続します。移行元でも移行先でもないコンピュータで 仮想マシンマネージャ を起動する場合、両方のホストへの接続ができる環境をご用意ください。
移行対象の VM ゲスト を選択してマウスの右ボタンを押し、
を選択します。なお、 VM ゲスト が実行中であるか、一時停止中であることを確認してください。シャットダウン (シャットオフ) されているコンピュータに対しては、ゲストを移行することができません。移行速度を向上させるには、 VM ゲスト を一時停止させる方法があります。これは従来のバージョンの 仮想マシンマネージャ における 「オフラインマイグレーション」 と等価な意味を持ちます。
を選択します。移行先のホストが一覧に現れていない場合は、ホストに接続されているかどうかを確認してください。
リモートのホストに接続する際の既定のオプションを変更するには、
以下にある と (IP アドレスもしくはホスト名) 、そして をそれぞれ変更します。 を指定した場合、 も指定しなければなりません。を選択すると、移行処理を恒久的に行う (既定値) か一時的に行う ( ) かを選択することができます。
また、必要であれば cache="none"
/ 0_DIRECT
を使用せずに VM ゲスト のストレージに対して矛盾せずにアクセスできる設定が必要となります。
新しいバージョンの 仮想マシンマネージャ では、移行時の帯域設定オプションの設定が削除されています。帯域幅を指定して移行したい場合は、 virsh
をお使いください。
移行を開始するには、
を押します。移行が完了すると、
ウインドウが閉じられ、 VM ゲスト が 仮想マシンマネージャ ウインドウ内の新しいホストの下に表示されることになります。ただし、移行元の VM ゲスト はそのまま残されます (シャットダウン状態になります) 。virsh
を利用した移行 #Edit sourcevirsh
migrate
で VM ゲスト の移行を行う場合、ホスト内でコマンドを実行する必要があることから、 VM ホストサーバ のシェルに直接接続する必要があります。移行コマンドは下記のようになります:
>
virsh migrate [OPTIONS] VM_の_ID_または名前 接続_URI [--migrateuri tcp://ホスト名:ポート]
最もよく使用されるオプションは下記のとおりです。完全な一覧を読みたい場合は、 virsh help migrate
を実行してください。
--live
ライブマイグレーションを行います。指定しない場合、ゲストは移行時に一時停止状態になります ( 「オフラインマイグレーション」 ) 。
--suspend
オフラインマイグレーションを行い、移行先のホストでは VM ゲスト を再開しないようにします。
--persistent
既定では、移行した VM ゲスト は一時的な移行として扱われ、移行先のホストで VM ゲスト をシャットダウンすると、設定は自動的に削除されます。このオプションを指定すると、移行処理を恒久的なものにすることができます。
--undefinesource
これを指定した場合、移行処理が成功すると、移行元のホスト内での VM ゲスト の定義を削除するようになります (ただし、ゲストに接続されていた仮想ディスクについては、削除が 行われません ) 。
--parallel --parallel-connections 接続数
移行元と移行先のホスト間でデータを転送する際、 1 スレッドだけではネットワークリンクを使い切れないような場合、並行 (パラレル) マイグレーションを使用することができます。たとえば 40 GB のネットワークインターフェイスを持つホストの場合、 4 つのスレッドを利用する必要があるかもしれません。また並行マイグレーションを使用すると、メモリ量の大きい VM の移行にかかる時間を削減することもできます。
下記の例では、移行元のホストを mercury.example.com 、移行先のホストを jupiter.example.com とし、 VM ゲスト の名前が opensuse131
(ID 37
) であるものとして記述しています。
>
virsh migrate 37 qemu+ssh://tux@jupiter.example.com/system
>
virsh migrate --live opensuse131 qemu+ssh://tux@jupiter.example.com/system
>
virsh migrate --live --persistent --undefinesource 37 \
qemu+tls://tux@jupiter.example.com/system
>
virsh migrate opensuse131 qemu+ssh://tux@jupiter.example.com/system \
--migrateuri tcp://@jupiter.example.com:49152
既定では、 virsh migrate
コマンドは移行先のホスト内に、一時的な (暫定的な) コピーを作成します。移行元のホストには、元のゲストがシャットダウン状態で残されます。一時的なコピーは、ゲストをシャットダウンするとサーバから削除されてしまいます。
移行先のホストに恒久的なコピーを作成したい場合は、 --persistent
オプションを指定してください。ただし、この場合も移行元のホストには、元のゲストをシャットダウンしたものが残ります。なお、 --persistent
オプションと --undefinesource
オプションを指定することで、移行先に恒久的なコピーを作成し、移行元のホストからは削除することができます。
なお、 --persistent
を指定せずに --undefinesource
を指定することは避けておくことをお勧めします。この場合、移行が完了した時点で移行元のゲストが削除され、移行先ではシャットダウンを行うことでゲストの設定が削除されてしまうためです。
まずはホスト間でゲストのイメージを共有するため、ストレージのエクスポートを行います。エクスポートは NFS サーバを構築することで実現することができます。下記の例では、 10.0.1.0/24 のネットワーク内にある全てのマシンに対して、 /volume1/VM
というディレクトリを共有しています。ここでは SUSE Linux Enterprise の NFS サーバを使用するものとします。 root ユーザで /etc/exports
ファイルを編集し、下記の内容を追加します:
/volume1/VM 10.0.1.0/24 (rw,sync,no_root_squash)
NFS サーバを再起動します:
>
sudo
systemctl restart nfsserver>
sudo
exportfs /volume1/VM 10.0.1.0/24
VM ゲスト の移行に使用するそれぞれのホストでは、ゲストのイメージを含んでいるボリュームにアクセスすることができるよう、プールを定義しなければなりません。ここでは NFS サーバが 10.0.1.99 にあり、共有が /volume1/VM
というディレクトリに存在し、これを /var/lib/libvirt/images/VM
ディレクトリにマウントする場合の例です。プール名は VM という名前であるものとします。プールを定義するには、 VM.xml
というファイルを作成し、下記の内容を記述します:
<pool type='netfs'> <name>VM</name> <source> <host name='10.0.1.99'/> <dir path='/volume1/VM'/> <format type='auto'/> </source> <target> <path>/var/lib/libvirt/images/VM</path> <permissions> <mode>0755</mode> <owner>-1</owner> <group>-1</group> </permissions> </target> </pool>
あとはこの内容を libvirt
に読み込ませるため、 pool-define
コマンドを使用します:
#
virsh pool-define VM.xml
なお、 virsh
コマンドを直接使用してプールを定義することもできます:
#
virsh pool-define-as VM --type netfs --source-host 10.0.1.99 \
--source-path /volume1/VM --target /var/lib/libvirt/images/VM
プール VM が定義されました
以後のコマンドは、 virsh
に何もパラメータを指定せずに実行した場合に提供される、 virsh
の対話型シェルを利用して設定しています。あとはプールをホストの起動時に自動的に開始させる (autostart オプション) ようにします:
virsh #
pool-autostart VM
プール VM が自動起動としてマークされました
autostart を無効化したい場合は、下記のように入力して実行します:
virsh #
pool-autostart VM --disable
プール VM の自動起動マークが解除されました
あとはプールが存在しているかどうかを調べます:
virsh #
pool-list --all 名前 状態 自動起動 ------------------------------------------- default 動作中 はい (yes) VM 動作中 はい (yes)virsh #
pool-info VM 名前: VM UUID: 42efe1b3-7eaa-4e24-a06a-ba7c9ee29741 状態: 動作中 永続: はい (yes) 自動起動: はい (yes) 容量: 2.68 TiB 割り当て: 2.38 TiB 利用可能: 306.05 GiB
このプールは、 VM ゲスト を移行できるようにするため、各ホストでそれぞれ定義しておかなければなりません。ご注意ください。
ここまでの手順で、プールの定義は完了しています。あとはディスクイメージを含むボリュームを作成します:
virsh #
vol-create-as VM sled12.qcow2 8G --format qcow2
ボリューム sled12.qcow2 が作成されました
ここで指定したボリューム名は、 virt-install でゲストをインストールする際に使用することができます。
ここまでの手順を行ってきたら、あとは virt-install
で openSUSE Leap の VM ゲスト を作成するだけです。 VM プールを --disk
オプションで指定します。また、後から移行処理を行うことを考慮して、 cache=none オプションを設定しておくことをお勧めします。これを設定しておかないと、移行時に --unsafe
オプションを付けなければならなくなるためです。
#
virt-install --connect qemu:///system --virt-type kvm --name \
sled12 --memory 1024 --disk vol=VM/sled12.qcow2,cache=none --cdrom \
/mnt/install/ISO/SLE-12-Desktop-DVD-x86_64-Build0327-Media1.iso --graphics \
vnc --os-variant sled12
Starting install...
Creating domain...
これで移行処理を行うことができるようになります。移行元の VM ホストサーバ で移行先を指定しながら migrate
コマンドを実行します。
virsh # migrate --live sled12 --verbose qemu+ssh://IP/ホスト名/system Password: マイグレーション: [ 12 %]
仮想マシンマネージャ を起動して VM ホストサーバ に接続すると、動作中のゲストの CPU 使用率が表示されます。
このツールでは、ディスクやネットワークの使用率に関する情報も表示することができます。ただし、あらかじめ
で機能を有効化しておかなければなりません:virt-manager
を起動します。
› を選択します。
から のタブに切り替えます。
悲痛に応じて、監視したい項目を選択します。それぞれ
, , です。また、必要であれば
の値も調整します。ダイアログを閉じます。
あとは
› 以下にある項目を選択して、グラフを表示させてください。すると、ディスクやネットワークの統計情報が、 仮想マシンマネージャ のメインウインドウ内に表示されるようになります。
より詳しいデータを閲覧したい場合は、 VNC ウインドウからご確認ください。 VNC ウインドウの表示方法は 10.2.1項 「グラフィカルコンソールの表示」 で説明しています。ツールバーから を押すか、もしくは › を選択してください。統計情報は左側のメニュー内にある を選択すると、表示されるようになります。
virt-top
を利用した監視 #Edit sourcevirt-top
はよく知られたプロセス監視ツールである top
に似たコマンドラインツールです。 virt-top
は libvirt を利用して、さまざまなハイパーバイザで動作する VM ゲスト の統計情報を表示することができます。 xentop
のようなハイパーバイザ固有のツールではなく、 virt-top
のような汎用ツールの使用をお勧めします。
既定では、 virt-top
は実行中の全ての VM ゲスト に対する統計情報を表示します。ここにはメモリの使用率 ( %MEM
) のほか、 CPU の使用率 ( %CPU
) とゲストの動作時間 ( TIME
) が表示されます。データは定期的に自動更新されます (既定では 3 秒間隔で更新されます) 。下記の例では、 VM ホストサーバ 内に合計 7 つの VM ゲスト が存在し、それらのうちの 4 つが停止されている状況を示しています:
virt-top 13:40:19 - x86_64 8/8CPU 1283MHz 16067MB 7.6% 0.5% 7 domains, 3 active, 3 running, 0 sleeping, 0 paused, 4 inactive D:0 O:0 X:0 CPU: 6.1% Mem: 3072 MB (3072 MB by guests) ID S RDRQ WRRQ RXBY TXBY %CPU %MEM TIME NAME 7 R 123 1 18K 196 5.8 6.0 0:24.35 sled12_sp1 6 R 1 0 18K 0 0.2 6.0 0:42.51 sles12_sp1 5 R 0 0 18K 0 0.1 6.0 85:45.67 opensuse_leap - (Ubuntu_1410) - (debian_780) - (fedora_21) - (sles11sp3)
既定での並び順は ID 順です。柿の木ー入力を行うことで、並び順を変更することができます:
Shift–P : CPU の使用率 |
Shift–M : ゲストに割り当てているメモリ量 |
Shift–T : 時間 |
Shift–I : ID |
その他の情報をもとに並べ替えを行いたい場合は、 Shift–F を押して、表示される一覧から項目を選択してください。並び順を逆にしたい場合は、 Shift–R を押します。
virt-top
では、 VM ゲスト のデータをさまざまな形で表示することができます。これらは下記のキー入力を行うことで、即時に変更することができます:
0 : 既定の表示 |
1 : 物理 CPU の表示 |
2 : ネットワークインターフェイスの表示 |
3 : 仮想ディスクの表示 |
virt-top
には表示を変更するためのさまざまなキー入力や、プログラムの動作を変更するためのさまざまなコマンドラインが用意されています。詳しくは man 1 virt-top
をお読みください。
kvm_stat
を利用した監視 #Edit sourcekvm_stat
は、 KVM の性能イベントを追跡する際に使用するツールです。 /sys/kernel/debug/kvm
を監視する仕組みであるため、まずは debugfs をマウントする必要があります。 openSUSE Leap では既定でマウントされるように設定されていますが、何らかの理由でマウントされていない場合は、下記のように実行してマウントしてください:
>
sudo
mount -t debugfs none /sys/kernel/debug
kvm_stat
は、下記に示す 3 種類の動作モードが用意されています:
kvm_stat # 1 秒間隔で更新 kvm_stat -1 # 1 秒間情報採取して出力 kvm_stat -l > kvmstats.log # ログ形式で 1 秒間隔で更新 # (表計算プログラムなどに取り込むことができます)
kvm_stat
の出力例 #kvm statistics efer_reload 0 0 exits 11378946 218130 fpu_reload 62144 152 halt_exits 414866 100 halt_wakeup 260358 50 host_state_reload 539650 249 hypercalls 0 0 insn_emulation 6227331 173067 insn_emulation_fail 0 0 invlpg 227281 47 io_exits 113148 18 irq_exits 168474 127 irq_injections 482804 123 irq_window 51270 18 largepages 0 0 mmio_exits 6925 0 mmu_cache_miss 71820 19 mmu_flooded 35420 9 mmu_pde_zapped 64763 20 mmu_pte_updated 0 0 mmu_pte_write 213782 29 mmu_recycled 0 0 mmu_shadow_zapped 128690 17 mmu_unsync 46 -1 nmi_injections 0 0 nmi_window 0 0 pf_fixed 1553821 857 pf_guest 1018832 562 remote_tlb_flush 174007 37 request_irq 0 0 signal_exits 0 0 tlb_flush 394182 148
これらの値の解釈方法について、詳しくは https://clalance.blogspot.com/2009/01/kvm-performance-tools.html (英語) をお読みください。