<div dir="ltr"><div dir="ltr">On Mon, Feb 4, 2019 at 1:28 PM Lennart Poettering <<a href="mailto:lennart@poettering.net">lennart@poettering.net</a>> wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On So, 03.02.19 10:50, Nick Zavaritsky (<a href="mailto:mejedi@gmail.com" target="_blank">mejedi@gmail.com</a>) wrote:<br>
<br>
> Dear systemd developers!<br>
><br>
> I want to develop something using raw cgroups api, hence I wish to<br>
> enable cgroup delegation on my login session scope (feels like the<br>
> most convenient option).<br>
><br>
> I am running systemd 237, and I have legacy cgroups disabled<br>
> (cgroup_no_v1=all systemd.unified_cgroup_hierarchy in my kernel boot<br>
> args).<br>
><br>
> I was unable to figure out how to enable cgroups delegation on a<br>
> session scope, could you please provide some pointers?<br>
<br>
You currently cannot. I figure we could add a concept to pam_systemd.so so<br>
that it can parse arbitrary unit properties from its module command<br>
lines, and that could then include the Delegate= property<br>
too. (i.e. think the stuff you can pass to systemd-run's --property=<br>
switch but denoted in the PAM service fragment).<br>
<br>
However, even if we add that, this would not realistically work: on<br>
cgroupsv2 inner nodes cannot contain processes. That means if a<br>
process X lives in a unit Y and Y has delegation enabled, then X<br>
practically needs to move itself into some subcgroup early on, because<br>
otherwise there can never be populated subcgroups of Y's cgroup, since<br>
X would then populate an inner cgroup, which is after all precisely<br>
what is not allowed.<br>
<br>
So, if you wanted to enable delegation on arbitrary login session<br>
scopes, then this would mean that the shell process (or whatever is<br>
the main process you run inside of it) must be prepared to move itself<br>
out of the session scope's main cgroup early on into some child,<br>
otherwise the delegation is not worth a dime...<br>
<br>
You could of course move the shell process with some external code<br>
from the outside, but yuck: then you come in conflict with the rule<br>
that each cgroup subtree should have a clearly defined manager and not<br>
two managers fight for the same subtree...<br>
<br>
Or to say this differently: unless the shell (or whatever you invoke<br>
as main process of the session scope) is itself cgroups-aware and<br>
manipulates its subtree to take advantage of delegation, delegation in<br>
sessions doesn't really make sense. Or to say this even differently:<br>
Good luck getting a patch for bash upstream that makes it take<br>
possession of its own cgroup subtree and then moves itself into a<br>
subcgroup early on...<br>
<br>
What you can do, is run your code outside of the session scope, for<br>
example through systemd-run or something similar: in this mode you ask<br>
systemd --user for your own service or scope, for which you turn on<br>
delegation. That service/scope is then entirely yours (unlike the<br>
login session scope, which is pretty much owned by the login shell),<br>
hence you can rearange stuff below it like you want.<br>
<br>
> I’ve also tried a few workarounds that came to my mind, but<br>
> surprisingly it didn’t work either.<br>
><br>
> In particular, systemctl set-property apparently is unaware of<br>
> Delegate= option.<br>
<br>
Delegate is a setting that can only be set when you allocate a unit,<br>
i.e. a-priori. It cannot be changed a-posteriori for an existing unit.<br>
<br>
> Systemd-run —user almost worked (I had to edit<br>
> /lib/systemd/system/user@.service to enable all available<br>
> controllers on a subtree, my distribution defaults to memory, pids).<br>
<br>
Yeah, we don't enable "cpu" right now by default, since it's too expensive.<br>
<br>
> Unfortunately, systemd-run doesn’t work if I pass —pipe flag.<br>
<br>
Hmm? What's the command line you are using in detail?<br>
<br>
> It fails with 'Failed to create bus connection: No such file or<br>
> directory’ message. According to strace, without —pipe it goes for<br>
> /run/user/1000/systemd/private which works, otherwise<br>
> /run/user/1000/bus is attempted, producing ENOENT.<br>
<br>
That suggests your dbus configuration is borked? Normally the user's<br>
dbus-daemon instance should listen on that socket.<br></blockquote><div><br></div><div>Well, not all distros (e.g. Debian) ship user-bus by default... But if systemctl --user is able to use the private socket for everything else, what prevents it from being used with --pipe?</div><div><br></div></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr">Mantas Mikulėnas</div></div></div>