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