Certo, então depois de pesquisar o código-fonte de systemd
, encontrei o ponto em que o cgroup systemd é criado. Em src/core/main.c
dentro de main()
, a função mount_setup_early()
é chamada, mas somente se systemd
estiver sendo executado como PID 1 e não em um contêiner. mount_setup_early()
é definido em src/core/mount-setup.c
e simplesmente monta certos sistemas de arquivos essenciais como /proc
, /dev
e mais importante /sys/fs/cgroup/systemd
.
O fato de que eu estava tentando executar systemd
como PID! = 1 significava que essa função nunca foi executada. Portanto, mais abaixo em main()
test_cgroups()
é executado e falha, pois /sys/fs/cgroup/systemd
não está montado. Como não há como falsificar este processo 'PID (ou pelo menos, não aquele que eu conheço ou estou disposto a tentar), a solução é montar manualmente esses sistemas de arquivos antes de executar systemd
. Pelo menos, essa é a teoria.
Outro efeito colateral interessante desta aventura é um pouco mais compreensivo em como as hierarquias nomeadas funcionam com cgroups. Há pouca documentação disponível para cgroups, especialmente sobre como exatamente as hierarquias nomeadas funcionam. Para montar uma hierarquia nomeada de maneira semelhante a como systemd
, execute:
mount -t cgroup cgroup -o none,name=<name> <mountpoint>
Isso fornece uma hierarquia completamente em branco semelhante à hierarquia name=systemd
montada em /sys/fs/cgroup/systemd
. Se você deseja ligar subsistemas a essa hierarquia, substitua none
pelos subsistemas desejados.