From 7039abe109956852b8fd8d04eea81a1c4581535e Mon Sep 17 00:00:00 2001 From: Daniel Lange Date: Sat, 2 Apr 2022 12:58:02 +0200 Subject: Guess lxc or docker from /proc/1/mounts At the moment this is used to make the memory meter report sane values even if the host has ZFS and that leaks through into a containerized environment Fixes #863 Includes a clever check for magic PROC_PID_INIT_INO in /proc/self/ns/pid thanks to Pavel Snajdr (snajpa) --- linux/Platform.c | 29 ++++++++++++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) diff --git a/linux/Platform.c b/linux/Platform.c index 4e3d2656..ef3f0100 100644 --- a/linux/Platform.c +++ b/linux/Platform.c @@ -83,6 +83,8 @@ enum CapMode { }; #endif +bool Running_containerized = false; + const ScreenDefaults Platform_defaultScreens[] = { { .name = "Main", @@ -355,7 +357,7 @@ void Platform_setMemoryValues(Meter* this) { this->values[3] = pl->cachedMem; this->values[4] = pl->availableMem; - if (lpl->zfs.enabled != 0) { + if (lpl->zfs.enabled != 0 && !Running_containerized) { this->values[0] -= lpl->zfs.size; this->values[3] += lpl->zfs.size; } @@ -1017,6 +1019,31 @@ bool Platform_init(void) { LibSensors_init(); #endif + char target[PATH_MAX]; + ssize_t ret = readlink(PROCDIR "/self/ns/pid", target, sizeof(target) - 1); + if (ret > 0) { + target[ret] = '\0'; + + if (!String_eq("pid:[4026531836]", target)) { // magic constant PROC_PID_INIT_INO from include/linux/proc_ns.h#L46 + Running_containerized = true; + return true; // early return + } + } + + FILE* fd = fopen(PROCDIR "/1/mounts", "r"); + if (fd) { + char lineBuffer[256]; + while (fgets(lineBuffer, sizeof(lineBuffer), fd)) { + // detect lxc or overlayfs and guess that this means we are running containerized + if (String_startsWith(lineBuffer, "lxcfs ") || String_startsWith(lineBuffer, "overlay ")) { + fprintf(stderr, "%s\n", lineBuffer); + Running_containerized = true; + break; + } + } + fclose(fd); + } // if (fd) + return true; } -- cgit v1.2.3