xenstore コマンドで、管理情報をゲストVMからチョコっと覗き見

#この文書はなに？

http://qiita.com/advent-calendar/2014/softlayer
http://qiita.com/advent-calendar/2014/softlayer2

に参加するのに書いたものです。是非、他のURLもご参照ください！

# xenstoreって？
xenstoreは、xenstored を通じて、dom0とdomU間で情報をやり取りするための仕組みです。
# それが SoftLayer にどう関係するの？
SoftLayerで利用されているハイパーバイザーは、XenServer です。各ゲストVMには、xentools がインストール済みの状態で引き渡されますが、この中に、xenstoreコマンドが含まれます。
この xenstoreコマンドを利用すると、ハイパーバイザー側の情報を少し引っ張ってこれるので、どんな情報が取れるのかをご紹介。


# xenstoreコマンドの実際
私が知らないだけだと思いますが、ゲスト側から叩く場合には、あまり参考になるドキュメントが見当たらないのですが、下記のように実行することで、いくつか情報を得ることができます。

## VMのuuidを知る

```
[root@vm ~]# xenstore-read vm
/vm/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
```

ここで表示される `xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx` が XenServer上での管理用の UUID になります。

## VM名を知る

先ほどのコマンドの結果をそのまま xenstore-ls の引数として指定します。

```
[root@vm ~]# xenstore-ls /vm/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
uuid = "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "999999-labs.kunitake.org"
```

ここで表示される name が、XenServer上で設定されている仮想マシン名になります。
先頭の6桁の数字に、SL をつけると、SoftLayerでのユーザ名になります。

なので、SoftLayerでは、仮想マシン名を

`6桁の数字(アカウント番号)`+ `-` + `最初に設定したホスト名`

で管理しているようですね。なお、途中でSoftLayerの管理画面やゲストOS側でホスト名を変更しても、XenServer上でのVM名は変わらないようです。

## VMに割り当てられたCPU個数を知る

```
[root@vm ~]# xenstore-ls cpu
0 = ""
 availability = "online"
```

この場合だと、１つです。

## VMに割り当てられたメモリ情報を知る
XenServerは、メモリをオーバコミットする仕組みを持ってますが、ちゃんと 1GBしっかりと割り当てられていることが確認できます。

```
[root@vm ~]# xenstore-ls memory
initial-reservation = "1058816"
static-max = "1048576"
target = "1048576"
dynamic-min = "1048576"
dynamic-max = "1048576"
memory-offset = "0"
```

## VMのデバイス情報を知る

`xenstore-ls device`を実行することで、そのVMにアタッチされている Disk/NIC情報が得られます。

```
[root@vm ~]# xenstore-ls device
vbd = ""
 51712 = ""
  backend = "/local/domain/0/backend/vbd/67/51712"
  protocol = "x86_64-abi"
  state = "4"
  backend-id = "0"
  device-type = "disk"
  virtual-device = "51712"
  ring-ref = "8"
  event-channel = "8"
 51728 = ""
  backend = "/local/domain/0/backend/vbd/67/51728"
  protocol = "x86_64-abi"
  state = "4"
  backend-id = "0"
  device-type = "disk"
  virtual-device = "51728"
  ring-ref = "9"
  event-channel = "9"
vif = ""
 0 = ""
  backend = "/local/domain/0/backend/vif/67/0"
  backend-id = "0"
  state = "4"
  handle = "0"
  mac = "06:1e:9f:XX:XX:XX"
  disconnect = "0"
  protocol = "x86_64-abi"
  tx-ring-ref = "768"
  rx-ring-ref = "769"
  event-channel = "10"
  request-rx-copy = "1"
  feature-rx-notify = "1"
  feature-sg = "1"
  feature-gso-tcpv4 = "1"
 1 = ""
  backend = "/local/domain/0/backend/vif/67/1"
  backend-id = "0"
  state = "4"
  handle = "1"
  mac = "06:99:cf:YY:YY:YY"
  disconnect = "0"
  protocol = "x86_64-abi"
  tx-ring-ref = "1280"
  rx-ring-ref = "1281"
  event-channel = "11"
  request-rx-copy = "1"
  feature-rx-notify = "1"
  feature-sg = "1"
  feature-gso-tcpv4 = "1"
```

## OS情報を知る

下記コマンドで、XenServerから見えているゲストOSのメモリ、OS、uptime などの情報が得られます。

```
[root@vm ~]# xenstore-ls data
meminfo_total = "1016228"
meminfo_free = "859048"
os_name = "CentOS release 6.6 (Final)"
os_majorver = "6"
os_minorver = "6"
os_uname = "2.6.32-504.1.3.el6.x86_64"
os_distro = "centos"
updated = "Sun Nov 30 19:44:29 CST 2014"
```

## XenServerとしてサポートされている機能を知る
知ったところで意味ないですが

```
[root@vm ~]# xenstore-ls control
platform-feature-multiprocessor-suspend = "1"
feature-balloon = "1"
```

## XenToolsのバージョン情報およびアドレス情報を知る
ゲストOSにインストールされたXenToolsのバージョン情報と、ホスト側に見えているゲストOSのIPアドレス(IPv4/IPv6)の情報を知ることができます。

```
attr = ""
 PVAddons = ""
  MajorVersion = "6"
  MinorVersion = "2"
  MicroVersion = "0"
  BuildVersion = "83676"
  Installed = "1"
 eth0 = ""
  ip = "192.0.2.1"
  ipv6 = ""
   0 = ""
    addr = "fe80::41e:9fff:feXX:XXXX"
 eth1 = ""
  ip = "203.0.113.1"
  ipv6 = ""
   0 = ""
    addr = "fe80::499:cfff:feYY:YYYY"
```

## コンソール情報を知る
これも知ったところで意味ないですが、SoftLayerの管理画面のコンソールがどう動いているか、ポート番号に思いを馳せることができます。

```
[root@vm ~]# xenstore-ls console
port = "2"
ring-ref = "16784082"
tty = "/dev/pts/1"
vnc-port = "5902"
tc-port = "9502"
```

## domidを知る

ゲストOSが稼働しているホスト上内でのみユニークな ID になります。再起動するたびに変わったりします。

```
[root@vm ~]# xenstore-read domid
67
```

## unique-domain-id を知る
多分プール内でユニークな domid。これも再起動のたびに変わる値です。

```
[root@vm ~]# xenstore-read unique-domain-id
yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
```

VMのUUIDとは異なります。

## 起動オプション
xenstoreではないですが

> [root@vm ~]# cat /proc/cmdline 
> ro root=UUID=AAAAAAA-BBBB-XXXX-YYYY-ZZZZZZZZZZZZ console=hvc0  SYSFONT=latarcyrheb-sun16 LANG=en_US.UTF-8 KEYTABLE=us 


## BIOS関連

```
[root@vm ~]# xenstore-ls bios-strings
bios-vendor = "Xen"
bios-version = ""
system-manufacturer = "Xen"
system-product-name = "HVM domU"
system-version = ""
system-serial-number = ""
hp-rombios = ""
oem-1 = "Xen"
oem-2 = "MS_VM_CERT/SHA1/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
```

## その他もろもろ

こんな感じでガッツリ、いままで上に挙げたような自身のゲストOSに関する情報が取得できます。

```
[root@vm ~]# xenstore-ls /local/domain/`xenstore-read domid`
vm = "/vm/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
vss = "/vss/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"
name = "999999-labs.kunitake.org"
cpu = ""
 0 = ""
  availability = "online"
memory = ""
 initial-reservation = "1058816"
 static-max = "1048576"
 target = "1048576"
 dynamic-min = "1048576"
 dynamic-max = "1048576"
 memory-offset = "0"
device = ""
 vbd = ""
  51712 = ""
   backend = "/local/domain/0/backend/vbd/67/51712"
   protocol = "x86_64-abi"
   state = "4"
   backend-id = "0"
   device-type = "disk"
   virtual-device = "51712"
   ring-ref = "8"
   event-channel = "8"
  51728 = ""
   backend = "/local/domain/0/backend/vbd/67/51728"
   protocol = "x86_64-abi"
   state = "4"
   backend-id = "0"
   device-type = "disk"
   virtual-device = "51728"
   ring-ref = "9"
   event-channel = "9"
 vif = ""
  0 = ""
   backend = "/local/domain/0/backend/vif/67/0"
   backend-id = "0"
   state = "4"
   handle = "0"
   mac = "06:1e:9f:XX:XX:XX"
   disconnect = "0"
   protocol = "x86_64-abi"
   tx-ring-ref = "768"
   rx-ring-ref = "769"
   event-channel = "10"
   request-rx-copy = "1"
   feature-rx-notify = "1"
   feature-sg = "1"
   feature-gso-tcpv4 = "1"
  1 = ""
   backend = "/local/domain/0/backend/vif/67/1"
   backend-id = "0"
   state = "4"
   handle = "1"
   mac = "06:99:cf:YY:YY:YY"
   disconnect = "0"
   protocol = "x86_64-abi"
   tx-ring-ref = "1280"
   rx-ring-ref = "1281"
   event-channel = "11"
   request-rx-copy = "1"
   feature-rx-notify = "1"
   feature-sg = "1"
   feature-gso-tcpv4 = "1"
error = ""
drivers = ""
control = ""
 platform-feature-multiprocessor-suspend = "1"
 feature-balloon = "1"
attr = ""
 PVAddons = ""
  MajorVersion = "6"
  MinorVersion = "2"
  MicroVersion = "0"
  BuildVersion = "83676"
  Installed = "1"
 eth0 = ""
  ip = "10.66.201.130"
  ipv6 = ""
   0 = ""
    addr = "fe80::41e:9fff:feXX:XXXX"
 eth1 = ""
  ip = "119.81.117.2"
  ipv6 = ""
   0 = ""
    addr = "fe80::499:cfff:feYY:YYYY"
data = ""
 meminfo_total = "1016228"
 meminfo_free = "812424"
 os_name = "CentOS release 6.6 (Final)"
 os_majorver = "6"
 os_minorver = "6"
 os_uname = "2.6.32-504.1.3.el6.x86_64"
 os_distro = "centos"
 updated = "Sun Nov 30 20:22:32 CST 2014"
messages = ""
platform = ""
 viridian = "true"
 nx = "false"
 acpi = "true"
 apic = "true"
 pae = "true"
 vcpu = ""
  number = "1"
  current = "1"
bios-strings = ""
 bios-vendor = "Xen"
 bios-version = ""
 system-manufacturer = "Xen"
 system-product-name = "HVM domU"
 system-version = ""
 system-serial-number = ""
 hp-rombios = ""
 oem-1 = "Xen"
 oem-2 = "MS_VM_CERT/SHA1/XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
unique-domain-id = "yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy"
domid = "67"
store = ""
 port = "1"
 ring-ref = "33752022"
serial = ""
 0 = ""
  limit = "65536"
console = ""
 port = "2"
 ring-ref = "16784082"
 tty = "/dev/pts/1"
 vnc-port = "5902"
 tc-port = "9502"
vncterm-pid = "11509"
```


# で、なんの役に立つの？

いや、特に役には立たないですねぇ…大昔、XenServerではゲストOS側から稼働しているホスト名が取得できた気がしてたんですが、もしSoftLayerでそれができるなら、収容先が変わった、変わらないが見えるかと思ったんですが、ちょっと調べたかぎりでは無理そう。残念。