diff options
author | Daniel Lange <DLange@git.local> | 2022-04-02 12:58:02 +0200 |
---|---|---|
committer | BenBE <BenBE@geshi.org> | 2022-04-02 14:02:06 +0200 |
commit | 7039abe109956852b8fd8d04eea81a1c4581535e (patch) | |
tree | 68a1a776e26d46310fd92ac58abe9a9ebcec0aa3 | |
parent | 2b7504b5228bfcab643d020819960ae3e3085575 (diff) |
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)
-rw-r--r-- | linux/Platform.c | 29 |
1 files changed, 28 insertions, 1 deletions
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; } |