BitVisorネットワークログ出力 (syslog編)

最新のBitVisorには、ネットワーク経由でログ出力を行う機能が進化して、syslogプロトコルで出力できるようになっています。その使い方を紹介します。

## 送信側 (BitVisor)

bitvisor.confまたはdefconfigに以下の設定を入れます。defconfigの場合、MACアドレスおよびIPアドレスは必ず1バイトずつ,で区切って指定し、16進数の場合は0xをつけてください。

- vmm.tty_mac_address=(送信先MACアドレス)
- vmm.tty_syslog.enable=1
- vmm.tty_syslog.src_ipaddr=(送信元IPv4アドレス)
- vmm.tty_syslog.dst_ipaddr=(送信先IPv4アドレス)
- vmm.driver.pci (ネットワークデバイスのドライバーオプションにtty=1をつける)

ゲートウェイを超える必要がある場合は、送信先MACアドレスにゲートウェイのMACアドレスを指定します。

```bitvisor.conf:設定例
vmm.tty_mac_address=00:11:22:33:44:55
vmm.tty_syslog.enable=1
vmm.tty_syslog.src_ipaddr=192.168.0.123
vmm.tty_syslog.dst_ipaddr=192.168.0.23
vmm.driver.pci=driver=bnx,net=pass,virtio=1,tty=1
```

## 受信側 (syslogd)

普通のsyslogdが使用できます。UDP 514番ポートで受け付けるよう、syslogdおよびファイヤーウォールの設定を適切に行ってください。

ここでは、Debianのrsyslogdを使用している場合の設定例を示します。特にファイヤーウォールを設定していなければ、rsyslog.confの設定さえすればOKです。rsyslog.confに以下のような部分があります。

```rsyslog.conf:/etc/rsyslog.conf
# provides UDP syslog reception
#$ModLoad imudp
#$UDPServerRun 514
```

このコメントを外してUDP/IPを有効にします。

```rsyslog.conf:/etc/rsyslog.conf
# provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514
```

BitVisorのログを別ファイルに書き出したい場合は以下のような設定を加えてください。

```rsyslog.conf:/etc/rsyslog.d/10-bitvisor.conf
:syslogtag,isequal,"bitvisor:" /var/log/bitvisor.log
& ~
```

できたらrsyslogdを再起動します。

```
# service rsyslog restart
```

きちんとポートがbindされたか確認します。

```
$ ss -uln|grep 514
UNCONN     0      0                         *:514                      *:*
UNCONN     0      0                        :::514                     :::*
```

もしかすると、rsyslogdがログを受信した時に名前解決をしようとして時間がかかるかも知れません。その場合は/etc/hostsに送信側IPアドレスを書き加えるなどの対策を行ってください。

## 実行例

```syslog:/var/log/bitvisor.log
Dec  9 20:47:49 bitvisor bitvisor: Processor 1 (AP)
Dec  9 20:47:49 bitvisor bitvisor: Processor 2 (AP)
Dec  9 20:47:49 bitvisor bitvisor: Processor 3 (AP)
Dec  9 20:47:49 bitvisor bitvisor: Trying to enable VMXON.
Dec  9 20:47:49 bitvisor bitvisor: message repeated 2 times: [Trying to enable VMXON.]
Dec  9 20:47:50 bitvisor bitvisor: Processor 3 2000058400 Hz (Invariant TSC)
Dec  9 20:47:50 bitvisor bitvisor: Processor 1 2000058304 Hz (Invariant TSC)
Dec  9 20:47:50 bitvisor bitvisor: Processor 2 2000058592 Hz (Invariant TSC)
Dec  9 20:47:51 bitvisor bitvisor: virtio_net hook 0x5000
Dec  9 20:47:51 bitvisor bitvisor: core_io_unregister_handler: port: 5000-501f
Dec  9 20:47:51 bitvisor bitvisor: virtio_net hook 0x5000
Dec  9 20:47:51 bitvisor bitvisor: core_io_unregister_handler: port: 5000-501f
Dec  9 20:47:51 bitvisor bitvisor: virtio_net hook 0x6000
Dec  9 20:47:52 bitvisor bitvisor: virtio_net: reset
Dec  9 20:47:52 bitvisor bitvisor: bnx: Disable interrupt
Dec  9 20:47:52 bitvisor bitvisor: bnx: Enable interrupt
```

## Q&A

### 従来版と比べて利点と欠点は?

従来版は独自プロトコルで1バイトずつ送信していたため、受信プログラムに既製品が使えない、ネットワーク負荷が高い、などの欠点がありました。syslogプロトコルは極めて一般的なもので、rsyslogdなど多数の既製品が使える他、1行ずつの出力のためネットワーク負荷も抑えられます。ログに時刻情報を付加したり、複数ホストからのログ出力をひとつのsyslogdで受信したりするのも簡単です。

ただし、1行ずつの出力には、改行文字が来るか、バッファーに80バイト分たまるまで出力されないという欠点もあります。

### なんでMACアドレスが必要か?

ログ出力機能はpanicなど致命的な状況でもなるべく動作するようにするため、TCP/IPスタックを使用せず、UDPパケットを独自に生成して送信しています。また、ネットワークドライバーの設定によってはゲストOSが開始するまで通信できない可能性があることも想定し、ARPによるアドレス解決も行っていないため、送信先MACアドレスが必要になります。

送信元MACアドレスはネットワークデバイスから読み取られます。

### IPv6は?

IPv6には対応していません。

### 受信側の設定をし忘れた、あるいは、送信先の設定を間違えたら?

ログ出力機能はとにかく出力しっぱなしで、受信は何もしていませんので、例え相手ホストがICMP Port Unreachableを返してきても完全に無視して送り続けます。また、MACアドレスを間違えた場合や、もともと書いてあるFF-FF-FF-FF-FF-FFのままにした場合は、通常はスイッチングハブの機能によりブロードキャストされます。