tkuchikiの日記

Linux やプログラミングについて書きます。

ohai で仮想化環境の種類を取得する

ohai の version は、8.0.1 です。

仮想化環境の種類は、以下のように格納されています。

{
  "virtualization": {
    "system": "VIRTUALIZATION_TYPE"
  }
}

当然ですが、仮想環境下でなければ "virtualization" key はありません。

chef で取る場合は、

node[:virtualization][:system]

で取れます。

ちなみに、Docker container 内で ohai を使った場合は、

{
  "virtualization": {
    "system": "lxc"
  }
}

となるので、
Docker container の provisioning に chef を使い、
Docker の時だけ処理を変えたい場合は、
node[:virtualization][:system] == "lxc" みたいな感じになると思います。
ただ、この方法は、LXC と Docker で同一の cookbook を使いたい場合は使えないです。

ohai/virtualization.rb at 8-stable · opscode/ohai · GitHub を見てみると、
どのように LXC(Docker) と判別しているかがわかります。
/proc/self/cgroup を parse しているようです。
Docker container 内の /proc/self/cgroup は、以下のようになっていました。

11:name=systemd:/
10:hugetlb:/
9:perf_event:/docker/0f963a9815788bdc17074c65112165580e449fdd4f2f71e7e888aa6cb6f21b01
8:blkio:/docker/0f963a9815788bdc17074c65112165580e449fdd4f2f71e7e888aa6cb6f21b01
7:freezer:/docker/0f963a9815788bdc17074c65112165580e449fdd4f2f71e7e888aa6cb6f21b01
6:devices:/docker/0f963a9815788bdc17074c65112165580e449fdd4f2f71e7e888aa6cb6f21b01
5:memory:/docker/0f963a9815788bdc17074c65112165580e449fdd4f2f71e7e888aa6cb6f21b01
4:cpuacct:/docker/0f963a9815788bdc17074c65112165580e449fdd4f2f71e7e888aa6cb6f21b01
3:cpu:/docker/0f963a9815788bdc17074c65112165580e449fdd4f2f71e7e888aa6cb6f21b01
2:cpuset:/

コードを見てもわかると思いますが、docker と lxc が含まれているかを見ているので、これを使えば LXC と Docker の判別ができそうです。

ohai/lib/ohai/plugins at 8-stable · opscode/ohai · GitHub 以下の、
{freebsd,linux,netbsd,openbsd,solaris2}/virtualization.rb に定義が書いてあります。

以下にOSごとに取れる値をまとめました。