1 virsh dumpとは?
仮想マシンのダンプを採取するためのコマンドです。
採取したダンプは、crashコマンドで参照することができます。
仮想マシンの障害調査のときに使います。
その他、virshコマンドの記事は、以下のものを作成しました。
virshコマンドの使い方
virshコマンドの使い方(snapshot編)
2 環境
VMware Workstation 14 Playerで作成した仮想マシン使用しました。
ホストマシン、仮想マシンともに以下の版数を使用しました。
[root@vm1 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@vm1 ~]# uname -r
3.10.0-957.el7.x86_64
3 オプション一覧
3.1 概要
[root@vm1 ~]# virsh help dump
名前
dump - 解析用ファイルへのドメインのコアダンプ
形式
dump <domain> <file> [--live] [--crash] [--bypass-cache] [--reset] [--verbose] [--memory-only] [--format <string>]
詳細
ドメインのコアダンプを取得します。
オプション
[--domain] <string> domain name, id or uuid
[--file] <string> コアをダンプする場所
--live サポートされれば、活性コアダンプを実行します
--crash コアダンプ後にドメインをクラッシュさせます
--bypass-cache ダンプ中のファイルシステムキャッシュの回避
--reset コアダンプ後にドメインをリセットします
--verbose ダンプの進行状況の表示
--memory-only ドメインのメモリーのみダンプ
--format <string> specify the format of memory-only dump
3.2 詳細
ダンプ採取後の仮想マシンの挙動を以下に示します。
オプション | ダンプ採取後の状態 |
---|---|
--live | 仮想マシンは実行中のままです |
--crash | 仮想マシンはシャットオフします |
--reset | 仮想マシンは再起動します |
4 仮想マシンのダンプ採取方法
4.1 事前準備
実行中の仮想マシンを確認します。vm1が実行中であることがわかります。
ここでは、vm1のダンプを採取してみます。
なお、virshコマンドの使い方は、ここ(virshコマンドの使い方)を参照ください。
[root@vm1 ~]# virsh list
Id 名前 状態
----------------------------------------------------
1 vm1 実行中
仮想マシンのカーネル版数等を確認します。
[root@vm1 vm]# virsh console vm1
[root@nested-vm1 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
[root@nested-vm1 ~]# uname -r
3.10.0-957.el7.x86_64
crashコマンドで、ncプロセスが動作中であることを確認するため、
仮想マシンでncコマンドを実行します。
なお、ncコマンドの使い方は、ncコマンドの使い方を参照ください。
[root@nested-vm1 ~]# nc -kl 11111
4.2 ダンプの採取方法
ホストでvirsh dump
コマンドを実行して、仮想マシンのダンプを採取してみます。
--reset
オプションを指定すると、ダンプ採取後、仮想マシンはリスタートします。
[root@vm1 ~]# virsh dump vm1 vm.core --memory-only --reset --verbose
ダンプ: [100 %]
ドメイン vm1 が vm.core にダンプされました
仮想マシンのダンプを確認してみます。
[root@vm1 ~]# ls -l vm.core
-rw-------. 1 root root 1074005816 7月 18 21:14 vm.core
4.3 ダンプの確認方法
crashコマンドを実行します。
この時、仮想マシンのカーネル版数と同じ版数のカーネル(vmlinux)とダンプファイル名を指定します。
なお、crashコマンドの使い方は、crashコマンドの使い方を参照ください。
[root@vm1 ~]# crash /usr/lib/debug/lib/modules/3.10.0-957.el7.x86_64/vmlinux vm.core
-中略-
KERNEL: /usr/lib/debug/lib/modules/3.10.0-957.el7.x86_64/vmlinux
DUMPFILE: vm.core
CPUS: 2
DATE: Thu Jul 18 21:14:18 2019
UPTIME: 00:11:48
LOAD AVERAGE: 0.00, 0.01, 0.03
TASKS: 111
NODENAME: nested-vm1
RELEASE: 3.10.0-957.el7.x86_64
VERSION: #1 SMP Thu Nov 8 23:39:32 UTC 2018
MACHINE: x86_64 (2808 Mhz)
MEMORY: 1 GB
PANIC: ""
PID: 0
COMMAND: "swapper/0"
TASK: ffffffffb1c18480 (1 of 2) [THREAD_INFO: ffffffffb1c00000]
CPU: 0
STATE: TASK_RUNNING (ACTIVE)
WARNING: panic task not found
ncプロセスがListen中に仮想マシンのダンプを採取したので、ncプロセスの状態を確認してみます。
crash> ps nc
PID PPID CPU TASK ST %MEM VSZ RSS COMM
3317 3291 0 ffff999efa5f9040 IN 0.2 43980 2096 nc
ncプロセスのPIDを指定して、setコマンドを実行します。
crash> set 3317
PID: 3317
COMMAND: "nc"
TASK: ffff999efa5f9040 [THREAD_INFO: ffff999efd464000]
CPU: 0
STATE: TASK_INTERRUPTIBLE
ncプロセスがオープンしているFDを確認してみます。
FD=3,4でIPv6/IPv4のソケットをオープンしていることがわかります。
crash> files
PID: 3317 TASK: ffff999efa5f9040 CPU: 0 COMMAND: "nc"
ROOT: / CWD: /root
FD FILE DENTRY INODE TYPE PATH
0 ffff999efa065800 ffff999efdc2d600 ffff999efd77b2f0 CHR /dev/ttyS0
1 ffff999efa065800 ffff999efdc2d600 ffff999efd77b2f0 CHR /dev/ttyS0
2 ffff999efa065800 ffff999efdc2d600 ffff999efd77b2f0 CHR /dev/ttyS0
3 ffff999ef9814200 ffff999ef5ed8900 ffff999ef9fa16b0 SOCK TCPv6
4 ffff999ef9814400 ffff999ef5ed8480 ffff999ef9fa1930 SOCK TCP
Z 参考情報
20.19. VIRSH DUMP を使ったゲスト仮想マシンのコアのダンプファイルの作成
libvirt をインストールして、ホストマシンから仮想マシンのダンプを取得して crash で読んでみる