「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構築の時間を大幅に短縮できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
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は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環境変数で変更可能)
・メモリ変更:`<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
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内でホスト名を変更(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 ポート確認の全コマンドと組み合わせて、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無料マニュアルを受け取る >>
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 前のページへ:rsyslog.confの設定ガイド|ログ転送・フィルタリング・テンプレートの実践例
- この記事の属するカテゴリ:Linuxtips・Linuxサーバー構築(Rocky Linux/RHEL9)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます