mirror of https://github.com/xzeldon/htop.git
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:
parent
2b7504b522
commit
7039abe109
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue