fix virtualization detection when `systemd-detect-virt` is not available (#12911)
Ilya Mashchenko committed
May 16, 2022 at 12:37 UTC
ea1b0ea8383131eee6fb59a1bad8837d86ea49b3
1 file changed
+19
-3
daemon/system-info.sh
+19
-3
@@ -10,6 +10,18 @@ ARCHITECTURE="$(uname -m)"
10
# -------------------------------------------------------------------------------------------------
11
# detect the virtualization and possibly the container technology
12
13
+# systemd-detect-virt: https://github.com/systemd/systemd/blob/df423851fcc05cf02281d11aab6aee7b476c1c3b/src/basic/virt.c#L999
14
+# lscpu: https://github.com/util-linux/util-linux/blob/581b77da7aa4a5205902857184d555bed367e3e0/sys-utils/lscpu.c#L52
15
+virtualization_normalize_name() {
16
+ vname="$1"
17
+ case "$vname" in
18
+ "User-mode Linux") vname="uml" ;;
19
+ "Windows Subsystem for Linux") vname="wsl" ;;
20
+ esac
21
+
22
+ echo "$vname" | tr '[:upper:]' '[:lower:]' | sed 's/ /-/g'
23
+}
24
+
25
CONTAINER="unknown"
26
CONT_DETECTION="none"
27
CONTAINER_IS_OFFICIAL_IMAGE="${NETDATA_OFFICIAL_IMAGE:-false}"
@@ -24,9 +36,9 @@ if [ -z "${VIRTUALIZATION}" ]; then
36
CONTAINER=${CONTAINER:-$(systemd-detect-virt -c)}
37
CONT_DETECTION="systemd-detect-virt"
38
else
27
- if grep -q "^flags.*hypervisor" /proc/cpuinfo 2> /dev/null; then
28
- VIRTUALIZATION="hypervisor"
29
- VIRT_DETECTION="/proc/cpuinfo"
39
+ if command -v lscpu >/dev/null 2>&1; then
40
+ VIRTUALIZATION=$(lscpu | grep "Hypervisor vendor" | cut -d: -f 2 | awk '{$1=$1};1')
41
+ VIRT_DETECTION="lscpu"
42
elif [ -n "$(command -v dmidecode)" ] && dmidecode -s system-product-name 2> /dev/null | grep -q "VMware\|Virtual\|KVM\|Bochs"; then
43
VIRTUALIZATION="$(dmidecode -s system-product-name)"
44
VIRT_DETECTION="dmidecode"
@@ -34,9 +46,13 @@ if [ -z "${VIRTUALIZATION}" ]; then
46
VIRTUALIZATION="none"
47
fi
48
fi
49
+
50
if [ -z "${VIRTUALIZATION}" ]; then
51
# Output from the command is outside of spec
52
VIRTUALIZATION="unknown"
53
+ VIRT_DETECTION="none"
54
+ else
55
+ VIRTUALIZATION=$(virtualization_normalize_name $VIRTUALIZATION)
56
fi
57
else
58
# Passed from outside - probably in docker run