virshコマンドでKVM仮想マシンを管理する方法|起動・停止・スナップショット・移行の実践例

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Linuxサーバー構築(Rocky Linux/RHEL9) > virshコマンドでKVM仮想マシンを管理する方法|起動・停止・スナップショット・移行の実践例
「KVMで仮想マシンを立てたはいいけど、virshコマンドの操作がよくわからない」
「GUIのVirt-Managerは使えるが、SSHしか繋がらないサーバーでの操作方法を知りたい」

Linuxサーバーで仮想化環境を運用するとき、virshコマンドは欠かせないツールです。
GUIなしのサーバーでも、virshさえ使えれば仮想マシンの起動・停止・設定変更・スナップショット取得までひと通りの操作が完結します。

この記事では、virshコマンドの基本操作から、実務でよく使うスナップショット管理・クローン・移行手順までを体系的に解説します。
動作確認環境はRHEL 9.4 / Rocky Linux 9.3です。

この記事のポイント

・virsh list --all でVM一覧を確認し、start/shutdownで起動・停止できる
・virsh snapshot-create-as でスナップショットを取得し、失敗時に即リストアできる
・virsh dumpxml/edit でXML定義を直接編集してCPU・メモリ・ディスクを変更できる
・virt-clone でVMをクローンし、新規VM構築の時間を大幅に短縮できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

virshとKVMの基本的な関係

virshは、KVM(Kernel-based Virtual Machine)を含むlibvirtが管理する仮想化環境を操作するためのコマンドラインツールです。

KVMはLinuxカーネルに組み込まれたハイパーバイザーで、RHEL/Rocky Linux/AlmaLinuxではデフォルトの仮想化基盤として採用されています。
virshはlibvirtd(仮想化管理デーモン)に接続し、KVMだけでなくXenやQEMUなども統一インターフェースで管理できます。

主要コンポーネントの関係

KVM:Linuxカーネルモジュール(kvm.ko / kvm-intel.ko / kvm-amd.ko)として動作するハイパーバイザー
QEMU:KVMの上で動くエミュレーター。仮想マシンのデバイスエミュレーション担当
libvirt:KVM/QEMUを抽象化して管理するAPIレイヤー(libvirtdデーモン)
virsh:libvirtdと通信するCLIツール。サーバー管理者が直接操作するインターフェース

# KVMが使えるか確認(出力があれば対応CPU) $ grep -E 'vmx|svm' /proc/cpuinfo | head -1 flags : fpu vme de ... vmx ... # libvirtdの動作確認 $ systemctl status libvirtd * libvirtd.service - Virtualization daemon Loaded: loaded (/usr/lib/systemd/system/libvirtd.service; enabled) Active: active (running) since Wed 2026-06-10 09:00:01 JST

virshのインストールと接続確認

1. 必要なパッケージのインストール

RHEL系では、KVM仮想化に必要なパッケージをまとめてインストールできます。

# 仮想化関連パッケージを一括インストール(RHEL 9 / Rocky 9) $ sudo dnf install -y qemu-kvm libvirt libvirt-client virt-install virt-viewer # libvirtdを起動・自動起動設定 $ sudo systemctl enable --now libvirtd # バージョン確認 $ virsh --version 9.0.0

2. 一般ユーザーでvirshを使う設定

root以外のユーザーがvirshを使うには、libvirtグループへの追加が必要です。

# ユーザーをlibvirtグループに追加(設定後は再ログインが必要) $ sudo usermod -aG libvirt $(whoami) # 接続確認(エラーが出なければOK) $ virsh list --all Id Name State --------------------

3. リモートホストへの接続

virshはSSH経由でリモートのlibvirtdに接続することも可能です。

# リモートホストのlibvirtdに接続して操作 $ virsh -c qemu+ssh://user@192.168.1.10/system list --all # 接続先をまとめて指定する場合(~/.bashrcに追記) export LIBVIRT_DEFAULT_URI=qemu+ssh://user@192.168.1.10/system

VMの一覧表示と基本操作

1. VM一覧の確認

# 起動中のVMのみ表示 $ virsh list Id Name State ------------------------------- 1 web-server-01 running 3 db-server-02 running # 停止中を含む全VM表示(運用でよく使う) $ virsh list --all Id Name State ------------------------------- 1 web-server-01 running 3 db-server-02 running - test-vm-01 shut off - staging-01 paused

2. VMの起動・停止・再起動

# VMを起動 $ virsh start web-server-01 Domain 'web-server-01' started # 正常シャットダウン(OS内でshutdownコマンドが実行される) $ virsh shutdown web-server-01 Domain 'web-server-01' is being shutdown # 強制停止(電源ブチ切り相当。データ破損リスクあり) $ virsh destroy web-server-01 Domain 'web-server-01' destroyed # 再起動 $ virsh reboot web-server-01 Domain 'web-server-01' is being rebooted # 一時停止(メモリ内容を保持したまま停止) $ virsh suspend web-server-01 Domain 'web-server-01' suspended # 一時停止から再開 $ virsh resume web-server-01 Domain 'web-server-01' resumed

shutdownとdestroyの使い分け

shutdownはOSに対してシャットダウン信号を送るため、実行中のプロセスが安全に終了します。
destroyは即座に電源を切るため、ファイルシステムが破損するリスクがあります。
緊急時や応答しないVMへの対処以外では、shutdown→30秒待機→応答なければdestroyの順で操作してください。

3. VM削除(定義の削除)

# VMを停止してから定義を削除(ディスクイメージは残る) $ virsh undefine test-vm-01 Domain 'test-vm-01' has been undefined # ディスクイメージも一緒に削除する場合 $ virsh undefine test-vm-01 --remove-all-storage

VMの詳細確認と設定変更

1. VM情報の確認

# VMの基本情報を表示 $ virsh dominfo web-server-01 Id: 1 Name: web-server-01 UUID: a1b2c3d4-e5f6-7890-abcd-ef1234567890 OS Type: hvm State: running CPU(s): 4 CPU time: 203.4s Max memory: 8388608 KiB Used memory: 8388608 KiB Persistent: yes Autostart: enable Managed save: no Security model: selinux Security DOI: 0 Security label: system_u:system_r:svirt_t:s0:c150,c807 (enforcing) # VMのVCPU使用状況確認 $ virsh vcpuinfo web-server-01 # メモリ統計(qemu-guestが必要) $ virsh dommemstat web-server-01

2. XML定義の確認と編集

virshではVMの設定をXML形式で管理しています。
このXMLを直接編集することで、CPU数・メモリ・ディスク・ネットワーク設定を変更できます。

# XML定義をファイルに書き出す $ virsh dumpxml web-server-01 > web-server-01.xml # 主要な設定箇所の例(メモリ・CPU) $ virsh dumpxml web-server-01 | grep -A2 '8388608 8388608 4 # VMを停止してからXMLを直接編集 $ virsh edit web-server-01 (デフォルトのエディタが開く。EDITOR環境変数で変更可能)

よく変更するXMLの設定箇所

メモリ変更:`<memory unit='KiB'>8388608</memory>` を書き換える(単位はKiB)
CPU数変更:`<vcpu placement='static'>4</vcpu>` の数値を変更
自動起動設定:`virsh autostart web-server-01` コマンドで設定(XML不要)

# ホスト起動時にVMを自動起動する設定 $ virsh autostart web-server-01 Domain 'web-server-01' marked as autostarted # 自動起動を解除 $ virsh autostart --disable web-server-01 # 自動起動設定の確認 $ virsh list --all --autostart

スナップショットの作成と管理

スナップショットは、VMの特定時点の状態(ディスク+メモリ)を保存しておく機能です。
OSアップデートや設定変更の前に取得しておけば、問題が起きたときに即座にロールバックできます。

1. スナップショットの作成

# 基本的なスナップショット作成(VM停止中・稼働中どちらでも可) $ virsh snapshot-create-as web-server-01 \ --name "before-update-20260610" \ --description "dnf update実施前のスナップショット" Domain snapshot before-update-20260610 created # スナップショット一覧を表示 $ virsh snapshot-list web-server-01 Name Creation Time State -------------------------------------------------------------- before-update-20260610 2026-06-10 10:30:00 +0900 running

2. スナップショットへのロールバック

# スナップショットの詳細を確認 $ virsh snapshot-info web-server-01 before-update-20260610 Name: before-update-20260610 Domain: web-server-01 Current: no State: running Location: internal Parent: - Children: 0 Descendants: 0 Metadata: yes # スナップショットに戻す(VMが停止している場合) $ virsh snapshot-revert web-server-01 before-update-20260610 # 稼働中のVMをスナップショットに戻す場合は --running オプションを追加 $ virsh snapshot-revert web-server-01 before-update-20260610 --running

3. スナップショットの削除

# 特定スナップショットを削除 $ virsh snapshot-delete web-server-01 before-update-20260610 # 全スナップショットを削除(ディスク容量解放時) $ virsh snapshot-list web-server-01 --name | while read snap; do virsh snapshot-delete web-server-01 "$snap" done

注意点:スナップショットはディスクイメージ内部に差分として保存されるため、取得しすぎるとディスクI/Oが劣化します。本番環境では3世代以内に管理するのが実務的な目安です。

VMのクローンと移行

1. virt-cloneでVMをクローン

既存VMをテンプレートとしてクローンすることで、同じ構成の新規VMを素早く作成できます。

# VMを停止してからクローン実行 $ virsh shutdown web-server-01 # 停止を確認 $ virsh list --all | grep web-server-01 - web-server-01 shut off # クローン作成(MACアドレスとUUIDは自動で新規生成される) $ virt-clone \ --original web-server-01 \ --name web-server-02 \ --auto-clone Allocating 'web-server-02.qcow2' | 40 GB 00:02:30 Clone 'web-server-02' created successfully. # クローンしたVMを起動 $ virsh start web-server-02

クローン後は、クローン先のVMにSSHでログインして、ホスト名・IPアドレス・SSHホスト鍵を変更することを忘れないでください。

# クローンVM内でホスト名を変更(VM内で実行) $ sudo hostnamectl set-hostname web-server-02 # SSHホスト鍵を再生成(VM内で実行) $ sudo rm -f /etc/ssh/ssh_host_* $ sudo ssh-keygen -A

2. VM定義のバックアップとリストア

# VM定義XMLをバックアップ $ virsh dumpxml web-server-01 > /backup/vm-defs/web-server-01.xml # 別ホストまたは再インストール後にVMを復元 $ virsh define /backup/vm-defs/web-server-01.xml Domain 'web-server-01' defined from /backup/vm-defs/web-server-01.xml

3. ライブマイグレーション(稼働中VMの移行)

同じバージョンのlibvirtがインストールされた別ホストへ、VMを停止せずに移行できます。

# 移行前の確認(送信元ホストで実行) $ virsh list Id Name State ------------------------------- 1 web-server-01 running # ライブマイグレーション実行(送信元→宛先ホストへSSH経由で移行) $ virsh migrate --live web-server-01 \ qemu+ssh://admin@dest-host.example.com/system # 移行後の確認(宛先ホストで確認) $ virsh -c qemu+ssh://admin@dest-host.example.com/system list Id Name State ------------------------------- 2 web-server-01 running

ライブマイグレーションの前提条件

・送信元と宛先のlibvirtバージョンが同じか近いこと
・共有ストレージ(NFSやSAN)を使う場合は移行後もディスクへのアクセスが継続可能
・共有ストレージなしの場合は `--copy-storage-all` オプションでディスクごとコピー
・ネットワーク帯域が十分にあること(メモリをすべて転送するため)

コンソール接続とディスク管理

1. VMのコンソールに接続

SSHが使えない場合や初期セットアップ時にVMのコンソールに直接接続できます。

# シリアルコンソールに接続(Ctrl+] で切断) $ virsh console web-server-01 Connected to domain 'web-server-01' Escape character is ^] (Ctrl + ]) Rocky Linux 9.3 (Blue Onyx) Kernel 5.14.0-362.24.1.el9_3.x86_64 on an x86_64 web-server-01 login: root Password: # コンソールを使えるようにするにはVM内でシリアルコンソールを有効化する必要がある # (grubで console=ttyS0 を追加する)

2. ディスクの追加

# 新しいqcow2ディスクイメージを作成(20GB) $ qemu-img create -f qcow2 /var/lib/libvirt/images/web-server-01-data.qcow2 20G # 稼働中のVMにディスクをホットアタッチ $ virsh attach-disk web-server-01 \ /var/lib/libvirt/images/web-server-01-data.qcow2 \ vdb \ --driver qemu \ --subdriver qcow2 \ --targetbus virtio \ --live \ --config # VM内でディスクが認識されているか確認 $ virsh domblklist web-server-01 Target Source ----------------------------------------------- vda /var/lib/libvirt/images/web-server-01.qcow2 vdb /var/lib/libvirt/images/web-server-01-data.qcow2

トラブルシュート

「error: Failed to connect socket to '/var/run/libvirt/libvirt-sock'」が出る

libvirtdが起動していないか、接続権限がない場合に発生します。

# libvirtdの状態確認 $ systemctl status libvirtd * libvirtd.service Active: inactive (dead) # libvirtdを起動 $ sudo systemctl start libvirtd # 一般ユーザーの場合はグループ所属確認 $ groups user wheel # libvirtグループに追加してログインし直す $ sudo usermod -aG libvirt $(whoami) $ exit # 再ログイン後に確認 $ groups user wheel libvirt

「error: domain is not running」でコンソール接続できない

# VMの状態確認 $ virsh list --all | grep web-server-01 - web-server-01 shut off # VMを起動してから接続 $ virsh start web-server-01 $ virsh console web-server-01

shutdown後もVMが停止しない

OSがACPI信号に応答しない場合、shutdownが効かないことがあります。

# 30秒待ってもshut offにならない場合はdestroyで強制停止 $ virsh shutdown web-server-01 # 30秒待機後... $ virsh list --all | grep web-server-01 1 web-server-01 running # まだ動いている # 強制停止 $ virsh destroy web-server-01

スナップショットが作成できない(raw形式のディスク)

内部スナップショットはqcow2形式のディスクでのみ使えます。raw形式では使えません。

# ディスク形式の確認 $ qemu-img info /var/lib/libvirt/images/web-server-01.img | grep 'file format' file format: raw # raw→qcow2へ変換(VM停止中に実行) $ qemu-img convert -f raw -O qcow2 \ /var/lib/libvirt/images/web-server-01.img \ /var/lib/libvirt/images/web-server-01.qcow2 # XMLのディスクソースパスをqcow2ファイルに書き換える $ virsh edit web-server-01

Linuxのポート確認やNFS構築と同様に、virshの操作も「何が起きているかをコマンドで直接確認できる」ことが重要です。
Linux ポート確認の全コマンドと組み合わせて、VM内外のネットワーク状態を合わせて確認する習慣をつけておきましょう。

virshコマンドまとめ

やりたいこと コマンド
全VM一覧(停止含む)を表示 virsh list --all
VMを起動する virsh start VM名
VMを正常シャットダウン virsh shutdown VM名
VMを強制停止 virsh destroy VM名
VMを再起動 virsh reboot VM名
VMの基本情報を確認 virsh dominfo VM名
XML定義を確認 virsh dumpxml VM名
XML定義を編集 virsh edit VM名
自動起動を有効化 virsh autostart VM名
スナップショットを作成 virsh snapshot-create-as VM名 --name スナップショット名
スナップショット一覧を表示 virsh snapshot-list VM名
スナップショットにリストア virsh snapshot-revert VM名 スナップショット名
VMをクローン virt-clone --original 元VM名 --name 新VM名 --auto-clone
VM定義の削除 virsh undefine VM名
コンソールに接続 virsh console VM名
ディスク一覧を確認 virsh domblklist VM名
ライブマイグレーション virsh migrate --live VM名 移行先URI

virshコマンドの操作に慣れてきたら、mount コマンドの使い方も合わせて確認しておくと、VMのディスクイメージをホスト側からマウントして確認する作業がスムーズになります。

仮想化環境はKVMだけでなくDockerやPodmanと組み合わせて使うことも増えています。
目的に応じてコンテナと仮想マシンを使い分けることで、Linuxサーバーの運用効率を一段と高められます。

メルマガ「Linux Master Magazine」では、このような実務で役立つLinux技術を毎週お届けしています。
無料でご登録いただけますので、ぜひご活用ください。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、20年以上の運用経験を持つ現役エンジニアが基礎から教えます。
Linux無料マニュアルを受け取る >>

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。