2016-08-24 2 views
3

Wenn ich diesen Befehl ausführen:su nicht alles andere Benutzer ändern (cgroups)

su -l otheruser -c 'strace /usr/lib/systemd/systemd --user 2> /tmp/su.err' 

Es schlägt fehl:

Fehlgeschlagen Wurzel cgroup Hierarchie zu erstellen: Permission

verweigert

fehlgeschlagen Manager-Objekt zuweisen: Berechtigung verweigert

Ich sehe in der strace Ausgabe, die als Benutzer systemd Anlaß versagt hier:

mkdir("/sys/fs/cgroup/systemd/user/root/754/systemd-3893", 0755) = -1 
    EACCES (Permission denied) 

Wo/sys/fs/cgroup/systemd/user/root/kommen aus?

Wenn ich den gleichen Befehl via ssh laufen auf localhost funktioniert es:

ssh [email protected] 'strace /usr/lib/systemd/systemd --user 2> /tmp/ssh.err' 

Hier wird das richtige Verzeichnis verwendet wird:

mkdir("/sys/fs/cgroup/systemd/user/modwork_gew_dfj/825/systemd-4272", 0755) = 0 

Warum es über ssh funktioniert, aber nicht über su ?

Version: su (GNU coreutils) 8,17

aktualisieren

Hier können Sie sehen, dass die cgroup nicht durch meine Version von su geändert bekommt:

host:~ # su -l otheruser 
[email protected]:~$ cat /proc/$PPID/cgroup 
10:hugetlb:/ 
9:perf_event:/ 
8:blkio:/ 
7:net_cls:/ 
6:freezer:/ 
5:devices:/ 
4:memory:/ 
3:cpuacct,cpu:/ 
2:cpuset:/ 
1:name=systemd:/user/root/5913 <################ root 

Via ssh:

host:~ # ssh [email protected] 
[email protected]:~$ cat /proc/$PPID/cgroup 
10:hugetlb:/ 
9:perf_event:/ 
8:blkio:/ 
7:net_cls:/ 
6:freezer:/ 
5:devices:/ 
4:memory:/ 
3:cpuacct,cpu:/ 
2:cpuset:/ 
1:name=systemd:/user/otheruser/5919 <################ otheruser 

Update2

Meine Version von su ändert nicht die Cgroup (Siehe den Link in der Antwort des Benutzers "ax."). Gibt es eine Möglichkeit, die Cgroup (vorher oder nachher) zu ändern, indem Sie su anrufen?

Update3

Diese Version hat dieses Problem nicht: su util-linux 2.25

+0

Nachgefragt .... Ihr root-Account ein Passwort hat, nicht wahr? – Hackerman

+0

Welche Systemd Version hast du? – vsminkov

+0

Ist es ein Fehler oder ein Feature, dass 'su' die cgroup nicht ändert? Was sagen die Gnu Corutils Leute? – guettli

Antwort

3

su inherits its cgroup from the originating session, nicht vom Benutzer zu su weitergegeben. Wenn Sie also su -l otheruser -c systemd ... als root aufrufen, versucht systemd die Root-Cgroup (/sys/fs/cgroup/systemd/user/root/...) als otheruser zu verwenden und schlägt fehl.

Mit ssh [email protected] ... sind sowohl Benutzer als auch Cgroup otheruser, und alles funktioniert wie erwartet.

+0

Für mich sieht das so aus als ob "su" etwas falsch macht. Mit 'su -l' sollte die cgroup geändert werden. Gibt es eine Möglichkeit, die C-Gruppe zu ändern? Ich möchte "ssh zu localhost" vermeiden. – guettli

+0

Bitte lesen Sie den Link in meiner Antwort (und die Systemd-Probleme, die es verknüpft). Genau weil sich su inkonsistent verhält, haben die Systemd-Entwickler den neuen Befehl "machinectl shell" hinzugefügt, der genau das tun soll, was Sie wollen. –

+0

Ja, '" machinectl "könnte funktionieren. Leider muss ich ein altes System unterstützen, wo dieser Befehl nicht verfügbar ist. Gibt es eine Möglichkeit,' cgexec' (oder ein anderes Werkzeug) in Kombination mit 'su' zu verwenden ohne ssh)? – guettli

0

wie guettli wies darauf hin, su nicht mehr funktionieren. in centos7.2 als root Ich habe versucht, das scheint für cgroup von uid funktionieren: Angenommen, Sie haben UID = 1000, die eine hohe CPU-Freigabe Benutzer und UID = 1001 ist, die eine niedrige CPU-Freigabe Benutzer ist, (ich rate standardmäßig Jeder neue Benutzer erhält einen Anteil von 1024, was für root-Benutzer der Fall sein wird (uid = 0).

in centos7.2 als root Ich habe versucht, dies für cgroup scheint zu funktionieren:

systemd-run --uid=1000 --slice=user-1000.slice do_uid_1000_work_commands 
systemd-run --uid=1001 --slice=user-1001.slice do_uid_1001_work_commands 

die oben wird mit der entsprechenden Benutzer-Slice-Konfiguration unter/run/systemd/System zwei Ad-hoc-Dienste erstellen /:

/run/systemd/system/*10345* 

/run/systemd/system/run-10345.service 

/run/systemd/system/run-10345.service.d: 

50 -Description.conf 50-ExecStart.conf 50-Slice.conf 50-User.conf

Hier sind die restlichen Konfigurationen: -> /etc/systemd/system/user-1000.slice.d/ 50-CPUShares.conf

[Slice] 
CPUShares=4096 

-> /etc/systemd/system/user-1001.slice.d/50-CPUShares.conf

[Slice] 
CPUShares=1024 

->/usr/lib/systemd/System/user-1001 .slice

[Unit] 
Description=User and Session Slice for uid = 1001 (low cpu share user) 
Documentation=man:systemd.special(7) 
Before=slices.target 

[Service] 
Slice=user-1001 
CPUShares=1024 

-> /usr/lib/systemd/system/user-1000.slice

[Unit] 
Description=User and Session Slice for uid = 1000 (high cpu share user) 
Documentation=man:systemd.special(7) 
Before=slices.target 

[Service] 
Slice=user-1000 
CPUShares=4096 
Verwandte Themen