systemdを使用してユーザーcgroupを作成する方法

systemdを使用してユーザーcgroupを作成する方法

lxc私はですArch Linux。基本的なシステム情報は次のとおりです。

[chb@conventiont ~]$ uname -a
Linux conventiont 3.17.4-Chb #1 SMP PREEMPT Fri Nov 28 12:39:54 UTC 2014 x86_64 GNU/Linux

以下を備えたカスタム/コンパイルされたカーネルですuser namespace enabled

[chb@conventiont ~]$ lxc-checkconfig 
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

[chb@conventiont ~]$ systemctl --version
systemd 217
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID -ELFUTILS +KMOD +IDN 

残念ながら、現在はsystemdうまくいきませんlxc。特に、root以外のユーザーのために設定するのはcgroupsうまく機能しないようです。lxcコンテナが存在できる場合にのみ可能です。ただし、cgroup階層がにマウントされているため、/sys/fs/cgroup/XXX/*これは不可能です。回避策は次のとおりです。lxcsystemdroot/sys/fs/cgroup/*

for d in /sys/fs/cgroup/*; do
        f=$(basename $d)
        echo "looking at $f"
        if [ "$f" = "cpuset" ]; then
                echo 1 | sudo tee -a $d/cgroup.clone_children;
        elif [ "$f" = "memory" ]; then
                echo 1 | sudo tee -a $d/memory.use_hierarchy;
        fi
        sudo mkdir -p $d/$USER
        sudo chown -R $USER $d/$USER
        echo $$ > $d/$USER/tasks
done

このコードは、権限のないユーザーの階層に適切なディレクトリを作成しますcgroupcgroupところが理解できないことが起こりました。上記の作業を行う前に、次の点を確認してください。

[chb@conventiont ~]$ cat /proc/self/cgroup 
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope

上記のコードを実行した後、実行したシェルには次のものが表示されます。

[chb@conventiont ~]$ cat /proc/self/cgroup 
8:blkio:/chb
7:net_cls:/chb
6:freezer:/chb
5:devices:/chb
4:memory:/chb
3:cpu,cpuacct:/chb
2:cpuset:/chb
1:name=systemd:/chb

しかし、他のシェルではまだ次のことがわかります。

[chb@conventiont ~]$ cat /proc/self/cgroup 
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope

したがって、lxc上記のコードを実行しているシェルでは、権限のないコンテナを起動できますが、他のコンテナでは起動できません。

  1. 誰かがこの動作を説明できますか?

  2. cgroups現在のバージョンsystemd()に必要なものを設定するより良い方法を見つけた人はいますか>= 217

ベストアンサー1

より良いより安全なソリューションは、cgmanagerそれをインストールして実行することですsystemctl start cgmanagersystemdベースのディストリビューションから)。その後、ユーザーを作成するか、ホストに対する権限がrootある場合は、すべてのコントローラで権限のないユーザーに対して作成できます。sudocgroups

sudo cgm create all $USER
sudo cgm chown all $USER $(id -u $USER) $(id -g $USER)

権限のないユーザーに対してこれらのプロセスが作成されると、そのユーザーは以下をcgroup使用してアクセス権を持つプロセスを各コントローラのプロセスに移動できます。

cgm movepid all $USER $PPID

私が投稿したシェルスクリプトよりも安全で高速で信頼性があります。

手動ソリューション:

1に答えます。

for d in /sys/fs/cgroup/*; do
        f=$(basename $d)
        echo "looking at $f"
        if [ "$f" = "cpuset" ]; then
                echo 1 | sudo tee -a $d/cgroup.clone_children;
        elif [ "$f" = "memory" ]; then
                echo 1 | sudo tee -a $d/memory.use_hierarchy;
        fi
        sudo mkdir -p $d/$USER
        sudo chown -R $USER $d/$USER
        echo $$ > $d/$USER/tasks
done

その台本を書いた時は正確に何が起こっているのか分からなかったが、読んでみるとcgroup ドキュメントいくつかの実験は何が起こっているのかを理解するのに役立ちました。このスクリプトで私がすることは、基本的にcgroup現在のセッションの新しいセッションを作成することですuser。このコマンドを現在実行するshellか、スクリプトで実行し、inのshell代わりに現在で評価するようにした場合subshell. scriptこれが.機能するために重要です!)、新しいセッションを開くのではなく、現在のuserシェルを次のように追加します。このプロセスは新しいcgroupで実行されます。サブシェルでスクリプトを実行し、階層にドリルダウンし、cgroupchb subcgroupメンバーecho $$ > tasksを使用して現在のシェルをchb cgroup hierarchy

したがって、lxc現在のシェルで実行すると、私のコンテナもchb subcgroup現在のシェルがshell属するすべてのメンバーになります。つまり、私の地位をcontainer受け継いだのです。これはまた、現在のsの一部ではない他のシェルでは機能しない理由も説明します。cgroupshellchb subcgroup

私はまだ通過しました2.。一貫した動作を採用するには、systemd更新や追加のKernel開発を待つ必要があるかもしれませんがsystemd、それでもユーザーが何をしているのかを知るために手動設定を好みます。

おすすめ記事