summaryrefslogtreecommitdiff
path: root/src/core
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2014-05-28 18:37:11 +0800
committerLennart Poettering <lennart@poettering.net>2014-05-28 18:53:44 +0800
commitfdd25311706bd32580ec4d43211cdf4665d2f9de (patch)
tree37f3d1859779e00321ac69882b40723d5c875531 /src/core
parentd2edfae0f9bdbecf6a8518e2a5bcf06f470e0d9e (diff)
virt: rework container detection logic
Instead of accessing /proc/1/environ directly, trying to read the $container variable from it, let's make PID 1 save the contents of that variable to /run/systemd/container. This allows us to detect containers without the need for CAP_SYS_PTRACE, which allows us to drop it from a number of daemons and from the file capabilities of systemd-detect-virt. Also, don't consider chroot a container technology anymore. After all, we don't consider file system namespaces container technology anymore, and hence chroot() should be considered a container even less.
Diffstat (limited to 'src/core')
-rw-r--r--src/core/main.c12
1 files changed, 12 insertions, 0 deletions
diff --git a/src/core/main.c b/src/core/main.c
index 77cc2fbbdd..d5d1ee2b0c 100644
--- a/src/core/main.c
+++ b/src/core/main.c
@@ -1261,6 +1261,16 @@ static int status_welcome(void) {
isempty(pretty_name) ? "Linux" : pretty_name);
}
+static int write_container_id(void) {
+ const char *c;
+
+ c = getenv("container");
+ if (isempty(c))
+ return 0;
+
+ return write_string_file("/run/systemd/container", c);
+}
+
int main(int argc, char *argv[]) {
Manager *m = NULL;
int r, retval = EXIT_FAILURE;
@@ -1544,6 +1554,8 @@ int main(int argc, char *argv[]) {
if (virtualization)
log_info("Detected virtualization '%s'.", virtualization);
+ write_container_id();
+
log_info("Detected architecture '%s'.", architecture_to_string(uname_architecture()));
if (in_initrd())