heim_virt/
lib.rs

1//! Virtualization system detection.
2//!
3//! This module is enabled with the `virt` feature flag (enabled by default).
4//!
5//! At the moment not all declared virtualization systems are detected,
6//! therefore this crate should be used very carefully.
7//!
8//! See the [issues list](https://github.com/heim-rs/heim/issues?q=is%3Aissue+is%3Aopen+label%3AA-virt)
9//! for a not supported currently systems.
10
11#![doc(html_root_url = "https://docs.rs/heim-virt/0.0.11")]
12#![deny(
13    unused,
14    unused_imports,
15    unused_features,
16    bare_trait_objects,
17    future_incompatible,
18    missing_debug_implementations,
19    missing_docs,
20    nonstandard_style,
21    dead_code,
22    deprecated
23)]
24#![warn(
25    trivial_casts,
26    trivial_numeric_casts,
27    unused_extern_crates,
28    unused_import_braces,
29    unused_results
30)]
31
32use heim_common::prelude::*;
33
34mod sys;
35
36/// Virtualization systems (both VMs and containers)
37#[derive(Debug, Ord, PartialOrd, Eq, PartialEq, Clone, Hash)]
38pub enum Virtualization {
39    // VMs
40    /// Kernel Virtual Machine (https://www.linux-kvm.org)
41    Kvm,
42
43    /// QEMU (https://www.qemu.org/)
44    Qemu,
45
46    /// Bochs IA-32 emulator (http://bochs.sourceforge.net/)
47    Bochs,
48
49    /// Xen project (https://xenproject.org/)
50    Xen,
51
52    /// User-Mode Linux (http://user-mode-linux.sourceforge.net/)
53    Uml,
54
55    /// VMware (https://www.vmware.com)
56    Vmware,
57
58    /// Oracle virtualization (https://www.oracle.com/virtualization/)
59    Oracle,
60
61    /// Microsoft Hyper-V (http://www.microsoft.com/hyper-v)
62    HyperV,
63
64    /// FreeBSD bhyve (https://wiki.freebsd.org/bhyve)
65    Bhyve,
66    //    Zvm,
67    /// Parallels (https://www.parallels.com/)
68    Parallels,
69
70    /// QNX hypervisor (https://blackberry.qnx.com/en/products/hypervisor/index)
71    Qnx,
72
73    /// ACRN hypervisor (https://projectacrn.org/)
74    Acrn,
75
76    // Containers
77    /// `systemd-nspawn` container manager (https://www.freedesktop.org/wiki/Software/systemd/)
78    SystemdNspawn,
79
80    /// `lxc-libvirt` (https://libvirt.org/drvlxc.html)
81    LxcLibvirt,
82
83    /// Linux Containers (https://linuxcontainers.org/lxc)
84    Lxc,
85
86    /// OpenVz (https://openvz.org/)
87    OpenVz,
88
89    /// Docker (https://www.docker.com/)
90    Docker,
91
92    /// Podman (https://podman.io/)
93    Podman,
94
95    /// CoreOS rkt (https://coreos.com/rkt/)
96    Rkt,
97
98    /// Microsoft WSL (https://docs.microsoft.com/en-us/windows/wsl/about)
99    Wsl,
100
101    /// Unknown virtualization system.
102    ///
103    /// Usually means that there are symptoms of being running in some virtualization system,
104    /// but it can't be determined specifically.
105    Unknown,
106
107    #[doc(hidden)]
108    __Nonexhaustive,
109}
110
111impl Virtualization {
112    /// Returns `true` if it is a Virtual Machine virtualization.
113    pub fn is_vm(&self) -> bool {
114        match self {
115            Virtualization::Kvm => true,
116            Virtualization::Qemu => true,
117            Virtualization::Bochs => true,
118            Virtualization::Xen => true,
119            Virtualization::Uml => true,
120            Virtualization::Vmware => true,
121            Virtualization::Oracle => true,
122            Virtualization::HyperV => true,
123            Virtualization::Bhyve => true,
124            Virtualization::Qnx => true,
125            Virtualization::Acrn => true,
126            _ => false,
127        }
128    }
129
130    /// Returns `true` if it is a container virtualization.
131    pub fn is_container(&self) -> bool {
132        match self {
133            Virtualization::SystemdNspawn => true,
134            Virtualization::LxcLibvirt => true,
135            Virtualization::Lxc => true,
136            Virtualization::OpenVz => true,
137            Virtualization::Docker => true,
138            Virtualization::Podman => true,
139            Virtualization::Rkt => true,
140            Virtualization::Wsl => true,
141            _ => false,
142        }
143    }
144
145    /// Returns string identifying this virtualization system.
146    pub fn as_str(&self) -> &str {
147        match self {
148            Virtualization::Kvm => "kvm",
149            Virtualization::Qemu => "qemu",
150            Virtualization::Bochs => "bochs",
151            Virtualization::Xen => "xen",
152            Virtualization::Uml => "uml",
153            Virtualization::Vmware => "vmware",
154            Virtualization::Oracle => "oracle",
155            Virtualization::HyperV => "hyperv",
156            Virtualization::Bhyve => "bhyve",
157            Virtualization::Qnx => "qnx",
158            Virtualization::Acrn => "acrn",
159            Virtualization::SystemdNspawn => "systemd-nspawn",
160            Virtualization::LxcLibvirt => "lxc-libvirt",
161            Virtualization::Lxc => "lxc",
162            Virtualization::OpenVz => "openvz",
163            Virtualization::Docker => "docker",
164            Virtualization::Podman => "podman",
165            Virtualization::Rkt => "rkt",
166            Virtualization::Wsl => "wsl",
167            Virtualization::Unknown => "unknown",
168            _ => unreachable!(),
169        }
170    }
171}
172
173/// Returns future which tries to determine if the running program is running
174/// in some [Virtualization] system.
175///
176/// ## Compatibility
177///
178/// At the moment this function works only for Linux (partially)
179/// and always returns `None` for macOS and Windows.
180pub fn detect() -> impl Future<Output = Option<Virtualization>> {
181    self::sys::detect()
182}