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

#1 virsh dumpとは?
仮想マシンのダンプを採取するためのコマンドです。
採取したダンプは、crashコマンドで参照することができます。
仮想マシンの障害調査のときに使います。

その他、virshコマンドの記事は、以下のものを作成しました。
[virshコマンドの使い方](https://qiita.com/hana_shin/items/3fc67e2e6132bd534932)
[virshコマンドの使い方(snapshot編)](https://qiita.com/hana_shin/items/c43f824f16797e0d7e62)

#2 環境
VMware Workstation 14 Playerで作成した仮想マシン使用しました。
ホストマシン、仮想マシンともに以下の版数を使用しました。

```console:ディストリビューション版数
[root@vm1 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
```

```console:カーネル版数
[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コマンドの使い方)](https://qiita.com/hana_shin/items/3fc67e2e6132bd534932)を参照ください。

```console:仮想マシンの確認
[root@vm1 ~]# virsh list
 Id    名前                         状態
----------------------------------------------------
 1     vm1                            実行中
```

仮想マシンのカーネル版数等を確認します。

```console:仮想マシンの版数確認
[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コマンドの使い方](https://qiita.com/hana_shin/items/97e6c03ac5e5ed67ce38)を参照ください。

```console:ncコマンドの起動
[root@nested-vm1 ~]# nc -kl 11111
```

##4.2 ダンプの採取方法
ホストで`virsh dump`コマンドを実行して、仮想マシンのダンプを採取してみます。
`--reset`オプションを指定すると、ダンプ採取後、仮想マシンはリスタートします。

```console:仮想マシンのダンプ採取
[root@vm1 ~]# virsh dump vm1 vm.core --memory-only --reset --verbose
ダンプ: [100 %]
ドメイン vm1 が vm.core にダンプされました
```

仮想マシンのダンプを確認してみます。

```console:ダンプファイル確認
[root@vm1 ~]# ls -l vm.core
-rw-------. 1 root root 1074005816  7月 18 21:14 vm.core
```

##4.3 ダンプの確認方法

crashコマンドを実行します。
この時、仮想マシンのカーネル版数と同じ版数のカーネル(vmlinux)とダンプファイル名を指定します。
なお、crashコマンドの使い方は、[crashコマンドの使い方](https://qiita.com/hana_shin/items/02d8da181c8287580613)を参照ください。

```console: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プロセスの状態を確認してみます。

```console:ncプロセスのPID確認
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コマンドを実行します。

```console:カレントをncプロセスに変更
crash> set 3317
    PID: 3317
COMMAND: "nc"
   TASK: ffff999efa5f9040  [THREAD_INFO: ffff999efd464000]
    CPU: 0
  STATE: TASK_INTERRUPTIBLE
```


ncプロセスがオープンしているFDを確認してみます。
FD=3,4でIPv6/IPv4のソケットをオープンしていることがわかります。

```console:ncプロセスのFD
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 を使ったゲスト仮想マシンのコアのダンプファイルの作成](https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/virtualization_deployment_and_administration_guide/sect-domain_commands-creating_a_dump_file_of_a_domains_core)
[libvirt をインストールして、ホストマシンから仮想マシンのダンプを取得して crash で読んでみる](http://intrajp-computer.hatenadiary.jp/entry/2017/09/16/041748)