Linux Detect Virtualization
TL;DR
systemd-detect-virtの実装を読め
仮想化検知
VMMによって挙動が変わるようなソフトウェアを書く/使う時,検知できると嬉しい.
agenda
- about
- Detet VM
- Detect Container
- impl
about
基本的には特有のリソースから検知する
ここからはそのリソースとそこから判断できる仮想化技術についてまとめる
Detect VM
DMI
Desktop Management Interface
/sys/class/dmi/id/product_name
/sys/class/dmi/id/sys_vendor
/sys/class/dmi/id/board_vendor
/sys/class/dmi/id/bios_vendor
これらのファイルにベンダーの情報が含まれていたりする
ここから検知できるのは以下のhypervisor
- KVM
- EC2
- QEMU
- VMware
- VirtualBox
- Xen
- Bochs
- Parallels
- Bhyve
UML
User Mode Linux
/proc/cpuinfo
を見ると,
vendor_id
にUser Mode Linux
が設定されている
cpuid
cpuid
命令からわかる
hypervisorの情報も含まれている
検知できるのは以下のhypervisor
- Xen
- VMware
- HyperV
- KVM
- QEMU
- Bhyve
- QNX
- ACRN
/proc/xen
Xenには/proc/xen
が存在する
/sys/hypervisor/type
Xenは/sys/hypervisor/type
がxen
になっている
device tree
いくつかのhypervisorは/proc/device-tree
以下のファイルで検知できる
PowerVMには
/proc/device-tree/ibm,partition-name
/proc/device-tree/hmc-managed?
/proc/device-tree/chosen/qemu,graphic-width
が存在する
QEMUには
/proc/device-tree
以下にfw-conf
が名前に含まれるようなファイルが存在する
/proc/device-tree/hypervisor/compatible
の内容によって
- KVM
- Xen
- VMware
を検知できる
/proc/sysinfo
z/VMは/proc/sysinfo
のVM00 Control Program
がz/VM
になっている
Detect Container
コンテナも主に特定のファイルで検知できる
OpenVZ
/proc/vz
とか/proc/bc
があったりする
WSL
/proc/sys/kernel/osrelease
にMicrosoft
とかWSL
って書いてある
PRoot
/proc/self/status
のTracerPidが0でなく,/proc/{TracerPid}/comm
がproot
で始まっているとPRoot
container-manager
/run/systemd/container-manager
がoci
だった時,
/run/.containerenv
があるとPodman
/.dockerenv
があるとDocker
/run/systemd/container
や,/proc/1/environ
の内容で
- lxc
- lxc-libvirt
- systemd-nspawn
- Docker
- Podman
- WSL
- PRoot
- pouch
を検知できる
impl
基本的にはsystemd-detect-virtの再実装.
Rustで実装してみたやつgithub.com/n01e0/detect-virt
testができない:cry:
参考
systemd-detect-virt
この記事はIPFactory Advent Calendar 2021の12/02分です.
IPFactoryというサークルについては,こちらをご覧ください.
昨日はn01e0によるDocker image injectionでした.
Comments