logind: add infrastructure to keep track of machines, and move to slices

- This changes all logind cgroup objects to use slice objects rather
  than fixed croup locations.

- logind can now collect minimal information about running
  VMs/containers. As fixed cgroup locations can no longer be used we
  need an entity that keeps track of machine cgroups in whatever slice
  they might be located. Since logind already keeps track of users,
  sessions and seats this is a trivial addition.

- nspawn will now register with logind and pass various bits of metadata
  along. A new option "--slice=" has been added to place the container
  in a specific slice.

- loginctl gained commands to list, introspect and terminate machines.

- user.slice and machine.slice will now be pulled in by logind.service,
  since only logind.service requires this slice.
This commit is contained in:
Lennart Poettering
2013-06-20 03:49:59 +02:00
parent 77f40f165c
commit 9444b1f20e
41 changed files with 2539 additions and 714 deletions
+15 -13
View File
@@ -27,6 +27,8 @@
#include "unit-name.h"
#include "unit-printf.h"
#include "macro.h"
#include "cgroup-util.h"
#include "special.h"
static char *specifier_prefix_and_instance(char specifier, void *data, void *userdata) {
Unit *u = userdata;
@@ -86,22 +88,22 @@ static char *specifier_cgroup(char specifier, void *data, void *userdata) {
}
static char *specifier_cgroup_root(char specifier, void *data, void *userdata) {
_cleanup_free_ char *p = NULL;
Unit *u = userdata;
char *p;
const char *slice;
int r;
assert(u);
if (specifier == 'r')
return strdup(u->manager->cgroup_hierarchy);
slice = unit_slice_name(u);
if (specifier == 'R' || !slice)
return strdup(u->manager->cgroup_root);
if (path_get_parent(u->manager->cgroup_hierarchy, &p) < 0)
return strdup("");
r = cg_slice_to_path(slice, &p);
if (r < 0)
return NULL;
if (streq(p, "/")) {
free(p);
return strdup("");
}
return p;
return strjoin(u->manager->cgroup_root, "/", p, NULL);
}
static char *specifier_runtime(char specifier, void *data, void *userdata) {
@@ -256,8 +258,8 @@ char *unit_full_printf(Unit *u, const char *format) {
*
* %f the the instance if set, otherwise the id
* %c cgroup path of unit
* %r root cgroup path of this systemd instance (e.g. "/user/lennart/shared/systemd-4711")
* %R parent of root cgroup path (e.g. "/usr/lennart/shared")
* %r where units in this slice are place in the cgroup tree
* %R the root of this systemd's instance tree
* %t the runtime directory to place sockets in (e.g. "/run" or $XDG_RUNTIME_DIR)
* %U the UID of the configured user or running user
* %u the username of the configured user or running user