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}