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)
This commit is contained in:
Daniel Lange 2022-04-02 12:58:02 +02:00 committed by BenBE
parent 2b7504b522
commit 7039abe109
1 changed files with 28 additions and 1 deletions

View File

@ -83,6 +83,8 @@ enum CapMode {
}; };
#endif #endif
bool Running_containerized = false;
const ScreenDefaults Platform_defaultScreens[] = { const ScreenDefaults Platform_defaultScreens[] = {
{ {
.name = "Main", .name = "Main",
@ -355,7 +357,7 @@ void Platform_setMemoryValues(Meter* this) {
this->values[3] = pl->cachedMem; this->values[3] = pl->cachedMem;
this->values[4] = pl->availableMem; 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[0] -= lpl->zfs.size;
this->values[3] += lpl->zfs.size; this->values[3] += lpl->zfs.size;
} }
@ -1017,6 +1019,31 @@ bool Platform_init(void) {
LibSensors_init(); LibSensors_init();
#endif #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; return true;
} }