summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-04-26 13:37:31 +0200
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>2019-04-29 15:36:26 +0200
commit342bed02084c4396dd2f1054bd559bfb2699cfcb (patch)
tree1c01d5a7c833878b2ba4a3f9d72ea00c3a091d62
parenta6d04b1a179643685cabda9e489b34f24c287f27 (diff)
downloadsystemd-342bed02084c4396dd2f1054bd559bfb2699cfcb.tar.gz
basic/virt: try the /proc/1/sched hack also for PID1
If a container manager does not set $container, we could end up in a strange situation when detect-virt returns container-other when run as non-pid-1 and none when run as pid-1.
-rw-r--r--src/basic/virt.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/src/basic/virt.c b/src/basic/virt.c
index 5dd1bd6633..1a213bb22e 100644
--- a/src/basic/virt.c
+++ b/src/basic/virt.c
@@ -428,7 +428,6 @@ finish:
}
int detect_container(void) {
-
static const struct {
const char *value;
int id;
@@ -468,9 +467,15 @@ int detect_container(void) {
}
if (getpid_cached() == 1) {
- /* If we are PID 1 we can just check our own environment variable, and that's authoritative. */
-
+ /* If we are PID 1 we can just check our own environment variable, and that's authoritative.
+ * We distinguish three cases:
+ * - the variable is not defined → we jump to other checks
+ * - the variable is defined to an empty value → we are not in a container
+ * - anything else → some container, either one of the known ones or "container-other"
+ */
e = getenv("container");
+ if (!e)
+ goto check_sched;
if (isempty(e)) {
r = VIRTUALIZATION_NONE;
goto finish;
@@ -498,8 +503,9 @@ int detect_container(void) {
if (r < 0) /* This only works if we have CAP_SYS_PTRACE, hence let's better ignore failures here */
log_debug_errno(r, "Failed to read $container of PID 1, ignoring: %m");
- /* Interestingly /proc/1/sched actually shows the host's PID for what we see as PID 1. Hence, if the PID shown
- * there is not 1, we know we are in a PID namespace. and hence a container. */
+ /* Interestingly /proc/1/sched actually shows the host's PID for what we see as PID 1. If the PID
+ * shown there is not 1, we know we are in a PID namespace and hence a container. */
+ check_sched:
r = read_one_line_file("/proc/1/sched", &m);
if (r >= 0) {
const char *t;