O usuário systemd não pode obter a capacidade do grupo de usuários

8

Adicionei um usuário não raiz ao grupo de janelas de encaixe e um outro serviço é executado quando esse usuário não raiz se conecta ao daemon de janela de encaixe. mas o serviço não pode funcionar. Eu faço um exemplo de teste para isso:

root@# systemctl start docker.service 
root@# gpasswd -a tiger docker

crie um serviço systemd no tigre:

[Service]
ExecStart=/home/tiger/connectdocker
Restart=always
StartLimitInterval=0
Delegate=true
KillMode=process
[Install]
WantedBy=default.target

o /home/tiger/connectdockerseguinte:

docker run -itd busybox 2> connectdocker.log

inicie este serviço:

tiger@# systemctl --user enable connectdocker.service
tiger@# systemctl --user start connectdocker.service

e o resultado:

Thu Jul 21 00:59:15 CST 2016
Cannot connect to the Docker daemon. Is the docker daemon running on this host?

mas eu posso conectar ao docker.sock com o tigre:

tiger@# docker run -itd busybox
997e99f959cfd5500319935ec17677775da9d367d203a11efef8b42161c3ee64

para provar isso, altero o /var/run/docker.sockgrupo de janela de encaixe para tigre e o serviço connectdocker pode se conectar ao daemon de janela de encaixe.

mudança /var/run/docker.sock:

ls -l /run/docker.sock
srw-rw---- 1 root docker 0 Jul 21 00:33 /run/docker.sock

para:

ls -l /run/docker.sock
srw-rw---- 1 root tiger 0 Jul 21 00:33 /run/docker.sock
yongsu zhang
fonte
1
Você já conseguiu isso funcionando?
Mark Stosberg #

Respostas:

1

Você deve usar a User=diretiva em seu systemdserviço.

Usuário =, Grupo =

Defina o usuário ou grupo UNIX em que os processos são executados, respectivamente. Aceita um único nome de usuário ou grupo ou ID numérico como argumento. Para serviços do sistema (serviços executados pelo gerenciador de serviços do sistema, ou seja, gerenciados pelo PID 1) e para serviços do usuário root (serviços gerenciados pela instância root do systemd --user), o padrão é "root", mas User = may ser usado para especificar um usuário diferente. Para serviços do usuário de qualquer outro usuário, a troca da identidade do usuário não é permitida; portanto, a única configuração válida é o mesmo usuário em que o gerenciador de serviços do usuário está executando. Se nenhum grupo estiver definido, o grupo padrão do usuário será usado. Essa configuração não afeta os comandos cuja linha de comando é prefixada com "+".

https://www.freedesktop.org/software/systemd/man/systemd.exec.html#User=

Eu também recomendaria mover seu script de um diretório inicial para um caminho padrão, como /usr/local/binalgo parecido.

Você também deve garantir a ordem do seu connectdocker.service, dando a ele After=docker.servicee Requires=docker.service. Como está escrito, connectdocker.serviceprovavelmente está tentando iniciar na mesma hora que o docker.servicee você precisaria aguardar docker.servicea ativação antes de poder se conectar a ele.

Requer =

Configura dependências de requisitos em outras unidades. Se esta unidade for ativada, as unidades listadas aqui também serão ativadas. Se uma das outras unidades for desativada ou sua ativação falhar, esta unidade será desativada. Essa opção pode ser especificada mais de uma vez ou várias unidades separadas por espaço podem ser especificadas em uma opção, caso em que serão criadas dependências de requisitos para todos os nomes listados. Observe que as dependências de requisitos não influenciam a ordem na qual os serviços são iniciados ou parados. Isso deve ser configurado independentemente com as opções After = ou Before =. Se uma unidade foo.service exigir uma unidade bar.service conforme configurado com Requer = e nenhuma ordem for configurada com After = ou Before =, as duas unidades serão iniciadas simultaneamente e sem nenhum atraso entre elas se foo.service estiver ativado. Frequentemente,

Observe que esse tipo de dependência não implica que a outra unidade sempre precise estar no estado ativo quando esta estiver em execução. Especificamente: falhas nas verificações de condição (como ConditionPathExists =, ConditionPathExists =,… - veja abaixo) não fazem com que o trabalho inicial de uma unidade com uma dependência Requer = falhe. Além disso, alguns tipos de unidades podem ser desativados por conta própria (por exemplo, um processo de serviço pode decidir sair corretamente ou um dispositivo pode ser desconectado pelo usuário), que não é propagado para unidades com uma dependência Requer =. Use o tipo de dependência BindsTo = junto com After = para garantir que uma unidade nunca esteja no estado ativo sem uma outra unidade específica também no estado ativo (veja abaixo).

Observe que dependências desse tipo também podem ser configuradas fora do arquivo de configuração da unidade adicionando um link simbólico a um diretório .requires / que acompanha o arquivo da unidade. Para detalhes, veja acima.

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Requires=

https://www.freedesktop.org/software/systemd/man/systemd.unit.html#Before=

Centimane
fonte