コンテナランタイムを実装していると D-Bus に触れることがある。一番ある例が cgroup まわりの操作。いつも忘れがちなので、メモしておく。
$ man 5 org.freedesktop.systemd1↗method
SetUnitProperties(in s name, in b runtime, in a(sv) properties)properties で unit のプロパティを実行中に変更できる。cgroup のリソース制限(例: MemoryMax)もここから設定可能。
busctl で試す
テスト用の Unit を作成
/etc/systemd/system/memhog.service[Unit] Description=memhog demo service (for SetUnitProperties example) [Service] Type=simple ExecStart=/usr/bin/python3 -c "import time; buf=bytearray(150*1024*1024); print('allocated', len(buf)); time.sleep(3600)" Restart=no [Install] WantedBy=multi-user.target反映して起動します。
$ sudo systemctl daemon-reload $ sudo systemctl start memhog.service $ sudo systemctl status memhog.serviceD-Bus 上の Unit オブジェクトパスを取る
GetUnit で object path を取得します。$ busctl --system call \ org.freedesktop.systemd1 /org/freedesktop/systemd1 \ org.freedesktop.systemd1.Manager GetUnit \ s "memhog.service" o "/org/freedesktop/systemd1/unit/memhog_2eservice"MemoryMax の型を introspect で確認する
SetUnitProperties は値が variant なので型が必要。introspect で確認します。
$ busctl --system introspect \ org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/memhog_2eservice \ | grep MemoryMax .MemoryMax property t 18446744073709551615 -tは uint64D-Bus SetUnitProperties でメモリ使用量の最大値を制限 ついに、SetUnitProperties を呼ぶ
$ sudo busctl --system call \ org.freedesktop.systemd1 /org/freedesktop/systemd1 \ org.freedesktop.systemd1.Manager SetUnitProperties \ "sba(sv)" "memhog.service" true \ 1 \ "MemoryMax" t 104857600引数たち:
trueは runtime(再起動まで)a(sv)の先頭 1 は (sv) ペアの個数- 104857600 = 100MiB
設定が入ったか確認する(D-Bus / systemctl) D-Bus で確認
$ busctl --system get-property \ org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/memhog_2eservice \ org.freedesktop.systemd1.Service MemoryMax t 104857600systemctl で確認
$ systemctl show memhog.service -p MemoryMax MemoryMax=104857600お片付け
$ sudo systemctl stop memhog.service $ sudo rm /etc/systemd/system/memhog.service $ sudo systemctl daemon-reload